Octopressのプラグインの中で画像をちょっといじって 変換後の物を使いたい、と思って プラグインの中で新たなファイルを作って入れようとしたのですが、 きちんと新しいファイルを入れようと思ったら ちょっと手を加える必要があったことについて。
やりたいこと
こんな感じのプラグインを作ったとします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|
単にタグで受けたファイルのバックアップ(.tmp
)を作るだけのプラグイン。
このバックアップファイル自体もサイト(destination)へコピーしたい、という話です。
ちょっとsite
についての補足
ちょっと自分のために補足しておくと、
Liquid::Tag
の中のrender
で受ける引数(上ではcontext
の中からは
site = context.registers[:site]
という形でsite
の情報を取ってこれます。
_config.ymlで指定している様な値は、このsite
が持ってる
config
というオブジェクトがHashオブジェクトになっていて
この中にあります。
site.config['url']
な感じで取れます。
もしくは
context['site.url']
の様に、context
の引数にsite
+名前
を入れるとsite.config['名前']
の物を取ってくることも出来ます。
site.source
に関しては直接取ってきていますが、
これはSiteの定義を見れみると
上の方でconfig
とかと一緒に定義されてるのが分かりますが、
中で_config.ymlのsource
の値を入れています。
また、dest
の値にはdestination
の値が入っています。
上のままGenerateしてみる
上のプラグインをpluginsフォルダに入れてrake generate
しみると、
コピーして作った*.tmp
ファイルの方は
destination
の方のディレクトリに入っていません。
source
の方には正しく生成されています。
試しにもう一度generate
してみると今度はdestination
にも入っています。
一度source
の方を消してもう一度やってみると今度は
destination
に入っていません。
どうもgenerate
を始めた時点でのファイルだけをコピーして、
後から作ったものは見てない感じ。
そこで、最初こんな感じにスクリプトを変更してみました。
1 2 3 4 |
|
作ったファイルのパスの中のsource
な部分をdest
に変換して
そちらにもここでコピーを作ってしまう、という方法。
しかし、これやっても新しく作ったファイルをコピーされません。
ちょっと確認しながら見てみると、確かに1回コピーはされるのですが、 その後、他のファイルをコピーする時に一旦全部消されてコピーし直すので 上の様に途中でコピーしても意味がない模様。
上に挙げたsite.rbの中でprocess
というメソッド内で、
最後にwrite
するまえにcleanup
していて、まさにこれ。
ということで、generate
する前にファイルリストを作って
最後に一旦dest
を掃除した後にファイルリストにあるものをコピーしてる、と言う感じなので
そのリストに追加して上げれば良いだろう、ということだと思います。
statif_ciles
で、探して出てきたのがこれ。
plugins - How to generate files from Liquid blocks in Jekyll? - Stack Overflow
site.static_files
と言う値にそのままコピーされてく様なファイルが
詰められてる、とのことです。
なのでこのリストに新しく作ったファイルを詰めて上げれば 最後にコピーされます。
詰めるにはJekyll::StaticFile
というオブジェクトの形で詰める必要があるので
site.static_files << Jekyll::StaticFile.new(site, site.source, path, filename)
な感じになります。上のをもう一度書き直すと、
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
|
最初の2つの引数はそのままでよいですが、
3つ目のpath
には最後のファイル名と、最初に付いてるsource
のパス部分を
除いてやる必要があります。
(第二引数+第三引数+第四引数
の形のパスを最終的に探して
dest+第三引数+第四引数
へコピーします。)
これでプラグイン内とかで新しいファイルを作っても最後に一緒にコピーされるようになります。