筆者:藤原 由来
本連載では文書の装飾・構造付けを手軽に行える記法であるMarkdownを用いて、さまざまな文書や成果物を作成する方法を紹介します。前回に引き続き、文書変換ツール「Pandoc」の文書作成方法を紹介します。今回はPandocのフィルタ機能により柔軟な文書変換を実施する方法を解説します。
シェルスクリプトマガジン Vol.99は以下のリンク先でご購入できます。![]()
![]()
図4 入力とするMarkdownテキストファイル(sample-input.md)
|
1 2 3 4 5 6 7 8 9 10 11 |
# カレーの作り方 おいしいカレーを作りましょう。 ## 材料 - 牛肉 - 玉ねぎ - にんじん - カレールー - 水 |
図5 フィルタ適用後に出力されるMarkdownテキストファイル(sample-output.md)
|
1 2 3 4 5 6 7 8 9 10 11 |
# カレーの作り方 おいしいカレーを作りましょう。 ## ★材料 - 牛肉 - 玉ねぎ - にんじん - カレールー - 水 |
図7 Pythonで記述したJSONフィルタ
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
#!/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)
|
1 2 3 4 5 6 7 8 9 10 11 |
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)
|
1 2 3 4 5 6 7 8 |
function Header(elem) -- 見出しのレベルが2の場合 if elem.level == 2 then -- 内容の先頭に星印「★」を追加 table.insert(elem.content, 1, pandoc.Str("★")) end return elem end |
図A-2 図表の定義と、図表の参照を組み合わせた例
|
1 2 3 4 5 6 7 8 9 10 |
[@fig:sample]は、サンプル図を示しています。 [@tbl:sample]は、サンプル表を示しています。 {#fig:sample} | ヘッダー1 | ヘッダー2 | |-----------|-----------| | データ1 | データ2 | : サンプル表 {#tbl:sample} |