ANSI-utdata
Ange lang till 'ansi' för att markera terminalutdata — text som innehåller ANSI-escape-sekvenser — i stället för att tokenisera med en grammatik. shikiphp tolkar escape-koderna och färglägger texten med temats ANSI-palett. Det är en portering av Shikis tokeniserare lang: 'ansi', och fyra oracle-scenarier kontrollerar dess HTML mot Shiki 3.23.0.
use Shikiphp\Shikiphp;
echo Shikiphp::codeToHtml("\e[31merror\e[0m: something broke", [
'lang' => 'ansi',
'theme' => 'github-dark',
]);
Det här är det naturliga sättet att återge infångade CLI-utdata — från testkörningar, byggloggar och git-utdata — med originalfärgerna bevarade. Escape-sekvenserna tas bort från utdata; bara texten återstår, omsluten av färgade spann.
Observera den dubbelt citerade PHP-strängen: "\e" är escape-tecknet. När du återger utdata som fångats från en process (till exempel med shell_exec eller proc_open) finns escape-tecknen redan i strängen.
Vad den tolkar
Tokeniseraren läser SGR-sekvenser (Select Graphic Rendition), ESC [ … m, med valfritt antal koder åtskilda av ;:
| Koder | Effekt |
|---|---|
0 |
återställer alla färger och attribut |
1, 3, 4, 9 |
fetstil, kursiv, understrykning, genomstrykning |
2 |
dämpad: förgrunden ritas med halv opacitet |
7 |
omvänd: förgrund och bakgrund byter plats |
21, 23, 24, 27, 29 |
stänger av motsvarande attribut |
22 |
normal intensitet: stänger av dämpning och fetstil |
30–37, 90–97 |
förgrund: de 8 standardfärgerna och 8 ljusa färgerna |
40–47, 100–107 |
bakgrund: de 8 standardfärgerna och 8 ljusa färgerna |
38;5;n, 48;5;n |
förgrund eller bakgrund från tabellen med 256 färger |
38;2;r;g;b, 48;2;r;g;b |
24-bitars äkta färg för förgrund eller bakgrund |
39, 49 |
standardförgrund eller standardbakgrund |
Dold (8) och överstrykning (53) tolkas men påverkar inte utdata, och andra koder ignoreras. Stilar gäller över radbrytningar tills de återställs, precis som i en terminal.
Färger
De 16 namngivna färgerna hämtas från temats terminal.ansi*-färger (terminal.ansiRed, terminal.ansiBrightBlue och så vidare). Om ett tema inte definierar en färg används standardpaletten VS Code (#cd3131 för rött, #2472C8 för blått och så vidare). Text utan angiven färg använder temats förgrundsfärg, och blockbakgrunden är temats bakgrund, precis som vid grammatiksbaserad markering. I tabellen med 256 färger är posterna 0–15 samma 16 namngivna färger; posterna 16–255 (färgkuben 6×6×6 och gråskalegradienten) samt färgvärden i sann färg beror inte på temat.
colorReplacements gäller även ANSI-färger.
Dubbla teman
ANSI följer mappningen themes precis som grammatiksbaserad markering och ger ut temavariansen CSS för andra teman än standardtemat:
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'],
]);
Varje namngiven färg slås upp i respektive temas egen palett, så rött i det ljusa temat kan skilja sig från rött i det mörka temat.
Inget grammatiktillstånd
Eftersom ANSI inte använder en grammatik av typen TextMate finns inget grammatiktillstånd att bevara. getLastGrammarState ger fel för lang: 'ansi', och codeToTokensResult returnerar ett null-grammarState.