ShikiPHP
Czysty PHP highlighter składni, port Shiki. Stylizuj bloki kodu za pomocą motywów VS Code i gramatyk TextMate bez Node; wynik jest zgodny z Shiki 3.23.0 w scenariuszach testowych 214.
composer require shikiphp/shikiphpNajnowsze wydanie v0.1.0 MIT PHP 8.2+, ext-json, ext-mbstring
use Shikiphp\Shikiphp;
echo Shikiphp::codeToHtml("\e[31merror\e[0m: something broke", [
'lang' => 'ansi',
'theme' => 'github-dark',
]);W praktyce
Wyróżnij fragment kodu z szablonu PHP lub skryptu kompilacji i wyświetl zwracany przez niego HTML.
Jedno wywołanie na blok kodu
Shikiphp::codeToHtml przyjmuje kod, identyfikator języka i identyfikator motywu. Zwraca kompletny blok pre z kolorami zapisanymi inline, który renderuje się bez dodatkowego arkusza stylów.
Przekaż mapę themes zamiast theme, a ten sam blok będzie zawierał jasne i ciemne kolory za pomocą zmiennych CSS.
use Shikiphp\Shikiphp;
echo Shikiphp::codeToHtml(<<<'PHP'
<?php
function greet(string $name): string {
return "Hello, {$name}!";
}
PHP, [
'lang' => 'php',
'theme' => 'github-dark',
]);use Shikiphp\Shikiphp;
$code = 'const answer: number = 42';
echo Shikiphp::codeToHtml($code, [
'lang' => 'ts',
'themes' => ['light' => 'github-light', 'dark' => 'github-dark'],
]);Prawdziwe gramatyki TextMate
Wierny port vscode-textmate: języki osadzone, wstrzyknięcia i zagnieżdżone repozytoria. Te same gramatyki, z którymi tokenizują Shiki i VS Code.
Motywy VS Code
Specyficzność selektorów zakresu i dopasowywanie zakresów nadrzędnych przeniesione z vscode-textmate. Pojedynczy motyw lub jasny i ciemny przez zmienne CSS.
Wynik identyczny z Shiki
W 214 scenariuszach testowych, obejmujących 167 z 253 dołączonych gramatyk, ANSI i wszystkie 65 motywów, wynik HTML jest zgodny z Shiki 3.23.0 używającym silnika wyrażeń regularnych JavaScript, z wyjątkiem początkowych i końcowych białych znaków.
Silnik wyrażeń regularnych w czystym PHP
Dołączony silnik RegExp JavaScript z inline0/phasis, obsługiwany przez port oniguruma-to-es. Silnik wyrażeń regularnych JavaScript w Shiki używa tej samej ścieżki Oniguruma do RegExp.
Transformery
Każdy hook Shiki (preprocess, tokens, root, pre, code, line, span, postprocess) oraz wbudowane transformery notacji, metadanych i białych znaków.
Pełny pakiet
W pakiecie znajduje się każdy język tm-grammars (235 oraz 18 gramatyk pomocniczych) i każdy motyw tm-themes (65). W zestawie są też wyjście terminalowe ANSI, dekoracje i colorReplacements.
CLI
Wyróżnij plik do HTML albo wyświetl listę dołączonych języków i motywów bezpośrednio w wierszu poleceń za pomocą bin/shikiphp.
Bez Node
Działa w wersji PHP 8.2+ i wymaga tylko ext-json oraz ext-mbstring. Bez środowiska Node, natywnego powiązania Oniguruma i uruchamiania zewnętrznych poleceń.
Dlaczego ShikiPHP
Działa tam, gdzie działa Twoje PHP
Podświetlanie odbywa się w procesie PHP, bez uruchamiania Node ani wywoływania hostowanego API. Sprawdza się w kroku kompilacji Laravel, WordPress lub witryny statycznej.
Wynik, który można buforować
Ten sam kod z tymi samymi opcjami zawsze generuje ten sam HTML. Podświetlaj podczas kompilacji albo buforuj HTML według kodu i opcji, aż do zmiany źródła.
Jeden blok dla motywu jasnego i ciemnego
Mapa motywów zapisuje kolory drugiego motywu jako zmienne CSS w tych samych znacznikach, a kilka wierszy CSS pozwala przełączyć motyw. Opcja defaultColor wybiera motyw zapisany inline.
Ograniczenia dla niezaufanych danych wejściowych
Silnik wyrażeń regularnych zapamiętuje niepowodzenia i chroni przed ReDoS, więc patologiczny wzorzec spowalnia działanie zamiast je zawieszać. Opcja tokenizeMaxLineLength emituje zbyt długie wiersze jako pojedynczy zwykły token.
W porównaniu z
Inne sposoby podświetlania kodu dla witryny PHP i różnice między nimi a ShikiPHP.
| Narzędzie | Dobre w | Różnica w porównaniu z ShikiPHP |
|---|---|---|
| Shiki | Dobre wImplementacja referencyjna w JavaScript. Działa w każdym nowoczesnym środowisku uruchomieniowym JavaScript bez interfejsów API Node.js, ładuje gramatyki i motywy na żądanie oraz oferuje integracje Twoslash TypeScript. | Różnica w porównaniu z ShikiPHPShikiPHP przenosi ten potok do PHP na potrzeby stron renderowanych na serwerze PHP. Zestaw testów oracle porównuje jego HTML z Shiki 3.23.0, podczas gdy główna gałąź Shiki przeszła już na v4. |
| Phiki | Dobre wHighlighter PHP, który również korzysta z gramatyk TextMate i motywów VS Code. Udostępnia rozszerzenie league/commonmark współpracujące z metodą Str::markdown w Laravel, wyjście terminalowe i plik binarny wiersza poleceń. | Różnica w porównaniu z ShikiPHPPhiki opisuje swój tokenizer jako inspirowany przez vscode-textmate, ale niebędący tłumaczeniem 1:1. ShikiPHP przenosi vscode-textmate i oniguruma-to-es oraz testuje swoje HTML w zestawie scenariuszy oracle 214 z wynikami Shiki. |
| highlight.php | Dobre wSerwerowy port PHP highlight.js obsługujący 185 języków z oryginalnymi definicjami języków i stylów oraz automatycznym wykrywaniem języka. | Różnica w porównaniu z ShikiPHPShikiPHP tokenizuje za pomocą gramatyk TextMate i koloruje za pomocą motywów VS Code, czyli tych samych plików, których używa Shiki; każde wywołanie wymaga podania języka. |
| Torchlight | Dobre wUsługa podświetlania zgodna z VS Code. To HTTP API z adnotacjami w komentarzach do wyróżnień, fokusowania i różnic. Ma oficjalne klienty dla Laravel, CommonMark, Statamic i innych stosów. | Różnica w porównaniu z ShikiPHPShikiPHP działa w procesie PHP, bez hostowanego API. Wbudowane transformery notacji odczytują porównywalne komentarze dla wyróżnionych, skupionych i zmienionych wierszy. |
Źródła, zaznaczone
Pytania i odpowiedzi
Krótkie odpowiedzi z dokumentacji ShikiPHP.
Przekaż mapę motywów z wpisami dla jasnego i ciemnego motywu. Jasne kolory są zapisywane inline, a ciemne jako zmienne --shiki-dark, które aktywuje krótka reguła CSS ograniczona do html.dark .shiki. Ustaw defaultColor na false, aby wygenerować tylko zmienne.
Wszystkie gramatyki z tm-grammars 1.31.15, języki 235 oraz 18 gramatyk pomocniczych, a także wszystkie 65 motywów z tm-themes. Uruchom vendor/bin/shikiphp langs lub vendor/bin/shikiphp themes, aby wyświetlić identyfikatory, albo wywołaj bundledLanguages() i bundledThemes() w highlighterze.
Tak. Odczytaj plik .tmLanguage.json i zarejestruj go za pomocą loadGrammar, podając identyfikator oraz opcjonalne aliasy, albo zarejestruj motyw VS Code za pomocą loadTheme. Najpierw zarejestruj każdą dołączoną lub osadzoną gramatykę.
Silnik wyrażeń regularnych zapamiętuje niepowodzenia i chroni przed ReDoS, więc patologiczny wzorzec spowalnia działanie zamiast je zawieszać. Ustaw tokenizeMaxLineLength, aby każdy wiersz o tej długości lub dłuższy emitować jako pojedynczy zwykły token.
Dokumentacja odradza takie podejście. Wyróżniaj kod podczas kompilacji stron statycznych albo buforuj wyrenderowany HTML według kodu i opcji. W obrębie procesu używaj ponownie jednego highlightera; fasada Shikiphp robi to za Ciebie.
Zestaw testów oracle porównuje ShikiPHP: HTML z Shiki 3.23.0, używając silnika wyrażeń regularnych JavaScript w Shiki. Scenariusze 214 obejmują 167 dołączonych gramatyk 253, ANSI i wszystkie 65 motywów; opcje i wbudowane transformery mają też własne testy zgodności.
Zacznij od przewodnika dla początkujących, a następnie dodaj transformery, własne gramatyki lub wyjście ANSI, gdy będą potrzebne na Twoich stronach.