この連載は、『PythonでMarkdownからEPUBをつくろう』を一部抜粋して編集したものです。
本編には、全てのソースコードや、生成する原稿のサンプルが付属しています。ぜひ、こちらもご購入ください。
姉妹版の『PythonとPygameで作る レトロ風RPG 全コード』もあります。
≫ 目次に戻る mod/toc/toc_xhtml.py
では、toc.xhtml
を構築します。TOCはTable of Contentsの略で、目次を意味します。
toc.xhtml
は、表紙と本文のあいだに挿入する目次ページです。本文を作成する時に収集した「目次用データ」を元に作成します。
gen-epub/
main.py
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の目次にも利用されます。
この連載は、『PythonでMarkdownからEPUBをつくろう』を一部抜粋して編集したものです。
本編には、全てのソースコードや、生成する原稿のサンプルが付属しています。ぜひ、こちらもご購入ください。
姉妹版の『PythonとPygameで作る レトロ風RPG 全コード』もあります。