PythonでMarkdownからEPUBをつくろう

この連載について

 この連載は、『PythonでMarkdownからEPUBをつくろう』を一部抜粋して編集したものです。

 本編には、全てのソースコードや、生成する原稿のサンプルが付属しています。ぜひ、こちらもご購入ください。

 姉妹版の『PythonとPygameで作る レトロ風RPG 全コード』もあります。

目次に戻る

9-1 toc.xhtmlの構築

公開:2025-05-29

 mod/toc/toc_xhtml.pyでは、toc.xhtmlを構築します。TOCはTable of Contentsの略で、目次を意味します。

 toc.xhtmlは、表紙と本文のあいだに挿入する目次ページです。本文を作成する時に収集した「目次用データ」を元に作成します。

▶ ファイル構成
▶ mod/toc/toc_xhtml.py
 1from mod.util import file as uf
 2
 3# toc.xhtmlの構築
 4# 目次ページに利用。EPUBやKPFの目次情報にも利用。
 5def build(data):
 6    dir = data['dirs']
 7    con = data['config']
 8
 9    # 目次リストの作成
10    li = []
11    for title in con['titles']:
12        f = title['file']
13        t = title['title']
14        l = title['level']
15        h = con['tocLevelHead'][l - 1]
16        children = title['children']
17        li.append(f'<li class="toc-level-{l}"><a href="./{f}">{h}{t}</a></li>')
18
19        for child in children:
20            t  = child['title']
21            l  = child['level']
22            h = con['tocLevelHead'][l - 1]
23            id = child['id']
24            li.append(f'<li class="toc-level-{l}"><a href="./{f}#{id}">{h}{t}</a></li>')
25
26    li = [' ' * 16 + s for s in li]
27    t_li = '\n'.join(li)
28
29    # toc.xhtmlの書き換え
30    p = uf.join(dir['outputEpub'], 'item/xhtml/toc.xhtml')
31    toc = uf.read(p)
32    t = con['templateLoaded']
33    t = t.replace('@body@', toc)
34    t = t.replace('@lang@', con['lang'])
35    t = t.replace('@title@', con['tocTitle'])
36    t = t.replace('@tocTitle@', con['tocTitle'])
37    t = t.replace('@tocPreBody@', con['tocPreBody'])
38    t = t.replace('@listLi@', t_li)
39    t = t.replace('@tocPostBody@', con['tocPostBody'])
40    uf.write(p, t)

 処理は前半の目次リストの作成と、後半のtoc.xhtmlの書き換えに分かれます。後半の処理は、これまで出てきた「ファイルを読んで置換する処理」と同じなので説明を省きます。

 前半では、半角スペース16個<li><a href="URL" class="toc-level-レベル">タイトル</a></li>というテキストのリストを作っています。

 前半の処理のいくつかを説明します。

 Pythonでは、f'テキスト{変数や式}'テキストと書くことで、テキストの中に変数の値や、式の計算結果を埋め込むことができます。

 [' ' * 16 + s for s in li]の部分はリスト内包表記と呼ばれる書き方です。変数liの各要素を変数sとして取り出してforの前の式で処理していきます。そして式の結果をまとめた新しいリストを作ります。

 ' ' * 16の部分は、半角スペースを16個繰り返すという意味です。

 下にリスト内包表記の例を示します。

▶ リスト内包表記の例
1# 初期化
2list_a = ['rat', 'cat', 'dog']
3list_b = ['#' * 2 + s for s in list_a]
4print(list_b)
5# 「['##rat', '##cat', '##dog']」と出力

 ここでは、「ページへのリンク」と「その中の各タイトルへのリンク」を作っていき、目次のテキストを作成します。

 このファイルの内容は、Kindleの目次にも利用されます。

▶ Kindleの目次

目次に戻る

この連載について

 この連載は、『PythonでMarkdownからEPUBをつくろう』を一部抜粋して編集したものです。

 本編には、全てのソースコードや、生成する原稿のサンプルが付属しています。ぜひ、こちらもご購入ください。

 姉妹版の『PythonとPygameで作る レトロ風RPG 全コード』もあります。

 技術系同人誌など まとめページ


トップページに戻る
Cronus Crown(クロノス・クラウン)のトップページに戻る
(c)2002-2025 Cronus Crown (c)1997-2025 Masakazu Yanai
ご意見・お問い合わせはサイト情報 弊社への連絡までお願いします
個人情報の取り扱い、利用者情報の外部送信について