ToggleHeadingNBlock: NotionRubyMapping 解説 (18)

はじめに

NotionRubyMapping 解説の第18回目です。今日は昨日の Heading1Blockなど のトグル版である ToggleHeading1Block などを解説します。今日紹介する Toggle heading block も TextSubBlockColorBaseBlock というクラスの子クラスです。今日の作業ページはこちらです。

hkob.notion.site

あらかじめページを取得しておきます。

irb(main):002> page = Page.find "https://hkob.notion.site/ToggleHeadingBlock-18-00d93ff4dd954ed2be2400518bfaf3ce?pvs=4"
=> NotionRubyMapping::Page-00d93ff4dd954ed2be2400518bfaf3ce

ToggleHeading1Block

Heading1Block は見出し1を示すテキストブロックです。 text_infocolor が設定できるのは ParagraphBlock と同様です。Heading1Block はカラーを設定しないとエラーになっていましたが、ToggleHeading1Block は問題ありませんでした。Heading1Blocksub_blocks を受け付けないように initializer をオーバーライトした時にエンバグしたようです。

irb(main):003> th1 = page.append_block_children ToggleHeading1Block.new("H1")
=> NotionRubyMapping::Heading1Block-4a7d28e7f67742c3b39432d9258291ff

実行した結果以下のような見出しが用意されました。トグルがついていることがわかります。

TH1

トグルがついているので、append_block_children を実行してみましたが、エラーになってしまいました。

irb(main):016> th1.append_block_children NumberedListItemBlock.new("First"), NumberedListItemBlock.new("Second")
/Users/hkob/.rbenv/versions/3.3.0/lib/ruby/gems/3.3.0/gems/notion_ruby_mapping-0.8.3/lib/notion_ruby_mapping/blocks/base.rb:127:in `append_block_children': This block can have no children. (StandardError)
  from (irb):16:in `<main>'
  from <internal:kernel>:187:in `loop'
    from /Users/hkob/.rbenv/versions/3.3.0/lib/ruby/gems/3.3.0/gems/irb-1.11.1/exe/irb:9:in `<top (required)>'
  from /Users/hkob/.rbenv/versions/3.3.0/bin/irb:25:in `load'
  from /Users/hkob/.rbenv/versions/3.3.0/bin/irb:25:in `<main>'

確認すると、作成した th1 のクラスが Heading1Block になっていました。

irb(main):017> th1.class
=> NotionRubyMapping::Heading1Block

コードを確認すると、返却された JSON の children が空かどうかを確認していて、存在した時には、ToggleHeading1Block で作成するようにしていたようです。Notion API が出た当時は、判断基準がそれしかなかったためです。現在は、is_toggleable 属性があるので、それを確認するように変換すべきだと思います。これは修正候補に入れておきます。

せっかくなので、ToggleHeading2Block は sub_blocks を渡して作成してみます。sub_blocks があると、ちゃんと ToggleHeading2Block になっていることがわかります。

irb(main):018> th2 = page.append_block_children ToggleHeading2Block.new("H2", sub_blocks: [NumberedListItemBlock.new("First"), NumberedListItemBlock.new("Second")])
=> NotionRubyMapping::ToggleHeading2Block-a80991c5fbc84fce8c0ec8a7b4b90bf1

結果は以下のようになりました。

TH2

ToggleHeading3Block は色も設定してみます。

irb(main):019> th3 = page.append_block_children ToggleHeading3Block.new("H3", color: "purple", sub_blocks: [QuoteBlock.new("Quote")])
=> NotionRubyMapping::ToggleHeading3Block-ba0adf71caa145a2b4fa63af10e9addc

TH3

th2 の色も後から変更してみます。

irb(main):021> th2.color = "brown"
=> "brown"
irb(main):022> th2.save
=> NotionRubyMapping::ToggleHeading2Block-a80991c5fbc84fce8c0ec8a7b4b90bf1

h1 は色を変えるとテキストの色も変わりましたが、ToggleHeading2Block はトグルだけが色が変わりました。

TH2C

th2 の rich_text_array の最初のものの色を合わせてみます。

irb(main):023> th2.rich_text_array.first.color = "brown"
=> "brown"
irb(main):024> th2.save
=> NotionRubyMapping::ToggleHeading2Block-a80991c5fbc84fce8c0ec8a7b4b90bf1

無事、テキストの色も揃いました。

TH2B2

おわりに

今回は ToggleHeadingNBlock を解説してみました。要素が存在しないと ToggleHeadingXBlock にならないので、append_block_children ができない状況です。これは問題なので、後で直しておきます。

ToggleHeading1Block のマニュアルはこちら。

hkob.notion.site

NotionRubyMapping解説