ラック
Home > CMS > 記事 > 2017年5月 > MODxでMarkdownパースして記事投稿

MODxでMarkdownパースして記事投稿

カテゴリ: MODx

最近Markdownでドキュメントを書くことが多くなりました。そんな中、いちいちHTMLタグを記述したり、ビジュアルエディタを使ったりして記事を書くのが面倒になってきました(特にここは文章メインのブログですし)。

人間はとかく怠惰な生き物ですし、どうにかして「Markdownで記事を書けるようにしたい」と考えるのは至極自然な帰着だと思います。

ということで、それを実装するにはどうすれば良いか考えました。

なお、新規のブログならばまだしも、このブログのようにすでにHTMLタグ込みで書かれた記事が数百もあるようなところだと、HTMLとMarkdownの住み分けも考えたくなります。この部分は少し面倒そうです…。

導入手順(頓挫)

  1. PHPのMarkdownパーサを用意
  2. HTML・Markdownの記述をフラグ判定するテンプレート変数を作成
    • 変数名:md_html_flag
    • 投稿画面内の見出し:Markdown or HTML判定フラグ
    • 入力フォーム:Radio Options
    • オプション:html||md
    • 既定値:html
    • プロセッサ:なし
  3. 2.を判定基準として、Markdownのフラグが立った記事は、記事投稿時に1.のPHPパーサでHTMLに変換する自前プラグインを作成
    • プラグイン名:content_md2html
    • システムイベント:[7] Documents -> [1] OnDocPublished
      • $modx->documentObjectはテンプレート変数を名前で吐き出すので、$modx->documentObject["テンプレート変数名"]["value"]で中の値を持ってこられる。
        • チェックボックスによる複数選択の場合は||がデリミタ。

こんなイメージでした(でも実装できず)。

導入手順(妥協)

プラグインにするには知識が足りなかったのでスニペットにします(保存時に変換ではなく、表示時に変換、というスタンス)。

  1. PHPのMarkdownパーサを用意
  2. Markdownで記述するコンテンツ用のテンプレート変数を作成
    • 変数名:md_content
    • 投稿画面内の見出し:Markdownコンテンツ
    • 入力フォーム:Textarea
    • 既定値:なし
    • プロセッサ:なし
  3. 1.で作成したコンテンツを表示するスニペットを作成
    • スニペット名:content_md2html
    • コードは下記
  4. Markdownのテキストを1.のテンプレート変数に保存し、コンテンツ内で2.のスニペットを呼ぶ

スニペットのコード

$var_str = $modx->documentObject["md_content"]["value"]; //$var_strに代入

if(!empty($var_str)) { //文字列が空(0やfalse、空文字列も条件に含む)でない場合
    $parse_markdown_base = $modx->config['base_path']."assets/snippets/parse_markdown/";
    require_once($parse_markdown_base."Parsedown.php");
    $Parsedown = new Parsedown();
    $result = $Parsedown->text($var_str);
}
else {
    $result = "";
}

return $result;

これでどうでしょうか。上手く行っていそうですね。ええ、今お読みになっているこの文章がMarkdownで書かれた文章なのです。

備考

作る途中でMODxのdocumentObjectを眺めるためにjson_encode関数でエンコードしてjson形式で眺めていたのですが、あるリソース(フレンドリーURLにより、これがURIとなる)に任意のリソースIDをパラメータで投げて、指定されたリソースIDのdocumentObjectをjson形式で吐き出すスニペットを作ってやれば、REST APIっぽいものができるのではなかろうか、と思い付きました。

この方法だとリソースIDにしか対応できませんが、いろいろ拡張すればそれっぽいものもできそうな気はします。

タグ: テンプレート変数,スニペット,ブログ関係,Markdown

 



関連する記事一覧