zfb
GitHub リポジトリ

検索したい単語を入力

いつでも検索バーを開ける

ディレクティブレジストリ

:::name / ::name / :name のディレクティブ構文を JSX コンポーネントへマッピングするコアのプリミティブ。

DirectiveRegistry は、CommonMark Directives 構文 — コンテナ(:::name)、 リーフ(::name[label])、テキスト(:name[label]) — を、コンパイル済み 出力の JSX コンポーネント呼び出しにマッピングするコアのプリミティブです。

このプリミティブは Core に存在しますが、レジストリ visitor は通常のパイプラインにはデフォルトで追加されません。markdown.features.directives が指定されたとき、または Rust コードが DirectiveRegistry を手動で挿入したときだけ実行されます。次の 2 つの方法で利用できます:

  • 設定から — オプトインの directives 機能を使って、Rust を書かずにディレクティブ名を登録する。directives: {} を指定しても、空のレジストリが配線されます。

  • Rust からDirectiveRegistry を直接構築してパイプラインに挿入する。 カスタムディレクティブ を参照。

ディレクティブの形状

レジストリは 3 つのディレクティブ形状を扱います:

  • コンテナ:::name[label]::: は、複数段落の本文を JSX コンポーネントで包む。

  • リーフ::name[label]{attrs} は、子要素を持たない 自己終結型のコンポーネントを生成する。

  • テキスト:name[label]{attrs} はインラインコンポーネント。

デフォルトはゼロ

レジストリには、事前登録されたディレクティブ名は一つもありません。使用する すべての :::name は明示的に登録する必要があります — zfb.config.tsdirectives 機能を介すか、Rust でレジストリを 構築するかのいずれかです。レジストリが有効なとき、認識されないディレクティブ名は警告診断を出力し、その元の段落を変更せずに残します。

型付きの属性スキーマ(#584 より)

レジストリは、登録された各ディレクティブに対して型付きの属性スキーマを 受け付けます。未知の属性はビルド時の 警告 を出力します(属性自体は 変更されずにそのまま通過します)。型強制の失敗(例えば Boolean 属性に 非ブール値を渡した場合)は、警告ではなく エラー を出力します。各属性は AttrSchema として宣言します。

フィールド説明
nameMDX ソースに書かれるとおりの属性名(例: "tone""data-foo")。
ty期待される型 — 下記の AttrType を参照。
default属性が不在で、かつ requiredfalse のときに適用される値。None はデフォルトなしを意味します。
requiredtrue で、属性が不在かつデフォルトもない場合に診断を出力します。

AttrType には 4 つのバリアントがあります。

バリアント受け付ける値備考
String任意の文字列値。そのまま通過します。検証は行いません。
Enum(Vec<String>)宣言された許可値のいずれか(大文字小文字を区別)。リストにない値は診断を出力します。
Boolean"true" / "false"(大文字小文字は区別しません)。=value を伴わない裸の属性も true として扱われます。JSX へは文字列 "true" / "false" として出力されます(v1 は文字列リテラル属性のみをサポートします)。
Numberf64::from_str でパースできる任意の値。パース後の数値ではなく元のソース文字列が保持されるため、JSX エミッタはそれをそのまま通過させます。パースできない値は診断を出力します。

スキーマは register 呼び出しと並べて宣言します。

registry.register(
    DirectiveDef::text("badge", "Badge")
        .with_attrs(vec![
            AttrSchema { name: "tone".into(), ty: AttrType::String, default: None, required: false },
            AttrSchema {
                name: "size".into(),
                ty: AttrType::Enum(vec!["sm".into(), "md".into(), "lg".into()]),
                default: Some("md".into()),
                required: false,
            },
        ]),
);

カスタムディレクティブ

ディレクティブを追加で登録したり組み込みを上書きしたりするには、 カスタムディレクティブ を参照してください。 これは Rust を書く必要のない、著者向けの手段です。

関連項目

Revision History

作成更新