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