Org-Modus - Rich HTML direkt beim Einfügen analysieren?


12

Derzeit kann ich für Notetaking-Tools wie Evernoteund QuiverHTML-Inhalte direkt von meinem Lieblingsbrowser kopieren und dann in die App einfügen, wobei alle Formatierungen und Links erhalten bleiben. Im orgmode scheinen jedoch alle Formatierungsinformationen verloren zu sein.

Ich habe jemanden gesehen , der vorgeschlagen hat eww, im Internet zu surfen und den Inhalt über zu kopiereneww-org . Das ist jedoch sehr langweilig (ich glaube nicht, dass ewwheutzutage viele Leute mit modernen Browsern im Internet surfen würden . Ich muss diesen Link erneut öffnen ewwund kopieren, ganz zu schweigen davon, dass dies manchmal ewwnicht der Fall ist den Inhalt schön rendern).

Ist es möglich, Emacsden kopierten HTML-Code beim Einfügen direkt analysieren zu lassen ? Auch wenn es dafür noch kein Tool gibt, ist es machbar, eines zu erstellen?

Dies ist fast das einzige, was mich davon orgmodeabhält , von anderen Notetaking-Tools zu wechseln.


Bitte klären Sie, was Sie unter "direktes Kopieren des kopierten HTML"
verstehen

@mankoff OK Ich glaube, ich war in meiner Beschreibung nicht klar genug. Was ich zum Beispiel möchte, ist, wenn der ursprüngliche HTML-Code <b>text</b>dann nach dem Einfügen auf irgendeine Weise beim Einfügen Cmd + Cin *text*in konvertiert werden kann org mode. Oder wenn nein, behalten Sie zumindest den ursprünglichen HTML-Code bei, damit ich sie später in ihrem ursprünglichen richtigen Format anzeigen kann. Die aktuelle Situation ist, dass nur einfacher Text gerendert wird.
xji

Zum Beispiel haben wir hier <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>. Wenn ich diesen Absatz kopiere, möchte ich seine Formatierung in reproduzieren können orgmode.
xji

1
@mankoff Wunderbar! Es funktionierte! Du bist der Mann! Ich denke, Sie könnten sogar in Betracht ziehen, es als Emacs-Paket usw. einzureichen, haha. Dies könnte org modeso viel benutzerfreundlicher machen . Eigentlich gefällt es mir bei der Formatierung ohne Zwischen-RTF-Konvertierung besser, weil dadurch mehr Informationen erhalten bleiben. Zum Beispiel #+BEGIN_QUOTEund #+BEGIN_EXAMPLEin Ihrer Antwort würde mit der zusätzlichen Konvertierung nicht erhalten bleiben.
xji

1
@incandescentman Das ist nur der Versuch, einige Formatierungsinformationen zu entfernen, z. B. CSS auf der Webseite. Sie können es selbst versuchen und sehen, welchen Unterschied es macht.
Xji

Antworten:


12

ist es machbar, einen zu machen?

Da dies Emacs ist, ja .

Mein Ansatz ist die Verwendung von Tools von Drittanbietern, die HTML verwenden und in einfachen Text oder sogar direkt in das Org-Format konvertieren können. Ich denke, dies ist ein hässlicher Hack, und es gibt vielleicht bessere Möglichkeiten, dies zu tun, aber es sieht so aus, als würde es für meine Testfälle funktionieren.

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

Leider ist HTML jetzt unglaublich komplex - nicht mehr nur einfache handgeschriebene Tags. Dieses komplexe HTML-Tagging erfordert den oben beschriebenen komplizierten Shell-Befehl. Es macht folgendes:

  1. osascriptRuft den HTML-Text aus der Zwischenablage ab. Es ist also hexadezimal codiert
  2. Perl konvertiert das Hex in einen String
  3. Wir könnten diesen HTML-Code direkt mit pandoc in Org konvertieren, aber der HTML-Code ist voller komplizierter Tags und erzeugt daher eine Menge Org-Code. Um den HTML-Code einfach auf den minimalen Satz von Tags zu beschränken, der zum Erfassen der Formatierung erforderlich ist, habe ich
  4. Konvertieren Sie den HTML-Code in json und dann
  5. Konvertieren Sie den JSON in Org (diese beiden Schritte vereinfachen den HTML-Code).

Beachten Sie, dass dies osascriptfür MacOS gilt. Um die Schritte 1-2 für Linux zu ändern, ersetzen Sie das Argument von shell-command-to-string durch

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

In jedem Fall wird die Ausgabe des pandocBefehls an emacs zurückgegeben und in den Puffer eingefügt.

Binden Sie den neuen Emacs-Befehl an einen Schlüssel, der "Einfügen" ähnelt, aber das bedeutet "Einfügen und Konvertieren von HTML" für Sie, und es sollte funktionieren.

Wenn Sie nicht darüber nachdenken möchten, welcher Einfügebefehl verwendet werden soll, finden Sie hier eine Linux-Version, die HTML konvertiert, wenn dies in der Zwischenablage verfügbar ist, und ansonsten auf einfachen Text zurückgreift:

"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"

Ein Zusatz: Es scheint, dass beim Konvertieren von formatiertem Inline-Text (fett, kursiv, Code usw.), der standardmäßig nicht erkannt wird , pandocautomatisch nicht viel Platz anstelle des normalen Platzes verwendet orgmodewird. Sie org-emphasis-regexp-componentsmüssten es () hinzufügen, damit diese Texte korrekt formatiert werden orgmode.
Xji

Insbesondere die "veröffentlichte" Version von xclip unterstützt die Option -t nicht. xclip muss also aus github gebaut werden. Außerdem müssen Sie möglicherweise Pandoc-Ein- und Ausgänge durchiconv utf-8
malcook

xclipist auch unter OS X (möglicherweise nur mit X11 und / oder Entwicklertools installiert?), sodass die verbesserte Antwort auch unter OS X funktionieren könnte.
Mankoff

@JIXiang Wie würde ich die akzeptierte Antwort so ändern, dass auch nicht unterbrechende Leerzeichen in normale Leerzeichen konvertiert werden?
Glühlampen

1
@incandescentman Ich habe ursprünglich die Paketdatei von org-mode so geändert, dass sie nicht unterbrechenden Speicherplatz als Trennzeichen erkennt. Es stellte sich jedoch heraus, dass Versionsänderungen mühsam waren. Ich habe dann ein Problem mit Pandocs Repo angesprochen, nach dem Sie suchen können. Im Wesentlichen können Sie einen "Filter" in Pandoc verwenden, um eine automatische Substitution durchzuführen. Das scheitert aber manchmal auch. Jetzt wähle ich den eingefügten Inhalt meistens manuell aus und führe eine Ersetzung durch. Meine letzte Ersetzung ist fast immer diese, also scrolle ich einfach in meiner Ersetzungshistorie nach oben und bewerbe mich.
Xji
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.