MDX ランタイムヘルパー

Methanol は、各 MDX ページに軽量なランタイムコンテキストを注入します。これにより、ページ情報の参照や動的なコンテンツ生成、テンプレートとの連携が容易になります。

コンテキスト値

MDX 内では、以下の変数が常に利用可能です。

# {frontmatter.title ?? ctx.page.title}

現在のルート: {ctx.routePath}

コンテキストのデータ構造

ctx オブジェクトの主要なフィールドは以下の通りです。

注意: theme.sources で定義された URL や public/ ディレクトリ内の静的ファイルは、通常ビルド時に自動解決されるため、ctx.withBase() を明示的に使用する必要はありません。ただし、JavaScript で動的に URL を生成する場合など、開発環境でのパス解決に問題が生じる際の回避策として有効です。

ctx.page オブジェクト

ctx.page は、現在のページの情報を保持するメタデータオブジェクトです。

補足: ディレクトリのインデックスページの場合、routePath の末尾には / が付与されます(例: /guide/)。

使用例:

{ctx.page.title}
{ctx.page.frontmatter?.excerpt}

ctx.pages リスト

ctx.pages は、サイト内の全ページのメタデータオブジェクトを格納した配列です。インデックスページや非表示ページも含まれますが、exclude: true が設定されたページは除外されます。

カスタムのページリスト、サイトマップ、または独自のナビゲーション UI の構築に適しています。

<ul>
  {ctx.pages.map((page) => (
    <li><a href={page.routeHref || page.routePath}>{page.title}</a></li>
  ))}
</ul>

ctx.pagesTree 階層ツリー

ctx.pagesTree は、現在のルートに基づいた階層的なナビゲーションツリーを提供します(isRoot および hidden のルールが適用済み)。

サイドバーなど、標準ナビゲーションと同期した UI を構築する際に利用します。

{ctx.pagesTree.map((node) => (
  <div>{node.title || node.name}</div>
))}

ctx.getSiblings 関数

ctx.getSiblings() は、現在のナビゲーション順序における「前のページ」と「次のページ」を取得します。これはナビゲーションルートの設定や非表示/除外ルールを反映しており、サイドバーでの表示順序と一致します。

{(() => {
  const siblings = ctx.getSiblings.()
  if (!siblings) return null
  return (
    <nav>
      {siblings.prev ? <a href={siblings.prev.routeHref || siblings.prev.routePath}>前へ: {siblings.prev.title}</a> : null}
      {siblings.next ? <a href={siblings.next.routeHref || siblings.next.routePath}>次へ: {siblings.next.title}</a> : null}
    </nav>
  )
})()}

rawHTML インターフェース

rawHTML を使用すると、エスケープ処理を回避して生の HTML を直接挿入できます。インラインスクリプトや、特定の HTML 構造をそのまま出力したい場合に便利です。

{rawHTML('<span class="badge">Beta</span>')}
{rawHTML`<div data-banner="true">Banner</div>`}

rawHTML はシグナル(Signals)やテンプレートリテラルによる補間にも対応しています。