การแปลงเอาต์พุตสีเป็น 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 | ...เครื่องมือunbufferเป็นส่วนหนึ่งของความคาดหวัง )


1
ถ้าคุณชอบ dwdiff คุณอาจชอบ colordiff เสื้อคลุมที่ทำให้เอาท์พุตของ diff ต่างกัน ฉันใช้นามแฝง diff = colordiff มานานหลายปีไม่เคยมีปัญหาใด ๆ
Jonathan Hartley

คำตอบ:


34

คำตอบสำหรับคำถามนี้อาจเป็นสิ่งที่คุณต้องการ

มันเชื่อมโยงไปยังเครื่องมือเหล่านี้ซึ่งทำการแปลงที่คุณต้องการ:


3
ahasudo 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


ยินดีต้อนรับสู่ 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แปลงรหัสจากอินพุตมาตรฐาน


สิ่งนี้ไม่ได้ผลสำหรับฉัน มันจะช่วยถ้าคุณจะอธิบายคำสั่ง
เคนอินแกรม

คำสั่งนี้จะได้รับการอธิบายในคู่มือการกลุ่มตรวจสอบโดยหรือ:help TOhtml :help g:html_no_progress
kenorb

วิธีที่คุณเขียนนั้นทำให้เกิดความสับสน ใช้ปลั๊กอิน AnsiEsc.vim เปิดใช้งานด้วย: เปิดไวยากรณ์แล้วคุณจะเห็นข้อความในสไตล์การจัดรูปแบบ ANSI อย่างถูกต้องหรือไม่ หลังจากนั้นให้บันทึกไฟล์เป็น html โดยใช้: TOhtml
เคนอินแกรม

1
หากคุณมีข้อเสนอแนะเกี่ยวกับวิธีการปรับปรุงขั้นตอนโปรดอย่าลังเลที่จะปรับปรุง
kenorb

2
ฉันเสนอพวกเขาในความคิดเห็นของฉัน ถ้าฉันเข้าใจคำแนะนำอย่างถูกต้อง ฉันเดาว่าคุณแนะนำให้ฉันแก้ไขคำตอบ? ซึ่งเป็นเรื่องปกติ ฉันทำได้
Ken Ingram

4

คุณสามารถใช้เป็นกลุ่ม นี่เป็นส่วนหนึ่งของสคริปต์ที่ฉันใช้ในการแปลงเอาต์พุต 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

หลังจากนี้ฉันก็ทำงานเพื่อเปลี่ยน CSS และชื่อให้ตรงกับที่ฉันต้องการ

* แก้ไข: ฉันควรได้กล่าวว่าเพื่อให้ได้สีคุณต้องเปิดใช้งานการเน้นไวยากรณ์ ฉันทำเช่นนั้นใน. vimrc ของฉัน แต่ถ้าคุณต้องการเพิ่มที่นี่มันจะเป็นอีกบรรทัดเหมือนกัน

-c ':syntax on' \

ตกลง. ดังนั้นคุณต้องการแปลงผลลัพธ์ของโปรแกรมที่กำหนดเองได้อย่างไร: grep
Grzegorz Wierzowiecki

1
โอเคฉันไม่เข้าใจในตอนแรก ถ้าคุณต้องการแปลงรหัสสี ANSI คำตอบที่นี่น่าจะเป็นสิ่งที่คุณต้องการ หากคุณต้องการแฮ็คด่วนคุณก็สามารถสร้างสคริปต์ที่มีบรรทัดจำนวนหนึ่งซึ่งแทนที่รหัส ANSI ด้วย HTML ได้ บางสิ่งเช่น 's, ^ [\ [31m, <span style =' color: red '>, gs, ^ [\ [m, </span>, g' จะรวดเร็วและสกปรก แต่อาจเพียงพอ
user17591

@ คุณ user17591 ใส่ลิงค์นี้เป็นคำตอบอีกข้อได้ไหม ฉันชอบที่จะเลือกมันเป็นคำตอบสำหรับคำถามของฉันและเพิ่มชื่อเสียงของคุณ
Grzegorz Wierzowiecki

ตกลง. ฉันได้เพิ่มลิงก์โดยตรงไปยังโมดูล Perl เพื่อให้ผู้ใช้รายต่อไปจะสามารถค้นหาได้โดยใช้การอ้อมน้อยกว่าหนึ่งระดับ แต่ยังลิงก์ไปยังคำถาม / คำตอบเดิมสำหรับการระบุแหล่งที่มาด้วย
user17591

@ user17591 เป็นทางออกที่ดี! (+1) ฉันเพิ่งจะเพิ่มตัวแปรติดตามผล vimshell สำหรับโซลูชันของคุณ!
JJoao

3

ansi2htmlบน pypi

หนึ่งอาจเป็นผลมาจำนวนเกินเลยของความบันเทิงจากท่อเอาท์พุทเชลล์ปกติผ่านLolcatแล้วผ่าน ansi2html สิ่งที่ต้องการ:

… | lolcat -f | ansi2html -ip

+1 สำหรับเอาต์พุต LaTeX ฉันจะให้ +1 กับคุณสำหรับlolcatความคิดเพียงอย่างเดียว แต่ฉันยุ่งเกินไปที่จะหัวเราะ
Neil Mayhew

FYI, Debian ของcolorized-บันทึกแพคเกจเข้ากันไม่ได้ติดตั้งansi2htmlไบนารีปฏิบัติการ
scruss

1

อัปเดต:ฉันได้เพิ่มperlวิธีการโดยใช้โมดูล HTML :: FromANSI จาก CPAN .. หากต้องการติดตั้งเพียงแยกไปยังไดเรกทอรีและเรียกใช้ในฐานะรูท: 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:

ป้อนคำอธิบายรูปภาพที่นี่


นี่คือวิธีการใช้สคริปต์ elisp-shell emacs ... ตัวอย่างเช่นเรียกว่าhtmlize ... Emacs ไม่จำเป็นต้องทำงาน

ฉันเดิมทดสอบบนพื้นหลังสีดำ แต่ผมสังเกตเห็นว่าด้วยเหตุผลบางพื้นหลังสีขาวไม่ได้เล่นได้ดีกับหนึ่งในรหัสหนีแนะนำ\e[Kซึ่งดูเหมือนว่าจะเป็น ERASE_LINE (ลบบรรทัดปัจจุบันของการส่งออก Terminal) ฉันได้เพิ่มบรรทัดเพื่อลบรหัสการยกเว้นนี้ ตอนนี้มันใช้งานได้สำหรับพื้นหลังสีขาว

นี่คือตัวอย่างของการแสดงสีที่ไฮไลต์จาก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 ที่ซ้อนทับ ที่สีแดงkทับซ้อนกับชื่อไฟล์สีเขียว แต่นั่นเป็นเพราะการทดสอบ regex สำหรับ grep \e[K...

ป้อนคำอธิบายรูปภาพที่นี่


เสียงดี. มันจะดีถ้ามีเครื่องมือขนาดเล็กสำหรับงานนี้ (emacs ใช้เวลา ~ 100MB)
Grzegorz Wierzowiecki

1

สำหรับผู้ที่มีคำสั่งที่เขียนบนสมมติฐานที่ว่า piped output จะไม่มีสี (เช่นกรอบการทดสอบบางอย่าง) คุณอาจพบว่ามีประโยชน์ในการใช้ยูทิลิตีสคริปต์เพื่อบันทึกเอาต์พุต 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!

chmod มันและ

การใช้งาน: htmlvim file(เพื่อผลิตไฟล์. html)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.