rcmdnk's blog
Last update

メッキ 立体 エンブレム - (ハイフン) 1個

Octopressの中でHTMLコメント<!-- ... -->を書いた所、 一部最後の部分が&#8211;>と変更されていました。

これだとコメントの終了部分がなくなりずっとコメントになってしまって困ります。

この問題が起こった部分がたまたま次にすぐ別のコメントがあったので これまで問題なく見えてた様ですが、 ちょっとこれでは困るので何とかしようと思ったら思った以上に大変でした。

注意

追記: 2015/06/15

これは古いバージョンのOctorpessで plugins/octopress_filters.rbの中の post_filterでRubypantsを使ってページの最終変更を行ってる部分が 問題だったみたいです 1

今はこの部分は削除されて下に書いた様な問題は起こらなくなっています。

ということでOctopressのoctopress_filter.rbのアップデートを追って (Rubypants部分削除)試してみたら問題なく出力出来たので 下で作った fix_double_dashというタスクは削除しました。

この辺ちゃんと理解してませんでしたが、 octopress/hooks とを使っていて、これが色々な段階へ作業を入れ込める様になってるので、 特に今回のこういった各ページに必ず何かするような事は これを使ってどこかの段階で入れてしまう方が良いかもしれませんね。

追記ここまで

--と&#8211 ;

ダブルハイフン(double hyphen)とかダブルダッシュ(double dash) と言ったりしますが、HTMLではコメントの閉じる部分で使います。

&#8211;はEN DASHと言って通常のハイフンよりちょっと長めのダッシュになります 2

どうも場合によって--と書いたものがこのEN DASHに変換されてしまう模様。

ただし全てではなくて一部です。

調べていくと

<!-- <something> -->

の様に中に>記号とかが入ってると最後のコメントの部分が変換されてしまうようです。

例えばはてなブックマークで自分のページにブックマークが付いたら知らせてくれるようにするためには

<!--
<rdf:RDF
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:foaf="http://xmlns.com/foaf/0.1/">
<rdf:Description rdf:about="エントリーのリンクあるいはウェブサイトのURL">
<foaf:maker rdf:parseType="Resource">
<foaf:holdsAccount>
<foaf:OnlineAccount foaf:accountName="あなたのはてなID">
<foaf:accountServiceHomepage rdf:resource="http://www.hatena.ne.jp/" />
</foaf:OnlineAccount>
</foaf:holdsAccount>
</foaf:maker>
</rdf:Description>
</rdf:RDF>
-->

なコードが必要になります3

この最後の-->が変換されてコメントが閉じなくなってしまって困ります。

Markdownパーサーが悪いのか?

まず最初にMarkdownパーサーが変換時に変なことをしてるのでは?と言う話。

現在Kramdownを使っていますがKramdownのQuick Reference を見てみると、まず

{::comment}
This is a comment which is
completely ignored.
{:/comment}

の様に書くことでコメントタグをKramdownの記号で書いて変換することが出来る、というものが有ります。

またSyntax の方には要素にmarkdownという値を与えてそれが0なら そのまま書き出す、と言うオプションもあります。

他にも他のパーサーも含めて-\\\\-とするとか 4、 他のパーサーのコメントの書き方とか 5 色々有りましたが、 ここで気づいたのがこの内容が書かれてるファイルは_includes以下にある*.htmlなファイルだった、 ということ。

つまりMarkdownではなくてMarkdownパーサーも通っていません。 暫く上のを試して上手くいかないな、と思ったり 記事の方でやったら有効だったり無駄な事をしてしまいました。。。 (まあでもいくつか今後のための有用な情報は得られた、ということで。。)

Liquid/Jekyll/Octopressが悪い?

ということで悪さをしてるのはJekyllコマンドの中での何かしらの変更だと思います。

index.html parse error · Issue #1662 · imathis/octopress

ここを見ると、まさに同じ様な話で、 OctopressのIssueではそれはMarkdownの問題だ、と切り捨てられていますが、 多分そうではないと思います。

jekyll - Octopress HTML parsing bug - Stack Overflow

こちらの問題がかなり似ていますが、 タイトル部のみに問題があってそこにstrip_htmlというフィルターをかけたら治った、 ということなんですが、 今回はもうちょっと広い範囲なのでこれを適用するのはちょっとむずかしいな、と。

結局実際の所どの部分が悪いのかよく分かってませんが、 簡単に回避する方法は見つかりませんでした。。。

出来上がったHTMLを無理やり直す

ということで、結局どうしたかというと、出来上がったHTMLファイルを 直接変換しています。

Rakeファイルの中に以下のようなタスクを追加します。

1
2
3
4
5
6
7
8
9
10
11
12
# Fix double dash problem at the end of comment
desc "Fix double dash problem"
task :fix_double_dash do
  puts "## Double dash fix"
  Parallel.map(Dir.glob("#{public_dir}/**/*.html")) do |h|
    html = IO.read(h)
    html.sub!("</rdf:RDF>\n&#8211;>","</rdf:RDF>\n-->")
    File.open(h , 'w') do |f|
      f.write html
    end
  end
end

一度&#8211;になるのは仕方ないとして、そうなったものをもう一度戻しています。

このタスクをgenerateタスクのjekyllコマンドの後で

`jekyll build`
Rake::Task[:fix_double_dash].execute

な感じで呼んであげればOK。

今のところは見たところ上のはてなブックマーク用のもの以外のところでは 変な変換は無かった様なので、 余計な変換をしないように一つ前の行を含めて変換に入れています。

まあ取り敢えずな感じですが、他に良い方法が見つかるまではこれで。

Sponsored Links
Sponsored Links

« OctopressでJekyllコマンドをきちんとTraceする Octopress (Liquid)のfor文内等でタグを使う時の注意 »

}