Org mode - розбирає багатий HTML безпосередньо під час вставки?


12

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

Я бачив, як хтось пропонує використовувати ewwвеб-сайт для перегляду та копіювання вмістуeww-org . Однак це дійсно втомлює (я не думаю , що там буде багато людей , які переглядають в Інтернеті з допомогою ewwзамість сучасних браузерів на сьогоднішній день. Я повинен відкрити це посилання ще раз в ewwі зробити копіювання, не кажучи вже іноді ewwНЕ викладіть вміст добре).

Чи можна дозволити Emacsбезпосередньо розбирати скопійований HTML під час вставки? Навіть якщо для цього ще не існує інструменту, чи можливо це зробити?

Це майже єдине, що не дозволяє мені перейти на orgmodeінші інструменти для примітки.


Поясніть, будь ласка, що ви маєте на увазі під "безпосередньо розбирати скопійований HTML"
mankoff

@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 до ключа, схожого на "вставити", але це означає "вставити і перетворити-з-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. Також вам може знадобитися передача вводу та виводу pandoc черезiconv utf-8
malcook

xclipтакож є в OS X (можливо, встановлено лише w / X11 та / або Інструменти для розробників?), тому вдосконалена відповідь може працювати і на OS X.
mankoff

@JIXiang Як ​​я можу змінити прийняту відповідь, щоб вона також перетворила нерозривні пробіли у звичайні проміжки?
лампа розжарювання

1
@incandescentman Я спочатку змінив файл пакунків в органічному режимі, щоб він розпізнавав нерозривний простір як роздільник. Однак це виявилося нудним із зміною версії. Тоді я порушив питання про репо-пандак, який можна шукати. По суті, ви можете використовувати "фільтр" в pandoc для автоматичної заміни. Але це часом теж не вдається. Тому зараз я просто в основному вибираю вставлений вміст вручну та здійснюю заміну. Моя остання заміна майже завжди ця, тому я просто прокручую історію заміни та подаю заявку.
xji
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.