Gollum用のマクロを作る話

前回の記事 で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

感想

これはめっちゃ簡単