Middleman 4にする
Middlemanの新しいのがリリースされたので更新してみた。
大きな変化はSprocketsが分離されたこと。gemを追加すれば引き続き使えるようだが、ためしに外部パイプラインでjs/cssを生成することにした。
外部パイプラインそのものについてはサンプルを参考にすればすんなりできた。なんせ適当なタイミングでコマンドが実行されるだけなので。ただ、外部パイプラインに組み入れるwebpackそのものの使い方と、Middlemanとのすり合わせとには時間をとられた。これまでなじみがなかったせい。
あとこのことに関連して、シンタックスハイライトのためのCSS出力にerbを使えなくなったんだが、これはどうするとよいのだろう。そう変更するものでもないのでrougify style github > syntax.css
として置いておいた。webpackで一つにまとめたCSSファイルだけをbuild
に出力したいのでignore
を設定したせいではあるのだけど。う〜ん。
# js/cssを無視する
ignore /\/(?!all\.(?:js|css)).*\.(?:js|css|s[ac]ss)\z/
# ドットファイルを無視する
ignore /(?:\A|\/)\./
# 外部パイプラインの設定
activate :external_pipeline,
name: :webpack,
command: build? ? 'node_modules/.bin/webpack --bail' : 'node_modules/.bin/webpack --watch -d',
source: '.tmp/dist',
latency: 1
それ以外ではblog.summary_separator
に指定すべき正規表現の変更?に戸惑った。以前は記事中に<!-- more -->
と書いておいて、blug.summary_separator = /<!-- more -->/
と設定しておけば、そこで記事を区切ってくれた。
Middleman 4では、まずHTMLコメント形式が使えない。これは、以下のコードが動くためで、inner_text
が返すテキストにはHTMLコメントが含まれない。
doc = Nokogiri::HTML::DocumentFragment.parse text
length = doc.inner_text =~ Regexp.new(separator)
またHTML変換後のことも考えた正規表現にしなければならいように思える。具体的には、記事に--more--
と書いておくとすると、blog.summary_separator
には%r{(?:^|<p>)--more--(?:$|</p>)}
を設定する必要がある。これは、区切り検出がHTML変換前に行われるため。%r{<p>--more--</p>}
では区切りにマッチせず、/--more--/
ではHTML変換により生成される<p></p>
が残ってしまう。
activate :blog do |blog|
blog.summary_separator = %r{(?:^|<p>)--more--(?:$|</p>)}
blog.summary_length = 200
end
もう一つ。Middlemanのヘルパーなどで生成するリンクを相対リンクにするオプションがあるのだが、そのためのパスの計算がうまく動かないケースがある……と思う。たとえば2016-07-05-foo-bar.html.markdown
で使う画像を2016-07-05-foo-bar/baz.jpg
として置いたとき、image_tag '2016-07-05-foo-bar/baz.jpg'
による出力が<img src="bar.jpg">
となってしまうことがあった。いまひとつ切り分けできていないのだが、ひとまずは相対リンクにするのをあきらめることで対応した。
# なんだかうまくうごかない?
#activate :relative_assets
#set :relative_links, true