Convertendo saída colorida em html

58

Existem ferramentas que fornecem saída colorida:

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

A questão é: Como converter sua saída colorida de programa arbitrário em arquivo html colorido?

Outros formatos de saída também podem ser adequados (o LaTeX seria ótimo). Eu acho que o html é um bom ponto de partida, pois é fácil convertê-lo para outros formatos.

(Para saber como manter os códigos de cores dos terminais, siga a resposta: https://unix.stackexchange.com/a/10832/9689 ... | unbuffer command_with_colours arg1 arg2 | ... - o desbotador da ferramenta faz parte do esperado )

Grzegorz Wierzowiecki
fonte
11
Se você gosta de dwdiff, também pode gostar de colordiff, um invólucro que colore a saída do diff. Alias ​​diff = colordiff há anos, nunca tive problemas.
Jonathan Hartley

Respostas:

34

A resposta a esta pergunta é provavelmente o que você deseja.

Ele vincula essas ferramentas, que fazem a conversão que você está procurando:

user17591
fonte
3
ahaTambém está disponível no Ubuntu: sudo apt install aha. Mas observe que alguns comandos suprimirão as cores quando a saída for um pipe. Portanto, ao enviar a saída para aha, talvez seja necessário adicionar opções aos seus comandos. Para lsou grepseria --color=always.
mivk
5

Você pode tentar vimcom o plug-in AnsiEsc.vim para visualizar cores ANSI através de códigos de escape e, em seguida, redirecionar para a saída padrão para vim -(verifique se você ativou :syntax on). Em seguida, converter o arquivo para HTML pelo comando vim: :TOhtml. O arquivo HTML gerado deve ter saída colorida.


Para converter o código-fonte de maneira não interativa em html, tente o seguinte 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 de :help TOhtml).

Nota: Você pode usar, em -vez de myfile.c, para converter o código da entrada padrão.

kenorb
fonte
Isso não funcionou para mim. Ajudaria se você explicasse o comando.
Ken Ingram
Este comando foi explicado no manual do Vim, verifique por :help TOhtmlou :help g:html_no_progress.
kenorb
A maneira como você escreveu isso é confusa. Use o plugin AnsiEsc.vim. Ative-o com: sintaxe ativada e, em seguida, você poderá ver o texto com estilo adequado na formatação ANSI? Depois disso, salve o arquivo como html usando: TOhtml?
Ken Ingram
11
Se você tiver alguma sugestão sobre como melhorar as etapas, fique à vontade para melhorar.
kenorb 03/01
2
Eu os ofereci no meu comentário. Se eu entendi a instrução corretamente. Acho que você está sugerindo que eu edite a resposta? O que é bom. Eu posso fazer isso.
Ken Ingram
4

Você pode usar o vim. Isso faz parte de um script que eu uso para converter a saída diff em 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

Depois disso, corro sed para alterar o CSS e o título para que sejam exatamente o que quero que sejam.

* Editar: eu deveria ter mencionado que, para obter cores, você precisa ter o destaque de sintaxe ativado. Eu faço isso no meu .vimrc, mas se você quiser adicioná-lo aqui, seria apenas outra linha como

-c ':syntax on' \
user17591
fonte
Está bem. Então, como você gostaria de converter a saída do programa arbitrário, digamos: grep?
Grzegorz Wierzowiecki 8/08/12
11
Ok, eu não entendi a princípio. Se você deseja converter códigos de cores ANSI, a resposta aqui provavelmente é o que você deseja. Se você precisar apenas de um hack rápido, a criação de um script sed com várias linhas que substituem os códigos ANSI pelo HTML funcionaria. Algo como 's, ^ [\ [31m, <span style =' color: red '>, gs, ^ [\ [m, </span>, g' seria rápido e sujo, mas possivelmente suficiente.
User17591
Você poderia @ user17591 colocar este link como mais uma resposta? Adoraria selecioná-lo como resposta à minha pergunta e aumentar sua reputação.
Grzegorz Wierzowiecki 12/08/2012
Está bem. Eu adicionei um link direto ao módulo Perl para que qualquer usuário subsequente possa encontrá-lo com um nível a menos de indireção, mas também um link para a pergunta / resposta original para atribuição.
user17591
@ user17591, boa solução! (+1) Acabei de adicionar uma variante de acompanhamento de 2 anos da sua solução!
precisa saber é
3

ansi2html , em pypi.

Pode-se obter uma quantidade imoderada de prazer ao canalizar a saída regular do shell pelo lolcat e depois pelo ansi2html. Algo como:

… | lolcat -f | ansi2html -ip
scruss
fonte
+1 para saída LaTeX. Eu daria a você +1 apenas pela lolcatideia, mas estou muito ocupado rindo.
Neil Mayhew
fyi, do Debian colorida-logs pacote instala uma incompatível ansi2htmlbinário executável
scruss
1

Atualização: eu adicionei um perlmétodo, usando o módulo HTML :: FromANSI do CPAN . Para instalá-lo, basta extraí-lo para um diretório e executar como root: perl -MCPAN -e 'install HTML::FromANSI'desse diretório. O recurso específico para atender à sua solicitação é um script chamado ansi2html. Curiosamente, ele mostra a mesma perda de cor após a sobreposição knos nomes dos arquivos, assim como o script elisp-shell ... Aqui está um exemplo de uso:

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

Aqui está a saída html. como visto no Firefox:

insira a descrição da imagem aqui


Aqui está um método usando um script emacs elisp-shell ... por exemplo, chamado htmlize ... O Emacs não precisa estar em execução.

Eu o testei originalmente em um fundo preto, mas notei que, por algum motivo, um fundo branco não funciona bem com um dos códigos de escape introduzidos \e[K, que parecem ser ERASE_LINE (apague a linha atual de saída do terminal) . Adicionei uma linha para remover este código de escape. Agora funciona para um fundo branco.

Aqui está um exemplo de saída destacada em cores de lsser canalizada para greprealçar mais cores.

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

esse é o 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"))

Aqui está um exemplo da saída html, no Firefox ... Se eu tiver tempo, analisarei mais detalhadamente a questão dos códigos ANSI sobrepostos. onde o vermelho se ksobrepõe aos nomes de arquivos verdes, mas isso só ocorre por causa de um regex de teste escolhido apressadamente para grep ... (talvez isso seja algo que \e[Kinfluencia ...

insira a descrição da imagem aqui

Peter.O
fonte
Parece bom. Seria ótimo se houvesse uma ferramenta menor para esta tarefa (o emacs leva ~ 100 MB).
Grzegorz Wierzowiecki 8/08
1

Para aqueles que possuem um comando que está escrito no pressuposto de que a saída canalizada nunca terá cores (por exemplo, algumas estruturas de teste), pode ser útil usar o utilitário de script para salvar primeiro a saída ansi. Isso pode ser enviado ahaha ou aos outros utilitários mencionados.

Andrew Stretton
fonte
1

Este é apenas um acompanhamento da solução @ user17591 - script vim :

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

chmod e

Uso: htmlvim file(para produzir file.html)

JJoao
fonte