组织模式-粘贴时直接解析丰富的HTML吗?


12

目前,记笔记工具,如EvernoteQuiver,我可以直接HTML内容从我喜爱的浏览器复制,然后将其粘贴到应用程序,与所有的格式保存+链接。但是在orgmode中,似乎所有格式信息都丢失了。

我见过有人建议使用eww来浏览网络并通过复制内容eww-org。但这确实很乏味(我认为现在没有很多人使用eww现代浏览器而不是现代浏览器来浏览网络。我将不得不再次打开该链接eww并进行复制,更不用说有时eww不会很好地呈现内容)。

Emacs粘贴时是否可以直接解析复制的HTML?即使目前还没有用于该工具的工具,是否可行?

这几乎是阻止我切换到orgmode其他笔记记录工具的唯一方法。


请澄清“直接解析复制的HTML”是什么意思
mankoff 2015年

@mankoff好吧,我想我的描述不够清楚。例如,我想要的是原始HTML是否包含<b>text</b>在我之后Cmd + C,可以在粘贴时通过某种方式将其转换为*text*in org mode。或者,如果没有,请至少保留原始的HTML代码,以便以后可以以原始的正确格式查看它们。当前的情况是以某种方式只能呈现纯文本。
xji 2015年

例如,我们在这里<p>I've seen somebody <a href="http://emacs.stackexchange.com/q/7171/115">suggest using <code>eww</code> to browse the web and copy the content via <code>eww-org</code></a>. However that is really tedious(I don't think there would be a lot of people browsing the web using <code>eww</code> instead of modern browsers nowadays. I'll have to open that link again in <code>eww</code> and do the copying, not to mention sometimes <code>eww</code> doesn't render the contents nicely). </p>。如果我复制此段落,则希望能够在中复制其格式orgmode
xji 2015年

1
@mankoff太好了!有效!你是男人!我想您甚至可以考虑将其提交为Emacs软件包等。这可以使org mode用户更加友好。实际上,我更喜欢在不进行中间RTF转换的情况下进行格式化,因为它保留了更多信息。例如#+BEGIN_QUOTE#+BEGIN_EXAMPLE您的答案将不会与其他转换一起保存。
xji 2015年

1
@incandescentman这只是尝试剥离一些格式信息,例如网页中的某些CSS。您可以自己尝试一下,看看有什么不同。
xji

Answers:


12

做一个可行吗?

因为这是emacs,所以可以

我的方法是使用可以使用HTML并转换为纯文本甚至直接转换为组织格式的第三方工具。我认为这是一个丑陋的技巧,也许有更好的方法可以做到这一点,但是看起来它可以用于我的测试用例。

(defun kdm/html2org-clipboard ()
  "Convert clipboard contents from HTML to Org and then paste (yank)."
  (interactive)
  (kill-new (shell-command-to-string "osascript -e 'the clipboard as \"HTML\"' | perl -ne 'print chr foreach unpack(\"C*\",pack(\"H*\",substr($_,11,-3)))' | pandoc -f html -t json | pandoc -f json -t org"))
  (yank))

不幸的是,HTML现在非常复杂,不再是一些简单的手写标签。这种复杂的HTML标记需要上面复杂的shell命令。它执行以下操作:

  1. osascript从剪贴板获取HTML文本。它是十六进制编码的,所以
  2. perl将十六进制转换为字符串
  3. 我们可以使用pandoc直接将HTML转换为Org,但是HTML充满了复杂的标签,因此会产生大量的Org代码。为了将HTML简化为捕获格式所需的最少标记集,我
  4. 将HTML转换为json,然后
  5. 将json转换为Org(这两个步骤简化了HTML)。

请注意,这osascript适用于MacOS。要为Linux修改步骤1-2,请用以下命令替换shell-command-to-string的参数

"xclip -o -t text/html | pandoc -f html -t json | pandoc -f json -t org"

无论如何,pandoc命令的输出都将返回到emacs,并插入到缓冲区中。

将新的Emacs命令绑定到类似于“ paste”的键,但这对您来说意味着“ paste-and-convert-from-html”,它应该可以工作。

另外,如果您不想考虑要使用哪个粘贴命令,则可以使用以下Linux版本,该版本将在剪贴板上可用时转换HTML,否则将转换为纯文本:

"xclip -o -t TARGETS | grep -q text/html && (xclip -o -t text/html | pandoc -f html -t json | pandoc -f json -t org) || xclip -o"

一个补充:在转换格式化的嵌入式文本(粗体,斜体,代码等)时,似乎会pandoc自动使用大量不间断空格而不是普通空格orgmode,默认情况下不会识别这些空格。您必须添加()org-emphasis-regexp-components才能使这些文本在中正确格式化orgmode
xji 2015年

值得注意的是,xclip的“发行”版本不支持选项-t;因此xclip必须从github构建。另外,您可能需要通过Pandoc输入和输出通过iconv utf-8
malcook

xclip也可以在OS X上安装(也许只安装了X11和/或开发人员工具?),因此改进的答案也可以在OS X上使用。
mankoff

@JIXiang我将如何修改接受的答案,以便将不间断的空格也转换为普通空格?
incandescentman

1
@incandescentman我最初修改了org-mode的程序包文件,以使其将不间断的空格识别为分隔符。但是事实证明,版本更改很繁琐。然后,我在pandoc的回购中提出了一个问题,您可以搜索该问题。本质上,您可以在pandoc中使用“过滤器”执行自动替换。但这有时也会失败。所以现在我基本上只是手动选择粘贴的内容并执行替换。我的上一个替补几乎总是这个,所以我只需滚动我的替补历史并申请即可。
xji
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.