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.
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:
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.