ShikiPHP
Resaltador de sintaxis puro en PHP, trasladado de Shiki. Da estilo a los bloques de código con temas VS Code y gramáticas TextMate sin Node; la salida coincide con Shiki 3.23.0 en los 214 escenarios de referencia.
composer require shikiphp/shikiphpÚltima versión v0.1.0 MIT PHP 8.2+, ext-json, ext-mbstring
use Shikiphp\Shikiphp;
echo Shikiphp::codeToHtml("\e[31merror\e[0m: something broke", [
'lang' => 'ansi',
'theme' => 'github-dark',
]);En la práctica
Resalta un fragmento de una plantilla o script de compilación PHP e imprime el HTML que devuelve.
Una llamada por bloque de código
Shikiphp::codeToHtml recibe el código, un ID de lenguaje y un ID de tema. Devuelve un bloque pre completo con los colores en línea, listo para mostrarse sin una hoja de estilos adicional.
Pasa un mapa themes en lugar de theme y el mismo bloque incluirá los colores claro y oscuro mediante variables CSS.
use Shikiphp\Shikiphp;
echo Shikiphp::codeToHtml(<<<'PHP'
<?php
function greet(string $name): string {
return "Hello, {$name}!";
}
PHP, [
'lang' => 'php',
'theme' => 'github-dark',
]);use Shikiphp\Shikiphp;
$code = 'const answer: number = 42';
echo Shikiphp::codeToHtml($code, [
'lang' => 'ts',
'themes' => ['light' => 'github-light', 'dark' => 'github-dark'],
]);Gramáticas TextMate reales
Un traslado fiel de vscode-textmate: lenguajes integrados, inyecciones y repositorios anidados. Usa las mismas gramáticas con las que tokenizan Shiki y VS Code.
Temas VS Code
Especificidad de selectores de ámbito y coincidencia de ámbitos principales, trasladadas de vscode-textmate. Un tema o temas claro/oscuro duales mediante variables CSS.
Salida idéntica a Shiki
En 214 escenarios de referencia, que abarcan 167 de las 253 gramáticas incluidas, ANSI y los 65 temas, la salida coincide con HTML de Shiki 3.23.0 con su motor de expresiones regulares JavaScript, salvo por los espacios en blanco iniciales y finales.
Motor de expresiones regulares puro en PHP
Motor RegExp de JavaScript incluido directamente desde inline0/phasis y alimentado por un traslado de oniguruma-to-es. El motor de expresiones regulares JavaScript de Shiki sigue la misma ruta de Oniguruma a RegExp.
Transformadores
Todos los hooks de Shiki (preprocess, tokens, root, pre, code, line, span, postprocess), más los transformadores integrados de notación, metadatos y espacios en blanco.
El paquete completo
Incluye todos los lenguajes tm-grammars (235, más 18 gramáticas auxiliares) y todos los temas tm-themes (65). Incluye salida de terminal ANSI, decoraciones y sustituciones de color.
CLI
Resalta un archivo en HTML o muestra los lenguajes y temas incluidos directamente desde la línea de comandos con bin/shikiphp.
Sin Node
Funciona con PHP 8.2+ solo con ext-json y ext-mbstring. Sin entorno de ejecución de Node, enlace nativo Oniguruma ni llamadas a la shell.
Por qué ShikiPHP
Se ejecuta donde se ejecuta PHP
El resaltado se realiza dentro del proceso de PHP, sin ejecutar Node desde la shell ni llamar a un API alojado. Ideal para Laravel, WordPress o como paso de compilación de un sitio estático.
Salida que se puede almacenar en caché
El mismo código con las mismas opciones siempre produce el mismo HTML. Resalta durante la compilación o guarda en caché el HTML con una clave basada en el código y las opciones hasta que cambie el código fuente.
Un bloque para claro y oscuro
Un mapa de temas escribe el segundo tema como variables CSS en el mismo marcado, y unas pocas líneas de CSS permiten activarlo. La opción defaultColor determina qué tema se escribe en línea.
Límites para entradas no fiables
El motor de expresiones regulares memoriza los fallos y protege contra ReDoS, así que un patrón problemático ralentiza el proceso en lugar de bloquearlo. La opción tokenizeMaxLineLength emite las líneas demasiado largas como un único token sin formato.
Comparación con
Otras formas de resaltar código para un sitio PHP y en qué se diferencia ShikiPHP.
| Herramienta | Ideal para | Diferencia con ShikiPHP |
|---|---|---|
| Shiki | Ideal paraLa implementación de referencia en JavaScript. Funciona en cualquier entorno de ejecución JavaScript moderno sin API de Node.js, carga gramáticas y temas bajo demanda e incluye integraciones Twoslash de TypeScript. | Diferencia con ShikiPHPShikiPHP traslada ese flujo a PHP para páginas renderizadas en un servidor PHP. Su banco de pruebas de referencia compara su HTML con Shiki 3.23.0, mientras que la rama principal de Shiki ya ha avanzado a v4. |
| Phiki | Ideal paraUn resaltador PHP que también usa gramáticas TextMate y temas VS Code. Incluye una extensión league/commonmark compatible con Str::markdown de Laravel, salida para terminal y un ejecutable de línea de comandos. | Diferencia con ShikiPHPPhiki describe su tokenizador como inspirado en vscode-textmate, pero no como una traducción 1-1. ShikiPHP traslada vscode-textmate y oniguruma-to-es, y prueba su HTML comparándolo con la salida de Shiki en 214 escenarios de referencia. |
| highlight.php | Ideal paraUn traslado PHP de highlight.js para el servidor que admite lenguajes 185 con las definiciones originales de lenguaje y estilo, y puede detectar el lenguaje automáticamente. | Diferencia con ShikiPHPShikiPHP tokeniza con gramáticas TextMate y aplica colores con temas VS Code, los mismos archivos que usa Shiki. En cada llamada hay que indicar el lenguaje. |
| Torchlight | Ideal paraUn servicio de resaltado compatible con VS Code. Es un HTTP API con anotaciones en comentarios para resaltar, enfocar y mostrar diferencias; ofrece clientes propios para Laravel, CommonMark, Statamic y otras plataformas. | Diferencia con ShikiPHPShikiPHP se ejecuta dentro del proceso de PHP, sin API alojado. Sus transformadores de notación integrados procesan comentarios similares para resaltar líneas, enfocarlas y mostrar diferencias. |
Preguntas y respuestas
Respuestas breves de la documentación de ShikiPHP.
Pasa un mapa de temas con entradas claras y oscuras. Los colores claros se escriben en línea y los oscuros como variables --shiki-dark, que activa una regla CSS breve aplicada a html.dark .shiki. Define defaultColor en false para emitir solo variables.
Todas las gramáticas de tm-grammars 1.31.15, los lenguajes 235 más 18 gramáticas auxiliares, y los 65 temas de tm-themes. Ejecuta vendor/bin/shikiphp langs o vendor/bin/shikiphp themes para ver los ID, o llama a bundledLanguages() y bundledThemes() en el resaltador.
Sí. Decodifica el archivo .tmLanguage.json y regístralo con loadGrammar, indicando un ID y alias opcionales, o registra un tema VS Code con loadTheme. Registra antes cualquier gramática que incluya o integre.
El motor de expresiones regulares memoriza los fallos y protege contra ReDoS, así que un patrón problemático ralentiza el proceso en lugar de bloquearlo. Define tokenizeMaxLineLength para emitir un único token sin formato para cualquier línea que alcance o supere esa longitud.
La documentación lo desaconseja. Resalta durante la compilación para páginas estáticas o guarda en caché el HTML renderizado con una clave basada en el código y las opciones. Dentro de un proceso, reutiliza un solo resaltador; la fachada Shikiphp lo hace por ti.
El banco de pruebas de referencia compara el HTML de ShikiPHP con Shiki 3.23.0 usando el motor de expresiones regulares JavaScript de Shiki. Sus 214 escenarios abarcan 167 de las 253 gramáticas incluidas, ANSI y los 65 temas; las opciones y los transformadores integrados también cuentan con pruebas de equivalencia.
Empieza con la guía de primeros pasos y añade transformadores, gramáticas personalizadas o salida ANSI cuando tus páginas lo necesiten.