mcpField
P
portable-text-serialization

portable-text-serialization

github.com/sanity-io開発1942.9k 回インストール1 日前に更新
リポジトリ

portable-text-serialization について

`@portabletext/*` ライブラリを使い、各フレームワークで Portable Text を描画するためのリファレンススキルです。コンポーネントのマッピング、フレームワーク別のルール、カスタムコンテンツや未対応コンポーネント、GROQ クエリのパターンを解説します。

主な機能

  1. 01フレームワーク別の Portable Text 描画
  2. 02ブロックとマークのコンポーネントマッピング
  3. 03カスタム型の描画ガイド
  4. 04未対応コンポーネントの処理
  5. 05GROQ による参照の展開ガイド

活用シーン

  1. 01フレームワークでの Portable Text 描画
  2. 02カスタムブロックと注釈のマッピング
  3. 03未知のコンテンツ型の処理
  4. 04参照を含む Portable Text のクエリ

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/sanity-io/agent-toolkit --skill portable-text-serialization

インストール後、Claude Code で/portable-text-serializationを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

rules/
astro.md
html.md
markdown.md
plain-text.md
react.md
svelte.md
vue.md

詳細

Portable Text のシリアライズ

@portabletext/* ライブラリファミリーを使用して、さまざまなフレームワークで Portable Text コンテンツをレンダリングします。各ライブラリは同じコンポーネントマッピングパターンに従います。components オブジェクトを指定し、PT ノードの種類をフレームワーク固有のレンダラーにマッピングします。

Portable Text の構造(クイックリファレンス)

PT はブロックの配列です。各ブロックは _type、省略可能な style、children(スパン)、markDefs、listItem、level を持ちます。

Root array
├── block (_type: "block")
│   ├── style: "normal" | "h1" | "h2" | "blockquote" | ...
│   ├── children: [span, span, ...]
│   │   └── span: { _type: "span", text: "...", marks: ["strong", "<markDefKey>"] }
│   ├── markDefs: [{ _key, _type: "link", href: "..." }, ...]
│   ├── listItem: "bullet" | "number" (optional)
│   └── level: 1, 2, 3... (optional, for nested lists)
├── custom block (_type: "image" | "code" | any custom type)
└── ...more blocks

マークには 2 つの形式があります。

  • デコレーター:"strong"、"em"、"underline"、"code" など、marks[] 内の文字列値
  • アノテーション:markDefs[] 内のエントリーを参照する marks[] のキー(リンクや内部参照など)

コンポーネントマッピングパターン(すべてのフレームワーク)

すべての @portabletext/* ライブラリは、次のキーを持つ components オブジェクトを受け取ります。

キーレンダリング対象Props/データ
typesカスタムブロック/インライン型(画像、コード、CTA)value(ブロックデータ)
marksデコレーター+アノテーションchildren + value(マークデータ)
blockブロックスタイル(h1、normal、blockquote)children
listリストのラッパー(ul、ol)children
listItemリスト項目children
hardBreakブロック内の改行—

フレームワーク固有のルール

お使いのフレームワークに対応するルールファイルを参照してください。

  • React/Next.js:rules/react.md — @portabletext/react または next-sanity
  • Svelte/SvelteKit:rules/svelte.md — @portabletext/svelte
  • Vue/Nuxt:rules/vue.md — @portabletext/vue
  • Astro:rules/astro.md — astro-portabletext
  • HTML(サーバーサイド):rules/html.md — @portabletext/to-html
  • Markdown:rules/markdown.md — @portabletext/markdown
  • プレーンテキストの抽出:rules/plain-text.md — @portabletext/toolkit
コミュニティ製シリアライザー

これらは portabletext.org に掲載されていますが、専用のルールファイルはありません。

対象パッケージ
React Native@portabletext/react-native-portabletext
React PDF@portabletext/react-pdf-portabletext
Solidsolid-portabletext
Qwikportabletext-qwik
Shopify Liquidportable-text-to-liquid
PHPsanity-php(SanityBlockContent クラス)
Pythonportabletext-html
C#/.NETdotnet-portable-text
Dart/Flutterflutter_sanity_portable_text

共通パターン(すべてのフレームワーク)

カスタム型には明示的なコンポーネントが必要です

PT レンダラーは、デフォルトでは標準ブロックのみを処理します。カスタム型(image、code、callToAction など)をレンダリングするには、コンポーネントのマッピングを明示的に指定する必要があります。指定しない場合はレンダリングされません。

コンポーネントオブジェクトを安定させる

React/Vue では、components をレンダリング関数の外で定義するか、メモ化してください。レンダリングのたびに再作成すると、不要な再レンダリングが発生します。

コンポーネントが見つからない場合に適切に処理する

すべてのライブラリは、未知の型に遭遇したときの動作を制御する onMissingComponent を受け取ります。

  • false — 警告を抑制します
  • カスタム関数 — ログを記録するか、報告します
GROQ で PT をクエリする

カスタムブロック内の参照は、必ず展開してください。

body[]{
  ...,
  _type == "image" => {
    ...,
    asset->
  },
  markDefs[]{
    ...,
    _type == "internalLink" => {
      ...,
      "slug": @.reference->slug.current
    }
  }
}

コメント