PerlのText::Markdown::Discountで囲い付きコードブロックを扱う ― 2022年12月11日 01時31分
この記事はPerl Advent Calendar 2022の11日目の分です。
PerlのText::Markdown::Discountモジュールを使うと、MarkdownをHTMLに変換できます。
use feature qw(say);
use Encode qw(encode_utf8);
use Text::Markdown::Discount qw(markdown);
say encode_utf8 markdown(<<'MARKDOWN');
こんにちは、世界。
* 順序
* なし
* リスト
MARKDOWN
<p>こんにちは、世界。</p>
<ul>
<li>順序</li>
<li>なし</li>
<li>リスト</li>
</ul>
オリジナルのMarkdownにはありませんが、CommonMarkおよびその拡張であるGitHub Flavored Markdownなどには囲い付きコードブロック(fenced code block)が存在します。3つ以上のバッククォート(`)の並びまたはチルダ(~)の並びで囲んだ部分が、HTMLのpre要素とcode要素を使って出力されるというものです。
Text::Markdown::Discountモジュール(の内部で使われているDiscountというMarkdown処理系)でも囲い付きコードブロックに対応していますが、扱い方がバージョンによって異なります。
Text::Markdown::Discount 0.14以降
囲い付きコードブロックを有効にするには、markdown関数の第2引数にMKD_FENCEDCODEフラグ(0x02000000)を指定します。
my $html = markdown(<<'MARKDOWN', Text::Markdown::Discount::MKD_NOHEADER | Text::Markdown::Discount::MKD_NOPANTS | 0x02000000);
```
fenced code block
```
MARKDOWN
<pre><code>fenced code block
</code></pre>
MKD_FENCEDCODEフラグはDiscount処理系で定義されているものの、Text::Markdown::Discountモジュールでは定数が定義されていていないため、フラグの値である0x02000000を直接指定しています。(定数を定義するpull requestが提出されています。)
MKD_NOHEADERフラグおよびMKD_NOPANTSフラグはmarkdown関数の第2引数を省略したときにデフォルトで適用されるフラグなので、元の挙動を変えずに別のフラグを追加する際には、このふたつのフラグも明示的に指定する必要があります。
MKD_FENCEDCODEフラグを指定しない場合、3つ以上のバッククォートの並びはインラインのコード範囲として解釈されます。
my $html = markdown(<<'MARKDOWN');
```
fenced code block
```
MARKDOWN
<p><code>
fenced code block
</code></p>
Text::Markdown::Discount 0.13
特にフラグを指定しなくても、囲い付きコードブロックが有効になっています。
my $html = markdown(<<'MARKDOWN');
```
fenced code block
```
MARKDOWN
<pre><code>fenced code block
</code></pre>
Text::Markdown::Discount 0.12以前
囲い付きコードブロックに対応していません。3つ以上のバッククォートの並びはインラインのコード範囲として解釈されます。
コメント
トラックバック
このエントリのトラックバックURL: http://nanto.asablo.jp/blog/2022/12/11/9547105/tb
コメントをどうぞ
※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。
※投稿には管理者が設定した質問に答える必要があります。