middleman を読む

サンプルスクリプトを書く

path: “/index.html” リクエストで source/index.html.md を HTML に変換するスクリプトを書いてみます:

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
% vi m.rb
require 'middleman'
require 'middleman-core/logger'
require 'pry-byebug'
logger = Middleman::Logger.singleton(Logger::DEBUG)
logger.debug '- define MyApp'
class MyApp < Middleman::Application
end
logger.debug '- create app: MyApp'
app = MyApp.new
logger.debug '- run_hook :ready'
app.run_hook :ready
logger.debug '- find index.html'
path = "/index.html"
page = app.sitemap.find_resource_by_path(path)
logger.debug '- render'
puts page.render
logger.debug '- all done.'

実行します:

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
% bundle exec ruby m.rb
- define MyApp
- create app: MyApp
== Activating: sprockets
== Reading: Local config
Loaded extensions:
== Extension: sprockets
== Extension: frontmatter
- run_hook :ready
== File Change: config.rb
== File Change: m.rb
== File Change: m.txt
== File Change: source/images/background.png
== File Change: source/images/middleman.png
== File Change: source/index.html.erb
== File Change: source/javascripts/all.js
== File Change: source/layouts/layout.erb
== File Change: source/stylesheets/all.css
== File Change: source/stylesheets/normalize.css
== Rebuilding resource list
- find index.html
- render
<!doctype html>
<html>
<head>
<meta charset="utf-8">
....
- all done.

ポイントは、

  • Middleman::Application の派生クラスのインスタンスを生成すると、extensions の読み込み、activate や local config の読み込みが行われる
  • :ready フックを run することで実際の resources の読み込みが行われる
    • このフックを起動しないとリソースの読み込みは完全に行われない

extensions の仕組みや、resources の読み込みの過程を洗ってみます。

参考サイト

https://github.com/yterajima/middleman-tansu
Wiki-like automatic linking in Middleman

MiddlemanのExtensionやTemplateを色々と試しました
Middlemanでwikiっぽいことができたら便利だなと思ったからmiddleman-tansu v0.1.0をリリースした | e2esound.com業務日誌

gem

middleman-pry

  • カスタマイズ
    • CSS: style.css

template-aks の構成と説明

  • layout
  • helpers
  • extentions

middlelamn-core を読み解く

  • Middleman::Application
    • define_hook する::before, :ready, :before_build, :after_build
    • include Middleman::Coreextensions::Extensions
      • => register() が使えるように成る
    • register Middleman::CoreExtensions::Request, FileWacher,Data., Middleman::Sitemap
      • => class なら extension.new、module などなら extension.registered(self) を呼ぶ
  • Middleman::Application.new
    • build cmd なら Middleman::BuildAction.new() で base.class.shared_instance で new される
      • リクエスト毎に Middleman::Application から派生されたクラスを作り、そこから new する
    • register したときに、Middleman::CoreExtensions::*:registered で InstanceMethod module 内の関数(initialize()含む)を app に include するよう send してるため、それぞれの initialize が呼ばれる
      • initialized() を持ってるのはData, Extensions のみ
      • 各種 extensions で hook などを設定
      • Extensions.new
        • initialized, before_configuration hook を呼ぶ
        • “config.rb” を実行する
          • activate する
            • extensions に登録
        • after_configuration hook を呼ぶ
  • require middleman
  • require middleman-core

  • application.rb

conf.rb

core-extensions/data
InstanseMethod
initialize: load config.rb

register
initialize
activate
after_configulation

sitemap を読み解く

middleman-blog を読み解く

  • BlogData
  • BlogArticle