Siirry sisältöön

shikiphp

shikiphp on puhdas-PHP-porttaus lähteestä Shiki, syntaksikorostimesta, joka värittää koodin samoilla TextMate-kieliopilla ja teemoilla kuin VS Code. Se pilkkoo koodin samoilla TextMate-kieliopilla ja värittää sen samoilla VS Code-teemoilla, joita Shiki käyttää, tuottaen saman HTMLn kuin Shiki 3.23.0 — kokonaan ympäristössä PHP.

Ei Node-ympäristöä. Ei muita json-laajennuksia kuin PHP ja mbstring. Ei natiivia Oniguruma-sidosta. Ei ulkoisen JavaScript-prosessin käynnistämistä eikä isännöityä API-palvelua.

PHP
use Shikiphp\Shikiphp;

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

Miksi shikiphp

Palvelimella renderöity syntaksikorostus ympäristössä PHP tarkoittaa yleensä jotakin kolmesta kompromissista: Node-prosessin käynnistämistä, isännöidyn API-palvelun kutsumista tai tyytymistä säännöllisiin lausekkeisiin perustuvaan korostimeen, joka ei oikeasti ymmärrä kieltä. Mikään näistä ei sovi hyvin ympäristöön Laravel, WordPress tai staattisen sivuston koontivaiheeseen.

shikiphp poistaa kompromissin porttaamalla lähteen Shiki todellisen käsittelyketjun ympäristöön PHP:

  • TextMate-kieliopin jäsennin (uskollinen porttaus lähteestä vscode-textmate), joka tukee upotettuja kieliä, injektioita ja sisäkkäisiä repositorioita
  • VS Code-teemojen selvitys laajuusvalitsimen tarkkuuden ja ylälaajuuden täsmäytyksen perusteella
  • Shiki-yhteensopiva HTML: vaaleat ja tummat teemat CSS-muuttujilla, codeToHast, muuntimet (kaikki koukut), koristeet, colorReplacements, structure: 'inline' ja ANSI-korostus (lang: 'ansi')
  • koko Shiki-paketti — kaikki tm-grammars kielet (235 sekä 18 niiden upottamaa apukielioppia) ja kaikki tm-themes teemaa (65)

Vastaavuus lähteen Shiki 3.23.0 kanssa

Tuloste ei ole vain ”riittävän lähellä”, vaan se tarkistetaan lukittua Shiki-julkaisua vasten.

Paketti Versio Käyttötarkoitus
shiki 3.23.0 vertailukohta, suoritetaan sen JavaScript-säännöllisten lausekkeiden moottorilla
tm-grammars 1.31.15 mukana toimitetut kieliopit
tm-themes 1.12.2 mukana toimitetut teemat
@shikijs/transformers 4.2.0 muuntimien vastaavuustestit

Shiki itse toimii vertailukohtana. Regressiotestien aineistossa on 214 skenaariota. Kukin niistä on yhdellä kielellä ja yhdellä teemalla korostettu näyte oletusasetuksilla. Sekä Shiki että shikiphp korostavat jokaisen skenaarion, ja tuloksena syntyvien HTML-merkkijonojen on oltava samat, kun alun ja lopun tyhjemerkit on poistettu. Skenaariot kattavat yhdessä 167 253-paketin kieliopista, lang: 'ansi' ja kaikki 65 teemaa. Asetukset (structure, tabindex, colorReplacements, kahden teeman tila, defaultColor ja muut), codeToTokensWithThemes sekä sisäänrakennetut muuntimet käydään läpi erillisissä vastaavuustesteissä, joiden odotetut tulosteet tallennettiin samoista Shiki-versioista.

Tästä seuraa kaksi rajoitusta. Shikin oletusmoottori on Oniguruma, joka on käännetty WebAssemblyksi. Vertailukohta käyttää sen sijaan Shikin JavaScript-säännöllisten lausekkeiden moottoria, jota shikiphp porttaa. Myöskään myöhempiä Shiki-julkaisuja (4.x-sarjaa) ei ole tarkistettu.

Näin se toimii

shikiphp perustuu vendoroituun, puhtaasti PHP-kielellä toteutettuun JavaScript-regex-moottoriin, joka on peräisin lähteestä inline0/phasis ja käyttää syötteenä PHP-porttausta lähteestä oniguruma-to-es. Shiki:n JavaScript-regex-moottori muuntaa TextMate-kielioppien Oniguruma-mallit JavaScript RegExp-muotoon, joten JS-regex-moottori on luonteva perusta: sen avulla shikiphp voi täsmätä moottorin tulokseen tavu tavulta.

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

Katso koko käsittelyketju kohdasta Arkkitehtuuri.

Vaatimukset

  • PHP 8.2 tai uudempi (CI suorittaa testisarjan versiolla PHP 8.4)
  • ext-json ja ext-mbstring (sisältyvät lähes kaikkiin PHP-koontiversioihin)

Seuraavaksi

  • Aloitus — asenna työkalu ja luo ensimmäinen lohkosi.
  • API — kaikki käytettävissä olevat metodit.
  • Valinnat — kaikki asetukset, jotka codeToHtml hyväksyy.
  • Muuntimet — koukkukäsittelyketju ja sisäänrakennetut muuntimet.
  • CLI — bin/shikiphp highlight, langs ja themes.

Lisenssi

MIT, tekijänoikeudet inline0. Mukana toimitettujen TextMate-kielioppien ja teemojen alkuperäiset lisenssit säilyvät voimassa.