Saída ANSI
Defina lang como 'ansi' para destacar a saída do terminal — texto que contém sequências de escape ANSI — em vez de tokenizar com uma gramática. shikiphp analisa os códigos de escape e colore o texto com a paleta ANSI do tema. É uma adaptação do tokenizador lang: 'ansi' de Shiki, e quatro cenários de referência verificam seu HTML em relação a Shiki 3.23.0.
use Shikiphp\Shikiphp;
echo Shikiphp::codeToHtml("\e[31merror\e[0m: something broke", [
'lang' => 'ansi',
'theme' => 'github-dark',
]);
Esta é a forma natural de renderizar saídas CLI capturadas — de executores de testes, logs de compilação e saídas de git — preservando as cores originais. As sequências de escape são removidas da saída; somente o texto permanece, envolto em spans coloridos.
Observe a string PHP entre aspas duplas: "\e" é o caractere de escape. Ao renderizar saídas capturadas de um processo (por exemplo, com shell_exec ou proc_open), os caracteres de escape já estão na string.
O que ele entende
O tokenizador lê sequências SGR (Select Graphic Rendition), ESC [ … m, com qualquer quantidade de códigos separados por ;:
| Códigos | Efeito |
|---|---|
0 |
redefine todas as cores e atributos |
1, 3, 4, 9 |
negrito, itálico, sublinhado, tachado |
2 |
esmaecido: o primeiro plano é desenhado com metade da opacidade |
7 |
inverso: primeiro plano e plano de fundo trocam de lugar |
21, 23, 24, 27, 29 |
desativa o atributo correspondente |
22 |
intensidade normal: desativa esmaecido e negrito |
30–37, 90–97 |
primeiro plano: as 8 cores padrão e as 8 brilhantes |
40–47, 100–107 |
plano de fundo: as 8 cores padrão e as 8 brilhantes |
38;5;n, 48;5;n |
primeiro plano ou plano de fundo da tabela de 256 cores |
38;2;r;g;b, 48;2;r;g;b |
primeiro plano ou plano de fundo em cores reais de 24 bits |
39, 49 |
primeiro plano ou plano de fundo padrão |
Oculto (8) e sobrelinha (53) são analisados, mas não alteram a saída; os demais códigos são ignorados. Os estilos persistem entre quebras de linha até serem redefinidos, como em um terminal.
Cores
As 16 cores nomeadas vêm das cores terminal.ansi* do tema (terminal.ansiRed, terminal.ansiBrightBlue e assim por diante). Quando um tema não define uma delas, usa-se a paleta padrão de VS Code (#cd3131 para vermelho, #2472C8 para azul, e assim por diante). O texto sem cor definida usa a cor de primeiro plano do tema, e o plano de fundo do bloco usa o plano de fundo do tema, como no destaque baseado em gramática. Na tabela de 256 cores, as entradas de 0 a 15 são essas mesmas 16 cores nomeadas; as entradas de 16 a 255 (o cubo de cores 6×6×6 e a escala de cinza) e os valores de cores reais não dependem do tema.
colorReplacements também se aplicam às cores ANSI.
Temas duplos
ANSI respeita o mapa themes assim como o destaque baseado em gramática, emitindo variantes CSS para os temas que não são padrão:
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'],
]);
Cada cor nomeada é resolvida com base na paleta própria de cada tema, portanto, o vermelho no tema claro pode ser diferente do vermelho no tema escuro.
Sem estado de gramática
Como ANSI não usa uma gramática TextMate, não há estado de gramática a preservar. getLastGrammarState lança um erro para lang: 'ansi', e codeToTokensResult retorna um null grammarState.