MDX ランタイムヘルパー

Methanol は、すべての MDX ファイルに対して軽量なランタイムコンテキストを自動的に注入します。これにより、テンプレートや動的コンテンツの構築が容易になります。

コンテキスト変数

MDX ページ内では、以下のヘルパー変数が常に利用可能です。

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

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

コンテキストの構造

ctx オブジェクトで利用可能な主要プロパティは以下の通りです。

注: theme.sourcespublic/ 内の静的ファイルについては、Methanol がビルド時に解決するため、通常 ctx.withBase() を使用する必要はありません。ただし、開発環境において JavaScript で動的に URL を生成する場合の安全策として有用です。

ctx.site

ctx.site は、サイトレベルのメタデータとビルドフラグのスナップショットであり、以下を含みます。

ctx.page メタデータオブジェクト

ctx.page は、現在のページに関する包括的なメタデータを提供します。完全なフィールド一覧は以下の通りです。

注: ディレクトリのインデックスルートには、常に末尾にスラッシュが含まれます(例: /guide/)。 ctx.page.getSiblings() は、前後ナビゲーションを容易にするためにランタイムで注入されます。

使用例:

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

ctx.pages リスト

ctx.pages は、プロジェクトおよびテーマ内の全ページ(ctx.page スキーマに一致)を含むフラットな配列です。exclude: true が設定されたページは除外され、/404 および /offline ページは hidden: false が明示的に設定されていない限り除外されます。非表示ページ(hidden: true)はここに含まれる場合がありますが、ctx.pagesTree ではフィルタリングされます。

カスタムインデックス、サイトマップ、または手動ナビゲーション構造の生成に最適です。

<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}>Previous: {siblings.prev.title}</a> : null}
      {siblings.next ? <a href={siblings.next.routeHref || siblings.next.routePath}>Next: {siblings.next.title}</a> : null}
    </nav>
  )
})()}

rawHTML ユーティリティ

rawHTML ヘルパーを使用すると、エスケープされていない HTML を注入できます。これは、インラインスクリプトや、サニタイズされるべきでない特定のマークアップに特に有用です。

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

rawHTML は、シグナルによるリアクティビティや標準的なテンプレート補間に対応しています。