🍣

Gollum 用のマクロを作る話

2022/07/10に公開

前回の記事 で Gollum を使って自宅用の Wiki を構築する話を書きました。今回の記事では Gollum のマクロを作ってみます。

Gollum とは

前回の記事でも書きましたが、Gollum とは Ruby/Sinatra 製の Wiki で、かなりシンプルな作りなのが特徴です。Gollum は GitHub Wiki のエンジンにも使われています。 Gollum は設定ファイル (config.rb) が Ruby のコードになっており、継承等を使うことで様々な挙動を柔軟かつ容易に設定できます。 実際今回作成する Gollum のマクロも Ruby のクラスを 1 つ定義するだけで作ることもできました。

こういうものを作りました

今回は簡単な例として、YouTube の動画を埋め込むためのマクロを定義しました。具体的には、YouTube の動画ページの URI か動画の ID を記述すると動画を埋め込める様なマクロを定義しました。 例えば <<YouTube(F3589zFsgBo)>> と記述すると https://www.youtube.com/watch?v=F3589zFsgBo の動画が埋め込まれます。 動画の開始秒数を指定することも、html 中の URI を少し変更するだけでできるはずですが、今回はやっていません。また、このマクロは 2021 年 6 月現在動作しますが、YouTube の仕様変更などによりそのうち使えなくなると思われます。

作ったもの

具体的には以下の様なマクロを作りました。以下のコードを config.rb に追加します。大事なことは以下の様になります。

  • Gollum::Macro の内部クラスとして Gollum::Macro を継承したクラスを作成する。
  • 作成したクラス名をマクロで指定する。
  • 実際にマクロが展開される結果は render 関数の返り値である。
  require 'gollum-lib'

  module Gollum
    class Macro
      # Macro to embed a YouTube video
      class YouTube < Gollum::Macro
        def render(url_or_id, title = 'YouTube video player')
          result = url_or_id.match('https://www.youtube.com/watch?v=(.*)')
          id = result ? result[1] : url_or_id
          size = 'width="560" height="315"'
          src = "https://www.youtube.com/embed/#{id}"
          allow = 'accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture'
          attribute = "#{size} src=\"#{src}\" title=\"#{title}\" frameborder=\"0\" allow=\"#{allow}\""
          "<iframe #{attribute} allowfullscreen></iframe>"
        end
      end
    end
  end

感想

これはめっちゃ簡単

Discussion