Skip to content

feat: feedwright/when ブロックを追加して要素の条件出力を可能にする #27

@mt8

Description

@mt8

背景

mediba <mdf:deleted/> のような 「特定条件のときだけ別の要素群を出力したい」 仕様要件に対応する手段が現状ない。feedwright/element は無条件出力なので、削除通知 / 期限切れ / sticky 専用要素 / 言語別要素などのケースで詰まる。

汎用の wrapper ブロック feedwright/when を 1 つ追加して、内部のバインディング式を解決した結果が空かどうかで子ブロックの出力可否を切り替えるのが本 issue のスコープ。

期待

<!-- wp:feedwright/when {"expression":"{{post_raw.post_status|map:trash=1,*=}}"} -->
  <!-- wp:feedwright/element {"tagName":"mdf:deleted","contentMode":"empty"} /-->
<!-- /wp:feedwright/when -->

<!-- wp:feedwright/when {"expression":"{{post_raw.post_status|map:trash=1,*=}}","negate":true} -->
  <!-- wp:feedwright/element {"tagName":"title","contentMode":"binding","bindingExpression":"{{post.post_title}}"} /-->
  <!-- wp:feedwright/element {"tagName":"description","contentMode":"cdata-binding","bindingExpression":"{{post.post_content}}"} /-->
<!-- /wp:feedwright/when -->
  • expression を解決:結果が空文字列以外なら「条件成立」とみなす
  • negate: true のときは判定を反転(空のとき子ブロックを出力)
  • 子ブロックは feedwright/element / feedwright/raw / feedwright/comment / feedwright/sub-query / さらに入れ子の feedwright/when を許可

設計

新ブロック

  • feedwright/when
    • 配置可能位置:feedwright/channel / feedwright/item / feedwright/sub-item / feedwright/element (children モード) のいずれかの子。ancestor: ['feedwright/rss'] 制約で全文脈に対応
    • 属性
      • expression: string(解決対象のバインディング式)
      • negate: boolean(default false)
      • label: string(任意、エディタ表示用ラベル)
    • 子ブロック許可:feedwright/elementfeedwright/rawfeedwright/commentfeedwright/sub-queryfeedwright/when

Renderer 側

  • Renderer\WhenRenderer を新設、render(array $block, Context $ctx): array<DOMNode> を実装
    • Resolverexpression を解決
    • 結果の空判定('' === $value)と negate を XOR
    • 真なら innerBlocks を ElementRenderer::render_child() で展開し全 DOMNode を集めて返す
    • 偽なら空配列
  • ElementRenderer::render_child()feedwright/when ディスパッチを追加(既存 array<DOMNode> 戻り値の枠に乗せる)
  • Renderer::render_uncached() の channel ループにも分岐を追加

Editor UI

  • Inspector:
    • expression を BindingInput で編集
    • negate トグル
  • ブロック本文:when [expression] のような薄い枠、内部の InnerBlocks
  • カテゴリ:feedwright(既存)

受け入れ基準

  • feedwright/when ブロックが登録され、channel / item / sub-item / element(children) 配下で挿入可能
  • expression が空でない値に解決されたとき、子ブロックの DOMNode が出力される
  • 解決結果が空文字列のとき、子ブロックは無視される(0 ノード返す)
  • negate: true のとき判定が反転する
  • feedwright/when の入れ子(when の中に when)が動作する
  • item / sub-item 文脈で {{post.*}} が正しく解決される
  • channel 文脈で item 系バインディングを使った場合は空文字列扱い → 出力されない(既存の Resolver / Provider 挙動の延長)
  • Unit / Integration テストを追加:expression 真偽 / negate / 入れ子 / item context 内/外 を網羅
  • docs/requirements.md §12(block specs)に feedwright/when 章を追加、§13(renderer)に WhenRenderer の説明を追加
  • WordPress Coding Standards (composer phpcs) パス
  • 翻訳カタログ(POT / ja PO・MO・JED)更新

影響範囲

  • 新規:blocks/when/{block.json,index.js,edit.js}
  • 新規:src/Renderer/WhenRenderer.php
  • 修正:src/Renderer/ElementRenderer.php(render_child のディスパッチ)
  • 修正:src/Renderer/Renderer.php(channel ループのディスパッチ)
  • 修正:src/BlockRegistry.php(BLOCK_DIRS に 'when' 追加)
  • 修正:blocks/{channel,item,sub-item,element}/edit.js(allowed children に 'feedwright/when' 追加)
  • テスト:tests/Unit/tests/Integration/RenderTest.phptests/Integration/BlockRegistrationTest.php
  • 仕様書:docs/requirements.md
  • 翻訳:languages/

関連

  • 別 issue(item-querytrash ステータスを許可する話)と組み合わせて、mediba <mdf:deleted/> の運用パターンが完成する

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions