Pular para o conteúdo

shikiphp

shikiphp é uma adaptação de Shiki escrita apenas em PHP, o realçador de sintaxe que colore código com as mesmas gramáticas TextMate e os mesmos temas de VS Code. Tokeniza o código com as mesmas gramáticas TextMate e o colore com os mesmos temas de VS Code usados por Shiki, produzindo o mesmo HTML de Shiki 3.23.0 — inteiramente em PHP.

Sem ambiente de execução Node. Sem extensões PHP além de json e mbstring. Sem vinculação nativa Oniguruma. Sem executar processos JavaScript externos nem usar um API hospedado.

PHP
use Shikiphp\Shikiphp;

echo Shikiphp::codeToHtml(<<<'PHP'
<?php
function greet(string $name): string {
    return "Hello, {$name}!";
}
PHP, [
    'lang'  => 'php',
    'theme' => 'github-dark',
]);

Por que shikiphp

O realce de sintaxe no servidor em PHP geralmente exige um de três compromissos: executar Node, chamar uma API hospedada ou se contentar com um realçador baseado em expressões regulares que não entende de fato a linguagem. Nenhuma dessas opções se encaixa bem em uma etapa de compilação de Laravel, WordPress ou de site estático.

shikiphp elimina esse compromisso ao portar o pipeline real de Shiki para PHP:

  • um tokenizador de gramática TextMate (uma adaptação fiel de vscode-textmate), incluindo idiomas incorporados, injeções e repositórios aninhados
  • resolução de temas VS Code com especificidade de seletores de escopo e correspondência de escopos pai
  • Shiki-compatível HTML: temas claro/escuro por meio de variáveis CSS, codeToHast, transformadores (todos os hooks), decorações, colorReplacements, structure: 'inline' e realce ANSI (lang: 'ansi')
  • o pacote Shiki completo — todas as linguagens tm-grammars (235, além de 18 gramáticas auxiliares incorporadas) e todos os temas tm-themes (65)

Comparado com Shiki 3.23.0

A saída não é “boa o bastante”: ela é verificada com uma versão fixa de Shiki.

Pacote Versão Uso
shiki 3.23.0 referência, executada com seu mecanismo de expressões regulares JavaScript
tm-grammars 1.31.15 gramáticas incluídas no pacote
tm-themes 1.12.2 temas incluídos no pacote
@shikijs/transformers 4.2.0 testes de equivalência dos transformadores

O próprio Shiki é a referência. O conjunto de testes de regressão contém 214 cenários, cada um com uma amostra em um idioma e um tema, usando as opções padrão. Cada cenário é realçado por Shiki e por shikiphp, e as duas strings de HTML precisam ser idênticas após a remoção dos espaços em branco iniciais e finais. Juntos, os cenários abrangem 167 das 253 gramáticas incluídas no pacote, lang: 'ansi' e todos os 65 temas. As opções (structure, tabindex, colorReplacements, temas duplos, defaultColor e as demais), codeToTokensWithThemes e os transformadores integrados são cobertos por testes separados de equivalência, cuja saída esperada foi capturada das mesmas versões de Shiki.

Isso impõe dois limites. O mecanismo padrão de Shiki é Oniguruma compilado para WebAssembly, enquanto a referência usa o mecanismo de expressões regulares JavaScript de Shiki, que é o mecanismo para o qual shikiphp faz adaptações. Além disso, versões posteriores de Shiki (a linha 4.x) ainda não foram verificadas.

Como funciona

shikiphp é baseado em um mecanismo de expressões regulares puro PHP JavaScript incluído no código-fonte de inline0/phasis, alimentado por uma adaptação PHP de oniguruma-to-es. O mecanismo de expressões regulares JavaScript de Shiki converte os padrões Oniguruma nas gramáticas TextMate em JavaScript RegExp, então um mecanismo de expressões regulares JS é a base natural — permite que shikiphp corresponda à saída desse mecanismo, deslocamento por deslocamento.

Código
code → grammar tokenizer → theme resolver → themed tokens → HTML
              │
              └─ OnigScanner → PatternConverter (oniguruma-to-es) → Shikiphp\Regex (JS RegExp engine)

Consulte Arquitetura para ver o pipeline completo.

Requisitos

  • PHP 8.2 ou posterior (a CI executa o conjunto de testes em PHP 8.4)
  • ext-json e ext-mbstring (ambos incluídos em praticamente todas as compilações de PHP)

Próximos passos

  • Primeiros passos — instale e renderize seu primeiro bloco.
  • API — todos os métodos disponíveis.
  • Opções — todas as opções aceitas por codeToHtml.
  • Transformadores — o pipeline de hooks e os recursos integrados.
  • CLI — bin/shikiphp highlight, langs e themes.

Licença

MIT, direitos autorais de inline0. As gramáticas e os temas incluídos no pacote TextMate mantêm suas licenças de origem.