Middleman の extensionを書くための覚書

まとめ中

基本

Middleman::Extension から派生させたクラスを作り(Middleman::Hello::Extension)、
そこに helper 関数の追加、 resource の manipulate、hook の追加などする。
そしてMiddleman::Extension.register(:hello, Middleman::Hello::Extension) した上で、
config.rb で activate :hello させれば有効になる。

参考

gem

% bundle gem middleman-hello とし gem のひな形を作る。
ファイル構成はいじる。

1
2
3
4
5
6
7
8
9
10
├── Gemfile
├── lib
│   ├── middleman-hello
│   │   ├── extension.rb
│   │   └── version.rb
│   ├── middleman-hello.rb
│   └── middleman_extension.rb
├── LICENSE.txt
├── middleman-hello.gemspec
├── README.md

lib/middleman-hello.rb

version情報と extension 本体を読み込み、register する。

1
2
3
4
5
6
7
require "middleman-hello/version"
::Middleman::Extensions.register(:hello) do
require 'middleman-hello/extension'
::Middleman::Hello::Extension
end

lib/middleman_extension.rb

middleman 本体に自拡張を読み込ませるために必要。
Middleman::Extensions.load_extensions_inpath() で読まれる。
これ忘れると template が動かないので注意。
なお ‘-‘ ではなく ‘
‘ なのでより注意。

1
require "middleman-hello"

lib/middleman-hello/version.rb

version 情報書くだけ。

1
2
3
4
5
module Middleman
module Hello
VERSION = "0.0.1"
end
end

lib/middleman-hello/extension.rb

extension 本体。ヘルパー関数書くなり resource に module 追加するなり
proxy追加するなり。

1
2
3
4
5
6
7
module Middleman
module Hello
class Extension < Middleman::Extension
...
end
end
end

config.rb

ここまで準備したら activate :hello とすると、
拡張機能が有効になる。

helper関数

簡単なものから

config.rb:helpers do

config.rb に書き下す:

1
2
3
4
5
6
% vi config.rb
helpers do
def hello
"Hello, World"
end
end

extension.defined_helpers=[]

Middleman::Extension.defined_helpers を使う:

1
2
3
4
5
6
7
8
9
10
11
12
module Middleman
module Hello
module Helpers
def hello
"Hello, World"
end
end
class Extension < Middleman::Extension
self.defined_helpers = [Helpers]
end
end
end

option

1
2
3
4
5
6
class Extension
option
def init
app.set :hello_settings, options
..

独自テンプレート

middleman init PROJ –tempate hello で source/ などを含めて
プロジェクトを作れるテンプレートを作る。

テンプレートファイル群

lib/middleman-hello/template/ 以下にテンプレートで使うファイルを置く。
Middleman::Template::Base から派生させ、テンプレート作成を行う。
主に build_scaffold()。

1
2
3
4
5
6
lib/middleman-hello/template/
├── config.tt
├── shared
│   └── Gemfile
└── source
└── index.html.md

Thor, invoke などを使ってるもよう。

作成設定

Middleman::Templates::Base から派生させて build_scaffold() で実体をコピーなどする。
Middleman::Templates.register() で登録する。

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
27
28
29
30
31
32
33
34
35
36
% vi lib/middleman-aks/template.rb
require 'middleman-core/templates'
module Middleman
module Hello
class Template < Middleman::Templates::Base
class_option "css_dir",
default: "stylesheets",
desc: 'The path to the css files'
class_option "js_dir",
default: "javascripts",
desc: 'The path to the javascript files'
class_option "images_dir",
default: "images",
desc: 'The path to the image files'
def self.source_root
File.join(File.dirname(__FILE__), 'template')
end
def build_scaffold
template "config.tt", File.join(location, "config.rb")
source = File.join(location, "source")
directory "source", source
[:css_dir, :js_dir, :images_dir].each do |dir|
empty_directory File.join(source, options[dir])
end
end
end
end
end
Middleman::Templates.register(:aks, Middleman::Aks::Template)

デバッグ時

~/.middleman/hello に template.rb を置くと Middleman::Templates::Local がそれを見る。

1
2
3
% mkdir -p ~/.middleman/hello && cd ~/.middleman/hello
% ln -s <extdevdir>/lib/middleman-hello/template.rb .
% ln -s <extdevdir>/lib/middleman-hello/template .