情報アイランド

「情報を制する者は世界を制す」をモットーに様々な情報を提供することを目指すブログです。現在はプログラミング関連情報が多めですが、投資関連情報も取り扱っていきたいです。

Node.jsでmarkdown-itを使ったMarkdown→HTML変換を行う

2017/04/08

MarkdownドキュメントをHTMLドキュメントに変換するには下のようなモジュールを利用する方法があります。

  • markdown
  • marked
  • showdown
  • markdown-it

この記事ではmarkdown-itモジュールを利用する方法を取り上げます。

変換

まず、markdownItクラスのインスタンスを作成します。

var markdownIt = require('markdown-it');

var mi = new markdownIt();

markdownItクラスのインスタンスが得られたらmi.render関数を呼び出します。

var hdoc = mi.render('xxx');

第1引数にMarkdownドキュメントを指定します。

返り値としてHTMLドキュメントが得られます。

なお、返り値として得られるHTMLドキュメントの改行コードは\nであるため、場合によっては自分で\r\nに変換しなければならないかもしれません。

設定

変換に関する設定を変更するにはmi.set関数を使用します。

mi.set({
    html: false, 
    breaks: false, 
    linkify: false, 
    highlight: function (code, lang) {
        return 'yyy';
    }
});

第1引数にオプションを指定します。

主なオプションには下のようなものがあります。

  • html・・・サニタイズを行わないかを真偽値として指定します。デフォルトはfalseです。
  • breaks・・・段落中の\n<br>に変換するかを真偽値として指定します。デフォルトはfalseです。
  • linkify・・・URLを表す文字列をリンクに変換するかを真偽値として指定します。デフォルトはfalseです。
  • highlight・・・codeタグの内容に対してシンタックスハイライトを行う処理を関数として指定します。この関数の第1引数はcodeタグの内容であり、第2引数は言語名です。この関数は返り値としてシンタックスハイライト後の内容を返すようにします。

サンプルコード1

3つ目のコマンドライン引数として与えられたファイルを読み込み、Markdownドキュメントとしてパースし、HTMLドキュメントに変換し、整形し、4つ目のコマンドライン引数として与えられたファイルに書き込みます。

HTMLドキュメントを整形する方法に関しては下の記事を参照してください。

なお、文字コードがUTF-8のテキストファイルを読み込むとテキストの先頭にBOM(バイトオーダーマーク)が付加されていることがあるため、下のプログラムではstripBom関数を使用してBOMを取り除いています。

stripBom関数に関しては下の記事を参照してください。

markdown-it.js

var fs = require('fs');
var stripBom = require('strip-bom');
var markdownIt = require('markdown-it');
var html = require('html');

if (process.argv.length < 4) {
    console.error('lack argument.');
    process.exit(1);
}

fs.readFile(process.argv[2], 'utf-8', function (err, mdoc) {
    if (err) {
        console.error(err);
        process.exit(1);
    }
    else {
        var mi = new markdownIt();
        var hdoc = html.prettyPrint(mi.render(stripBom(mdoc)), { indent_size: 2 }).replace(new RegExp('\r\n', 'g'), '\n').replace(new RegExp('\n', 'g'), `\r\n`);
        fs.writeFile(process.argv[3], hdoc, 'utf-8', function (err) {
            if (err) {
                console.error(err);
                process.exit(1);
            }
            else {
                console.log('finished!!');
            }
        });
    }
});

使用パッケージ

  • strip-bom
    npm install strip-bomでインストールします。
  • markdown-it
    npm install markdown-itでインストールします。
  • html prettyprinter
    npm install htmlでインストールします。

実行結果

現在のフォルダには下のような内容のdoc.mdという名称のMarkdownドキュメントが存在しています。

# 私が好きなアニメ

私が好きなアニメを紹介します。

* 対魔導学園35試験小隊
* 下ネタという概念が存在しない退屈な世界
* 城下町のダンデライオン
* 電波教師
* 魔法少女リリカルなのはViVid
* ISUCA
* DOG DAYS''
* 六畳間の侵略者!?
* 星刻の竜騎士

## 対魔導学園35試験小隊

序盤は微妙かなと思ったけど**回を進める毎に良くなっていきました**。

## 下ネタという概念が存在しない退屈な世界

このMarkdownドキュメントをHTMLドキュメントに変換してみます。

C:\work\node>node markdown-it.js doc.md doc.htm
finished!!

変換結果は下のようになりました。

<h1>私が好きなアニメ</h1>

<p>私が好きなアニメを紹介します。</p>
<ul>
  <li>対魔導学園35試験小隊</li>
  <li>下ネタという概念が存在しない退屈な世界</li>
  <li>城下町のダンデライオン</li>
  <li>電波教師</li>
  <li>魔法少女リリカルなのはViVid</li>
  <li>ISUCA</li>
  <li>DOG DAYS''</li>
  <li>六畳間の侵略者!?</li>
  <li>星刻の竜騎士</li>
</ul>

<h2>対魔導学園35試験小隊</h2>

<p>序盤は微妙かなと思ったけど<strong>回を進める毎に良くなっていきました</strong>。</p>

<h2>下ネタという概念が存在しない退屈な世界</h2>

関連

pizyumi
プログラミング歴19年のベテランプログラマー。業務システム全般何でも作れます。現在はWeb系の技術を勉強中。
スポンサーリンク

-Node.js