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