Output ANSI
Impostate lang su 'ansi' per evidenziare l’output del terminale — testo che contiene sequenze di escape ANSI — anziché analizzarlo con una grammatica. shikiphp analizza i codici di escape e colora il testo usando la palette ANSI del tema. È un port del tokenizer lang: 'ansi' di Shiki e quattro scenari oracle ne verificano HTML rispetto a Shiki 3.23.0.
use Shikiphp\Shikiphp;
echo Shikiphp::codeToHtml("\e[31merror\e[0m: something broke", [
'lang' => 'ansi',
'theme' => 'github-dark',
]);
È il modo naturale di visualizzare l’output CLI acquisito — runner di test, log di build, output git — mantenendone i colori originali. Le sequenze di escape vengono rimosse dall’output; resta solo il testo, racchiuso in span colorati.
Attenzione alla stringa PHP tra virgolette doppie: "\e" è il carattere di escape. Quando visualizzate l’output acquisito da un processo (per esempio con shell_exec o proc_open), i caratteri di escape sono già nella stringa.
Cosa comprende
Il tokenizer legge le sequenze SGR (Select Graphic Rendition), ESC [ … m, con un numero qualsiasi di codici separati da ;:
| Codici | Effetto |
|---|---|
0 |
reimposta tutti i colori e gli attributi |
1, 3, 4, 9 |
grassetto, corsivo, sottolineato, barrato |
2 |
attenuato: il primo piano viene visualizzato al 50% di opacità |
7 |
invertito: primo piano e sfondo si scambiano |
21, 23, 24, 27, 29 |
disattivano il relativo attributo |
22 |
intensità normale: disattiva attenuazione e grassetto |
30–37, 90–97 |
primo piano: gli 8 colori standard e gli 8 brillanti |
40–47, 100–107 |
sfondo: gli 8 colori standard e gli 8 brillanti |
38;5;n, 48;5;n |
primo piano o sfondo dalla tabella a 256 colori 256 |
38;2;r;g;b, 48;2;r;g;b |
colore RGB a 24 bit per primo piano o sfondo |
39, 49 |
primo piano o sfondo predefinito |
Nascosto (8) e sovralineato (53) vengono analizzati, ma non modificano l’output; gli altri codici vengono ignorati. Gli stili persistono nei cambi di riga finché non vengono reimpostati, come in un terminale.
Colori
I 16 colori con nome provengono dai colori terminal.ansi* del tema (terminal.ansiRed, terminal.ansiBrightBlue e così via). Se il tema non ne definisce uno, viene usata la palette predefinita VS Code (#cd3131 per il rosso, #2472C8 per il blu e così via). Il testo senza un colore impostato usa il colore di primo piano del tema e lo sfondo del blocco usa quello di sfondo del tema, come nell’evidenziazione basata su grammatiche. Nella tabella a 256 colori, le voci 0–15 corrispondono agli stessi 16 colori con nome; le voci 16–255 (il cubo di colori 6×6×6 e la scala di grigi) e i valori true color non dipendono dal tema.
Anche i colori ANSI vengono applicati a colorReplacements.
Temi chiari e scuri
ANSI rispetta la mappa themes proprio come l’evidenziazione basata su grammatiche, generando varianti CSS per i temi non predefiniti:
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'],
]);
Ogni colore con nome viene risolto in base alla palette specifica di ciascun tema, quindi il rosso nel tema chiaro può differire da quello nel tema scuro.
Nessuno stato della grammatica
Poiché ANSI non usa una grammatica TextMate, non c’è uno stato della grammatica da mantenere. getLastGrammarState genera un errore per lang: 'ansi', mentre codeToTokensResult restituisce un null grammarState.