Treci la conținut

Ieșire ANSI

Setați lang la 'ansi' pentru a evidenția ieșirea terminalului — text care conține secvențe de escape ANSI — în loc să o tokenizați cu o gramatică. shikiphp analizează codurile de escape și colorează textul folosind paleta ANSI a temei. Este un port al tokenizerului lang: 'ansi' din Shiki, iar patru scenarii oracle îi verifică HTML în raport cu Shiki 3.23.0.

PHP
use Shikiphp\Shikiphp;

echo Shikiphp::codeToHtml("\e[31merror\e[0m: something broke", [
    'lang'  => 'ansi',
    'theme' => 'github-dark',
]);

Aceasta este modalitatea firească de a reda ieșirea CLI capturată — de la rulatoare de teste, jurnale de compilare și ieșire git — păstrând culorile originale. Secvențele de escape sunt eliminate din ieșire; rămâne doar textul, încadrat în elemente span colorate.

Observați șirul PHP între ghilimele duble: "\e" este caracterul de escape. Când redați ieșirea capturată dintr-un proces (de exemplu, cu shell_exec sau proc_open), caracterele de escape se află deja în șir.

Ce înțelege

Tokenizerul citește secvențe SGR (Select Graphic Rendition), ESC [ … m, cu orice număr de coduri separate prin ;:

Coduri Efect
0 resetează toate culorile și atributele
1, 3, 4, 9 aldine, cursive, subliniate, tăiate
2 estompare: prim-planul este redat la opacitate de 50%
7 inversare: prim-planul și fundalul își schimbă locul
21, 23, 24, 27, 29 dezactivează atributul corespunzător
22 intensitate normală: dezactivează estomparea și aldinele
30–37, 90–97 prim-plan: cele 8 culori standard și cele 8 luminoase
40–47, 100–107 fundal: cele 8 culori standard și cele 8 luminoase
38;5;n, 48;5;n prim-plan sau fundal din tabelul de 256 culori
38;2;r;g;b, 48;2;r;g;b prim-plan sau fundal în culoare reală pe 24 de biți
39, 49 prim-plan sau fundal implicit

Ascunse (8) și supraliniate (53) sunt analizate, dar nu modifică ieșirea; celelalte coduri sunt ignorate. Stilurile se păstrează la trecerea peste întreruperile de linie până când sunt resetate, ca într-un terminal.

Culori

Cele 16 culori cu nume provin din culorile terminal.ansi* ale temei (terminal.ansiRed, terminal.ansiBrightBlue și așa mai departe). Dacă o temă nu definește una dintre ele, se folosește paleta implicită VS Code (#cd3131 pentru roșu, #2472C8 pentru albastru și așa mai departe). Textul fără o culoare setată folosește culoarea de prim-plan a temei, iar fundalul blocului este cel al temei, la fel ca în evidențierea bazată pe gramatică. În tabelul de 256 culori, intrările 0–15 sunt aceleași 16 culori cu nume; intrările 16–255 (cubul de culori 6×6×6 și gradația de tonuri de gri) și valorile în culori reale nu depind de temă.

colorReplacements și se aplică și culorilor ANSI.

Teme duale

ANSI respectă maparea themes la fel ca evidențierea bazată pe gramatică, generând variante cu CSS pentru temele care nu sunt implicite:

PHP
use Shikiphp\Shikiphp;

$log = "\e[32mPASS\e[0m tests/Unit\n\e[31mFAIL\e[0m tests/Integration";

echo Shikiphp::codeToHtml($log, [
    'lang'   => 'ansi',
    'themes' => ['light' => 'github-light', 'dark' => 'github-dark'],
]);

Fiecare culoare cu nume este asociată paletei proprii a fiecărei teme, astfel încât roșul din tema luminoasă poate diferi de cel din tema întunecată.

Fără stare gramaticală

Deoarece ANSI nu folosește o gramatică TextMate, nu există o stare gramaticală de păstrat. getLastGrammarState generează o excepție pentru lang: 'ansi', iar codeToTokensResult returnează un null grammarState.