Conversione dell'output colorato in HTML


58

Esistono strumenti che forniscono output colorati:

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

La domanda è: come convertire il loro output colorato di programma arbitrario in file html colorato?

Anche altri formati di output potrebbero essere adatti (LaTeX sarebbe eccezionale). Penso che html sia un buon punto di partenza, in quanto è facile convertirlo in altri formati.

(Per informazioni curiose su come conservare i codici colore dei terminali, seguire la risposta: https://unix.stackexchange.com/a/10832/9689 ... | unbuffer command_with_colours arg1 arg2 | ... - lo strumento Unuffuffer fa parte di aspettarsi )


1
Se ti piace dwdiff, ti potrebbe piacere anche colordiff, un wrapper che colora l'output di diff. Ho alias diff = colordiff per anni, non ho mai avuto problemi.
Jonathan Hartley,

Risposte:


34

La risposta a questa domanda è probabilmente quello che vuoi.

Si collega a questi strumenti, che eseguono la conversione che stai cercando:


3
ahaè anche disponibile in Ubuntu: sudo apt install aha. Tuttavia, alcuni comandi elimineranno i colori quando l'output è una pipe. Pertanto, quando si invia un output ad aha, potrebbe essere necessario aggiungere opzioni ai comandi. Per lso grepsarebbe --color=always.
mivk


5

Puoi provare vimcon il plug-in AnsiEsc.vim per visualizzare i colori ANSI attraverso i codici di escape, quindi reindirizzare all'output standard su vim -(assicurati di aver attivato :syntax on). Quindi convertire il file in formato HTML con il comando vim: :TOhtml. Il file HTML generato dovrebbe avere un output colorato.


Per convertire il codice sorgente in modo non interattivo in HTML, provare il seguente comando:

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

Fonte: :help g:html_no_progress(parte di :help TOhtml).

Nota: è possibile utilizzare -invece di myfile.c, per convertire il codice dall'input standard.


Questo non ha funzionato per me. Sarebbe utile se spiegassi il comando.
Ken Ingram

Questo comando è stato spiegato nel manuale di Vim, controllare con :help TOhtmlo :help g:html_no_progress.
Kenorb,

Il modo in cui hai scritto è confuso. Utilizzare il plug-in AnsiEsc.vim. Attivalo con: sintassi on, e quindi puoi vedere il testo correttamente nella formattazione ANSI? Successivamente, salva il file come html usando: TOhtml?
Ken Ingram il

1
Se hai suggerimenti su come migliorare i passaggi, sentiti libero di migliorare.
Kenorb,

2
Li ho offerti nel mio commento. Se ho capito correttamente le istruzioni. Immagino che stai suggerendo di modificare la risposta? Va bene Posso farlo.
Ken Ingram,

4

Puoi usare vim. Questo fa parte di uno script che utilizzo per convertire l'output diff in 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

Dopo questo, corro sed per cambiare il CSS e il titolo per essere esattamente quello che voglio che siano.

* Modifica: avrei dovuto menzionare che per ottenere il colore, è necessario attivare l'evidenziazione della sintassi. Lo faccio nel mio .vimrc, ma se volessi aggiungerlo qui sarebbe solo un'altra linea simile

-c ':syntax on' \

Ok. Quindi, come vorresti convertire l'output di un programma arbitrario, diciamo: grep?
Grzegorz Wierzowiecki

1
Ok, all'inizio non ho capito. Se vuoi convertire i codici colore ANSI, la risposta qui è probabilmente quella che vuoi. Se hai solo bisogno di un trucco rapido, allora la creazione di uno script sed con un mucchio di righe che sostituiscono i codici ANSI con HTML funzionerebbe. Qualcosa come 's, ^ [\ [31m, <span style =' color: red '>, gs, ^ [\ [m, </span>, g' sarebbe veloce e sporco, ma forse sufficiente.
user17591

Potresti @ user17591 inserire questo link come un'altra risposta? Mi piacerebbe selezionarlo come risposta alla mia domanda e aumentare la tua reputazione.
Grzegorz Wierzowiecki,

Ok. Ho aggiunto un collegamento diretto al modulo Perl in modo che qualsiasi utente successivo possa trovarlo con un livello di indiretta in meno, ma anche un collegamento alla domanda / risposta originale per l'attribuzione.
user17591

@ user17591, bella soluzione! (+1) Ho appena finito di aggiungere una variante di follow-up vimshell di 2 anni della tua soluzione!
JJoao,

3

ansi2html , su pypi.

Si può ricavare quantità immodificate di godimento dall'output di shell regolare attraverso lolcat e poi attraverso ansi2html. Qualcosa di simile a:

… | lolcat -f | ansi2html -ip

+1 per l'uscita LaTeX. Ti darei +1 per l' lolcatidea da sola, ma sono troppo impegnato a ridere.
Neil Mayhew,

a proposito, il pacchetto colorized-logs di Debian installa un ansi2htmleseguibile binario incompatibile
scruss

1

Aggiornamento: ho aggiunto un perlmetodo, usando il modulo HTML :: FromANSI da CPAN .. Per installarlo, basta estrarlo in una directory ed eseguire, come root: perl -MCPAN -e 'install HTML::FromANSI'da quella directory. La caratteristica particolare per soddisfare la tua richiesta è uno script chiamato ansi2html. È interessante notare che mostra la stessa perdita di colore dopo la sovrapposizione knei nomi dei file, così come lo script elisp-shell ... Ecco un esempio di utilizzo:

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

Ecco l'output html. come visto in Firefox:

inserisci qui la descrizione dell'immagine


Ecco un metodo che utilizza uno script emacs elisp-shell ... per esempio, chiamato htmlize ... Non è necessario che Emacs sia in esecuzione.

Inizialmente l'ho testato su uno sfondo nero, ma ho notato che per qualche motivo, uno sfondo bianco non gioca bene con uno dei codici di escape introdotti \e[K, che sembra essere ERASE_LINE (Cancella l'attuale riga di output del terminale) . Ho aggiunto una riga per rimuovere questo codice di escape. Ora funziona per uno sfondo bianco.

Ecco un esempio dell'output con evidenziazione del colore dal lspiping a grepper ulteriore evidenziazione del colore.

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

questa è la elsip-shellsceneggiatura.

#!/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"))

Ecco un esempio dell'output html, in Firefox ... Se avrò tempo, esaminerò ulteriormente il problema dei codici ANSI sovrapposti. dove il rosso si ksovrappone ai nomi dei file verdi, ma questo è lì solo a causa di una regex di test scelta in fretta per grep ... (forse questo è qualcosa che \e[Kinfluenza ...

inserisci qui la descrizione dell'immagine


Suona bene. Sarebbe bello se ci fosse uno strumento più piccolo per questo compito (emacs richiede ~ 100 MB).
Grzegorz Wierzowiecki

1

Per coloro che hanno un comando scritto partendo dal presupposto che l'output con pipe non avrà mai colore (ad esempio alcuni framework di test), potrebbe essere utile utilizzare l'utilità di script per salvare prima l'output ansi. Questo può quindi essere spinto in aha o nelle altre utility menzionate.


1

Questo è solo un seguito della soluzione @ 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 e

Utilizzo: htmlvim file(per produrre file.html)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.