Výstup ANSI
Nastavte lang na 'ansi' a zvýrazníte výstup terminálu — text obsahující escape sekvence ANSI — namísto tokenizace pomocí gramatiky. shikiphp analyzuje escape kódy a obarví text podle palety ANSI daného motivu. Jde o port tokenizeru lang: 'ansi' od Shiki; čtyři ověřovací scénáře kontrolují jeho HTML vůči Shiki 3.23.0.
use Shikiphp\Shikiphp;
echo Shikiphp::codeToHtml("\e[31merror\e[0m: something broke", [
'lang' => 'ansi',
'theme' => 'github-dark',
]);
Jde o přirozený způsob vykreslení zachyceného výstupu CLI — například z testovacích nástrojů, sestavovacích protokolů nebo výstupu git — se zachováním původních barev. Escape sekvence se z výstupu odstraní; zůstane jen text obalený barevnými elementy span.
Všimněte si řetězce PHP v uvozovkách: "\e" je escape znak. Při vykreslování výstupu zachyceného z procesu (například pomocí shell_exec nebo proc_open) jsou escape znaky v řetězci už obsaženy.
Co rozpozná
Tokenizer čte sekvence SGR (Select Graphic Rendition), ESC [ … m, které obsahují libovolný počet kódů oddělených znakem ;:
| Kódy | Efekt |
|---|---|
0 |
resetuje všechny barvy a atributy |
1, 3, 4, 9 |
tučné písmo, kurzíva, podtržení, přeškrtnutí |
2 |
ztlumení: popředí se vykreslí s poloviční neprůhledností |
7 |
převrácení: popředí a pozadí si vymění barvy |
21, 23, 24, 27, 29 |
vypne odpovídající atribut |
22 |
běžná intenzita: vypne ztlumení a tučné písmo |
30–37, 90–97 |
barva popředí: 8 standardních a 8 jasných barev |
40–47, 100–107 |
barva pozadí: 8 standardních a 8 jasných barev |
38;5;n, 48;5;n |
barva popředí nebo pozadí z tabulky 256 barev |
38;2;r;g;b, 48;2;r;g;b |
24bitová barva popředí nebo pozadí |
39, 49 |
výchozí barva popředí nebo pozadí |
Skryté (8) a nadtržení (53) se analyzují, ale výstup nemění; ostatní kódy se ignorují. Styly se zachovávají přes konce řádků až do jejich resetování, stejně jako v terminálu.
Barvy
16 pojmenovaných barev pochází z barev ANSI terminal.ansi* motivu (terminal.ansiRed, terminal.ansiBrightBlue atd.). Pokud je motiv nedefinuje, použije se výchozí paleta VS Code (#cd3131 pro červenou, #2472C8 pro modrou atd.). Text bez nastavené barvy přebírá barvu popředí motivu a pozadí bloku odpovídá jeho pozadí, stejně jako při zvýraznění založeném na gramatice. V tabulce 256 barev odpovídají položky 0–15 těmto 16 pojmenovaným barvám; položky 16–255 (barevná krychle 6×6×6 a odstíny šedi) a hodnoty skutečných barev nezávisí na motivu.
colorReplacements platí také pro barvy ANSI.
Dva motivy
ANSI respektuje mapu themes stejně jako zvýrazňování založené na gramatice a pro motivy jiné než výchozí vytváří proměnné CSS:
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'],
]);
Každá pojmenovaná barva se určuje podle palety konkrétního motivu, takže červená ve světlém a tmavém motivu se může lišit.
Bez stavu gramatiky
Protože ANSI nepoužívá gramatiku TextMate, není třeba uchovávat stav gramatiky. getLastGrammarState vyvolá chybu pro lang: 'ansi' a codeToTokensResult vrací null grammarState.