Mode Org - Analyser du HTML riche directement lors du collage?


12

Actuellement, pour les outils de prise de notes comme Evernoteet Quiver, je peux directement copier le contenu HTML de mon navigateur préféré, puis le coller dans l'application, avec tout le formatage + lien préservé. Cependant en orgmode, il semble que toutes les informations de formatage soient perdues.

J'ai vu quelqu'un suggérer d'utiliser ewwpour naviguer sur le Web et copier le contenu viaeww-org . Mais qui est vraiment fastidieux (je ne pense pas qu'il y aurait beaucoup de gens à naviguer sur le Web en utilisant à la ewwplace des navigateurs modernes de nos jours. Je vais devoir ouvrir ce lien à nouveau dans ewwet faire la copie, sans parler parfois ewwne pas rendre le contenu bien).

Est-il possible de laisser Emacsanalyser directement le code HTML copié lors du collage? Même s'il n'existe pas encore d'outil pour cela, est-il possible d'en créer un?

C'est presque la seule chose qui m'empêche de passer à orgmoded'autres outils de prise de notes.


Veuillez clarifier ce que vous entendez par "analyser directement le code HTML copié"
mankoff

@mankoff OK je suppose que je n'étais pas assez clair dans ma description. Ce que je veux, par exemple, c'est que si le HTML d'origine contenait <b>text</b>alors après moi Cmd + Cdessus, il peut être converti *text*en org modeen quelque sorte lors du collage. Sinon, conservez au moins le code HTML d'origine afin de pouvoir les visualiser dans leur format d'origine plus tard. La situation actuelle est en quelque sorte que seul le texte brut sera rendu.
xji

Par exemple, nous avons ici <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 je copie ce paragraphe, je veux pouvoir reproduire sa mise en forme en orgmode.
xji

1
@mankoff Wonderful! Ça a marché! Tu es l'homme! Je pense que vous pourriez même envisager de le soumettre en tant que package Emacs, etc. haha. Cela pourrait être org modebeaucoup plus convivial. En fait, je l'aime plus avec le formatage sans conversion RTF intermédiaire car il conserve plus d'informations. Par exemple #+BEGIN_QUOTEet #+BEGIN_EXAMPLEdans votre réponse ne serait pas conservé avec la conversion supplémentaire.
xji

1
@incandescentman C'est juste une tentative de supprimer certaines informations de mise en forme, par exemple du CSS dans la page Web. Vous pouvez l'essayer vous-même et voir quelle différence cela fait.
xji

Réponses:


12

est-il possible d'en faire un?

Puisque c'est emacs, oui .

Mon approche consiste à utiliser des outils tiers qui peuvent prendre du HTML et le convertir en texte brut ou même directement au format Org. Je pense que c'est un hack laid, et il peut y avoir de meilleures façons de le faire, mais il semble que cela fonctionne pour mes cas de test.

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

Malheureusement, le HTML est incroyablement complexe maintenant - plus de simples balises écrites à la main. Ce balisage HTML complexe nécessite la commande shell compliquée ci-dessus. Il fait ce qui suit:

  1. osascriptobtient le texte HTML du presse-papiers. Il est codé en hexadécimal, donc
  2. perl convertit l'hex en chaîne
  3. Nous pourrions convertir ce HTML en Org directement avec pandoc, mais le HTML est plein de balises compliquées et produit donc une tonne de code Org. Afin de simplement le HTML à l'ensemble minimal de balises nécessaires pour capturer la mise en forme, je
  4. Convertissez le code HTML en json, puis
  5. Convertissez le json en Org (ces deux étapes simplifient le HTML).

Notez que osascriptc'est pour MacOS. Pour modifier les étapes 1-2 pour Linux, remplacez l'argument de shell-command-to-string par

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

Dans tous les cas, la sortie de la pandoccommande est retournée à emacs et insérée dans le tampon.

Liez la nouvelle commande Emacs à une clé similaire à "coller" mais cela signifie "coller et convertir à partir de html" pour vous, et cela devrait fonctionner.

Alternativement, si vous ne voulez pas penser à la commande de collage à utiliser, voici une version Linux qui convertira le HTML lorsqu'il sera disponible dans le presse-papiers et retombera autrement en texte brut:

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

Un ajout: Il semble que pandocutilise automatiquement l' espace insécable pas mal au lieu de l' espace normal lors de la conversion au format texte en ligne (gras, italique, le code , etc.), qui ne sont pas reconnus par orgmodepar défaut. Vous devez l'ajouter () org-emphasis-regexp-componentspour que ces textes soient correctement formatés en orgmode.
xji

notamment, la version "publiée" de xclip ne prend pas en charge l'option -t; donc xclip doit être construit à partir de github. En outre, vous devrez peut-être acheminer l'entrée et la sortie iconv utf-8
pandoc

xclipest également sur OS X (peut-être uniquement avec X11 et / ou Developer Tools installés?), donc la réponse améliorée pourrait également fonctionner sur OS X.
mankoff

@JIXiang Comment modifier la réponse acceptée pour qu'elle convertisse également les espaces insécables en espaces normaux?
incandescentman

1
@incandescentman J'ai à l'origine modifié le fichier de package de org-mode afin qu'il reconnaisse l'espace insécable comme séparateur. Cependant, cela s'est avéré fastidieux avec les changements de version. J'ai ensuite soulevé un problème sur le dépôt de pandoc sur lequel vous pouvez rechercher. Essentiellement, vous pouvez utiliser un "filtre" dans pandoc pour effectuer une substitution automatique. Mais cela échoue parfois aussi. Alors maintenant, je sélectionne simplement le contenu collé et j'effectue une substitution. Ma dernière substitution est presque toujours celle-ci, je fais donc défiler mon historique de substitution et je postule.
xji
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.