Text Object: NotionRubyMapping 解説 (6)

はじめに

NotionRubyMapping 解説の第6回目です。これまで解説してきた中で RichTextArray というものが頻繁に出現していました。これは複数の RichText Object を要素にもつクラスでした。今回は、RichText Object のうちの一つである Text Object を解説します。今日の作業ページはこちらです。

hkob.notion.site

段落ブロックの取得 (復習)

上のページにこんな感じで段落ブロックを置いてみました。

段落ブロック

このブロックでブロックのリンクを取得とすると以下のような URL になります。

https://www.notion.so/hkob/TextObject-6-1c93e27ccef1446d998568c22fc6bd4a?pvs=4#3bce1441431d4c8590b095a6d9b50155

昨日の復習としてこのブロックを取得してみます。

irb(main):002> block = Block.find "https://www.notion.so/hkob/TextObject-6-1c93e
27ccef1446d998568c22fc6bd4a?pvs=4#3bce1441431d4c8590b095a6d9b50155"
=> NotionRubyMapping::ParagraphBlock-3bce1441431d4c8590b095a6d9b50155

NotionRubyMapping::ParagraphBlock のオブジェクトが取得できていることがわかります。

RichTextArray

この ParagraphBlock に対して、 rich_text_array メソッドでリッチテキスト配列オブジェクトを取得してみます。RichTextArray は内部に @rich_text_objects という配列要素を持っており、この中に RichText クラスのサブクラスのオブジェクトが登録されます。

irb(main):003> block.rich_text_array
=>
#<NotionRubyMapping::RichTextArray:0x00000001297bac58
 @key="rich_text",
 @rich_text_objects=
  [#<NotionRubyMapping::TextObject:0x0000000129468438
    @options=
     {"plain_text"=>"normal",
      "bold"=>false,
      "italic"=>false,
      "strikethrough"=>false,
      "underline"=>false,
      "code"=>false,
      "color"=>"default",
      "href"=>nil},
    @text="normal",
    @type="text",
    @will_update=false>],
 @will_update=false>

RichTextArray は配列に関する多くのメソッドが上記 @rich_text_array に delegate するように設定してあります。今回、 first メソッドで今回取り扱う TextObject を取り出してみます。

to = block.rich_text_array.first
=>
#<NotionRubyMapping::TextObject:0x0000000129468438
...

TextObject オブジェクトに対するメソッド

1. text, text = a_text: テキストを取得、テキストを設定

text はテキストを取得するメソッドです。今回の場合は normal という文字列が取得できます。

irb(main):006> to.text
=> "normal"
irb(main):007> to.text = "full"
=> "full"

2. options: 装飾オプションを取得

options は TextObject の装飾情報を取得できます。先ほど text を書き換えたので、plain_text の部分が full に変わっています。

irb(main):008> to.options
=>
{"plain_text"=>"full",
 "bold"=>false,
 "italic"=>false,
 "strikethrough"=>false,
 "underline"=>false,
 "code"=>false,
 "color"=>"default",
 "href"=>nil}

4. bold = flag, italic = flag, strikethrough = flag, under_line = flag, code = flag, color = a_color, href = a_url

上記 options の情報はそれぞれの代入コマンドで変更できます。

irb(main):012> to.bold = true
=> true
irb(main):013> to.italic = true
=> true
irb(main):014> to.strikethrough = true
=> true
irb(main):015> to.underline = true
=> true
irb(main):016> to.code = true
=> true
irb(main):017> to.color = "green"
=> "green"
irb(main):018> to.href = "https://www.google.com"
=> "https://www.google.com"

ここまで設定して block を保存するとテキスト情報が書き変わります。

irb(main):019> block.save
=> NotionRubyMapping::ParagraphBlock-3bce1441431d4c8590b095a6d9b50155

全て設定するとよくわからない状態になっていました。

full

せっかくなので、もう少し意味ある処理をしてみましょう。options の文字列をテキストに持つ TextObject を作成し、それぞれのオプションを send で設定します。RichTextArray には << で RichTextObject を追加できるので、作成した TextObject を追加しています。追加が終わって block を保存すると段落ブロックが書き変わります。

irb(main):020* %w[bold italic strikethrough underline code].each do |key|
irb(main):021*   to = TextObject.new key
irb(main):022*   to.send "#{key}=", true
irb(main):023*   block.rich_text_array << to
irb(main):024> end
=> ["bold", "italic", "strikethrough", "underline", "code"]
irb(main):025> block.save
=> NotionRubyMapping::ParagraphBlock-3bce1441431d4c8590b095a6d9b50155

それぞれのオプションが設定された TextObject が並んでいることがわかります。

full_other

おわりに

昨日説明した ParagraphBlock を使って、TextObject の使い方を解説してみました。JSON で書くと非常に面倒な TextObject ですが、NotionRubyMapping だとほとんど気にしないで記述できるかと思います。options がない簡単な文字列であれば、「TextObject.new 文字列」だけで生成できるのは楽なのではないでしょうか。

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

TextObject

NotionRubyMapping解説