Ugrás a tartalomhoz

shikiphp

A shikiphp a Shiki tisztán PHP nyelven írt portja, annak a szintaxiskiemelőnek, amely a VS Code-éval azonos TextMate nyelvtanokkal és témákkal színezi a kódot. A kódot ugyanazokkal a TextMate nyelvtanokkal tokenizálja, és ugyanazokkal a VS Code témákkal színezi, amelyeket a Shiki használ, így ugyanazt az HTML állítja elő, mint a Shiki 3.23.0 — teljes egészében PHP nyelven.

Nincs Node-futtatókörnyezet. A json és mbstring kivételével nincsenek PHP-kiterjesztések. Nincs natív Oniguruma kötés, nincs külön JavaScript folyamat indítása, és nincs hosztolt API sem.

PHP
use Shikiphp\Shikiphp;

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

Miért a shikiphp?

A szerveren végzett szintaxiskiemelés a PHP rendszerben általában három kompromisszum egyikével jár: Node indítása külön folyamatként, hosztolt API meghívása vagy egy, a nyelvet valójában nem értő, reguláris kifejezésekre épülő kiemelő használata. Ezek egyike sem illeszkedik jól a Laravel, WordPress vagy statikus webhelyet készítő buildfolyamatba.

A shikiphp úgy szünteti meg ezt a kompromisszumot, hogy a Shiki valódi feldolgozási folyamatát portolja PHP nyelvre:

  • TextMate nyelvtani tokenizer, a vscode-textmate hű portja, beágyazott nyelvekkel, injekciókkal és egymásba ágyazott tárolókkal
  • VS Code témák feloldása hatókörválasztó-specifikussággal és szülőhatókör-illesztéssel
  • Shiki-kompatibilis HTML: kettős világos/sötét témák CSS változókkal, codeToHast, transzformátorok (minden hook), díszítések, colorReplacements, structure: 'inline' és ANSI (lang: 'ansi') kiemelés
  • a teljes Shiki csomag — minden tm-grammars nyelv (235, valamint az általuk beágyazott 18 segédnyelvtan) és mind a tm-themes téma (65)

Összevetve ezzel: Shiki 3.23.0

A kimenet nem csupán „elég közeli”: egy rögzített Shiki-kiadással ellenőrizzük.

Csomag Verzió Felhasználás
shiki 3.23.0 referencia, a saját JavaScript reguláriskifejezés-motorjával futtatva
tm-grammars 1.31.15 beépített nyelvtanok
tm-themes 1.12.2 beépített témák
@shikijs/transformers 4.2.0 transzformátorok egyezőségi tesztjei

Maga a Shiki a referencia. A regressziós tesztkészlet 214 forgatókönyvet tartalmaz; mindegyik egy mintát, egy nyelvet és egy témát használ alapértelmezett beállításokkal. Minden forgatókönyvet a Shiki és a shikiphp is kiemel, és a két HTML karakterláncnak a kezdő és záró szóközök levágása után pontosan egyeznie kell. Együtt a forgatókönyvek a beépített 253 nyelvtanok 167 részét, a lang: 'ansi' nyelvet és mind a 65 témát lefedik. A beállításokat (structure, tabindex, colorReplacements, kettős témák, defaultColor és a többi), a codeToTokensWithThemes funkciót és a beépített transzformátorokat külön egyezőségi tesztek ellenőrzik; ezek elvárt kimenetét ugyanazon Shiki-verziókkal rögzítették.

Ennek két korlátja van. A Shiki alapértelmezett motorja Oniguruma WebAssemblyre fordítva, a referencia viszont a Shiki JavaScript reguláriskifejezés-motorját használja, amelyre a shikiphp portol. A későbbi Shiki-kiadásokat (a 4.x sorozatot) még nem ellenőrizték.

Működés

A shikiphp egy külső forrásból beemelt, tisztán PHP nyelvű JavaScript reguláriskifejezés-motorra épül, amelyet a inline0/phasis biztosít; bemenetét a oniguruma-to-es portja szolgáltatja PHP nyelven. A Shiki JavaScript reguláriskifejezés-motorja a TextMate nyelvtanok Oniguruma mintáit JavaScript RegExp formára alakítja, ezért a JS reguláriskifejezés-motor természetes alap: így a shikiphp kimenete pozícióról pozícióra egyeztethető ezzel a motorral.

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

A teljes feldolgozási folyamatról lásd: Architektúra.

Követelmények

  • PHP 8.2 vagy újabb (a CI a tesztcsomagot PHP 8.4 verzióval futtatja)
  • ext-json és ext-mbstring (szinte minden PHP build tartalmazza őket)

Merre tovább?

  • Első lépések — telepítse, és jelenítse meg az első blokkot.
  • API — a teljes metóduskészlet.
  • Beállítások — az összes, codeToHtml által elfogadott beállítás.
  • Transzformátorok — a hook-folyamat és a beépített elemek.
  • CLI — bin/shikiphp highlight, langs és themes.

Licenc

MIT, szerzői jog: inline0. A beépített TextMate nyelvtanokra és témákra a forrásprojektek licencei érvényesek.