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