Octopressで画像を設置する{% img
~ %}
等には、
通常第二引数以降は単に文字列として渡すので
yamlブロックで指定した値やLiquid文法でassign
した変数をそのまま渡すことが出来ません。
(単なる文字列として処理される)
ただ、変数を渡すためには一旦文字列で変数名を与えて 何らかの形でタグクラスの中で文字列を変換してあげれば 出来たのでその方法について。
やりたいこと
サイトのロゴを_config.yml
で指定していたりする場合
その画像を
sitelogo: /images/MacApp/MacLogoMiddle.png
と指定しておいて
1
|
|
としてやれば{{site.sitelogo}}
部分は変換されて正しく表示できますが、
1
|
|
のようにimgタグを使うことは出来ません。
この場合、{{site.sitelogo}}
部分は
そのまま{{site.sitelogo}}
という文字列として渡されます。
両側の{{
~}}
を外してもそのまま渡されるだけです。
1つの決まった画像ならhtmlでも良いのですが、 他のタグ等でも直接変数が渡せたら便利だと思ったので そのやり方について調べてみました。
contextから取れる
Liquid::Tag
を継承して新しいタグを作っているプラグインを見ると、
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
大体こんな感じです。
initialize
の方のtag_name
はタグの名前(つまりこの場合は必ずnewtag
)、
markup
にはタグに書いた第二引数以降が入ります(imgタグならクラスや画像位置等)。
tokens
は
Finally, the tokens are all of the other tags that appear within this block tag, including the closing endnavigation tag.
なんだそうで、特にBlockタグの場合に中で処理するのに必要なんだと思います。 通常、継承したクラスで自分で扱うことはあまり無いです 1。
imgタグを定義してるplugins/image_tag.rb
では
1 2 3 |
|
こんなかんじでmarkupを@img
に入れていってrender
で使います。
(http(s)://
で始まったり/
を含むような文字列の場合それをsrc
とする)
一方、render
関数ではcontext
という引数を持っていて
ページの情報等を持っています。
従って、上のsite.sitelogo
の情報も持っていて、
context['site.sitelogo']
としてやれば_config.yml
で指定したsitelogo
の値を
取ってこれます2。
同じようにページの途中で
{% assign img=/image/a.jpg %}
とassign
したものやcapture
ブロックで設定した値もそのまま使えます。
これを適用してあげればいいんですが、普段は直接URLを書いて
必要なときだけ変換して欲しいので、画像パスにval:
と言う
値をつけた時だけ変換するようにしました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
|
initialize
の方でval:
という値の時にもsrc
に入れて、
render
の中でval:
だった場合には変換しています。
加えて、画像置き場を変えたい時もあるので、その値をimgpath
として
_config.yml
で設定して、http
から始まるものでない場合には
そのパスを最初に与えるようにもしました。
自己サイト内の別の場所も指定できるように、
パスを追加したくない場合はnoimgpath
をクラスに(つまりは画像URLより先に書く)
与えます。
まとめ
yamlブロックで指定した値やLiquid文法で作った値は
render
関数の中でcontext
から直接値を引き出せる、と言うことが分かってれば
後はやり方しだいで、と言った感じです。