Jekyll(Octopress)で画像パスを勝手に指定してくれるLiquidタグの作成
2016 年 1 月 18 日 by 山平前回、Jekyll(Octopress)の記事生成時に、記事用のディレクトリと、画像用のディレクトリを作成しました。
折角、画像用のディレクトリを作成しても、パスの指定までは面倒見てくれないので、あまり便利になった実感が沸きません。
そこで今回は、画像のパスを勝手に指定してくれるように手を加えていきます。
Jekyllでは、テンプレートエンジンにLiquidを利用しているので、Liquidタグを追加する形で拡張すれば良いとのこと。
簡単そうなのでサクサク作って…と思いきや、画像のURLをうまく指定するのが難しいことに気がつきました。
そこで、前回のnew_post2コマンドを少し直して、実装を楽にします。
以下、Rakefileの抜粋です。
images_dir = "images" # directory for blog images require 'yaml' desc "Begin a new post in #{"config.yml[post2_dir_format]"}/#{posts_dir}" task :new_post2, :title do |t, args| if args.title title = args.title else title = get_stdin("Enter a title for your post: ") end raise "### You haven't set anything up yet. First run `rake install` to set up an Octopress theme." unless File.directory?(source_dir) jekyll_config = YAML.load_file('_config.yml') time = Time.now filename = "#{time.strftime('%Y-%m-%d')}-#{title.to_url}" _dir = time.strftime(jekyll_config['post2_dir_format']) posts_dir_ex = File.join(posts_dir, _dir, filename).gsub(/\/$/, '') image_dir_ex = File.join(images_dir, _dir, filename).gsub(/\/$/, '') mkdir_p "#{source_dir}/#{posts_dir_ex}" mkdir_p "#{source_dir}/#{image_dir_ex}" filename = "#{source_dir}/#{posts_dir_ex}/#{time.strftime('%Y-%m-%d')}-#{title.to_url}.#{new_post_ext}" if File.exist?(filename) abort("rake aborted!") if ask("#{filename} already exists. Do you want to overwrite?", ['y', 'n']) == 'n' end puts "Creating new post: #{filename}" open(filename, 'w') do |post| post.puts "---" post.puts "layout: post" post.puts "title: \"#{title.gsub(/&/,'&')}\"" post.puts "date: #{time.strftime('%Y-%m-%d %H:%M:%S %z')}" post.puts "comments: true" post.puts "categories: " post.puts "image_dir: /#{image_dir_ex}" post.puts "---" end `gedit #{filename}` `nautilus #{source_dir}/#{image_dir_ex}` end
要は、画像ディレクトリを作成したタイミングでYAML Front Matterにディレクトリパスを追加することで、pageオブジェクトでアクセスできるようにします。
これで実装が簡単になったはずなので、さっそく作ってみます。
module Jekyll class HomeImageTag < Liquid::Tag def initialize(tag_name, markup, tokens) _p = markup.strip.split(/\s/) @src = _p.shift @alt = _p.join(" ").strip super end def render(context) page = context['page'] path = File.join(page['image_dir'], @src) return <<-"EOD" <img src="#{path}" alt="#{@alt}" /> EOD end end end Liquid::Template.register_tag('home_img', Jekyll::HomeImageTag)
このコマンドで「rake new_post2[hoge]」とすると、YAML Front Matter「img_dir」が追加されたエントリの雛形が作成されます。
ここに作成した「hime_img」Liquidタグを書いていきます。
使うときは「home_img」タグに画像のファイル名とaltテキストを指定するだけです。
比較用にマークダウンでも画像を指定しています。
—
layout: post
title: “hoge”
date: 2015-12-13 22:25:20 +0900
comments: true
categories:
image_dir: /images/2015/1213/2015-12-13-hoge
—
markdown:
![hoge hoge ho](/images/2015/1213/2015-12-13-hoge/test.png)
plugin:
{% home_img test.png hoge hoge ho %}
マークダウンでパスを指定した場合と同じ画像が表示されています。
</div> <div> <div><div class="entry-content"></div> <div><p></div> <div>markdown:</div> <div><img src="/images/2015/1213/2015-12-13-hoge/test.png" alt="hoge hoge ho"></div> <div></p></div> <div><p></div> <div>plugin:</div> <div><img src="/images/2015/1213/2015-12-13-hoge/test.png" alt="hoge hoge ho"></div> <div></p></div> <div></div></div> </div> <div>