createShikiTransformer()

より低レベルな制御を行うためのスタンドアロンな Shiki トランスフォーマーを生成します。createShikiPlugin() と異なり、HAST ツリーに手動で適用できる生のトランスフォーマーオブジェクトを返します。

import { createShikiTransformer } from "@unifast/shiki";

シグネチャ

async function createShikiTransformer(
  options?: ShikiTransformerOptions,
): Promise<ShikiTransformer>

パラメータ

options?

Shiki の設定 (テーマ、言語)

プロパティデフォルト説明
themesBundledTheme[]["github-dark"]読み込む Shiki テーマ
defaultThemeBundledThemethemes の最初のテーマレンダリングで使うデフォルトのテーマ
langsBundledLanguage[][]読み込む言語。読み込まれた言語のみがハイライトされます。

使い方

import { compile } from "@unifast/node";
import { createShikiTransformer } from "@unifast/shiki";
import type { HastRoot } from "@unifast/core";

const transformer = await createShikiTransformer({
  themes: ["github-dark", "github-light"],
  defaultTheme: "github-dark",
  langs: ["typescript", "rust", "json"],
});

const result = compile(md, { outputKind: "hast" });
const hast: HastRoot = JSON.parse(result.output as string);
const highlighted = transformer.transform(hast);

console.log(highlighted);
// HAST tree with Shiki-highlighted code blocks

使用例

手動で HAST 変換を行う

import { compile } from "@unifast/node";
import { createShikiTransformer } from "@unifast/shiki";
import { hastToHtml } from "@unifast/core";
import type { HastRoot } from "@unifast/core";

const transformer = await createShikiTransformer({
  themes: ["github-dark"],
  langs: ["typescript"],
});

const result = compile("```ts\nconst x = 1;\n```", { outputKind: "hast" });
const hast: HastRoot = JSON.parse(result.output as string);
const highlighted = transformer.transform(hast);
const html = hastToHtml(highlighted);

console.log(html);
// <pre> with Shiki-highlighted <span> elements

React のレンダリングと組み合わせて使う

import { createElement, Fragment } from "react";
import { compile } from "@unifast/node";
import { createShikiTransformer } from "@unifast/shiki";
import { hastToReact } from "@unifast/react";
import type { HastRoot } from "@unifast/core";

const transformer = await createShikiTransformer({
  themes: ["github-dark"],
  langs: ["typescript"],
});

const result = compile(md, { outputKind: "hast" });
const hast: HastRoot = JSON.parse(result.output as string);
const highlighted = transformer.transform(hast);
const element = hastToReact(highlighted, { createElement, Fragment });