RSS

WordPress JetPack MarkdownでSyntaxHighlightする3つの方法

Markdown大好き flied onionです。
Markdown使ってテキストだけで文書を綺麗に作成できるのはうれしいですよね。
標準化にあたってはすったもんだしているようで、CommonMarkはどうなることやら心配ですがあちらもシンプルで便利になるといいですね。

そんなわけでWordPressでMarkdownがJetPackにて公式サポートされた時には小躍りしていたわけですが、
コードブロックのハイライト表示はサポートされておらず、いろんなSyntaxHighlighterプラグインを試してみたもののなかなかちゃんと使えるものがみつかりませんでした。いくつか問題なく使えると思われるプラグインも見つけましたので今回はそれを紹介します。

なお、確認に使ったバージョンは

  • WordPress 4.0
  • JetPack
    • Jetpack by WordPress.com なら 3.2
    • JP Markdown なら 3.1

です。
また、個人的にバッククォート 3連のコードブロックを使っているので、インデント方式のコードブロックでどうなるかは確認していません。

ためしてみて問題があったプラグイン

私がためしてみてダメだったのは以下の3つです

  • Crayon Syntax Highlighter 2.6.8
    不等号などがエスケープされますがそれはオプションでなんとかなります。
    問題はハイライトはされますが、言語を指定しても認識されませんでした。
    (ですが自前で修正して、現在はこれを使っています。詳しくは後述。)
    また設定によっては複数行コードが 1行化されて表示されてしまうようです(どの設定か忘れました)。
  • SyntaxHighlighter Evolved 3.1.10
    不等号やアンド記号がエスケープされてしまい、HTMLなどが書けません。
  • wp-markdown-syntaxhighlighter 0.4
    Codeのショートブロックになるだけで一番だめでした。

利用可能な3つのプラグイン

細かい確認まではしていませんが、以下のプラグインは使えそうでした。

  • Syntax Highlighter for WordPress 3.0.83.3
    とくに問題なく使えそうでした。
    更新が長期間ないのが気にはなりますが、単にバージョンアップの影響を受けていないからその必要がないだけなのかもしれませんね。
  • SmartSyntax 1.0.1
    Google prettify syntax highlighting を自動的に適用すると説明にはあります。
    Jetpack Markdownで使えることを公言しているだけあって利用可能です。見た目もシンプルで動作も軽い様に思います。
    stackoverflow風にしたい場合もこちらを利用すればいいと思います(設定でカスタムのCSSをオフにすればstackoverflow風になるんですかね?)
  • Crayon Syntax Highlighter 2.6.8
    そのままでは「最後に空行が追加される」「不等号がエスケープされてしまいHTMLなどが書けない」「言語を指定しても認識してくれない」という問題があります。
    HTMLに関しては設定(*1)でなんとかなるのですが、言語の認識は設定ではどうにもなりません。
    しかしカスタマイズの豊富さに惹かれてなんとか使えないかとパッチを書いてみました。次のセクションで紹介します。
    前述の 2つで問題なければそちらを利用するといいと思います。
    *1 コード内のHTMLエンティティを出力 にチェックをつける

Crayon Syntax Highlighterを使用するためにパッチを当てる

Crayon SyntaxHighlighterはそのままではコードブロックに言語を指定してもそのまま表示されてしまいます。
言語を指定というのは以下でいえばjavaにあたる部分です。

この問題はどうやらスタイルシートのクラスが挿入されるタグが、Crayonが期待するタグじゃないために起きているようで、
その部分が上手く動作するように修正します。

修正にあたっての注意点。
1. 必ずバックアップを取っておきましょう。
2. プラグインが更新された場合は再度反映する必要があります。本体のコードが変わる場合もありますので同じようにはできない場合もあるためご了承ください。
3. Crayon SyntaxHighlighterを使用するためのパッチなので他のSyntaxHighlighterではうまく反映されなくなる可能性があります。
4. なにがあっても自己責任でよろしくお願いします。サポート・質問に対する回答などは期待しないでください。

対象となるファイルは

フルセットのJetPackなら
\wp-content\plugins\jetpack\_inc\lib\markdown\extra.php

マークダウンのみのJP Markdownなら
\wp-content\plugins\jetpack-markdown\lib\markdown\extra.php

になります。環境に合わせて修正してください。修正内容はどちらでも同じです。

定数を定義する

Crayon まずはこれから行う修正を無効化しやすくしておくために定数を作成します。
この値を falseから trueに切り替えれば一時的に無効化できるように実装していきます。

43行目にMARKDOWN_CODE_ATTR_ON_PREの定義がありその下あたりに以下を追加します。

コードを追加する

続いて_doFencedCodeBlocks_callbackの以下の部分を書き換えます。
大体 2815行目からです。
量は多いですが、元のコードはインデント変えただけで全部残っているので実際には10行程度追加しただけです。

追加している 定数・変数 の名前 FO_SUPPORT_CRAYON_SYNTAX_HIGHLIGHT, $fo_support_crayon_syntax_highlight_exは適当です。ユニーク(一意)な名前であれば変えても構いません。変えるときは全箇所変えてください。

簡単な動作説明

FO_SUPPORT_CRAYON_SYNTAX_HIGHLIGHT がtrueならば preタグのclass属性にlang:NAMEといった値を追加しているだけのチープなコードです。
これによって

と出力されていたのが

と出力されるようになり、Crayonが言語名を拾ってくれるようになります。

なおクラス名の区切りは : と決め打ちとしてしまっているので crayonの設定でも : を選択するか上記のコードの $this->code_class_prefix = "lang:"; の コロンを設定したものに変更してください。

ついでに最後に空行が追加される問題も rtrimでチープに対処してます。
これで一応動作していると思いますが、何かあればお知らせください。

素敵なMarkdownライフをお送りください。

  1. コメントはまだありません。

  1. 2015 12/28
*