hekyllのimpress.jsスライドを自動的にグリッド配置するjekyllプラグイン

March 26, 2013 at 08:37 PM | categories: jekyll, impress.js, ruby |

hekyllimpress.jsjekyllテンプレのようなものだけど、スライドの位置を個別に指定する必要があってめんどうだったので適当なグリッドに配置するプラグインを書いた。

jekyllのプラグインについて

https://github.com/mojombo/jekyll/wiki/Pluginsに必要なことは大体書いてある。

jekyllのディレクトリに_pluginsディレクトリを作り、その中に*.rbをおいておけば自動的にロードされる。 プラグインの種類はおおまかに以下の4通り。サンプルは本家wikiにあるのでメモもかねて概要だけ。

  • Generators
    • カテゴリ別とか期間別といった任意のルールでページを生成する
  • Converters
    • hamlとかjsonとかのフォーマット変換をする
  • Tags
    • liquidテンプレートエンジンのタグを追加する
    • たとえば、{{ your_tag }} というタグをつかいたければ、Liquid::Tagを継承したクラスをつくって、Liquid::Template.register_tag('your_tag', Jekyll::YourTag) などとする
  • Filters
    • liquidのフィルタを追加する
    • フィルタとはいいつつどんな関数でも登録できる
    • 適当にモジュールをつくって、Liquid::Template.register_filter(Jekyll::YourModule)とすると、{{ 'arg' | your_filter }} のようにして呼びだせる

ソース

wikiで説明されているpluginの書き方を踏まえた上で、それを完全に無視する方法で実装した。 Postクラスを拡張してhekyllにあうようにliquidに渡すデータを上書きしてるだけ。

もっといい方法はあると思う。

def once(tag)
 unless (@__once_executed__ ||= []).include? tag
 yield
 @__once_executed__ << tag
 end
end
module Jekyll
 class Post
 def grid_position
 pos = @site.posts.index(self)
 siz = Math::sqrt(@site.posts.size).ceil
 {
 "x" => 1000 * (pos % siz),
 "y" => 1000 * (pos / siz),
 }
 end
 once(:redefine_to_liquid) do
 alias __old_to_liquid to_liquid
 def to_liquid
 dat = self.data["data"]
 if dat.nil?
 self.data["data"] = self.grid_position
 end
 __old_to_liquid
 end
 end
 end
end

https://gist.github.com/taksatou/5244991

まとめ

impress.jsをつかっておいて単なるグリッドというのもどうかとは思いますが、位置決めをする部分をかえればなんとでもなるのでひまなときにがんばればいいと思います



About Me

pic
mojavy

Recent posts






Categories



Badges


AltStyle によって変換されたページ (->オリジナル) /