rcmdnk's blog

Liquid Modernity

このブログは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な空文字でも問題ないですが一応元の形に合わせて)。

Sponsored Links
Sponsored Links

« Ankerのモバイルバッテリーを再び購入 SAMSONITEの最新ソフトスーツケース Janik購入 »

}