【问题标题】:Apple Script : How can I copy html content to the clipboard?Apple Script:如何将 html 内容复制到剪贴板?
【发布时间】:2012-06-18 15:06:09
【问题描述】:

我知道如何将纯文本复制到剪贴板:

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 服务器上的图像。
  • 我明白了。但是剪贴板似乎可以肯定地保存 html 内容。当我在 Safari 中拖动并复制一些图像,然后使用 'osascript -e "剪贴板"' 命令转储内容时,它显示的数据类似于 '«data HTML3C6D65...binary data...»',而我相信应该有一种方法可以在命令行上做同样的工作。 ;)
  • 我相信既然 Safari 已经下载了图片,当你把图片放到剪贴板上时,它会复制图片本身。但是,当您使用上述命令时,会将不兼容的 img 标记转换为 RTF 格式,从而导致图像损坏。
  • 似乎RTF格式不能包含图片(下载也没有引用),所以我的代码失败了。 (并且 Safari 复制 html 代码,而不是二进制图像。)但是我可以直接使用原始 html 类来实现目标,而无需通过 RTF 类。谢谢你的帮助,迈克尔!

标签: html macos applescript rtf


【解决方案1】:

我找到了一个解决方案,想法是直接使用 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}»"

当然,您可以将它们组合成一个句子。
希望这对任何感兴趣的人有所帮助。 :)

【讨论】:

  • 很好的解决方案;请注意,对于 UTF-8 支持,您应该在 HTML sn-ps 前加上 &lt;meta charset="utf-8"&gt;
  • 这在我粘贴时有效,例如 TextEdit,但我无法粘贴到很多其他地方,例如 Discord 的网络应用程序。有什么想法吗?
【解决方案2】:

如果输入的 HTML 太大,@k-j 的解决方案将不起作用,您可能会遇到如下错误消息:

/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»

【讨论】:

    【解决方案3】:

    我在 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 中。

    【讨论】:

    • 感谢您的回答,迈克尔!您的回答可能是一个很好的解决方法,我认为应该有一种更简单的方法可以在不使用 Safari 的情况下做到这一点。但我很感激并为答案 +1!
    【解决方案4】:

    我无法在优胜美地的这个帖子中使用任何其他解决方案。将 RTF 内容放入剪贴板时,粘贴到 TextEdit 时工作正常,但粘贴到 Chrome 时不起作用(我想将脚本粘贴到 Google 表格电子表格中)。最终我能够让它工作:

    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
    

    【讨论】:

      【解决方案5】:

      抱歉,您的代码甚至无法在 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”。

      【讨论】:

        【解决方案6】:

        (扩展了 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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-05-18
          • 1970-01-01
          相关资源
          最近更新 更多