shikiphp
shikiphp on teegi Shiki puhas-PHP port: süntaksi esiletõstja värvib koodi samade TextMate grammatikate ja teemadega nagu VS Code. See tokeniseerib koodi samade TextMate grammatikatega ja värvib selle samade VS Code teemadega, mida Shiki kasutab, luues sama HTML nagu Shiki 3.23.0 — täielikult PHP-is.
Node'i käituskeskkonda pole. Peale json ja mbstring pole vaja PHP laiendusi. Natiivset Oniguruma sidumist pole. Välise JavaScript protsessi käivitamist ega majutatud API-i pole.
use Shikiphp\Shikiphp;
echo Shikiphp::codeToHtml(<<<'PHP'
<?php
function greet(string $name): string {
return "Hello, {$name}!";
}
PHP, [
'lang' => 'php',
'theme' => 'github-dark',
]);
Miks shikiphp
Serveris renderdatud süntaksi esiletõstmine PHP-is tähendab tavaliselt üht kolmest kompromissist: Node'i käivitamist, majutatud API-i kasutamist või regulaaravaldisepõhist esiletõstjat, mis keelt tegelikult ei mõista. Ükski neist ei sobi hästi Laravel, WordPress ega staatilise saidi koostamise etappi.
shikiphp kõrvaldab kompromissi, teisendades teegi Shiki tegeliku töötlusahela PHP-ile:
- TextMate grammatika tokeniseerija (teegi
vscode-textmatetäpne port), sealhulgas põimitud keeled, injektsioonid ja pesastatud hoidlad - VS Code teemalahendus koos ulatuse valija spetsiifilisuse ja ülemulatusse sobitamisega
- Shiki-iga ühilduv HTML: heledad ja tumedad teemad CSS muutujate kaudu,
codeToHast, teisendajad (kõik haagid), dekoratsioonid,colorReplacements,structure: 'inline'ja ANSI (lang: 'ansi') esiletõstmine - täielik Shiki pakett — kõik
tm-grammarskeeled (235 ja 18 abigrammatikat, mida need põimivad) ning kõiktm-themesteemad (65)
Võrreldud versioonidega Shiki 3.23.0
Väljund pole lihtsalt „piisavalt lähedane“: seda kontrollitakse kindla Shiki väljalaske alusel.
| Pakett | Versioon | Kasutus |
|---|---|---|
shiki |
3.23.0 | võrdlusalus, käivitatakse selle JavaScript regulaaravaldiste mootoriga |
tm-grammars |
1.31.15 | paketiga kaasas olevad grammatikad |
tm-themes |
1.12.2 | paketiga kaasas olevad teemad |
@shikijs/transformers |
4.2.0 | teisendajate võrdsustestid |
Shiki ise on võrdlusalus. Taandustestide komplektis on 214 stsenaariumi, igaüks ühe keele ja ühe teema näidis vaikevalikutega. Iga stsenaariumi tõstavad esile nii Shiki kui ka shikiphp ning mõlema HTML string peab olema identne pärast algus- ja lõputühikute eemaldamist. Kokku katavad stsenaariumid 167 paketiga kaasas olevast 253 grammatikast, lang: 'ansi' ja kõik 65 teemat. Valikuid (structure, tabindex, colorReplacements, kaks teemat, defaultColor ja muud), codeToTokensWithThemes ning sisseehitatud teisendajaid kontrollitakse eraldi võrdsustestidega, mille oodatav väljund jäädvustati samadest Shiki versioonidest.
Sellest tuleneb kaks piirangut. Shiki vaikemootor on WebAssemblyks kompileeritud Oniguruma, võrdlusalus kasutab aga teegi Shiki JavaScript regulaaravaldiste mootorit — sama mootorit, millele shikiphp on port. Hilisemaid Shiki väljalaskeid (4.x haru) pole kontrollitud.
Kuidas see töötab
shikiphp põhineb tarnitaval puhtal PHP JavaScript regulaaravaldiste mootoril allikast
inline0/phasis, mida toidab PHP port allikast
oniguruma-to-es. Shiki
JavaScript regulaaravaldiste mootor teisendab TextMate grammatikates olevad Oniguruma mustrid
JavaScript RegExp-ks, seega on JS regulaaravaldiste mootor loomulik alus — see võimaldab
shikiphp-l vasteid mootori väljundiga nihke kaupa võrrelda.
code → grammar tokenizer → theme resolver → themed tokens → HTML
│
└─ OnigScanner → PatternConverter (oniguruma-to-es) → Shikiphp\Regex (JS RegExp engine)
Täielikku töövoogu kirjeldab arhitektuur.
Nõuded
- PHP 8.2 või uuem (CI käivitab testikomplekti versiooniga PHP 8.4)
ext-jsonjaext-mbstring(mõlemad on kaasas peaaegu iga PHP järguga)
Kuhu edasi
- Alustamine — paigalda ja renderda oma esimene plokk.
- API — kõik saadaolevad meetodid.
- Valikud — kõik valikud, mida
codeToHtmlaktsepteerib. - Teisendajad — konksude töövoog ja sisseehitatud teisendajad.
- CLI —
bin/shikiphp highlight,langsjathemes.
Litsents
MIT, autoriõigus inline0. Kaasasolevate TextMate grammatikate ja teemade litsentsid jäävad samaks, mis nende algsetel versioonidel.