본문으로 건너뛰기

ShikiPHP

순수 PHP 구문 강조기이며 Shiki을 포팅했습니다. Node 없이 VS Code 테마와 TextMate 문법으로 코드 블록의 스타일을 지정하며, 214 오라클 시나리오 전반에서 출력이 Shiki 3.23.0와 일치합니다.

터미널
composer require shikiphp/shikiphp

최신 릴리스 v0.1.0 MIT PHP 8.2+, ext-json, ext-mbstring

실제 사용

PHP 템플릿이나 빌드 스크립트의 코드 조각을 강조 표시하고, 반환되는 HTML을 출력합니다.

코드 블록마다 한 번 호출

Shikiphp::codeToHtml은 코드, 언어 ID, 테마 ID를 받습니다. 색상이 인라인으로 작성된 완전한 pre 블록을 반환하므로 추가 스타일시트 없이 렌더링됩니다.

theme 대신 themes 맵을 전달하면 같은 블록에서 CSS 변수를 통해 라이트 및 다크 색상을 모두 사용할 수 있습니다.

PHP
use Shikiphp\Shikiphp;

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

실제 TextMate 문법

vscode-textmate을 충실하게 포팅했습니다. 임베디드 언어, 인젝션, 중첩 리포지토리를 지원합니다. Shiki 및 VS Code에서 토큰화하는 문법과 동일합니다.

VS Code 테마

vscode-textmate에서 포팅한 범위 선택자의 우선순위와 상위 범위 일치 기능을 제공합니다. 단일 테마 또는 CSS 변수를 통한 라이트/다크 테마를 지원합니다.

Shiki와 동일한 출력

기본 제공 문법 253개 중 167개, ANSI 및 테마 65개 모두를 포함하는 오라클 시나리오 214개를 검증합니다. JavaScript 정규식 엔진을 사용하는 Shiki 3.23.0의 HTML과 앞뒤 공백(스페이스, 탭, 줄바꿈)을 제외하면 정확히 일치합니다.

순수 PHP 정규식 엔진

inline0/phasis의 벤더링된 JavaScript RegExp 엔진을 oniguruma-to-es 포트에서 입력받습니다. Shiki의 JavaScript 정규식 엔진도 동일한 Oniguruma에서 RegExp로 이어지는 경로를 사용합니다.

트랜스포머

모든 Shiki 훅(preprocess, tokens, root, pre, code, line, span, postprocess)과 내장 표기법, 메타 및 공백 변환기를 제공합니다.

전체 번들

모든 tm-grammars 언어(235 및 보조 문법 18개)와 tm-themes 테마(65개)가 기본 포함됩니다. ANSI 터미널 출력, 데코레이션 및 colorReplacements도 포함됩니다.

CLI

bin/shikiphp을 사용해 명령줄에서 바로 파일을 HTML로 강조 표시하거나 기본 제공 언어와 테마 목록을 확인하세요.

Node 불필요

ext-json 및 ext-mbstring만으로 PHP 8.2 이상에서 실행됩니다. Node 런타임, 네이티브 Oniguruma 바인딩, 외부 셸 명령 실행이 필요 없습니다.

ShikiPHP를 사용하는 이유

PHP가 실행되는 곳에서 실행

강조 표시는 PHP 프로세스 내에서 이루어지므로 Node를 외부에서 실행하거나 호스팅 API를 호출하지 않습니다. 따라서 Laravel, WordPress 또는 정적 사이트 빌드 단계에 적합합니다.

캐시 가능한 출력

같은 옵션으로 같은 코드를 처리하면 항상 동일한 HTML가 생성됩니다. 빌드 시 강조 표시하거나 소스가 변경될 때까지 코드와 옵션을 키로 HTML를 캐시할 수 있습니다.

라이트와 다크에 하나의 블록

테마 맵은 같은 마크업에 두 번째 테마를 CSS 변수로 작성하며, 몇 줄의 CSS로 해당 테마를 활성화합니다. defaultColor 옵션으로 인라인에 작성할 테마를 선택할 수 있습니다.

신뢰할 수 없는 입력을 위한 제한

정규식 엔진은 실패를 메모이즈하고 ReDoS를 방지하므로, 병적인 패턴이 멈춤을 유발하지 않고 성능 저하로 이어집니다. tokenizeMaxLineLength 옵션은 길이 제한을 초과하는 줄을 하나의 일반 토큰으로 출력합니다.

비교 대상

PHP 사이트에서 코드를 강조 표시하는 다른 방법과 ShikiPHP의 차이점입니다.

ShikiPHP와 다른 도구 비교
Shiki 잘하는 점참조 구현은 JavaScript에 있습니다. 최신 JavaScript 런타임이면 Node.js API 없이 어디서나 작동하며, 문법과 테마를 필요할 때 불러오고 TypeScript Twoslash 통합 기능을 제공합니다. ShikiPHP와의 차이점ShikiPHP은 해당 파이프라인을 PHP로 포팅해 PHP 서버에서 렌더링되는 페이지에 사용합니다. 오라클 하네스는 HTML을 Shiki 3.23.0와 비교하며, Shiki의 메인 브랜치는 v4로 넘어갔습니다.
Phiki 잘하는 점PHP 기반 구문 강조기로 TextMate 문법과 VS Code 테마도 사용합니다. league/commonmark 확장 기능을 제공하며, Laravel의 Str::markdown, 터미널 출력 및 명령줄 바이너리와 함께 작동합니다. ShikiPHP와의 차이점Phiki는 토크나이저가 vscode-textmate에서 영감을 받았지만 1:1 번역은 아니라고 설명합니다. ShikiPHP은 vscode-textmate 및 oniguruma-to-es을 포팅하고, 214 오라클 시나리오에서 Shiki의 출력과 HTML을 비교해 테스트합니다.
highlight.php 잘하는 점원래 언어 및 스타일 정의를 사용하는 highlight.js의 서버 측 PHP 포트입니다. 185개 언어를 지원하고 언어를 자동으로 감지할 수 있습니다. ShikiPHP와의 차이점ShikiPHP은 TextMate 문법으로 토큰화하고 VS Code 테마로 색상을 지정합니다. Shiki에서 사용하는 파일과 동일하며, 호출할 때마다 언어를 지정해야 합니다.
Torchlight 잘하는 점VS Code 호환 강조 표시 서비스입니다. 주석으로 강조, 포커스 및 차이를 표시하는 HTTP API이며, Laravel, CommonMark, Statamic 및 기타 스택용 공식 클라이언트가 있습니다. ShikiPHP와의 차이점ShikiPHP은 호스팅 API 없이 PHP 프로세스 내에서 실행됩니다. 내장 표기법 변환기는 강조, 포커스 및 차이 표시 줄에 해당하는 주석을 읽습니다.

질문과 답변

ShikiPHP 문서의 간단한 답변.

시작하기 가이드부터 살펴본 다음, 페이지에 필요할 때 변환기, 사용자 지정 문법 또는 ANSI 출력을 추가하세요.