본문으로 건너뛰기

사용자 지정 언어 및 테마

번들에는 전체 Shiki 카탈로그가 포함되어 있지만, 디코딩한 JSON에서 사용자 지정 TextMate 문법 또는 VS Code 테마를 등록할 수도 있습니다. 둘 다 Highlighter 인스턴스에서 관리됩니다.

사용자 지정 테마

VS Code 테마 JSON 파일을 디코딩해 loadTheme에 전달하세요. 테마는 name로 식별되며, 사용자 지정 테마는 이름이 같은 번들 테마를 덮어씁니다.

PHP
use Shikiphp\Shikiphp;

$highlighter = Shikiphp::highlighter();

$theme = json_decode(file_get_contents('my-theme.json'), true);
$highlighter->loadTheme($theme);

$code = '<?php echo "hello";';

echo $highlighter->codeToHtml($code, [
    'lang'  => 'php',
    'theme' => $theme['name'], // the theme's own name
]);

사용자 지정 문법

loadGrammar는 디코딩된 .tmLanguage.json를 등록하므로 모든 진입점에서 언어 ID로 사용할 수 있습니다:

PHP
public function loadGrammar(
    array $rawTmLanguage,
    ?string $langId = null,
    array $aliases = [],
    array $embedded = [],
): void
  • $langId — 참조에 사용할 ID입니다. 생략하면 문법의 name을 사용하고, 그것도 없으면 scopeName를 사용합니다.
  • $aliases — 동일한 문법으로 연결되는 추가 ID입니다.
  • $embedded — 이 문법에 포함된 언어 ID입니다. 해당 언어의 문법도 확인합니다.
PHP
use Shikiphp\Shikiphp;

$highlighter = Shikiphp::highlighter();

$grammar = json_decode(file_get_contents('mylang.tmLanguage.json'), true);
$highlighter->loadGrammar($grammar, 'mylang', aliases: ['ml']);

$code = file_get_contents('example.mylang');

echo $highlighter->codeToHtml($code, [
    'lang'  => 'mylang',
    'theme' => 'github-dark',
]);

문법의 include 참조(#repo, $self, $base, other.scope)와 포함 언어는 하이라이터에 이미 등록된 문법에서 확인되므로 의존 항목을 먼저 등록하세요.

파사드를 통해 사용자 지정 하이라이터 사용

정적 Shikiphp 파사드에서 사용자 지정 하이라이터를 사용하려면 Shikiphp::use로 전달하세요:

PHP
use Shikiphp\Highlighter;
use Shikiphp\Shikiphp;

$myTheme = json_decode(file_get_contents('my-theme.json'), true);
$myGrammar = json_decode(file_get_contents('mylang.tmLanguage.json'), true);
$code = file_get_contents('example.mylang');

$highlighter = Highlighter::createBundled();
$highlighter->loadTheme($myTheme);
$highlighter->loadGrammar($myGrammar, 'mylang');

Shikiphp::use($highlighter);

// Now the facade delegates to your highlighter.
echo Shikiphp::codeToHtml($code, ['lang' => 'mylang', 'theme' => $myTheme['name']]);

기본 번들 하이라이터로 돌아가려면 Shikiphp::reset()를 호출하세요.