Liigu sisu juurde

Arhitektuur

shikiphp muudab lähtekoodi teemastatud esiletõstetud HTML-ks, kasutades TextMate grammatikat ja VS Code teemasid, ilma PHP laiendusteta peale json/mbstring, Node'i käituskeskkonna ja natiivse Oniguruma sidumiseta. See leht võtab kokku töötlusahela; kogu normatiivne leping asub hoidlas failis ARCHITECTURE.md.

Töötlusahel

Kood
source code
  └─ Highlighter::codeToTokens()
       ├─ Grammar\Registry        loads the grammar (+ its includes / embedded langs)
       ├─ Grammar\Tokenizer       line by line, driving an OnigScanner per rule state
       │     └─ Oniguruma\OnigScanner.findNextMatch()
       │           └─ Oniguruma\PatternConverter   Oniguruma pattern → JS regex
       │                 └─ Shikiphp\Regex (Parser + Matcher)   JS RegExp runtime
       ├─ Theme\Theme.match(scopeStack) → StyleAttributes   per token
       └─ Render\ThemedToken[]   (text + style) per line
  └─ Render\HtmlRenderer  → <pre class="shiki">…</pre>

Kõik toimingud kasutavad UTF-16 koodiühikute nihkeid — sama ühikuruumi nagu JS regulaaravaldiste mootor ja Shiki tokeniseerija. ASCII puhul võrdub see baidioffsetitega.

Regulaaravaldiste käituskeskkond

Aluseks on Shikiphp\Regex, täielik puhas-PHP ECMAScripti regulaaravaldiste mootor, mis on tarnitud lähtekoodist inline0/phasis (puhas-PHP JavaScript mootor). See parsib JS-RegExp-i lähtekoodi koos lippudega ja teeb edasiotsinguid Oniguruma onig_search semantikaga.

Oniguruma → JS teisendamine

TextMate grammatikad on kirjutatud Oniguruma-is. Shikiphp\Oniguruma\PatternConverter on PHP port teegist oniguruma-to-es: see teisendab Oniguruma mustri regulaaravaldiste mootorile sobivaks JS-RegExp-i lähtekoodiks ja lipustringiks. See on sama Oniguruma → RegExp-i tee, mida kasutab Shiki JavaScript regulaaravaldiste mootor; tänu sellele sobitub shikiphp selle mootori väljundiga nihke kaupa täpselt. Teisendaja käsitleb grammatikates kasutatavaid tegelikke konstruktsioone: POSIX-i klasse, ahneid kvantoreid ja aatomirühmi, tekstisiseseid lippe, nimetatud rühmi ja tagasiviiteid, Unicode omadusi ning muud.

Skanner ja selle PCRE kiirtee

Shikiphp\Oniguruma\OnigScanner jäljendab vscode-oniguruma skannerit: see koostatakse iga reegli jaoks mustrite loendist ühe korra ning leiab vasakpoolseima vaste määratud alguspositsioonil või sellest edasi.

Puumatšija on korrektne, kuid aeglane, seega on skanneril samaväärsusega kontrollitud PCRE kiirtee, millel on kaks taset. PcreTranslator kirjutab teisendaja JS lähtekoodi ümber natiivseks PCRE mustriks ainult siis, kui saab tulemuse samaväärsust tõestada:

  • Täielik vaste. Kui teisendus käitub matšijaga identselt, sealhulgas iga hõive puhul, käivitatakse muster otse PCRE abil. Sellest tasemest jäetakse välja nimetatud rühmad, tagasiviited, \p{}, \b, \G, aatomite emuleerimine ning hõived, mille JavaScript semantika erineb PCRE-st (kvantoriga rühma sees või tahavaates).
  • Ainult positsioon. Kui erineda võivad ainult hõived, lubab teine teisendus need konstruktsioonid (\b ja \B täpsete ASCII tahavaadetena, aatomirühmad natiivse (?>…)-ina, \p{…} kui PCRE suudab selle kompileerida). PCRE leiab siis ainult järgmise vaste asukoha ning matšija käivitatakse selles nihkes uuesti, et saada õiged hõived. Ka siin jäetakse tagasiviited ja \G välja.

Kõik muu käivitatakse ainult matšijaga. Paketis kaasas olevate grammatikate puhul aadressil Shiki 3.23.0 käivitatakse umbes 39% 14,234 erinevatest mustritest täielikult PCRE abil, umbes 57% kasutab positsioonitaset ja umbes 4% jääb matšija kasutada. Liigitust kontrollib hoidlas olev arendustööriist (bin/.oracle-tools/pcre-equivalence.php), mis võrdleb kiirteed matšijaga — indeksit, lõppu ja esimesel tasemel iga hõive vahemikku — stsenaariumide sisendite ning sünteetiliste stringide korral, lubamata ühtegi erinevust.

Grammatika ja teema

  • Grammatika (Shikiphp\Grammar) on teegi vscode-textmate täpne port: Registry lahendab grammatikad ulatuse nime järgi (sealhulgas include viited, põimitud keeled ja injektsioonid) ning Tokenizer haldab reeglite ja ulatuste pinusid rida-realt.
  • Teema (Shikiphp\Theme) kannab üle teegi vscode-textmate teemade sobitamise: esiplaani ja fondi laad lahendatakse ulatuse valija spetsiifilisuse ja ülemulatusse sobitamise põhjal.

Renderdamine

Shikiphp\Render\HtmlRenderer koostab täpselt sama pre.shiki > code > span.line > span HAST-puu nagu Shiki ning serialiseerib selle. Ühe teema režiimis väljastatakse lihtvärvid; kahe teema režiimis väljastatakse --shiki-light / --shiki-dark CSS muutujad.

Kontrollitud teegi Shiki alusel

Shiki ise on etalon, mis on seotud versiooniga shiki 3.23.0 ja selle JavaScript regulaaravaldiste mootoriga. scenarios/ kataloog sisaldab 214 testandmestikku, millest igaüks on üks sisend ühes keeles ja ühes kujunduses; kokku katavad need 167 253 kaasasolevast grammatikast, lang: 'ansi' ja kõik 65 kujundust. bin/test-regression tõstab igaüks esile mõlema mootoriga ja kontrollib, et HTML oleks pärast algus- ja lõputühikute eemaldamist identne. Valikuid ja teisendajaid kontrollivad pariteeditestid, mis võrdlevad väljundit sama Shiki ja @shikijs/transformers 4.2.0 põhjal jäädvustatud väljundiga. Mitte mingil juhul ei tohi esiletõstmise väljund taandareneda võrreldes versiooniga Shiki.