Preskoči na vsebino

shikiphp

shikiphp je čista vrata PHP za označevalnik sintakse Shiki, ki obarva kodo z enakimi slovnicami TextMate in temami kot VS Code. Kodo razčleni na žetone z enakimi slovnicami TextMate in jo obarva z enakimi temami VS Code, ki jih uporablja Shiki, ter ustvari enak HTML kot Shiki 3.23.0 — v celoti v PHP.

Brez izvajalnega okolja Node. Brez razširitev PHP razen json in mbstring. Brez izvorne vezave Oniguruma. Brez zaganjanja zunanjega procesa JavaScript in brez gostovanega API.

PHP
use Shikiphp\Shikiphp;

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

Zakaj shikiphp

Označevanje sintakse na strežniku v PHP običajno zahteva enega od treh kompromisov: zagon Node, klic gostovanega API ali zadovoljitev z označevalnikom na podlagi regularnih izrazov, ki jezika v resnici ne razume. Nobena od teh možnosti se dobro ne prilega gradnji za Laravel, WordPress ali statično spletno mesto.

shikiphp odpravi kompromis tako, da dejanski cevovod iz Shiki prenese v PHP:

  • tokenizator slovnice TextMate (zvest prenos vscode-textmate), vključno z vdelanimi jeziki, injekcijami in ugnezdenimi repozitoriji
  • razreševanje tem VS Code s specifičnostjo izbirnika obsega in ujemanjem nadrejenih obsegov
  • izris Shiki, združljiv s HTML: svetle in temne teme prek spremenljivk CSS, codeToHast, pretvorniki (vse zanke), okraski, colorReplacements, structure: 'inline' in označevanje ANSI (lang: 'ansi')
  • celoten paket Shiki — vsi jeziki tm-grammars (235 in 18 pomožnih slovnic, ki jih vdelujejo) ter vseh tm-themes tem (65)

Primerjano z Shiki 3.23.0

Izhod ni »dovolj podoben«: preverjen je glede na določeno izdajo Shiki.

Paket Različica Namen uporabe
shiki 3.23.0 referenčni vir, zagnan z njegovim pogonom regularnih izrazov JavaScript
tm-grammars 1.31.15 vgrajene slovnice
tm-themes 1.12.2 vgrajene teme
@shikijs/transformers 4.2.0 testi enakovrednosti pretvornikov

Sam Shiki je referenčni vir. Preizkusno ogrodje za regresije vsebuje 214 scenarijev, v vsakem pa vzorec za en jezik in eno temo s privzetimi možnostmi. Vsak scenarij označita Shiki in shikiphp, njuna niza HTML pa morata biti enaka, ko odstranimo začetne in končne presledke. Skupaj scenariji pokrivajo 167 od 253 vgrajenih slovnic, lang: 'ansi' in vseh 65 tem. Možnosti (structure, tabindex, colorReplacements, dve temi, defaultColor in druge), codeToTokensWithThemes ter vgrajeni pretvorniki so zajeti v ločenih testih enakovrednosti; pričakovani izhod je bil zajet iz istih različic Shiki.

Iz tega sledita dve omejitvi. Privzeti pogon Shiki je Oniguruma, preveden v WebAssembly, referenčni vir pa namesto njega uporablja pogon regularnih izrazov Shiki JavaScript, ki ga prenaša shikiphp. Preverjene niso bile niti poznejše izdaje Shiki (linija 4.x).

Kako deluje

shikiphp temelji na vključenem pogonu za regularne izraze JavaScript, v celoti napisanem v PHP, iz inline0/phasis, ki ga napaja prenos oniguruma-to-es v PHP. Pogon za regularne izraze JavaScript v Shiki pretvarja vzorce Oniguruma iz slovnic TextMate v JavaScript RegExp, zato je pogon za regularne izraze JS naravna osnova: shikiphp omogoča ujemanje z izhodom tega pogona pri vsakem odmiku.

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

Za celoten potek glejte Arhitektura.

Zahteve

  • PHP 8.2 ali novejši (CI izvaja testno zbirko na PHP 8.4)
  • ext-json in ext-mbstring (priložena sta skoraj vsaki različici PHP)

Kam naprej

  • Začetek — namestite in izrišite svoj prvi blok.
  • API — celoten nabor metod.
  • Možnosti — vse možnosti, ki jih sprejema codeToHtml.
  • Transformatorji — cevovod priklopov in vgrajeni elementi.
  • CLI — bin/shikiphp highlight, langs in themes.

Licenca

MIT, avtorske pravice inline0. Priložene slovnice in teme TextMate ohranjajo svoje izvorne licence.