Câu trả lời này đã được cập nhật để phản ánh quả cầu rubik hiểu nhầm giữa Rich Text là gì (những gì ban đầu được hỏi về) và những gì thực sự được làm việc với Google Chrome, là HTML. (Xem bình luận chuyển đến trò chuyện .)
Tôi đang để lại câu trả lời ban đầu và bên dưới nội dung mới này, vì về mặt kỹ thuật nó trả lời câu hỏi ban đầu khi được hỏi. Nó cũng chứa thông tin liên quan đến toàn bộ quá trình xử lý nội dung Clipboard trong bối cảnh câu hỏi gốc và sửa đổi.
Các mã dưới đây là ví dụ mã được kiểm tra và chạy trong (Apple) Script Editor, ngoài câu đầu tiên trong câu hỏi, chưa có cách sử dụng rõ ràng và cụ thể nào trong Automator, tuy nhiên, đã được đưa ra. Các mã có thể cần phải được chỉnh sửa để hoạt động trong phạm vi sử dụng không xác định trong Automator. Điều đó nói rằng, như đã viết, nếu toàn bộ kịch bản bên dưới được đặt chính nó vào một hành động Run AppleScript, tự nó, trong Automator ... nó hoạt động như bình thường. Nếu chỉ sử dụng các phân đoạn của mã , một số thay đổi đối với hiện tại mã có thể cần phải được thực hiện.
Các mã bên dưới chứa đủ bình luận để hiểu tổng thể những gì kịch bản đang làm
-- #
-- # Change the 'New RichText Filename.rtf' name to the wanted filename for the target file.
-- # Make sure you leave the double-quotes even if the filename does not contain spaces!
-- # Note that '(path to desktop as text)' can also be modified as needed, e.g. changed to,
-- # '(path to documents folder as text)' or the entire segment after 'set theRichTextFileName to'
-- # can be a fully qualified POSIX pathname, e.g.: set theRichTextFileName to "/path/to/filename.rtf"
-- #
set theRichTextFileName to POSIX path of (path to desktop as text) & "New RichText Filename.rtf"
-- # THE REMAINING CODE SHOULD NOT NEED TO BE MODIFIED.
-- #
-- # Note: This code, as is, works as written and intended when run from within (Apple) Script Editor.
-- # Some AppleScript code when wrapped in Automator may not work the same as in (Apple) Script Editor.
-- # In cases where is does not work from a Run AppleScript action in Automator, editing will be required.
-- #
-- # This AppleScript code preforms the following actions, sans errors caught during File I/O operations.
-- #
-- # 1. See it the target file exists and prompts to be overwritten if it does. If yes is selected, it continues.
-- #
-- # 2. If the Clipboard contains RTF content, writes it to the target file using plain AppleScript.
-- #
-- # 3. If the Clipboard contains HTML content, writes it to the target file as RTF using a 'do shell script' command.
-- #
-- # 4. If the Clipboard does not contain any RTF/HTML content, notify the user.
--
-- # Notes: The 'do shell script' makes use of the following:
-- #
-- # 'osascript' to get the HTML content from the Clipboard.
-- # The content is a Hex stream within a data wrapper and
-- # 'awk' will be used to remove/replace the data wrapper.
-- #
-- # 'awk' to remove the data wrapper from 'osascript' output
-- # replacing it with proper HTML opening/closing Tags to
-- # ensure it actually gets processed by 'textutil' after 'xxd'.
-- # Without the HTML opening/closing Tags 'textutil' does not
-- # properly, within limits, convert the HTML Clipboard content to RTF.
-- #
-- # 'xxd' to convert the Hex data from 'osascript/awk' to ASCII text.
-- #
-- # 'textutil' to convert the ASCII text HTML from 'xxd' to RTF
-- # formatted data and write it to the target file.
tell application "Finder"
if exists theRichTextFileName as POSIX file then
tell current application
display dialog "The file \"" & theRichTextFileName & "\" already exists!" & "\n\n" & "Do you want to overwrite the file?" buttons {"No", "Yes"} default button 1 with title "File Already Exists..." with icon caution
if the button returned of the result is "No" then
return
else
tell application "Finder"
delete the file (theRichTextFileName as POSIX file)
end tell
end if
end tell
end if
tell current application
-- # Find out what class types are available for the Clipboard content
-- # and use this information to determine which action will be taken.
set cbInfo to get (clipboard info) as string
if cbInfo contains "RTF" then
try
set richTextfromClipboard to get the clipboard as «class RTF »
on error eStr number eNum
display dialog eStr & " number " & eNum buttons {"OK"} default button 1 with icon caution
return
end try
try
set fileHandle to open for access theRichTextFileName with write permission
write richTextfromClipboard to fileHandle
close access fileHandle
on error eStr number eNum
display dialog eStr & " number " & eNum buttons {"OK"} default button 1 with title "File I/O Error..." with icon caution
try
close access fileHandle
end try
end try
else if cbInfo contains "HTML" then
try
do shell script "osascript -e 'try' -e 'get the clipboard as «class HTML»' -e 'end try' | awk '{sub(/«data HTML/, \"3C68746D6C3E\") sub(/»/, \"3C2F68746D6C3E\")} {print}' | xxd -r -p | textutil -convert rtf -stdin -stdout > " & quoted form of theRichTextFileName
on error eStr number eNum
display dialog eStr & " number " & eNum buttons {"OK"} default button 1 with icon caution
end try
else
display dialog "The Clipboard does not contain\nany usable RTF/HTML content!" buttons {"OK"} default button 1 with title "No RTF/HTML Content on Clipboard..." with icon caution
end if
end tell
end tell
Câu trả lời gốc cho câu hỏi ban đầu được hỏi:
Để có được Văn bản phong phú Nội dung từ Clipboard thành một tập tin sử dụng AppleScript , nó phức tạp hơn một chút rồi đơn giản do shell script
chỉ huy .
Ví dụ AppleScript mã dưới đây sẽ, nếu mục tiêu tập tin không tồn tại và nếu Văn bản phong phú Nội dung tồn tại trên Clipboard , viết nó cho một tập tin . Nó sẽ có tất cả thuộc tính như RichText Nội dung trên Clipboard có, như đã làm khi được sao chép vào Clipboard .
Mở Biên tập kịch bản và sao chép và dán mã dưới đây thành một cái mới Chưa có tiêu đề tài liệu và sau đó chạy nó từ Biên tập kịch bản , xem xét đầu ra trong Sự kiện / Trả lời . Chạy nó một vài lần, có và không có Văn bản phong phú Nội dung trên Clipboard và có và không có sự tồn tại của tập tin , trên ổ cứng, được xác định bởi set theRichTextFileName ...
khi bắt đầu kịch bản .
Bạn sẽ thấy mã đảm bảo tập tin không tồn tại, để không ghi đè lên một lối thoát tập tin của tên và vị trí mục tiêu và nếu Clipboard không chứa Văn bản phong phú Nội dung , nó cũng hiển thị một thông báo cho điều đó.
Bây giờ nếu sử dụng điều này trong một Dịch vụ tự động ví dụ: ở đâu Dịch vụ nhận văn bản phong phú được chọn , sau đó mã có thể được sửa đổi để không mắc lỗi nếu Văn bản phong phú Nội dung không phải trên Clipboard như dịch vụ sẽ không xuất hiện trên Dịch vụ thực đơn nếu Văn bản phong phú không được chọn trong một tài liệu. Ngoài ra nếu bạn muốn ghi đè lên mục tiêu tập tin tại vị trí được chỉ định của nó mã xung quanh đó có thể được gỡ bỏ quá. Tôi sẽ cho những người đó mã ví dụ là tốt
Thí dụ mã dán vào Biên tập kịch bản để thử nghiệm và xem xét:
set theRichTextFileName to POSIX path of (path to documents folder as text) & "New RichText Filename.rtf"
tell application "Finder"
if exists theRichTextFileName as POSIX file then
tell current application
display dialog "The file \"" & theRichTextFileName & "\" already exists!" buttons {"OK"} default button 1 with title "File Already Exists..." with icon caution
end tell
else
tell current application
try
set richTextfromClipboard to get the clipboard as «class RTF »
on error eStr number eNum
display dialog eStr & " number " & eNum buttons {"OK"} default button 1 with title "No Rich Text Content on Clipboard..." with icon caution
return
end try
try
set fileHandle to open for access theRichTextFileName with write permission
write richTextfromClipboard to fileHandle
close access fileHandle
on error eStr number eNum
display dialog eStr & " number " & eNum buttons {"OK"} default button 1 with title "File I/O Error..." with icon caution
try
close access fileHandle
end try
return
end try
end tell
end if
end tell
Thí dụ mã để sử dụng trong một Dịch vụ tự động ví dụ: ở đâu Dịch vụ nhận văn bản phong phú được chọn :
set theRichTextFileName to POSIX path of (path to documents folder as text) & "New RichText Filename.rtf"
tell application "Finder"
if exists theRichTextFileName as POSIX file then
tell current application
display dialog "The file \"" & theRichTextFileName & "\" already exists!" buttons {"OK"} default button 1 with title "File Already Exists..." with icon caution
end tell
else
tell current application
set richTextfromClipboard to get the clipboard as «class RTF »
set fileHandle to open for access theRichTextFileName with write permission
write richTextfromClipboard to fileHandle
close access fileHandle
end tell
end if
end tell
Thí dụ mã để sử dụng trong một Dịch vụ tự động ví dụ: ở đâu Dịch vụ nhận văn bản phong phú được chọn và ghi đè lên mục tiêu hiện có tập tin :
set theRichTextFileName to POSIX path of (path to documents folder as text) & "New RichText Filename.rtf"
tell current application
set richTextfromClipboard to get the clipboard as «class RTF »
set fileHandle to open for access theRichTextFileName with write permission
write richTextfromClipboard to fileHandle
close access fileHandle
end tell
Hình ảnh dưới đây là một ví dụ Dịch vụ tự động tạo ra Tên tệp RichText mới.rtf tập tin từ lựa chọn Văn bản phong phú từ Tạo tệp Rich Text từ Clipboard dịch vụ trên Menu ngữ cảnh dịch vụ (bằng cách nhấp chuột phải) hoặc Tên ứng dụng & gt; Dịch vụ & gt; thực đơn , khi nào Văn bản phong phú được chọn trong một tài liệu.
Bây giờ đây chỉ là các ví dụ và logic bổ sung có thể được mã hóa để điều chỉnh nó để đáp ứng nhu cầu của họ. Ví dụ mã có thể được thêm vào để tự động tăng tên tệp hiện có để không ghi đè lên hoặc nhắc nhở tên tệp mới và hoàn tất thao tác so với hủy bỏ thông báo rằng tệp đã tồn tại, v.v.
Cập nhật để sử dụng với do shell script
chỉ huy :
Nếu bạn thực sự muốn làm điều đó bằng cách sử dụng một do shell script
chỉ huy , sau đó sử dụng như sau mã trong khi thay thế /path/to/new rich text file.rtf
có giá trị tên tệp đường dẫn đến một vị trí bạn có quyền ghi. Lưu ý không loại bỏ \"
trước và sau /path/to/new rich text file.rtf
trong thực tế chỉ huy vì điều này xử lý tên tệp đường dẫn nếu chứa không gian. Nếu tên tệp đường dẫn không chứa khoảng trắng, sau đó \"
trước và sau /path/to/new rich text file.rtf
không cần sử dụng
do shell script "osascript -e 'try' -e 'get the clipboard as «class RTF »' -e 'end try' | awk '{print substr($0, 12, length($0)-13)}' | xxd -r -p > \"/path/to/new rich text file.rtf\""
Đây là chỉ huy dòng hiển thị dưới dạng văn bản được bọc, để xem dễ dàng hơn:
do shell script "osascript -e 'try' -e 'get the clipboard as «class RTF »' -e 'end try' | awk '{print substr($0, 12, length($0)-13)}' | xxd -r -p > \"/path/to/new rich text file.rtf\""
Trong khi người ta có thể sao chép và dán (khuyên dùng) mã , tuy nhiên đây là cách nhập Dấu ngoặc kép, cũng có sẵn trong Dấu ngoặc đơn trong các ký tự (đặc biệt), ví dụ: Tùy chọn chỉ huy T trong TextEdit.
Lưu ý: Hãy ghi nhớ khoảng cách trong «class RTF »
có nghĩa là được bù trong trường hợp sử dụng này.
Đánh dấu dấu ngoặc kép
- «Dấu ngoặc kép góc trái, nhấn: Tùy chọn \
- »Dấu ngoặc kép góc phải, nhấn: ca Tùy chọn \
Lưu ý rằng, như đã viết, cái này do shell script
chỉ huy ghi đè tập tin đầu ra nếu nó đã tồn tại, mà không cần nhắc! Nó sẽ là tệp có độ dài bằng 0 nếu Clipboard không chứa bất kỳ nội dung Rich Text nào, nếu không, tệp sẽ có độ dài cần thiết để chứa nội dung Rich Text từ Clipboard. Rõ ràng, logic bổ sung có thể được mã hóa vào osascript
chỉ huy tuy nhiên nếu bạn cần sự phức tạp hơn thì tốt hơn hết bạn nên sử dụng phương pháp được trình bày trước tiên trong câu trả lời này. Hoặc sử dụng một tập lệnh bên ngoài được gọi bởi do shell script
chỉ huy xử lý tất cả những gì cần thiết logic và xử lý lỗi dựa trên mức độ phức tạp của các điều kiện tổng thể, điều này sẽ được áp dụng theo.
- Tại sao phức tạp như vậy so với
do shell script "pbpaste > /path/to/clipboard-file.rtf"
?
Đó là một câu hỏi hay và trong khi pbpaste
có -Prefer {txt | rtf | ps}
tùy chọn, dù sao pbpaste -Prefer rtf
có thể không xuất ra Rich Text ngay cả khi nó tồn tại trên Clipboard. Hoặc những gì nó xuất ra, nếu không phải là Văn bản ASCII, sẽ không phải là một dạng Văn bản phong phú được hiểu, ví dụ như TextEdit và hoặc sẽ không chứa tất cả Văn bản có định dạng thuộc tính nếu có, nội dung Clipboard chứa.
Điều này khiến bạn cần có nội dung Rich Text trên Clipboard theo cách khác và tại sao get the clipboard as «class RTF »
đang được sử dụng thay thế. Khi sử dụng một do shell script
chỉ huy với điều này, nó đòi hỏi xử lý bổ sung để sử dụng dữ liệu trở lại, vì nó trong một dữ liệu bao bọc khi trả lại và không thể sử dụng ngay, do đó cần xử lý thêm.
Ví dụ Hello World!
trong Văn bản có định dạng trên Clipboard có thể trông như thế này trong Văn bản ASCII:
{\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf400
{\fonttbl\f0\fnil\fcharset0 ComicSansMS;}
{\colortbl;\red255\green255\blue255;}
\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural
\f0\b\fs36 \cf0 Hello World!}
Thật không may, định dạng trên không dễ sử dụng, nếu có, trong AppleScript và tôi tin rằng đó là lý do tại sao bị lấy khi Hex được mã hóa dữ liệu bắt buộc.
- Tôi dựa trên thực tế rằng mặc dù
get clipboard info
chỉ huy cho nội dung Clipboard trong ví dụ này trả về {«class RTF », 265}
Tuy nhiên, trong số các thông tin được trả về, trong khi dạng Văn bản ASCII của nội dung Rich Text này dài 265 byte, nó được trả về ở định dạng Hex với hơn hai lần byte với gói dữ liệu . Thực tế là nó đã trở lại trong Hex bởi get the clipboard as «class RTF »
trong cả Trình chỉnh sửa tập lệnh hoặc sử dụng osascript
ủng hộ giả định này.
Đây là như nhau Hello World!
trong Rich Text trên Clipboard trong Hex:
7B5C727466315C616E73695C616E7369637067313235325C636F636F61727466313138375C636F636F617375627274663430300A7B5C666F6E7474626C5C66305C666E696C5C66636861727365743020436F6D696353616E734D533B7D0A7B5C636F6C6F7274626C3B5C7265643235355C677265656E3235355C626C75653235353B7D0A5C706172645C74783732305C7478313434305C7478323136305C7478323838305C7478333630305C7478343332305C7478353034305C7478353736305C7478363438305C7478373230305C7478373932305C7478383634305C7061726469726E61747572616C0A0A5C66305C625C66733336205C6366302048656C6C6F20576F726C64217D
Tuy nhiên, những gì được trả lại bởi get the clipboard as «class RTF »
cho Hello World!
ví dụ trên là:
«data RTF 7B5C727466315C616E73695C616E7369637067313235325C636F636F61727466313138375C636F636F617375627274663430300A7B5C666F6E7474626C5C66305C666E696C5C66636861727365743020436F6D696353616E734D533B7D0A7B5C636F6C6F7274626C3B5C7265643235355C677265656E3235355C626C75653235353B7D0A5C706172645C74783732305C7478313434305C7478323136305C7478323838305C7478333630305C7478343332305C7478353034305C7478353736305C7478363438305C7478373230305C7478373932305C7478383634305C7061726469726E61747572616C0A0A5C66305C625C66733336205C6366302048656C6C6F20576F726C64217D»
Chuỗi mã hóa Hex nằm trong một «data RTF »
vỏ bánh cần phải được xóa trước khi chuyển đổi nội dung được mã hóa Hex thành Văn bản ASCII để ghi vào tệp đĩa bằng cách sử dụng Chuyển hướng I / O, ví dụ: >
, bên trong do shell script
chỉ huy ví dụ trên.
Vì vậy, đầu ra của osascript -e 'try' -e ' get the clipboard as «class RTF »' -e 'end try'
được đường ống ( |
) đến awk
nơi nó tạo ra một chuỗi con, chỉ in chính nội dung được mã hóa Hex chứ không phải gói dữ liệu phần, vì điều đó sẽ không được xử lý đúng bởi xxd
trong bước tiếp theo của quy trình.
Sau đó nó phải được đường ống ( |
) đến xxd
để chuyển đổi sang ASCII Text
được ghi vào tệp đĩa bằng cách sử dụng chuyển hướng I / O, ví dụ: >
, đến mục tiêu tên tệp đường dẫn .
Hình ảnh dưới đây là của Trình xem Clipboard chuyển đổi giữa chế độ xem mã hóa ASCII Text và Hex, hiển thị Hello World!
được sao chép từ Tài liệu văn bản có định dạng, tài liệu được sử dụng trong ví dụ này.
Tôi hy vọng điều này cung cấp sự hiểu biết tốt hơn về cách AppleScript hoạt động với nội dung Rich Text trên Clipboard, vì cách chuyển đổi từ chuỗi được mã hóa Hex sang Văn bản ASCII phải diễn ra và điều này được thực hiện một cách minh bạch trong ví dụ ban đầu mã đồng thời yêu cầu xử lý bổ sung bên ngoài AppleScript mã đang được xử lý bởi osascript
khi sử dụng do shell script
chỉ huy trong ngữ cảnh này.