Pular para o conteúdo

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.

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

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

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.