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の入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。
※投稿には管理者が設定した質問に答える必要があります。