ShikiPHP
Realçador de sintaxe PHP puro, implementação de Shiki. Estilize blocos de código com temas VS Code e gramáticas TextMate sem Node; a saída corresponde a Shiki 3.23.0 em cenários de referência 214.
composer require shikiphp/shikiphpVersão mais recente 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',
]);Na prática
Realce um trecho de um modelo ou script de compilação PHP e exiba o HTML retornado.
Uma chamada por bloco de código
Shikiphp::codeToHtml recebe o código, um ID de idioma e um ID de tema. Retorna um bloco pre completo, com as cores definidas inline, pronto para ser renderizado sem uma folha de estilos adicional.
Passe um mapa themes em vez de theme para que o mesmo bloco inclua cores claras e escuras por meio de variáveis 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 reais de TextMate
Implementação fiel de vscode-textmate: linguagens incorporadas, injeções e repositórios aninhados. As mesmas gramáticas que Shiki e VS Code usam para tokenizar.
Temas de VS Code
Especificidade de seletores de escopo e correspondência de escopos pais, implementadas de vscode-textmate. Tema único ou modo claro/escuro duplo via variáveis CSS.
Saída idêntica à de Shiki
Em 214 cenários de referência, que cobrem 167 das 253 gramáticas incluídas, ANSI e todos os 65 temas, o HTML coincide com o produzido por Shiki 3.23.0 usando seu motor de regex JavaScript, exceto pelos caracteres em branco iniciais e finais.
Mecanismo de regex puro em PHP
Mecanismo RegExp JavaScript incluído no pacote, de inline0/phasis, alimentado por uma implementação de oniguruma-to-es. O mecanismo de regex JavaScript de Shiki segue o mesmo caminho de Oniguruma para RegExp.
Transformadores
Todos os hooks de Shiki (preprocess, tokens, root, pre, code, line, span, postprocess), além dos transformadores integrados de notação, metadados e espaços em branco.
O pacote completo
Todas as linguagens de tm-grammars (235, mais 18 gramáticas auxiliares) e todos os temas de tm-themes (65) já vêm incluídos. Saída de terminal ANSI, decorações e colorReplacements também incluídos.
CLI
Realce um arquivo para HTML ou liste os idiomas e temas incluídos diretamente pela linha de comando com bin/shikiphp.
Sem Node
Funciona com PHP 8.2+ usando apenas ext-json e ext-mbstring. Sem ambiente de execução Node, vínculo nativo de Oniguruma ou execução de comandos externos.
Por que ShikiPHP
Executa onde seu PHP é executado
O realce ocorre dentro do processo PHP, sem executar o Node externamente nem chamar um API hospedado. É adequado para uma etapa de compilação de Laravel, WordPress ou de site estático.
Saída que pode ser armazenada em cache
O mesmo código com as mesmas opções sempre produz o mesmo HTML. Realce durante a compilação ou armazene o HTML em cache por código e opções até que a origem mude.
Um bloco para temas claro e escuro
Um mapa de temas define o segundo tema como variáveis CSS na mesma marcação, e algumas linhas de CSS ativam esse tema. A opção defaultColor escolhe qual tema é definido inline.
Limites para entradas não confiáveis
O mecanismo de regex memoriza falhas e oferece proteção contra ReDoS, fazendo com que um padrão problemático fique lento em vez de travar. A opção tokenizeMaxLineLength emite linhas longas demais como um único token simples.
Comparação com
Outras formas de realçar código em um site PHP e as diferenças de ShikiPHP.
| Ferramenta | Ideal para | Diferenças em relação a ShikiPHP |
|---|---|---|
| Shiki | Ideal paraA implementação de referência, em JavaScript. Funciona em qualquer ambiente de execução JavaScript moderno sem APIs de Node.js, carrega gramáticas e temas sob demanda e oferece integrações Twoslash TypeScript. | Diferenças em relação a ShikiPHPShikiPHP implementa esse pipeline em PHP para páginas renderizadas em um servidor PHP. Seu conjunto de testes de referência compara a saída HTML com Shiki 3.23.0, enquanto a ramificação principal de Shiki avançou para v4. |
| Phiki | Ideal paraUm realçador PHP que também usa gramáticas TextMate e temas VS Code. Inclui uma extensão league/commonmark que funciona com Str::markdown de Laravel, saída para terminal e um executável de linha de comando. | Diferenças em relação a ShikiPHPPhiki descreve seu tokenizador como inspirado em vscode-textmate, mas não como uma tradução 1-1. ShikiPHP implementa vscode-textmate e oniguruma-to-es, e testa sua saída HTML comparando-a com a saída de Shiki em cenários de referência 214. |
| highlight.php | Ideal paraUma implementação PHP no servidor de highlight.js, compatível com 185 idiomas usando as definições originais de idioma e estilo, com detecção automática do idioma. | Diferenças em relação a ShikiPHPShikiPHP tokeniza com gramáticas TextMate e aplica cores com temas VS Code, os mesmos arquivos usados por Shiki; cada chamada informa o idioma. |
| Torchlight | Ideal paraUm serviço de realce compatível com VS Code. É um HTTP API com anotações de comentário para realces, foco e diferenças, além de clientes oficiais para Laravel, CommonMark, Statamic e outras pilhas. | Diferenças em relação a ShikiPHPShikiPHP é executado dentro do seu processo PHP, sem um API hospedado. Seus transformadores de notação integrados leem comentários semelhantes para linhas realçadas, em foco e de diferenças. |
Perguntas e respostas
Respostas curtas da documentação do ShikiPHP.
Passe um mapa de temas com entradas para claro e escuro. As cores claras são definidas inline e as escuras como variáveis --shiki-dark, ativadas por uma regra CSS breve aplicada ao seletor html.dark .shiki. Defina defaultColor como false para emitir apenas variáveis.
Todas as gramáticas de tm-grammars 1.31.15, 235 idiomas e mais 18 gramáticas auxiliares, além dos 65 temas de tm-themes. Execute vendor/bin/shikiphp langs ou vendor/bin/shikiphp themes para listar os IDs, ou chame bundledLanguages() e bundledThemes() no realçador.
Sim. Decodifique o arquivo .tmLanguage.json e registre-o com loadGrammar, informando um ID e aliases opcionais, ou registre um tema VS Code com loadTheme. Registre primeiro todas as gramáticas que ele inclui ou incorpora.
O mecanismo de regex memoriza falhas e oferece proteção contra ReDoS, fazendo com que um padrão problemático fique lento em vez de travar. Defina tokenizeMaxLineLength para emitir um único token simples para qualquer linha que atinja ou ultrapasse esse limite.
A documentação desaconselha isso. Faça o destaque durante a compilação para páginas estáticas ou armazene em cache o HTML renderizado, indexado pelo código e pelas opções. Dentro de um processo, reutilize um único realçador, como a fachada Shikiphp faz por você.
O harness oracle compara o HTML de ShikiPHP com 3.23.0 Shiki usando o mecanismo de regex JavaScript de Shiki. Os cenários 214 abrangem 167 das gramáticas 253 incluídas, ANSI e todos os 65 temas; as opções e os transformadores integrados também têm seus próprios testes de paridade.
Comece pelo guia de introdução e, depois, adicione transformadores, gramáticas personalizadas ou saída ANSI quando suas páginas precisarem deles.