Preskočiť na obsah

Výstup ANSI

Nastavte lang na 'ansi', aby sa zvýraznil výstup terminálu — text obsahujúci sekvencie únikov ANSI — namiesto tokenizácie pomocou gramatiky. shikiphp spracuje únikové kódy a zafarbí text podľa palety ANSI témy. Ide o port tokenizéra lang: 'ansi' v Shiki a štyri kontrolné scenáre overujú jeho HTML voči Shiki 3.23.0.

PHP
use Shikiphp\Shikiphp;

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

Toto je prirodzený spôsob vykreslenia zachyteného výstupu CLI — napríklad výstupu testovacích nástrojov, zostavovacích protokolov či výstupu git — so zachovaním pôvodných farieb. Únikové sekvencie sa z výstupu odstránia; zostane len text obalený farebnými prvkami span.

Všimnite si reťazec PHP v dvojitých úvodzovkách: "\e" je únikový znak. Pri vykresľovaní výstupu zachyteného z procesu (napríklad pomocou shell_exec alebo proc_open) sú únikové znaky už súčasťou reťazca.

Čo rozpoznáva

Tokenizér číta sekvencie SGR (Select Graphic Rendition), ESC [ … m, s ľubovoľným počtom kódov oddelených pomocou ;:

Kódy Účinok
0 obnoví predvolené farby a atribúty
1, 3, 4, 9 tučné písmo, kurzíva, podčiarknutie, prečiarknutie
2 tlmenie: popredie sa vykreslí s polovičnou nepriehľadnosťou
7 inverzia: farby popredia a pozadia sa vymenia
21, 23, 24, 27, 29 vypnú príslušný atribút
22 normálna intenzita: vypne tlmenie a tučné písmo
30–37, 90–97 farba popredia: 8 štandardných a 8 jasných farieb
40–47, 100–107 farba pozadia: 8 štandardných a 8 jasných farieb
38;5;n, 48;5;n farba popredia alebo pozadia z tabuľky 256 farieb
38;2;r;g;b, 48;2;r;g;b 24-bitová farba popredia alebo pozadia
39, 49 predvolená farba popredia alebo pozadia

Skryté (8) a nadčiarknutie (53) sa spracujú, ale výstup nezmenia; ostatné kódy sa ignorujú. Štýly sa zachovávajú aj cez zalomenia riadkov, až kým sa nevynulujú, rovnako ako v termináli.

Farby

16 pomenovaných farieb pochádza z farieb témy terminal.ansi* (terminal.ansiRed, terminal.ansiBrightBlue atď.). Ak ich téma nedefinuje, použije sa predvolená paleta VS Code (#cd3131 pre červenú, #2472C8 pre modrú atď.). Text bez nastavenej farby preberá farbu popredia témy a pozadie bloku zodpovedá pozadiu témy, rovnako ako pri zvýrazňovaní založenom na gramatike. V tabuľke farieb 256 sú položky 0–15 tých istých 16 pomenovaných farieb; položky 16–255 (farebná kocka 6×6×6 a stupnica sivej) ani hodnoty v režime true color nezávisia od témy.

colorReplacements sa vzťahujú aj na farby ANSI.

Dve témy

ANSI rešpektuje mapu themes rovnako ako zvýrazňovanie založené na gramatike a pre témy, ktoré nie sú predvolené, vypisuje varianty CSS:

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'],
]);

Každá pomenovaná farba sa určuje podľa vlastnej palety danej témy, takže červená v svetlej téme sa môže líšiť od červenej v tmavej téme.

Bez stavu gramatiky

Keďže ANSI nepoužíva gramatiku TextMate, neexistuje stav gramatiky, ktorý by bolo možné uchovať. getLastGrammarState vyvolá výnimku pre lang: 'ansi' a codeToTokensResult vráti null grammarState.