Mode org - Memilah HTML kaya secara langsung saat menempel?

12

Saat ini, untuk mencatat alat seperti Evernotedan Quiver, saya dapat langsung menyalin konten HTML dari browser favorit saya dan kemudian menempelkannya ke dalam aplikasi, dengan semua tautan format + dipertahankan. Namun dalam orgmode sepertinya semua info format hilang.

Saya telah melihat seseorang menyarankan menggunakan ewwuntuk menjelajah web dan menyalin konten melaluieww-org . Namun itu sangat membosankan (saya tidak berpikir akan ada banyak orang menjelajah web menggunakan ewwbrowser modern saat ini. Saya harus membuka tautan itu lagi ewwdan melakukan penyalinan, belum lagi terkadang ewwtidak render isinya dengan baik).

Apakah mungkin untuk membiarkan Emacslangsung mem-parsing HTML yang disalin saat menempel? Bahkan jika belum ada alat untuk itu, apakah layak untuk membuatnya?

Ini adalah satu-satunya hal yang menghentikan saya untuk beralih orgmodedari dari alat pencatat lainnya.

xji
sumber
Tolong jelaskan apa yang Anda maksud dengan "secara langsung menguraikan HTML yang disalin"
mankoff
@mankoff OK Saya kira saya tidak cukup jelas dalam deskripsi saya. Apa yang saya inginkan adalah misalnya jika HTML asli <b>text</b>kemudian setelah saya Cmd + Cdi atasnya, dapat dikonversi ke *text*dalam org modebeberapa cara ketika menempel. Atau jika tidak, setidaknya pertahankan kode HTML asli agar saya bisa melihatnya dalam format asli semula nanti. Situasi saat ini entah bagaimana hanya teks biasa yang akan ditampilkan.
xji
Sebagai contoh, kita miliki di sini <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>. Jika saya menyalin paragraf ini, saya ingin dapat mereproduksi pemformatannya di orgmode.
xji
1
@mankoff Luar Biasa! Berhasil! Kamulah orangnya! Saya pikir Anda bahkan dapat mempertimbangkan untuk mengirimkannya sebagai paket Emacs dll. Haha. Ini bisa membuat org modejauh lebih ramah pengguna. Sebenarnya saya lebih suka dengan pemformatan tanpa konversi RTF antara karena mempertahankan lebih banyak info. Misalnya #+BEGIN_QUOTEdan #+BEGIN_EXAMPLEdalam jawaban Anda tidak akan dipertahankan dengan konversi tambahan.
xji
1
@incandescentman Itu hanya upaya untuk menghapus beberapa informasi pemformatan, misalnya beberapa CSS di dalam halaman web. Anda dapat mencobanya sendiri dan melihat perbedaannya.
xji

Jawaban:

12

apakah layak untuk membuatnya?

Karena ini emacs, ya .

Pendekatan saya adalah menggunakan alat pihak ke-3 yang dapat mengambil HTML dan mengonversi ke teks biasa atau bahkan langsung ke format Org. Saya pikir ini adalah peretasan yang buruk, dan mungkin ada cara yang lebih baik untuk melakukan ini, tetapi sepertinya ini berfungsi untuk kasus pengujian saya.

(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))

Sayangnya, HTML sangat kompleks sekarang - tidak lagi beberapa tag tulisan tangan sederhana. Tagging HTML yang rumit ini membutuhkan perintah shell yang rumit di atas. Ini melakukan hal berikut:

  1. osascriptmendapatkan teks HTML dari clipboard. Itu hex disandikan, jadi
  2. perl mengubah hex menjadi string
  3. Kita dapat mengonversi HTML itu menjadi Org langsung dengan pandoc, tetapi HTML itu penuh dengan tag yang rumit dan karenanya menghasilkan satu ton kode Org. Untuk sekadar HTML ke set minimal tag yang diperlukan untuk menangkap format, I
  4. Konversikan HTML ke json, lalu
  5. Konversikan json ke Org (dua langkah ini menyederhanakan HTML).

Perhatikan itu osascriptuntuk MacOS. Untuk memodifikasi langkah 1-2 untuk Linux, ganti argumen shell-command-to-string dengan

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

Bagaimanapun, output dari pandocperintah dikembalikan ke emacs, dan dimasukkan ke dalam buffer.

Bind perintah Emacs baru ke kunci yang mirip dengan "paste" tetapi itu berarti "paste-and-convert-from-html" kepada Anda, dan itu harus bekerja.

Atau, jika Anda tidak ingin memikirkan perintah tempel mana yang akan digunakan, berikut adalah versi Linux yang akan mengonversi HTML saat tersedia di clipboard dan sebaliknya akan kembali ke teks biasa:

"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"
mankoff
sumber
Satu tambahan: Tampaknya pandocsecara otomatis menggunakan Non-breaking space cukup banyak daripada ruang normal ketika mengkonversi teks sebaris yang diformat (cetak tebal, miring, kode dll.), Yang tidak dikenali orgmodesecara default. Anda harus menambahkannya () org-emphasis-regexp-componentsagar teks-teks tersebut diformat dengan benar orgmode.
xji
terutama versi "dirilis" dari xclip tidak mendukung opsi -t; jadi xclip harus dibangun dari github. Juga, Anda mungkin perlu menyalurkan input dan output iconv utf-8
pandoc
xclipada di OS X juga (mungkin hanya w / X11 dan / atau Alat Pengembang diinstal?), sehingga jawaban yang ditingkatkan dapat bekerja pada OS X juga.
mankoff
@ JIXiang Bagaimana saya akan memodifikasi jawaban yang diterima sehingga juga mengubah ruang yang tidak pecah menjadi ruang normal?
incandescentman
1
@incandescentman Saya awalnya memodifikasi file paket mode-org sehingga mengenali ruang yang tidak melanggar sebagai pemisah. Namun ternyata membosankan dengan perubahan versi. Saya kemudian mengangkat masalah pada repo pandoc yang dapat Anda cari. Pada dasarnya Anda dapat menggunakan "filter" di pandoc untuk melakukan penggantian otomatis. Tapi itu terkadang juga gagal. Jadi sekarang saya hanya sebagian besar secara manual memilih konten yang disisipkan dan melakukan substitusi. Substitusi terakhir saya hampir selalu yang ini jadi saya hanya gulir ke atas sejarah substitusi saya dan mendaftar.
xji