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 )


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:


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.


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' \

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

+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í


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.


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)

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.