Μετάβαση στο περιεχόμενο

shikiphp

Το shikiphp είναι μεταφορά του Shiki σε pure-PHP, του εργαλείου επισήμανσης σύνταξης που χρωματίζει κώδικα με τις ίδιες γραμματικές και τα ίδια θέματα TextMate με το VS Code. Αναλύει τον κώδικα σε token με τις ίδιες γραμματικές TextMate και τον χρωματίζει με τα ίδια θέματα VS Code που χρησιμοποιεί το Shiki, παράγοντας το ίδιο HTML με το Shiki 3.23.0 — εξ ολοκλήρου σε PHP.

Χωρίς runtime Node. Χωρίς επεκτάσεις PHP πέρα από τα json και mbstring. Χωρίς εγγενή σύνδεση Oniguruma. Χωρίς εκτέλεση εξωτερικής διεργασίας JavaScript και χωρίς φιλοξενούμενο API.

PHP
use Shikiphp\Shikiphp;

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

Γιατί shikiphp

Η επισήμανση σύνταξης κατά την απόδοση στον διακομιστή με PHP συνήθως απαιτεί έναν από τρεις συμβιβασμούς: εκτέλεση εξωτερικής διεργασίας Node, κλήση ενός φιλοξενούμενου API ή χρήση εργαλείου επισήμανσης βασισμένου σε regex που δεν κατανοεί πραγματικά τη γλώσσα. Κανένας από αυτούς δεν εντάσσεται ομαλά σε βήμα κατασκευής Laravel, WordPress ή στατικού ιστότοπου.

Το shikiphp καταργεί αυτόν τον συμβιβασμό μεταφέροντας την πραγματική ροή επεξεργασίας του Shiki στο PHP:

  • tokenizer γραμματικών TextMate (πιστή μεταφορά του vscode-textmate), με ενσωματωμένες γλώσσες, injections και εμφωλευμένα αποθετήρια
  • επίλυση θεμάτων VS Code με ειδικότητα scope selector και αντιστοίχιση γονικών scope
  • Shiki-συμβατή HTML: διπλά φωτεινά/σκοτεινά θέματα μέσω μεταβλητών CSS, codeToHast, transformers (κάθε hook), διακοσμήσεις, colorReplacements, structure: 'inline' και επισήμανση ANSI (lang: 'ansi')
  • το πλήρες bundle Shiki — όλες οι γλώσσες tm-grammars (235, μαζί με 18 βοηθητικές γραμματικές που ενσωματώνουν) και όλα τα θέματα tm-themes (65)

Αντιστοιχισμένο με Shiki 3.23.0

Η έξοδος δεν είναι «αρκετά κοντά»: ελέγχεται σε σύγκριση με μια συγκεκριμένη έκδοση Shiki.

Πακέτο Έκδοση Χρήση
shiki 3.23.0 σημείο αναφοράς, εκτελείται με τη μηχανή regex JavaScript
tm-grammars 1.31.15 ενσωματωμένες γραμματικές
tm-themes 1.12.2 ενσωματωμένα θέματα
@shikijs/transformers 4.2.0 δοκιμές ισοδυναμίας transformer

Το ίδιο το Shiki είναι το σημείο αναφοράς. Το σύστημα δοκιμών παλινδρόμησης περιλαμβάνει 214 σενάρια, καθένα με ένα δείγμα σε μία γλώσσα και ένα θέμα, με τις προεπιλεγμένες επιλογές. Κάθε σενάριο επισημαίνεται από τα Shiki και shikiphp, και οι δύο συμβολοσειρές HTML πρέπει να είναι πανομοιότυπες αφού αφαιρεθούν τα κενά στην αρχή και στο τέλος. Συνολικά, τα σενάρια καλύπτουν 167 από τις 253 ενσωματωμένες γραμματικές, το lang: 'ansi' και όλα τα 65 θέματα. Οι επιλογές (structure, tabindex, colorReplacements, διπλά θέματα, defaultColor και οι υπόλοιπες), το codeToTokensWithThemes και οι ενσωματωμένοι transformers καλύπτονται από ξεχωριστές δοκιμές ισοδυναμίας, των οποίων η αναμενόμενη έξοδος καταγράφηκε από τις ίδιες εκδόσεις Shiki.

Από αυτό προκύπτουν δύο περιορισμοί. Η προεπιλεγμένη μηχανή του Shiki είναι το Oniguruma μεταγλωττισμένο σε WebAssembly, ενώ το σημείο αναφοράς χρησιμοποιεί τη μηχανή regex JavaScript του Shiki, δηλαδή τη μηχανή που μεταφέρει το shikiphp. Επίσης, δεν έχουν ελεγχθεί μεταγενέστερες εκδόσεις Shiki (της σειράς 4.x).

Πώς λειτουργεί

Το shikiphp βασίζεται σε ενσωματωμένη μηχανή regex καθαρού PHP JavaScript από inline0/phasis, βασισμένη σε μεταφορά του PHP από oniguruma-to-es. Η μηχανή regex του Shiki JavaScript μετατρέπει τα μοτίβα Oniguruma στις γραμματικές TextMate σε JavaScript RegExp, επομένως μια μηχανή regex JS είναι η φυσική βάση — επιτρέπει στο shikiphp να αντιστοιχίζει την έξοδο της μηχανής ανά offset.

Κώδικας
code → grammar tokenizer → theme resolver → themed tokens → HTML
              │
              └─ OnigScanner → PatternConverter (oniguruma-to-es) → Shikiphp\Regex (JS RegExp engine)

Δείτε την Αρχιτεκτονική για ολόκληρη τη διαδικασία.

Απαιτήσεις

  • PHP 8.2 ή νεότερη έκδοση (το CI εκτελεί τη σουίτα δοκιμών στην PHP 8.4)
  • ext-json και ext-mbstring (περιλαμβάνονται σχεδόν σε κάθε έκδοση του PHP)

Επόμενα βήματα

  • Ξεκινώντας — εγκαταστήστε και αποδώστε το πρώτο σας block.
  • API — όλες οι διαθέσιμες μέθοδοι.
  • Επιλογές — όλες οι επιλογές που δέχεται το codeToHtml.
  • Μετασχηματιστές — η διαδικασία hooks και οι ενσωματωμένοι μετασχηματιστές.
  • CLI — bin/shikiphp highlight, langs και themes.

Άδεια χρήσης

MIT, πνευματικά δικαιώματα inline0. Οι ενσωματωμένες γραμματικές και τα θέματα TextMate διατηρούν τις άδειες χρήσης των αρχικών έργων τους.