Преобразование цветного вывода в HTML

58

Есть инструменты, обеспечивающие цветной вывод:

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

Вопрос в том, как преобразовать их цветной вывод произвольной программы в цветной HTML-файл?

Другие выходные форматы также могут подойти (LaTeX был бы отличным). Я думаю, что HTML является хорошей отправной точкой, так как его легко конвертировать в другие форматы.

(Любопытно, как сохранить цветовые коды терминала, пожалуйста, следуйте ответу: https://unix.stackexchange.com/a/10832/9689 ... | unbuffer command_with_colours arg1 arg2 | ... - небуферный инструмент является частью ожидаемого )

Гжегож Вежовецкий
источник
1
Если вам нравится dwdiff, вам также может понравиться colordiff, оболочка, которая окрашивает вывод diff. Я псевдоним diff = colordiff в течение многих лет, никогда не было никаких проблем.
Джонатан Хартли

Ответы:

34

Ответ на этот вопрос , вероятно, то, что вы хотите.

Он ссылается на эти инструменты, которые выполняют преобразование, которое вы ищете:

user17591
источник
3
ahaтакже доступна в Ubuntu: sudo apt install aha. Но обратите внимание, что некоторые команды будут подавлять цвета, когда вывод представляет собой канал. Поэтому при отправке вывода в aha вам может понадобиться добавить опции в ваши команды. Для lsили grepэто будет --color=always.
Mivk
19

Или просто скрипт

https://github.com/pixelb/scripts/blob/master/scripts/ansi2html.sh

Подробнее об этом скрипте http://pablomarin-garcia.blogspot.com/2011/04/converting-ansi-to-html-how-to-convert.html

Dreampuf
источник
Добро пожаловать в Unix и Linux Stack Exchange! Хотя это может теоретически ответить на вопрос, было бы предпочтительным включить здесь основные части ответа и предоставить ссылку для справки.
SLM
5

Вы можете попробовать vimс плагином AnsiEsc.vim просмотреть цвета ANSI через escape-коды, а затем перенаправить на стандартный вывод vim -(убедитесь, что вы активировали :syntax on). Затем преобразовать файл в HTML бойкости команды: :TOhtml. Сгенерированный файл HTML должен иметь цветной вывод.


Чтобы преобразовать исходный код неинтерактивно в HTML, попробуйте следующую команду:

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

Источник: :help g:html_no_progress(часть :help TOhtml).

Примечание: вы можете использовать -вместо myfile.c, для преобразования кода из стандартного ввода.

kenorb
источник
Это не сработало для меня. Было бы полезно, если бы вы объяснили команду.
Кен Ингрэм
Эта команда описана в руководстве Vim, проверьте с помощью :help TOhtmlили :help g:html_no_progress.
Кенорб
То, как ты это написал, сбивает с толку. Используйте плагин AnsiEsc.vim. Активируйте его с помощью: синтаксиса, и тогда вы сможете увидеть текст, правильно оформленный в формате ANSI? После этого сохраните файл как html, используя: TOhtml?
Кен Ингрэм
1
Если у вас есть предложения по улучшению шагов, не стесняйтесь их улучшать.
Кенорб
2
Я предложил их в своем комментарии. Если я правильно понял инструкцию. Я полагаю, вы предлагаете мне отредактировать ответ? Что хорошо. Я могу это сделать.
Кен Ингрэм
4

Вы можете использовать Vim. Это часть скрипта, который я использую для преобразования вывода diff в 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

После этого я запускаю sed, чтобы изменить CSS и заголовок так, чтобы он был именно таким, каким я его хочу.

* Изменить: я должен был упомянуть, что для получения цвета, вам нужно включить подсветку синтаксиса. Я делаю это в моем .vimrc, но если вы хотите добавить его сюда, это будет просто другая строка, как

-c ':syntax on' \
user17591
источник
Хорошо. Итак, как бы вы хотели преобразовать вывод произвольной программы, скажем, grep?
Гжегож Вежовецкий
1
Хорошо, сначала я не поняла. Если вы хотите преобразовать цветовые коды ANSI, то ответ здесь , вероятно, то, что вы хотите. Если вам просто нужен быстрый взлом, то будет работать сценарий sed с кучей строк, заменяющих коды ANSI HTML. Что-то вроде 's, ^ [\ [31m, <span style =' color: red '>, gs, ^ [\ [m, </ span>, g') будет быстрым и грязным, но, возможно, достаточным.
user17591
Не могли бы вы @ user17591 поставить эту ссылку как еще один ответ? Я хотел бы выбрать его в качестве ответа на мой вопрос и повысить вашу репутацию.
Гжегож Вежовецкий
Хорошо. Я добавил прямую ссылку на модуль Perl, чтобы любой последующий пользователь мог найти его с одним уровнем косвенности, а также ссылку на исходный вопрос / ответ для атрибуции.
user17591
@ user17591, отличное решение! (+1) Я только что закончил тем, что добавил 2-летний вариант вашего решения в vimshell!
JJoao
3

ansi2html , на pypi.

Можно получить неимоверное количество удовольствия от передачи обычной оболочки через lolcat, а затем через ansi2html. Что-то вроде:

… | lolcat -f | ansi2html -ip
scruss
источник
+1 за выход LaTeX. Я бы дал тебе +1 за lolcatодну идею, но я слишком занят, смеясь.
Нил Мэйхью
FYI, в Debian Раскрашенных-журналы пакет устанавливает несовместимый ansi2htmlдвоичный исполняемый файл
scruss
1

Обновление: я добавил perlметод, используя модуль HTML :: FromANSI из CPAN . Чтобы установить его, просто извлеките его в каталог и запустите как root: perl -MCPAN -e 'install HTML::FromANSI'из этого каталога. Особая функция для вашего запроса - это скрипт ansi2html. Интересно, что он показывает ту же потерю цвета после наложения kв именах файлов, как и сценарий elisp-shell ... Вот пример использования:

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

Вот вывод html. как видно в Firefox:

введите описание изображения здесь


Вот метод, использующий сценарий emacs- elisp-shell ... для примера, называемый htmlize ... Emacs запускать не нужно.

Первоначально я тестировал его на черном фоне, но заметил, что по какой-то причине белый фон не очень хорошо работает с одним из представленных Escape-кодов \e[K, который выглядит как ERASE_LINE ( стереть текущую строку вывода терминала) . Я добавил строку для удаления этого Escape Code. Теперь он работает на белом фоне.

Вот пример вывода цвета с выделением из lsконвейера grepдля дальнейшей цветовой подсветки.

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

это elsip-shellсценарий

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

Вот пример вывода html в Firefox ... Если у меня будет время, я рассмотрю проблему с наложением кодов ANSI. где красные ks перекрывают зеленые имена файлов, но это только там из-за спешно выбранного тестового регулярного выражения для grep ... (возможно, это что-то \e[Kвлияет ...

введите описание изображения здесь

Peter.O
источник
Звучит хорошо. Было бы здорово, если бы для этой задачи был бы меньший инструмент (emacs занимает ~ 100 МБ).
Гжегож Вежовецкий
1

Для тех, у кого есть команда, написанная в предположении, что вывод по конвейеру никогда не будет иметь цвет (например, некоторые тестовые среды), вам может оказаться полезным использовать утилиту сценария, чтобы сначала сохранить вывод ANSI. Это может быть затем передано в aha или в другие упомянутые утилиты.

Эндрю Стреттон
источник
1

Это всего лишь продолжение решения @ user17591 - скриптов vim :

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

чмод это и

Использование: htmlvim file(для создания файла .html)

JJoao
источник