Conversion de la sortie couleur en HTML


58

Il existe des outils fournissant une sortie colorée:

dwdiff -c File1 File2 # word level diff
grep --color=always # we all know this guy
...

La question qui se pose est la suivante: comment convertir leur sortie colorée de programme arbitraire en fichier html coloré?

D'autres formats de sortie pourraient également convenir (LaTeX serait génial). Je pense que le html est un bon point de départ, car il est facile de le convertir en un autre format.

(Pour savoir comment conserver les codes de couleur du terminal, veuillez suivre la réponse: https://unix.stackexchange.com/a/10832/9689 ... | unbuffer command_with_colours arg1 arg2 | ... - l'outil d' annulation de la mémoire tampon fait partie des attentes )


1
Si vous aimez dwdiff, vous pourriez aussi aimer colordiff, un wrapper qui colorise la sortie de diff. J'ai aliasé diff = colordiff depuis des années, je n'ai jamais eu de problèmes.
Jonathan Hartley

Réponses:


34

La réponse à cette question est probablement ce que vous voulez.

Il est lié à ces outils, qui font la conversion que vous recherchez:


3
ahaest également disponible dans Ubuntu: sudo apt install aha. Notez toutefois que certaines commandes suppriment les couleurs lorsque la sortie est un tuyau. Ainsi, lors de l'envoi d'une sortie à aha, vous devrez peut-être ajouter des options à vos commandes. Pour lsou grepce serait --color=always.
mardi


5

Vous pouvez essayer vimavec le plug- in AnsiEsc.vim de visualiser les couleurs ANSI via des codes d'échappement, puis de les rediriger vers la sortie standard vers vim -(assurez-vous que vous avez activé :syntax on). Ensuite , convertir le fichier au format HTML en commande vim: :TOhtml. Le fichier HTML généré doit avoir une sortie en couleur.


Pour convertir le code source en HTML de manière non interactive, essayez la commande suivante:

vim -E -s -c "let g:html_no_progress=1" -c "syntax on" -c "set ft=c" -c "runtime syntax/2html.vim" -cwqa myfile.c

Source: :help g:html_no_progress(partie de :help TOhtml).

Remarque: Vous pouvez utiliser à la -place de myfile.c, pour convertir le code à partir de l'entrée standard.


Cela n'a pas fonctionné pour moi. Il serait utile que vous expliquiez la commande.
Ken Ingram

Cette commande a été expliquée dans le manuel de Vim, vérifié par :help TOhtmlou :help g:html_no_progress.
Kenorb

La façon dont vous avez écrit cela est source de confusion. Utilisez le plugin AnsiEsc.vim. Activez-le avec: syntaxe sur, puis vous pourrez voir le texte correctement stylé dans le formatage ANSI? Après cela, enregistrez le fichier au format HTML à l’aide de: TOhtml?
Ken Ingram le

1
Si vous avez des suggestions pour améliorer les étapes, n'hésitez pas à les améliorer.
Kenorb

2
Je leur ai offert dans mon commentaire. Si j'ai bien compris la consigne. Je suppose que vous suggérez que je modifie la réponse? Ce qui va bien. Je peux le faire.
Ken Ingram le

4

Vous pouvez utiliser vim. Cela fait partie d'un script que j'utilise pour convertir les sorties diff en HTML.

vim -n \
    -c ':%s%^+  %+++    ' \
    -c ':%s%^-  %---    ' \
    -c ':%s%^   %       ' \
    -c ':set nu' \
    -c ':let html_use_css=1' \
    -c ':so $VIMRUNTIME/syntax/2html.vim' \
    -c ':wq' -c ':qa!' $input > /dev/null 2> /dev/null

Après cela, je lance sed pour changer le CSS et le titre pour qu'ils soient exactement ce que je veux qu'ils soient.

* Edit: J'aurais dû mentionner que pour obtenir de la couleur, la surbrillance de la syntaxe doit être activée. Je le fais dans mon .vimrc, mais si vous vouliez l’ajouter ici, ce serait juste une autre ligne comme

-c ':syntax on' \

D'accord. Alors, comment voudriez-vous convertir la sortie d'un programme arbitraire, disons: grep?
Grzegorz Wierzowiecki

1
Ok, je n'ai pas compris au début. Si vous voulez convertir des codes couleur ANSI, la réponse ici est probablement ce que vous voulez. Si vous avez juste besoin d'un piratage rapide, créer un script sed avec un tas de lignes qui remplacent les codes ANSI par HTML pourrait fonctionner. Quelque chose comme, ^ [\ [31m, <span style = 'couleur: rouge'>, gs, ^ [\ [m, </ span>, g 'serait rapide et sale, mais éventuellement suffisant.
user17591

Pourriez-vous @ utilisateur17591 mettre ce lien comme une réponse supplémentaire? J'adorerais le choisir comme réponse à ma question et améliorer votre réputation.
Grzegorz Wierzowiecki

D'accord. J'ai ajouté un lien direct au module Perl afin que tout utilisateur ultérieur puisse le trouver avec un niveau d'indirection de moins, mais également un lien vers la question / réponse d'origine pour l'attribution.
user17591

@ user17591, bonne solution! (+1) Je viens juste d'ajouter une variante de suivi vimshell de 2 ans de votre solution!
JJoao

3

ansi2html , sur pypi.

On peut obtenir un plaisir immodéré en diffusant lolcat puis en ansi2html. Quelque chose comme:

… | lolcat -f | ansi2html -ip

+1 pour la sortie LaTeX. Je vous donnerais +1 pour l' lolcatidée seule, mais je suis trop occupé à rire.
Neil Mayhew

fyi, le paquet colorized -logs de Debian installe un ansi2htmlexécutable binaire incompatible
scruss

1

Mise à jour: j'ai ajouté une perlméthode en utilisant le module HTML :: FromANSI de CPAN .. Pour l'installer, extrayez-la dans un répertoire et exécutez-la en tant que root: à perl -MCPAN -e 'install HTML::FromANSI'partir de ce répertoire. La fonctionnalité qui convient à votre demande est un script appelé ansi2html. Fait intéressant, il présente la même perte de couleur après la superposition kdans les noms de fichiers que le script elisp-shell ... Voici un exemple d'utilisation:

ls -l --color=always /bin/*k* | 
 grep --color=always "k\|x\|2010" |
  ansi2html  >/tmp/example.html
firefox /tmp/example.html

Voici la sortie HTML. comme vu dans Firefox:

entrez la description de l'image ici


Voici une méthode utilisant un script emacs elisp-shell ... pour l'exemple, appelé htmlize ... Emacs n'a pas besoin d'être exécuté.

Je l’avais initialement testé sur un fond noir, mais j’ai remarqué que, pour une raison quelconque, un fond blanc ne fonctionnait pas bien avec l’un des codes d’évasion introduits \e[K, qui semble être ERASE_LINE (efface la ligne actuelle de sortie du terminal) . J'ai ajouté une ligne pour supprimer ce code d'échappement. Cela fonctionne maintenant pour un fond blanc.

Voici un exemple de couleur mise en surbrillance depuis la sortie lsen lecture greppour plus de couleur.

ls -l --color=always /bin/*k* | 
 grep --color=always "k\|x\|2010" >/tmp/example
htmlize /tmp/example
firefox /tmp/example.html

c'est le elsip-shellscript.

#!/bin/sh
":"; exec /usr/bin/emacs -Q --script "$0" -- "$@" # -*-emacs-lisp-*-
(require 'ansi-color) (require 'htmlize)
(find-file (setq path-in (cadr argv)))
(ansi-color-apply-on-region (point-min) (point-max))
(switch-to-buffer (buffer-name (htmlize-buffer)))
(write-file (concat path-in ".html"))

Voici un exemple de la sortie html, dans Firefox ... Si le temps me le permet, j'examinerai plus en détail le problème des codes ANSI superposés. où les knoms de fichiers verts chevauchent les noms de fichiers verts, mais ce n’est là qu’à cause d’un regex de test choisi à la hâte pour grep ... (peut-être que quelque chose a \e[Kinfluencé ...

entrez la description de l'image ici


Cela semble bien. Ce serait génial s'il y avait un outil plus petit pour cette tâche (emacs nécessite environ 100 Mo).
Grzegorz Wierzowiecki

1

Pour ceux qui ont une commande écrite en partant du principe que la sortie redirigée n’aura jamais de couleur (par exemple, certains frameworks de test), il peut être utile d’utiliser l’utilitaire de script pour enregistrer d’abord la sortie ansi. Cela peut ensuite être poussé vers aha ou les autres utilitaires mentionnés.


1

Ceci n'est qu'un suivi de la solution @ user17591 - vim scripting :

#!/usr/bin/vim -ns
:%s%^+  %+++
:%s%^-  %---
:%s%^   %
:set nu
:let html_use_css=1
:so $VIMRUNTIME/syntax/2html.vim
:wq
:qa!

chmod et

Utilisation: htmlvim file(pour produire file.html)

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.