Режим Org - парсинг богатого HTML напрямую при вставке?

12

В настоящее время для таких инструментов заметок, как Evernoteи Quiver, я могу напрямую копировать HTML-контент из моего любимого браузера, а затем вставлять их в приложение, сохраняя все ссылки форматирования +. Однако в orgmode кажется, что вся информация о форматировании потеряна.

Я видел, как кто-то предложил использовать ewwдля просмотра веб-страниц и копирования содержимого черезeww-org . Однако это действительно утомительно (я не думаю, что в настоящее время многие люди просматривают Интернет ewwвместо современных браузеров. Мне придется снова открыть эту ссылку ewwи выполнить копирование, не говоря ewwуже о том, что сделать содержимое красиво).

Можно ли разрешить Emacsнепосредственно анализировать скопированный HTML при вставке? Даже если для этого еще нет существующего инструмента, возможно ли его создать?

Это почти единственное, что мешает мне переключиться на orgmodeдругие инструменты для заметок.

xji
источник
Пожалуйста, уточните, что вы подразумеваете под «прямым
анализом
@mankoff Ладно, я не совсем понял в своем описании. То , что я хочу, например , если исходный HTML был <b>text</b>тогда после того как я Cmd + Cна него, он может быть преобразован в *text*в org modeнекоторых средствах при вставке. Или, если нет, по крайней мере сохраните исходный HTML-код, чтобы позже я мог просмотреть их в оригинальном формате. Сложившаяся ситуация так или иначе будет отображаться только в виде простого текста.
xji
Например, у нас здесь <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
1
@mankoff Замечательно! Это сработало! Ты мужчина! Я думаю, вы могли бы даже подумать о том, чтобы отправить его в виде пакета Emacs и т. Д. Хаха. Это может сделать org modeнамного более удобным для пользователя. На самом деле мне больше нравится форматирование без промежуточного преобразования RTF, потому что оно сохраняет больше информации. Например #+BEGIN_QUOTEи #+BEGIN_EXAMPLEв вашем ответе не будет сохранено дополнительное преобразование.
xji
1
@incandescentman Это просто попытка удалить некоторую информацию о форматировании, например, немного CSS на веб-странице. Вы можете попробовать это сами и посмотреть, какая разница.
xji

Ответы:

12

это реально сделать один?

Так как это Emacs, да .

Мой подход заключается в использовании сторонних инструментов, которые могут принимать HTML и конвертировать в обычный текст или даже напрямую в формат Org. Я думаю, что это уродливый хак, и, возможно, есть лучшие способы сделать это, но похоже, что это работает для моих тестовых случаев.

(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-тегирования требуется указанная выше сложная команда оболочки. Это делает следующее:

  1. osascriptполучает текст HTML из буфера обмена. Это шестнадцатеричный код, так
  2. Perl преобразует гекс в строку
  3. Мы можем преобразовать этот HTML-код в Org напрямую с помощью pandoc, но HTML-код полон сложных тегов и, следовательно, создает тонну кода Org. Для того, чтобы просто HTML-код с минимальным набором тегов, необходимых для захвата форматирования, я
  4. Преобразовать HTML в JSON, а затем
  5. Конвертируйте json в Org (эти два шага упрощают HTML).

Обратите внимание, что osascriptдля MacOS. Чтобы изменить шаги 1-2 для Linux, замените аргумент 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
в частности, «выпущенная» версия xclip не поддерживает опцию -t; поэтому xclip должен быть собран из github. Кроме того, вам может потребоваться направить ввод и вывод iconv utf-8
pandoc
xclipтакже на OS X (возможно, только с установленными w / X11 и / или Developer Tools?), поэтому улучшенный ответ может работать и на OS X.
Mankoff
@JIXiang Как бы я изменил принятый ответ, чтобы он также преобразовывал неразрывные пробелы в нормальные пробелы?
Лампа накаливания
1
@incandescentman Первоначально я изменил файл пакета org-mode, чтобы он распознавал неразрывный пробел как разделитель. Однако это оказалось утомительным с изменениями версии. Затем я поднял вопрос о репо Пандока, который вы можете искать. По сути, вы можете использовать «фильтр» в pandoc для выполнения автоматической замены. Но иногда это тоже не получается. Поэтому сейчас я в основном вручную выбираю вставленный контент и выполняю замену. Моя последняя замена - почти всегда эта, поэтому я просто прокручиваю свою историю замены и подаю заявку.
xji