Farbausgabe in HTML konvertieren


58

Es gibt Tools für die farbige Ausgabe:

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

Die Frage ist: Wie konvertiert man die farbige Ausgabe eines beliebigen Programms in eine farbige HTML-Datei?

Andere Ausgabeformate könnten ebenfalls geeignet sein (LaTeX wäre großartig). Ich denke, HTML ist ein guter Ausgangspunkt, da es einfach ist, es in andere Formate zu konvertieren.

(Für neugierige Informationen zur Aufbewahrung der Terminal-Farbcodes folgen Sie bitte der Antwort: https://unix.stackexchange.com/a/10832/9689 ... | unbuffer command_with_colours arg1 arg2 | ... - Tool- Unbuffer ist Teil von expect. )


1
Wenn Sie dwdiff mögen, mögen Sie vielleicht auch colordiff, einen Wrapper, der die Ausgabe von diff koloriert. Ich habe seit Jahren diff = colordiff, hatte nie Probleme.
Jonathan Hartley

Antworten:


34

Die Antwort auf diese Frage ist wahrscheinlich, was Sie wollen.

Es enthält Links zu diesen Tools, mit denen Sie die gewünschte Konvertierung durchführen können:


3
ahaauch ist in Ubuntu: sudo apt install aha. Beachten Sie jedoch, dass einige Befehle Farben unterdrücken, wenn die Ausgabe eine Pipe ist. Wenn Sie also eine Ausgabe an aha senden, müssen Sie Ihren Befehlen möglicherweise Optionen hinzufügen. Für lsoder grepwäre es --color=always.
Mivk


5

Sie können vimmit dem AnsiEsc.vim- Plugin versuchen , ANSI-Farben über Escape-Codes anzuzeigen und dann zur Standardausgabe umzuleiten vim -(stellen Sie sicher, dass Sie aktiviert haben :syntax on). Dann konvertiert die Datei in HTML durch vim Befehl: :TOhtml. Die generierte HTML-Datei sollte eine farbige Ausgabe haben.


Führen Sie den folgenden Befehl aus, um den Quellcode nicht interaktiv in HTML zu konvertieren:

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

Quelle: :help g:html_no_progress(Teil von :help TOhtml).

Hinweis: Sie können -anstelle von myfile.c, verwenden, um Code aus der Standardeingabe zu konvertieren.


Das hat bei mir nicht funktioniert. Es würde helfen, wenn Sie den Befehl erklären würden.
Ken Ingram

Dieser Befehl wurde im Vim-Handbuch erklärt, überprüfen Sie ihn mit :help TOhtmloder :help g:html_no_progress.
Kenorb

Die Art und Weise, wie Sie das geschrieben haben, ist verwirrend. Verwenden Sie das Plugin AnsiEsc.vim. Aktivieren Sie es mit: syntax on, und sehen Sie dann den Text, der in der ANSI-Formatierung richtig formatiert ist? Danach speichern Sie die Datei als HTML mit: TOhtml?
Ken Ingram

1
Wenn Sie Vorschläge zur Verbesserung der Schritte haben, können Sie diese gerne verbessern.
Kenorb

2
Ich habe sie in meinem Kommentar angeboten. Wenn ich die Anleitung richtig verstanden habe. Vermutlich schlagen Sie vor, dass ich die Antwort bearbeite? Welches ist in Ordnung. Ich kann das machen.
Ken Ingram

4

Sie können vim verwenden. Dies ist Teil eines Skripts, mit dem ich Diff-Ausgaben in HTML konvertiere.

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

Danach starte ich sed, um das CSS und den Titel so zu ändern, dass sie genau so sind, wie ich sie haben möchte.

* Bearbeiten: Ich hätte erwähnen sollen, dass die Syntax-Hervorhebung aktiviert sein muss, um Farbe zu erhalten. Ich mache das in meiner .vimrc, aber wenn Sie es hier hinzufügen möchten, wäre es nur eine andere Zeile wie

-c ':syntax on' \

Okay. Wie möchten Sie also die Ausgabe eines beliebigen Programms konvertieren, sagen wir: grep?
Grzegorz Wierzowiecki

1
Ok, ich habe es zuerst nicht verstanden. Wenn Sie ANSI-Farbcodes konvertieren möchten, ist die Antwort hier wahrscheinlich die, die Sie möchten. Wenn Sie nur einen schnellen Hack benötigen, funktioniert das Erstellen eines sed-Skripts mit mehreren Zeilen, die ANSI-Codes durch HTML ersetzen. So etwas wie 's, ^ [\ [31m, <span style =' color: red '>, gs, ^ [\ [m, </ span>, g' wäre schnell und schmutzig, aber möglicherweise ausreichend.
user17591

Könnten Sie @ user17591 diesen Link als eine weitere Antwort setzen? Ich würde es gerne als Antwort auf meine Frage auswählen und Ihren Ruf verbessern.
Grzegorz Wierzowiecki

Okay. Ich habe einen direkten Link zum Perl-Modul hinzugefügt, damit jeder nachfolgende Benutzer es mit einer geringeren Indirektionsebene finden kann, aber auch einen Link zur ursprünglichen Frage / Antwort zur Attribution.
user17591

@ user17591, schöne lösung! (+1) Ich füge am Ende eine 2 Jahre alte Vimshell-Folgevariante Ihrer Lösung hinzu!
JJoao

3

ansi2html , auf pypi.

Man kann übermäßig viel Freude daran haben, wenn man die reguläre Shell-Ausgabe durch lolcat und dann durch ansi2html leitet. So etwas wie:

… | lolcat -f | ansi2html -ip

+1 für LaTeX-Ausgabe. Ich würde dir +1 für die lolcatIdee geben, aber ich bin zu beschäftigt zu lachen.
Neil Mayhew

Ja, Debians Paket ansi2html
colorized

1

Update: Ich habe eine perlMethode hinzugefügt , die das Modul HTML :: FromANSI aus CPAN verwendet . Um es zu installieren, extrahieren Sie es einfach in ein Verzeichnis und führen es als root aus: perl -MCPAN -e 'install HTML::FromANSI'aus diesem Verzeichnis. Die Besonderheit, die zu Ihrer Anfrage passt, ist ein Skript namens ansi2html. Interessanterweise zeigt es nach der Überlagerung kin den Dateinamen den gleichen Farbverlust wie das Elisp-Shell- Skript ... Hier ein Anwendungsbeispiel:

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

Hier ist die HTML-Ausgabe. wie in Firefox gesehen:

Bildbeschreibung hier eingeben


Hier ist eine Methode, die ein Emacs- Elisp-Shell-Skript verwendet ... für das Beispiel mit dem Namen htmlize ... Emacs muss nicht ausgeführt werden.

Ich habe es ursprünglich auf einem schwarzen Hintergrund getestet, aber ich habe festgestellt, dass aus irgendeinem Grund ein weißer Hintergrund nicht gut mit einem der eingeführten Escape-Codes zusammenpasst \e[K, der ERASE_LINE (Erase the current line of terminal output) zu sein scheint . Ich habe eine Zeile hinzugefügt, um diesen Escape-Code zu entfernen. Es funktioniert jetzt für einen weißen Hintergrund.

Hier ist ein Beispiel für eine Ausgabe mit farbigen Hervorhebungen ls, die grepzur weiteren farbigen Hervorhebung weitergeleitet wird.

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

Das ist das elsip-shellDrehbuch.

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

Hier ist ein Beispiel für die HTML-Ausgabe in Firefox ... Wenn ich Zeit habe, werde ich das Problem der überlagernden ANSI-Codes genauer untersuchen. wo die roten ks die grünen dateinamen überlappen, aber das liegt nur an einem hastig gewählten test regex für grep ... (vielleicht hat das etwas \e[Keinfluss ...

Bildbeschreibung hier eingeben


Klingt gut. Es wäre toll, wenn es für diese Aufgabe ein kleineres Tool gäbe (Emacs benötigt ~ 100 MB).
Grzegorz Wierzowiecki

1

Für diejenigen, die einen Befehl haben, der unter der Annahme geschrieben ist, dass die über Pipes übertragene Ausgabe niemals Farbe hat (z. B. einige Test-Frameworks), kann es nützlich sein, das Skript-Dienstprogramm zu verwenden, um zuerst die Ansi-Ausgabe zu speichern. Dies kann dann an aha oder die anderen genannten Dienstprogramme weitergeleitet werden.


1

Dies ist nur eine Fortsetzung der @ user17591-Lösung - vim scripting :

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

chmod es und

Verwendung: htmlvim file(um file.html zu erzeugen)

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.