Přejít k obsahu

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.

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

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