Conversión de salida coloreada en html

58

Hay herramientas que proporcionan resultados en color:

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

La pregunta es: ¿Cómo convertir su salida coloreada de programa arbitrario en un archivo html coloreado?

Otros formatos de salida también pueden ser adecuados (LaTeX sería genial). Creo que html es un buen punto de partida, ya que es fácil convertirlo a otros formatos.

(Para saber cómo mantener los códigos de color de la terminal, siga la respuesta: https://unix.stackexchange.com/a/10832/9689 ... | unbuffer command_with_colours arg1 arg2 | ... - el desbloqueo de la herramienta es parte de lo esperado )

Grzegorz Wierzowiecki
fuente
1
Si te gusta dwdiff, también te puede gustar colordiff, un contenedor que colorea la salida de diff. He alias diff = colordiff durante años, nunca tuve ningún problema.
Jonathan Hartley

Respuestas:

34

La respuesta a esta pregunta es probablemente lo que quieres.

Se vincula a estas herramientas, que realizan la conversión que está buscando:

usuario17591
fuente
3
ahaTambién está disponible en Ubuntu: sudo apt install aha. Pero tenga en cuenta que algunos comandos suprimirán los colores cuando la salida es una tubería. Entonces, al enviar resultados a aha, es posible que deba agregar opciones a sus comandos. Para lso grepsería --color=always.
mivk
5

Puede probar vimcon el complemento AnsiEsc.vim para ver los colores ANSI a través de códigos de escape, luego redirigir a la salida estándar a vim -(asegúrese de haber activado :syntax on). A continuación, convertir el archivo a HTML con el comando vim: :TOhtml. El archivo HTML generado debe tener salida de color.


Para convertir el código fuente de manera no interactiva en html, pruebe el siguiente 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

Fuente: :help g:html_no_progress(parte de :help TOhtml).

Nota: Puede usar en -lugar de myfile.c, para convertir el código de la entrada estándar.

kenorb
fuente
Esto no funcionó para mí. Sería útil si explicaras el comando.
Ken Ingram
Este comando ha sido explicado en el manual de Vim, verifique con :help TOhtmlo :help g:html_no_progress.
Kenorb
La forma en que escribiste eso es confusa. Use el complemento AnsiEsc.vim. ¿Actívelo con: sintaxis activada y luego podrá ver el texto con el estilo correcto en el formato ANSI? Después de eso, guarde el archivo como html usando: TOhtml?
Ken Ingram
1
Si tiene alguna sugerencia sobre cómo mejorar los pasos, siéntase libre de mejorar.
Kenorb
2
Les ofrecí en mi comentario. Si entendí las instrucciones correctamente. ¿Supongo que estás sugiriendo que edite la respuesta? Lo cual está bien. Yo puedo hacer eso.
Ken Ingram
4

Puedes usar vim. Esto es parte de un script que utilizo para convertir la salida diff a 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

Después de esto, ejecuté sed para cambiar el CSS y el título para que sea exactamente lo que quiero que sean.

* Editar: debería haber mencionado que para obtener color, debe tener activado el resaltado de sintaxis. Lo hago en mi .vimrc, pero si quisieras agregarlo aquí, sería otra línea como

-c ':syntax on' \
usuario17591
fuente
Okay. Entonces, ¿cómo le gustaría convertir la salida del programa arbitrario, digamos: grep?
Grzegorz Wierzowiecki
1
Ok, no entendí al principio. Si desea convertir códigos de color ANSI, entonces la respuesta aquí es probablemente lo que desea. Si solo necesita un hack rápido, entonces crear un script sed con un montón de líneas que reemplacen los códigos ANSI con HTML funcionaría. Algo como 's, ^ [\ [31m, <span style =' color: red '>, gs, ^ [\ [m, </span>, g' sería rápido y sucio, pero posiblemente suficiente.
user17591
¿Podría @ user17591 poner este enlace como una respuesta más? Me encantaría seleccionarlo como respuesta a mi pregunta y mejorar tu reputación.
Grzegorz Wierzowiecki
Okay. Agregué un enlace directo al módulo Perl para que cualquier usuario posterior pueda encontrarlo con un nivel menos de indirección, pero también un enlace a la pregunta / respuesta original para atribuirlo.
user17591
@ user17591, ¡buena solución! (+1) ¡Acabo de agregar una variante de seguimiento de vimshell de 2 años de su solución!
JJoao
3

ansi2html , en pypi.

Uno puede obtener cantidades inmoderadas de diversión al canalizar la salida de la carcasa a través de lolcat y luego a través de ansi2html. Algo como:

… | lolcat -f | ansi2html -ip
scruss
fuente
+1 para salida LaTeX. Te daría +1 solo por la lolcatidea, pero estoy demasiado ocupado riéndome.
Neil Mayhew
Para su información, el paquete de registros coloreados de Debian instala un ansi2htmlejecutable binario incompatible
scruss
1

Actualización: agregué un perlmétodo, usando el módulo HTML :: FromANSI de CPAN .. Para instalarlo, simplemente extráigalo a un directorio y ejecútelo como root: perl -MCPAN -e 'install HTML::FromANSI'desde ese directorio. La característica particular para satisfacer su solicitud es un script llamado ansi2html. Curiosamente, muestra la misma pérdida de color después de la superposición ken los nombres de archivo, al igual que el script de elisp-shell ... Aquí hay un ejemplo de uso:

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

Aquí está la salida html. como se ve en Firefox:

ingrese la descripción de la imagen aquí


Aquí hay un método que usa un script de emacs elisp-shell ... por ejemplo, llamado htmlize ... Emacs no necesita estar ejecutándose.

Originalmente lo probé sobre un fondo negro, pero noté que, por alguna razón, un fondo blanco no funciona bien con uno de los códigos de escape introducidos \e[K, que parece ser ERASE_LINE (borrar la línea actual de salida del terminal) . He agregado una línea para eliminar este código de escape. Ahora funciona para un fondo blanco.

Aquí hay un ejemplo de salida resaltada de color de lsser canalizada greppara resaltar más el color.

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

Este es el elsip-shellguión.

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

Aquí hay una muestra de la salida html, en Firefox ... Si tengo tiempo, investigaré más sobre el tema de los códigos ANSI superpuestos. donde los ks rojos se superponen a los nombres de archivo verdes, pero eso solo está ahí debido a una expresión regular de prueba elegida apresuradamente para grep ... (tal vez eso sea algo que \e[Kinfluya ...

ingrese la descripción de la imagen aquí

Peter.O
fuente
Suena bien. Sería genial si hubiera una herramienta más pequeña para esta tarea (emacs toma ~ 100MB).
Grzegorz Wierzowiecki
1

Para aquellos que tienen un comando escrito en el supuesto de que la salida canalizada nunca tendrá color (por ejemplo, algunos marcos de prueba), puede resultar útil utilizar la utilidad de script para guardar primero la salida ansi. Esto puede ser empujado a aha o las otras utilidades mencionadas.

Andrew Stretton
fuente
1

Esto es solo un seguimiento de la solución @ 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 y

Uso: htmlvim file(para producir file.html)

JJoao
fuente