Modo Org: ¿analiza HTML enriquecido directamente al pegar?

12

Actualmente, para herramientas de toma de notas como Evernotey Quiver, puedo copiar directamente el contenido HTML de mi navegador favorito y luego pegarlo en la aplicación, con todo el formato + enlace preservado. Sin embargo, en orgmode parece que toda la información de formato se pierde.

He visto a alguien sugerir usar ewwpara navegar por la web y copiar el contenido a través deeww-org . Sin embargo, eso es realmente tedioso (no creo que haya mucha gente navegando por la web en ewwlugar de navegadores modernos hoy en día. Tendré que abrir ese enlace nuevamente ewwy hacer la copia, por no mencionar que a veces ewwno renderiza el contenido muy bien).

¿Es posible permitir Emacsanalizar directamente el HTML copiado al pegar? Incluso si aún no existe una herramienta para eso, ¿es factible hacer una?

Esto es casi lo único que me impide cambiar orgmodede otras herramientas para tomar notas.

xji
fuente
Aclare lo que quiere decir con "analizar directamente el HTML copiado"
mankoff
@mankoff OK, supongo que no estaba lo suficientemente claro en mi descripción. Lo que quiero es, por ejemplo, si el código HTML original tenía <b>text</b>entonces después de que Cmd + Cen él, se puede convertir en *text*en org modede alguna manera al pegar. O si no, al menos conserve el código HTML original para poder verlos en su formato original más adelante. La situación actual es de alguna manera que solo se representará texto sin formato.
xji
Por ejemplo, tenemos aquí <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>. Si copio este párrafo, quiero poder reproducir su formato orgmode.
xji
1
@mankoff ¡Maravilloso! ¡Funcionó! ¡Eres el hombre! Creo que incluso podrías considerar enviarlo como un paquete de Emacs, etc. jaja. Esto podría hacer org modemucho más fácil de usar. En realidad, me gusta más con el formato sin conversión RTF intermedia porque conserva más información. Por ejemplo, #+BEGIN_QUOTEy #+BEGIN_EXAMPLEen su respuesta no se conservaría con la conversión adicional.
xji
1
@incandescentman Eso es solo intentar quitar algo de información de formato, por ejemplo, algo de CSS dentro de la página web. Puede probarlo usted mismo y ver qué diferencia hace.
xji

Respuestas:

12

¿Es factible hacer uno?

Como esto es emacs, .

Mi enfoque es utilizar herramientas de terceros que puedan tomar HTML y convertir a texto plano o incluso directamente a formato Org. Creo que este es un truco feo, y puede haber mejores formas de hacerlo, pero parece que funciona para mis casos de prueba.

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

Desafortunadamente, HTML es increíblemente complejo ahora, ya no son algunas etiquetas simples escritas a mano. Este etiquetado HTML complejo requiere el complicado comando de shell anterior. Hace lo siguiente:

  1. osascriptObtiene el texto HTML del portapapeles. Está codificado en hexadecimal, así que
  2. perl convierte el hexadecimal en una cadena
  3. Podríamos convertir ese HTML a Org directamente con pandoc, pero el HTML está lleno de etiquetas complicadas y, por lo tanto, produce una tonelada de código Org. Para simplificar el HTML al conjunto mínimo de etiquetas necesarias para capturar el formato, yo
  4. Convierta el HTML a json, y luego
  5. Convierta el json a Org (estos dos pasos simplifican el HTML).

Tenga en cuenta que osascriptes para MacOS. Para modificar los pasos 1-2 para Linux, reemplace el argumento de shell-command-to-string con

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

En cualquier caso, la salida del pandoccomando se devuelve a emacs y se inserta en el búfer.

Vincula el nuevo comando Emacs a una tecla similar a "pegar", pero eso significa "pegar y convertir de html" para ti, y debería funcionar.

Alternativamente, si no desea pensar qué comando pegar usar, aquí hay una versión de Linux que convertirá HTML cuando esté disponible en el portapapeles y de lo contrario volverá a texto sin formato:

"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
fuente
Una adición: parece que pandocautomáticamente usa mucho el espacio sin interrupción en lugar del espacio normal al convertir texto en línea formateado (negrita, cursiva, código, etc.), que no se reconocen orgmodepor defecto. Tendría que agregarlo () org-emphasis-regexp-componentspara que esos textos tengan el formato correcto orgmode.
xji
en particular, la versión "lanzada" de xclip no admite la opción -t; entonces xclip debe construirse a partir de github. Además, es posible que deba canalizar la entrada y salida de iconv utf-8
pandoc a
xcliptambién está en OS X (¿tal vez solo con X11 y / o herramientas de desarrollador instaladas?), por lo que la respuesta mejorada también podría funcionar en OS X.
mankoff
@JIXiang ¿Cómo modificaría la respuesta aceptada para que también convierta espacios que no se rompen en espacios normales?
incandescentman
1
@incandescentman Originalmente modifiqué el archivo del paquete org-mode para que reconozca el espacio sin interrupciones como un separador. Sin embargo, resultó ser tedioso con los cambios de versión. Luego planteé un problema en el repositorio de pandoc que puede buscar. Esencialmente, puede usar un "filtro" en pandoc para realizar una sustitución automática. Pero eso a veces también falla. Así que ahora solo selecciono manualmente el contenido pegado y realizo una sustitución. Mi última sustitución es casi siempre esta, así que solo desplazo hacia arriba mi historial de sustitución y postulo.
xji