marked使っていて改行を2回以上入れられない問題にぶちあたった。
例えば、運用の人から以下のようなマークダウンが送られてきたとする。
# 重大発表
重大発表があります!
それは。。。
秘密です!
改行をたくさん入れることによって、スクロールしないと続きが読めないようにするようなコンテンツなわけだが、これを普通にmarkedでパースすると以下のような感じになってしまう。
<h1>重大発表</h1>
<p>重大発表があります!</p>
<p>それは。。。</P>
<p>秘密です!</P>
つまりたくさん入れたはずの改行が無くなってしまう。 breaks オプションを true にしてもこうなる。
かと言って運用の人に「改行は行末に半角スペースを2回入れてですね、、、」みたいなことを説明してもわかってもらえるはずがない。
なので以下のような実装をした。
marked.parse(text.replace(/(?<=\n|\r|\r\n)(\n|\r|\r\n)/g, '<br>'), { breaks: true })
改行が一個の場合はちゃんと <br>
になるので、2回続いている場合のみ無理やり <br>
に置換している。
が、コードブロックをハイライトしたい場合はこれでは不十分で、コードブロックの中でだけは上記の処理をしないようにする必要がある。その処理をここに書くと長くなるのでGistに貼っておく。
https://gist.github.com/newnakashima/9e2eee6a68b5c7810a42536aabf4f0a3