ANSI-uitvoer
Stel lang in op 'ansi' om terminaluitvoer — tekst met ANSI-escapesequenties — te markeren in plaats van deze met een grammatica te tokeniseren. shikiphp verwerkt de escape-codes en kleurt de tekst met het ANSI-palet van het thema. Het is een port van de tokenizer van Shiki's lang: 'ansi'; vier oracle-scenario's controleren de HTML ervan aan de hand van Shiki 3.23.0.
use Shikiphp\Shikiphp;
echo Shikiphp::codeToHtml("\e[31merror\e[0m: something broke", [
'lang' => 'ansi',
'theme' => 'github-dark',
]);
Dit is de natuurlijke manier om vastgelegde CLI-uitvoer — testrunners, buildlogs, git-uitvoer — weer te geven met behoud van de oorspronkelijke kleuren. De escapesequenties worden uit de uitvoer verwijderd; alleen de tekst blijft over, omgeven door gekleurde spans.
Let op de string PHP met dubbele aanhalingstekens: "\e" is het escape-teken. Wanneer u uitvoer weergeeft die van een proces is vastgelegd (bijvoorbeeld met shell_exec of proc_open), staan de escape-tekens al in de string.
Wat het herkent
De tokenizer leest SGR-sequenties (Select Graphic Rendition), ESC [ … m, met een willekeurig aantal codes gescheiden door ;:
| Codes | Effect |
|---|---|
0 |
alle kleuren en kenmerken resetten |
1, 3, 4, 9 |
vet, cursief, onderstrepen, doorhalen |
2 |
gedimd: de voorgrond wordt met halve dekking getekend |
7 |
omgekeerd: voor- en achtergrond worden verwisseld |
21, 23, 24, 27, 29 |
het overeenkomende kenmerk uitschakelen |
22 |
normale intensiteit: schakelt gedimd en vet uit |
30–37, 90–97 |
voorgrond: de 8 standaardkleuren en 8 heldere kleuren |
40–47, 100–107 |
achtergrond: de 8 standaardkleuren en 8 heldere kleuren |
38;5;n, 48;5;n |
voorgrond of achtergrond uit de tabel met 256 kleuren |
38;2;r;g;b, 48;2;r;g;b |
24-bits truecolor-voorgrond of -achtergrond |
39, 49 |
standaardvoorgrond of -achtergrond |
Verborgen (8) en overline (53) worden verwerkt maar veranderen de uitvoer niet; andere codes worden genegeerd. Stijlen blijven van kracht over regeleinden heen totdat ze worden gereset, zoals in een terminal.
Kleuren
De 16 benoemde kleuren komen uit de terminal.ansi*-kleuren van het thema (terminal.ansiRed, terminal.ansiBrightBlue enzovoort). Als een thema er geen definieert, wordt het standaardpalet van VS Code gebruikt (#cd3131 voor rood, #2472C8 voor blauw enzovoort). Tekst waarvoor geen kleur is ingesteld, gebruikt de voorgrondkleur van het thema; de blokachtergrond is de achtergrondkleur van het thema, net als bij grammaticagebaseerde markering. In de tabel met 256 kleuren zijn de vermeldingen 0–15 dezelfde 16 benoemde kleuren; de vermeldingen 16–255 (de 6×6×6-kleurkubus en de grijstintenreeks) en truecolorwaarden zijn niet afhankelijk van het thema.
colorReplacements zijn ook van toepassing op ANSI-kleuren.
Dubbele thema's
ANSI houdt zich aan de map themes, net als grammaticagebaseerde markering, en genereert varianten met CSS voor de niet-standaardthema's:
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'],
]);
Elke benoemde kleur wordt bepaald aan de hand van het eigen palet van elk thema, dus rood kan in het lichte en het donkere thema verschillen.
Geen grammaticastatus
Omdat ANSI geen TextMate-grammatica gebruikt, is er geen grammaticastatus om te behouden. getLastGrammarState genereert een fout voor lang: 'ansi' en codeToTokensResult retourneert een null grammarState.