このブログはOctopressで運用していますが、 OctopressはJekyllという静的サイトジェネレーターを使っていて、 JekyllではLiquidと呼ばれるテンプレートエンジンを使っています。
そのLiquidの4.0.0がリリースされ、今まで使っていた自作プラグインで問題が起きたのでそれについて。
Tagクラスの変更
問題が起きたのは以下のプラグイン。
下みたいな感じに自分のブログ内へのリンクを画像つきでいい感じに表示してくれるプラグインです。
この中で他のプラグインを
thum = Jekyll::Thumbnail.parse('thumbnail', "small-thumbnail #{img}", '', '')
みたいな感じで呼んでいました。
このThumbnail
も自作クラスですが、LiquidのTagクラスを引き継いだものになります。
ここでparse(tag_name, markup, tokenizer, options)
という関数を使ってますが、第1, 2, 4番目の引数がそのまま
new
(つまりはinitialize
の1, 2, 3番目の引数として渡されて新しいオブジェクトが出来る様な形になっています。
(parse
の第3引数はデフォルトでは何もしない、引き継ぎ先でその値を引数に持ったparse(tokenizer)
を作って色々出来る様にしている。)
Liquid 3.X.XまではTagのinitialize
では
def initialize(tag_name, markup, options)
@tag_name = tag_name
@markup = markup
@options = options
end
みたいな形で引数をそのまま保存する様な形になっていました。
Tagは記事の中でLiquidのタグを使った時に呼ばれますが、 その際に3番目の引数には以前まではただのオプション情報を持ったハッシュが渡されていました。
ただ、元々のTagクラスでは渡された後、他では使われませんし 通常引き継いだ先のクラスでもこれを使うことはめったにありません。
なので
options
に何のクラスのオブジェクトを渡しても問題は起こりませんし
上のThumbnail
を作る際にも最後の引数に''
と、Stringクラスの空文字を適当に入れてあります。(デフォルト引数が無いので。)
これがLiquid 4.0.0になるにあたってinitialize
の中で
第3引数のメソッドを使う様な形に変更されています。
def initialize(tag_name, markup, parse_context)
@tag_name = tag_name
@markup = markup
@parse_context = parse_context
@line_number = parse_context.line_number
end
Implement line numbers without the Liquid::Token class. · Shopify/liquid@cebf75b
引数の名前もoptions
からparse_context
になっていますが
実際に記事の中で使われるタグを処理する際には
ParseContext
と呼ばれるオプション情報を持ったクラスが渡される様に変更されています。
これがline_number
と呼ばれるメソッドを持っているわけですが、
これがあるので適当なクラスを渡すとエラーが起きてしまいます。
ただ、結局Tagの中では使わないので
begin
parse_context = Liquid::ParseContext.new({})
rescue
parse_context = {}
end
thum = Jekyll::Thumbnail.parse('thumbnail', "small-thumbnail #{img}", '', parse_context)
という感じに空のParseContextを作って渡す様にしました。
Liquid 4.0.0より前にはParseContext
が無いのでない場合は空のハッシュを渡す様に(Stringな空文字でも問題ないですが一応元の形に合わせて)。