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
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 (
\bja\Btä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\Gvä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 teegivscode-textmatetäpne port:Registrylahendab grammatikad ulatuse nime järgi (sealhulgasincludeviited, põimitud keeled ja injektsioonid) ningTokenizerhaldab reeglite ja ulatuste pinusid rida-realt. - Teema (
Shikiphp\Theme) kannab üle teegivscode-textmateteemade 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.