Konwertowanie kolorowych wydruków na HTML

58

Istnieją narzędzia zapewniające kolorowe wydruki:

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

Pytanie brzmi: jak przekonwertować kolorowe wyjście dowolnego programu na kolorowy plik HTML?

Inne formaty wyjściowe również mogą być odpowiednie (LaTeX byłby świetny). Myślę, że HTML jest dobrym punktem wyjścia, ponieważ łatwo przekonwertować go na inne formaty.

(Aby dowiedzieć się, jak zachować kody kolorów terminali, postępuj zgodnie z odpowiedzią: https://unix.stackexchange.com/a/10832/9689 ... | unbuffer command_with_colours arg1 arg2 | ... - rozpakowywanie narzędzi jest częścią oczekiwań )

Grzegorz Wierzowiecki
źródło
1
Jeśli lubisz dwdiff, możesz również polubić colordiff, opakowanie, które koloruje wyjście diff. Od lat pseudonim diff = colordiff, nigdy nie miałem żadnych problemów.
Jonathan Hartley,

Odpowiedzi:

34

Odpowiedź na to pytanie jest prawdopodobnie tym, czego chcesz.

Odsyła do tych narzędzi, które dokonują konwersji, której szukasz:

użytkownik17591
źródło
3
ahaJest również dostępny w Ubuntu: sudo apt install aha. Pamiętaj jednak, że niektóre polecenia pomijają kolory, gdy wyjście jest potokiem. Wysyłając dane wyjściowe do aha, może być konieczne dodanie opcji do poleceń. Za lslub grepbyłoby --color=always.
mivk
5

Można spróbować vimz AnsiEsc.vim wtyczki aby zobaczyć kolory ANSI poprzez kody ucieczki, a następnie przekierować standardowe wyjście do vim -(upewnij się, że aktywna :syntax on). Następnie przekonwertować plik HTML poleceniem vim: :TOhtml. Wygenerowany plik HTML powinien mieć kolorowe wyjście.


Aby przekonwertować kod źródłowy nieinteraktywnie na HTML, spróbuj wykonać następujące polecenie:

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

Źródło: :help g:html_no_progress(część :help TOhtml).

Uwaga: Można użyć -zamiast myfile.cdo konwersji kodu ze standardowego wejścia.

kenorb
źródło
To mi nie zadziałało. Pomoże ci to wyjaśnić polecenie.
Ken Ingram
To polecenie zostało wyjaśnione w instrukcji Vima, sprawdź przez :help TOhtmllub :help g:html_no_progress.
kenorb
Sposób, w jaki to napisałeś, jest mylący. Użyj wtyczki AnsiEsc.vim. Aktywuj przy pomocy: składnia włączona, a następnie zobaczysz tekst poprawnie stylizowany w formacie ANSI? Następnie zapisz plik jako HTML za pomocą: TOhtml?
Ken Ingram
1
Jeśli masz jakieś sugestie, jak poprawić te kroki, możesz je ulepszyć.
kenorb
2
Zaproponowałem je w moim komentarzu. Jeśli poprawnie zrozumiałem instrukcję. Chyba sugerujesz, żebym edytował odpowiedź? Co jest w porządku Mogę to zrobić.
Ken Ingram
4

Możesz użyć vima. Jest to część skryptu, którego używam do konwersji wyjściowego pliku różnicowego na 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

Następnie uruchamiam sed, aby zmienić CSS i tytuł, aby były dokładnie takie, jakie chcę.

* Edycja: Powinienem wspomnieć, że aby uzyskać kolor, musisz włączyć podświetlanie składni. Robię to w moim .vimrc, ale jeśli chcesz go dodać tutaj, byłby to po prostu inny wiersz

-c ':syntax on' \
użytkownik17591
źródło
Dobrze. Jak więc chciałbyś przekonwertować wyjście dowolnego programu, powiedzmy: grep?
Grzegorz Wierzowiecki,
1
Ok, na początku nie zrozumiałem. Jeśli chcesz przekonwertować kody kolorów ANSI, odpowiedź tutaj prawdopodobnie jest tym, czego chcesz. Jeśli potrzebujesz tylko szybkiego włamania, zadziałałoby utworzenie skryptu sed z wiązką wierszy zastępujących kody ANSI kodem HTML. Coś w rodzaju „s, ^ [\ [31m, <span style = 'color: red'>, gs, ^ [\ [m, </span>, g '” byłoby szybkie i brudne, ale być może wystarczające.
user17591,
Czy możesz @ user17591 podać ten link jako jeszcze jedną odpowiedź? Chciałbym wybrać to jako odpowiedź na moje pytanie i poprawić twoją reputację.
Grzegorz Wierzowiecki,
Dobrze. Dodałem bezpośredni link do modułu Perla, aby każdy kolejny użytkownik mógł go znaleźć z jednym poziomem pośrednim mniejszym, ale także link do oryginalnego pytania / odpowiedzi w celu przypisania.
user17591,
@ user17591, fajne rozwiązanie! (+1) Właśnie kończę, dodając 2-letni wariant Twojego rozwiązania vimshell!
JJoao,
3

ansi2html , na pypi .

Można czerpać niezmiernie dużo przyjemności z przesyłania regularnych wyników powłoki przez lolcat, a następnie przez ansi2html. Coś jak:

… | lolcat -f | ansi2html -ip
szum
źródło
+1 dla wyjścia LaTeX. Dałbym ci +1 za lolcatsam pomysł, ale jestem zbyt zajęty śmiechem.
Neil Mayhew
fyi, pakiet ansi2html
color
1

Aktualizacja: Dodałem perlmetodę, używając modułu HTML :: FromANSI z CPAN .. Aby zainstalować, po prostu wypakuj go do katalogu i uruchom jako root: perl -MCPAN -e 'install HTML::FromANSI'z tego katalogu. Szczególną cechą odpowiadającą twojemu żądaniu jest skrypt o nazwie ansi2html. Co ciekawe, wykazuje taką samą utratę koloru po nałożeniu kw nazwach plików, jak skrypt elisp-shell ... Oto przykład użycia:

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

Oto wynik HTML. jak widać w przeglądarce Firefox:

wprowadź opis zdjęcia tutaj


Oto metoda wykorzystująca skrypt emacs elisp-shell ... na przykład o nazwie htmlize ... Emacs nie musi być uruchomiony.

Początkowo testowałem go na czarnym tle, ale zauważyłem, że z jakiegoś powodu białe tło nie gra dobrze z jednym z wprowadzonych kodów ucieczki \e[K, który wydaje się być ERASE_LINE (Usuń bieżącą linię wyjścia terminala) . Dodałem linię do usunięcia tego kodu ucieczki. Teraz działa na białym tle.

Oto przykład wyjściowego podświetlenia kolorów z lspotoku do grepdalszego podświetlania kolorów.

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

to jest elsip-shellskrypt.

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

Oto przykładowy wynik HTML w Firefoksie ... Jeśli będę mieć czas, przyjrzę się dalszemu problemowi nakładania się kodów ANSI. gdzie czerwone ks pokrywają się z zielonymi nazwami plików, ale dzieje się tak tylko z powodu pośpiesznie wybranego wyrażenia testowego dla grep ... (może to coś \e[Kwpływa na ...

wprowadź opis zdjęcia tutaj

Peter.O
źródło
Brzmi nieźle. Byłoby wspaniale, gdyby do tego zadania było mniejsze narzędzie (emacs zajmuje ~ 100 MB).
Grzegorz Wierzowiecki
1

Dla tych, którzy mają polecenie napisane przy założeniu, że dane wyjściowe w potoku nigdy nie będą miały koloru (np. Niektóre ramy testowe), może okazać się przydatne użycie narzędzia skryptowego do pierwszego zapisania danych wyjściowych ansi. Można to następnie przekazać do aha lub innych wymienionych narzędzi.

Andrew Stretton
źródło
1

To tylko kontynuacja rozwiązania @ 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 to i

Użycie: htmlvim file(do utworzenia pliku.html)

JJoao
źródło