苹果脚本:如何将HTML内容复制到剪贴板?

14
我知道如何复制纯文本到剪贴板:
oascript -e 'set the clipboard to "plain text"'

但问题是如何将HTML内容复制到剪贴板中?例如,如何将以下HTML内容复制到剪贴板:

<b>bold text</b>

如何使复制到TextEdit中的文本加粗?

先行致谢!


我找到了一个折中的解决方案:

echo "<b>bold text</b>" | textutil -stdin -stdout -format html -convert rtf | pbcopy

到目前为止,这个方法是有效的,但不幸的是我发现它不能用于图像标签:

echo "<img src=\"https://www.google.com/images/srpr/logo3w.png\">" | textutil -stdin -stdout -format html -convert rtf | pbcopy

这并不能完成我想要的工作,所以有人知道原因吗?
谢谢!


我找到了一个可行的解决方案并在下面发布了它 :)


img 标签无法正常工作的原因是 RTF 文档可能只能使用嵌入式图像,因此不能显示托管在 HTTP 服务器上的图像。 - Michael Morgan
我明白了。但是剪贴板似乎可以无限制地保存HTML内容。当我在Safari中拖动并复制一些图像,然后使用“osascript -e“the clipboard””命令转储内容时,它显示的数据类似于“«data HTML3C6D65...binary data...»”,我相信应该有一种方法在命令行上完成同样的工作。 ;) - K J
我认为Safari已经下载了这张图片,当你将它放到剪贴板中时,它会复制图片本身。但是,当你使用上述命令时,你正在将不兼容的 img 标签转换为 RTF 格式,这将导致你得到一张损坏的图片。 - Michael Morgan
似乎RTF格式无法包含图像(下载或引用),这就是为什么我的代码失败的原因。(而Safari复制的是HTML代码,而不是二进制图像。)但是我可以直接使用原始HTML类来实现目标,而不必经过RTF类。感谢你的帮助,Michael! - K J
6个回答

30
我已经找到了解决方案,思路是直接使用HTML类而非RTF类。(TextEdit或Web编辑器可以处理这个HTML类,就像处理RTF类数据一样) 你所需要做的就是将你的HTML代码转换成原始的十六进制码。 完整的代码看起来像这样:
hex=`echo -n "your html code here" | hexdump -ve '1/1 "%.2x"'`
osascript -e "set the clipboard to «data HTML${hex}»"
你当然可以将它们组合成一个句子。
希望这能帮助任何感兴趣的人。 :)

1
很棒的解决方案;请注意,为了支持UTF-8,您应该在HTML片段前加上<meta charset="utf-8"> - mklement0
2
这在我粘贴到TextEdit等应用程序中时有效,但我无法粘贴到许多其他地方,例如Discord的Web应用程序。有什么想法吗? - HappyFace
2
@HappyFace 目标应用程序必须支持HTML。然而,Discord只接受纯文本。由于剪贴板中可能存在多种数据类型,我们可以通过在剪贴板中添加纯文本表示而不丢失HTML版本来解决这个问题:将剪贴板设置为{«class HTML»:«data HTML${hex}», string:"${plain}"}。我在Slack中遇到了这个问题,实际上它能够处理HTML,但如果没有可用的纯文本,它仍然拒绝这样做。详情请参考:https://aaron.cc/copying-the-current-safari-tab-as-a-to-the-clipboard-as-a-clickable-link/ - undefined

5

@k-j提出的解决方案如果输入的HTML文件过大,则可能会遇到以下类似的错误信息:

/usr/bin/osascript: Argument list too long

我对@k-j的解决方案进行了一些改进,将其转换为可执行文件,并通过管道处理数据。希望它能够同样有所帮助。

可执行文件

~/bin/pbcopyhtml:

#!/bin/sh
printf "set the clipboard to «data HTML$(cat $@ | hexdump -ve '1/1 "%.2x"')»" | osascript -

用法

从管道中获取数据

$ printf '# title\n\n- list\n- list' | cmark | ~/bin/pbcopyhtml
$ osascript -e 'the clipboard as record'
«class HTML»:«data HTML3C68313E7469746C653C2F68313E0A3C756C3E0A3C6C693E6C6973743C2F6C693E0A3C6C693E6C6973743C2F6C693E0A3C2F756C3E0A»

来自文件

$ printf '# title\n\n- list\n- list' | cmark > sample.html
$ ~/bin/pbcopyhtml sample.html
$ osascript -e 'the clipboard as record'
«class HTML»:«data HTML3C68313E7469746C653C2F68313E0A3C756C3E0A3C6C693E6C6973743C2F6C693E0A3C6C693E6C6973743C2F6C693E0A3C2F756C3E0A»

2

我在Yosemite上无法使用本帖中的其他解决方案。将RTF内容放入剪贴板后,粘贴到TextEdit中可以正常工作,但是粘贴到Chrome中却不行(我想要脚本化粘贴到Google Sheets电子表格中)。最终,我成功做到了:

set rawHTML to "<a href=\"" & gmailURL & "\">" & myTitle & "</a>"
set escapedData to do shell script "echo " & (quoted form of rawHTML) as «class HTML»
set the clipboard to escapedData

1

我不是很擅长AppleScript,但这里有一个可行的方案。不幸的是,由于它会打开Safari窗口,所以不是即时的。您可能需要调整延迟值来弥补较慢的性能,但在我的测试中,0.25秒似乎足够长。

set theHTML to "<b>bold text</b>"

tell application "Safari"
    open location "data:text/html," & theHTML
    activate
    tell application "System Events"
        keystroke "a" using {command down}
        keystroke "c" using {command down}
    end tell
    delay 0.25
    close the first window
end tell

之后,渲染的文本应该在您的剪贴板上,随时可以粘贴到TextEdit中。


谢谢你的回答,Michael!你的回答可能是一个不错的解决方法,我认为应该有一种更简单的方法来避免使用Safari。但是我很感激你的回答,并给它点赞! - K J

0

抱歉,但您的代码甚至无法在OS X Mavericks的AppleScript编辑器中编译

hex=`echo -n "your html code here" | hexdump -ve '1/1 "%.2x"'`
osascript -e "set the clipboard to «data HTML${hex}»"

然而,我发现以下代码运行良好:

set the_HTML to "<font size=4 face=\"verdana\"><a href=\"" & the_url & "\" target=_blank>" & link_text & "</a></font>"
--set the clipboard to the_text

do shell script "echo " & quoted form of the_HTML & " | textutil -format html -convert rtf -stdin -stdout | pbcopy -Prefer rtf"

当然,您需要在上述语句之前设置AppleScript变量“the_url”和“link_text”。


似乎不再起作用了。 - Iulian Onofrei

0
(在 Ryan Pattersson 的回答基础上进行扩展,非常有效。)
你可以创建一个子程序,将链接放入剪贴板中,然后从代码的多个位置调用它。
my urlToClipboard("Gmail", "http://gmail.com")

on urlToClipboard(theTitle, theUrl)
    set rawHTML to "<a href=\"" & theUrl & "\">" & theTitle & "</a>"
    set escapedData to do shell script "echo " & (quoted form of rawHTML) as «class HTML»
    set the clipboard to escapedData
end urlToClipboard

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接