Gå til indhold

ANSI-output

Angiv lang til 'ansi' for at fremhæve terminaloutput — tekst, der indeholder ANSI-escape-sekvenser — i stedet for at tokenisere med en grammatik. shikiphp fortolker escape-koderne og farver teksten med temaets ANSI-palette. Det er en portering af Shikis lang: 'ansi'-tokenizer, og fire oracle-scenarier kontrollerer dens HTML mod Shiki 3.23.0.

PHP
use Shikiphp\Shikiphp;

echo Shikiphp::codeToHtml("\e[31merror\e[0m: something broke", [
    'lang'  => 'ansi',
    'theme' => 'github-dark',
]);

Dette er den naturlige måde at gengive optaget CLI-output — testkøreres og buildlogs' git-output — med de oprindelige farver bevaret. Escape-sekvenserne fjernes fra outputtet; kun teksten står tilbage, indpakket i farvede spans.

Bemærk strengen PHP med dobbelte anførselstegn: "\e" er escape-tegnet. Når du gengiver output, der er optaget fra en proces (for eksempel med shell_exec eller proc_open), er escape-tegnene allerede i strengen.

Det forstår den

Tokenizeren læser SGR-sekvenser (Select Graphic Rendition), ESC [ … m, med et vilkårligt antal koder adskilt af ;:

Koder Effekt
0 nulstil alle farver og attributter
1, 3, 4, 9 fed, kursiv, understregning, gennemstregning
2 dæmpet: forgrunden vises med halv opacitet
7 omvendt: forgrund og baggrund bytter plads
21, 23, 24, 27, 29 slå den tilsvarende attribut fra
22 normal intensitet: slår dæmpning og fed skrift fra
30–37, 90–97 forgrund: de 8 standardfarver og 8 klare farver
40–47, 100–107 baggrund: de 8 standardfarver og 8 klare farver
38;5;n, 48;5;n forgrund eller baggrund fra tabellen med 256 farver
38;2;r;g;b, 48;2;r;g;b 24-bit ægte farve for forgrund eller baggrund
39, 49 standardforgrund eller -baggrund

Skjult (8) og overstregning (53) fortolkes, men ændrer ikke outputtet, og andre koder ignoreres. Typografier fortsætter på tværs af linjeskift, indtil de nulstilles, som i en terminal.

Farver

De 16 navngivne farver kommer fra temaets terminal.ansi*-farver (terminal.ansiRed, terminal.ansiBrightBlue osv.). Hvis et tema ikke definerer en farve, bruges standardpaletten fra VS Code (#cd3131 for rød, #2472C8 for blå osv.). Tekst uden angivet farve bruger temaets forgrund, og blokkens baggrund er temaets baggrund, som ved grammatikbaseret fremhævning. I tabellen med 256 farver er posterne 0–15 de samme 16 navngivne farver; posterne 16–255 (farvekubussen på 6×6×6 og gråtoneskalaen) og ægte farveværdier afhænger ikke af temaet.

colorReplacements gælder også ANSI-farver.

Dobbelte temaer

ANSI følger themes-tilknytningen ligesom grammatikbaseret fremhævning og udsender varianter med CSS-variabler for temaer, der ikke er standardtemaet:

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

Hver navngiven farve slås op i hvert temas egen palette, så rød i det lyse tema kan have en anden farve end rød i det mørke tema.

Ingen grammatiktilstand

Da ANSI ikke bruger en grammatik af typen TextMate, er der ingen grammatiktilstand at videreføre. getLastGrammarState kaster en fejl for lang: 'ansi', og codeToTokensResult returnerer en null grammarState.