rcmdnk's blog

Universal Mind Control

Octopressのgenerateを劇的にスピードアップする でやった共通部分を先にレンダリングしておいて後で埋め込む、 という作業をプラグイン化しました。

Sponsored Links

octopress-common-part

Octopressのgenerateを劇的にスピードアップする の所でヘッダーやサイドバーなど全てのページで共通な部分を 別途のページとして用意しておいて、 jekyll build終了後、該当部分に埋め込む、みたいなことをしました。

これによって共通部分のレンダリングが今までページ分行われてたのが 1回で済むようになるので物凄くgenerateが速くなりました。 (このブログで全ページ変換するのに5分位から1分位に短縮。)

ただ、Jekyllの外で後からページの中身を変更したりするために、 変換様に使うための変換変数が一切ブログの中で書けなくなる等の副作用がありました。

とうことでもっとスマートに行うために作ったのが上のプラグイン。

インストール

プラグインのインストールはplugins/common_parts.rbplugins/に入れてください。

それからplugins/category_generator.rbの中の renderwriteしてる部分を削除します。

category_generator.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
--- a/plugins/category_generator.rb
+++ b/plugins/category_generator.rb
@@ -90,15 +90,11 @@ module Jekyll
     #  +category+     is the category currently being processed.
     def write_category_index(category_dir, category)
       index = CategoryIndex.new(self, self.source, category_dir, category)
-      index.render(self.layouts, site_payload)
-      index.write(self.dest)
       # Record the fact that this page has been added, otherwise Site::cleanup will remove it.
       self.pages << index

       # Create an Atom-feed for each index.
       feed = CategoryFeed.new(self, self.source, category_dir, category)
-      feed.render(self.layouts, site_payload)
-      feed.write(self.dest)
       # Record the fact that this page has been added, otherwise Site::cleanup will remove it.
       self.pages << feed
     end

これらの部分は後で通常のpagesがレンダリングされる時にも もう一度レンダリングされて書き出されるので ここでやってることはただ無駄なだけです。

無駄なだけなら良いのですが、octopress-common-partで作るヘッダーや サイドバーをカテゴリーページのテンプレの中で使ってたりすると まだ作る前なので、そんなものはない、と怒られてしまいます。

Tagsを使うためにplugins/tag_generator.rbを使ってる場合も 同様にrenderwriteしてる部分を削除します。

Octopressでのタグの運用

rcmdnk/monthly-archive 1 の中でも同じような事をしてましたが、 該当部分は直したので使っていたらアップデートしてください。

使い方

Octopressのgenerateを劇的にスピードアップする で作った様なcommon_header.htmlみたいな物を source/_common_parts/というディレクトリに入れます。

後は使いたい所で

{% common_part common_header.html %}

の様に、includeタグの様な感じで使います。

これで既にレンダリングされたcommon_header.htmlの レンダリングされた中身が埋め込まれます。

これでRakefileの中のcommonタスクを消せます。 また、COMMON_HEADERみたいなワードが使えなくなることもありません。

renderメソッドにパッチをあてる際の注意

Octopressのgenerateを劇的にスピードアップする で追記しておきましたが、 Jekyll::Site::renderを上書きしてしまうと、 octopress-hooks.rb の中でHookを埋め込んで居る部分を消してしまうので それを取り入れられる様に処理しておかないと行けません。

実際にここで入れてるパッチは実行時間を表示してるだけなので 入らなければ消してしまえば良いだけですが。

Sponsored Links
Sponsored Links