middleman を読む

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

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

% 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.'

実行します:

% 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
    • definehook する::before, :ready, :beforebuild, :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 を読み解く

build https://github.com/middleman/middleman/blob/v3-stable/middleman-core/lib/middleman-core/cli/build.rb Thor

middleman-blog を読み解く

  • BlogData
  • BlogArticle