Hoppa till innehåll

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.

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

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

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.