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
感想
これはめっちゃ簡単