シェルスクリプトマガジン

Markdownを活用する(Vol.99掲載)

筆者:藤原 由来

本連載では文書の装飾・構造付けを手軽に行える記法であるMarkdownを用いて、さまざまな文書や成果物を作成する方法を紹介します。前回に引き続き、文書変換ツール「Pandoc」の文書作成方法を紹介します。今回はPandocのフィルタ機能により柔軟な文書変換を実施する方法を解説します。

シェルスクリプトマガジン Vol.99は以下のリンク先でご購入できます。

図4 入力とするMarkdownテキストファイル(sample-input.md)

# カレーの作り方

おいしいカレーを作りましょう。

## 材料

- 牛肉
- 玉ねぎ
- にんじん
- カレールー
- 水

図5 フィルタ適用後に出力されるMarkdownテキストファイル(sample-output.md)

# カレーの作り方

おいしいカレーを作りましょう。

## ★材料

- 牛肉
- 玉ねぎ
- にんじん
- カレールー
- 水

図7 Pythonで記述したJSONフィルタ

#!/usr/bin/env -S uv run --script
import panflute as pf

def add_star_to_header2(elem, doc):
    """
    レベル2の見出しに星印「★」を追加するフィルタ関数
    """
    # 要素の種類がHeaderで、レベルが2の場合
    if isinstance(elem, pf.Header) and elem.level == 2:
        # 星印を表す要素を生成
        star = pf.Str("★")

        # 見出しの内容の先頭に星印を追加
        elem.content.insert(0, star)
    return elem

def main(doc=None):
    """
    メイン関数: フィルタを実行
    """
    return pf.run_filter(add_star_to_header2, doc=doc)

# スクリプトが直接実行された場合にmain()を呼び出す
if __name__ == "__main__":
    main()

図9 Luaフィルタの内容(add_star.lua)

function Pandoc(doc)
  -- 各ブロックについて処理
  for i, elem in ipairs(doc.blocks) do
    -- 要素の書類がHeaderで、レベルが2の場合
    if elem.t == "Header" and elem.level == 2 then
      -- 内容の先頭に星印「★」を追加
      table.insert(elem.content, 1, pandoc.Str("★"))
    end
  end
  return doc
end

図10 別の記述を用いたLuaフィルタの内容(add_star2.lua)

function Header(elem)
  -- 見出しのレベルが2の場合
  if elem.level == 2 then
    -- 内容の先頭に星印「★」を追加
    table.insert(elem.content, 1, pandoc.Str("★"))
  end
  return elem
end

図A-2 図表の定義と、図表の参照を組み合わせた例

[@fig:sample]は、サンプル図を示しています。
[@tbl:sample]は、サンプル表を示しています。

![サンプル図](cat1.png){#fig:sample}

| ヘッダー1 | ヘッダー2 |
|-----------|-----------|
| データ1   | データ2   |

: サンプル表 {#tbl:sample}