Saltar al contenido

Salida ANSI

Establezca lang en 'ansi' para resaltar la salida del terminal —texto que contiene secuencias de escape ANSI— en lugar de analizarlo con una gramática. shikiphp analiza los códigos de escape y colorea el texto con la paleta ANSI del tema. Es una adaptación del tokenizador lang: 'ansi' de Shiki, y cuatro escenarios de referencia comprueban su HTML frente a Shiki 3.23.0.

PHP
use Shikiphp\Shikiphp;

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

Esta es la forma natural de representar la salida CLI capturada —por ejemplo, de ejecutores de pruebas, registros de compilación y salida de git— conservando sus colores originales. Las secuencias de escape se eliminan de la salida; solo queda el texto, envuelto en tramos coloreados.

Observe la cadena PHP entre comillas dobles: "\e" es el carácter de escape. Al representar la salida capturada de un proceso (por ejemplo, con shell_exec o proc_open), los caracteres de escape ya están en la cadena.

Qué reconoce

El tokenizador lee secuencias SGR (Select Graphic Rendition), ESC [ … m, con cualquier número de códigos separados por ;:

Códigos Efecto
0 restablece todos los colores y atributos
1, 3, 4, 9 negrita, cursiva, subrayado, tachado
2 atenuado: el primer plano se dibuja con la mitad de opacidad
7 inverso: se intercambian el primer plano y el fondo
21, 23, 24, 27, 29 desactiva el atributo correspondiente
22 intensidad normal: desactiva atenuado y negrita
30–37, 90–97 primer plano: los 8 colores estándar y los 8 brillantes
40–47, 100–107 fondo: los 8 colores estándar y los 8 brillantes
38;5;n, 48;5;n primer plano o fondo de la tabla de 256 colores
38;2;r;g;b, 48;2;r;g;b color verdadero de 24 bits para el primer plano o el fondo
39, 49 primer plano o fondo predeterminado

Los atributos oculto (8) y sobrerayado (53) se analizan, pero no cambian la salida; los demás códigos se ignoran. Los estilos se mantienen entre saltos de línea hasta que se restablecen, como en un terminal.

Colores

Los 16 colores con nombre proceden de los colores terminal.ansi* del tema (terminal.ansiRed, terminal.ansiBrightBlue y demás). Si el tema no define alguno, se usa la paleta predeterminada de VS Code (#cd3131 para el rojo, #2472C8 para el azul y demás). El texto sin un color asignado usa el color de primer plano del tema, y el fondo del bloque es el fondo del tema, igual que en el resaltado basado en gramáticas. En la tabla de 256 colores, las entradas 0–15 son esos mismos 16 colores con nombre; las entradas 16–255 (el cubo de colores 6×6×6 y la escala de grises) y los valores de color verdadero no dependen del tema.

colorReplacements también se aplican a los colores ANSI.

Temas duales

ANSI respeta el mapa themes igual que el resaltado basado en gramáticas, y genera variantes CSS para los temas no predeterminados:

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 color con nombre se resuelve según la paleta propia de cada tema, por lo que el rojo puede variar entre el tema claro y el oscuro.

Sin estado gramatical

Como ANSI no usa una gramática TextMate, no hay estado gramatical que conservar. getLastGrammarState genera un error con lang: 'ansi', y codeToTokensResult devuelve un null grammarState.