PythonでMarkdownからEPUBをつくろう

この連載について

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

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

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

目次に戻る

6-2 設定の読み込み

公開:2025-05-26

 loader.pyには設定を読み込む処理を書きます。

 ここでは、プログラムを実行するときに--configで指定したconfig.yamlを読み込み、設定を読み取ります。

 また、その他の設定も初期化します。

▶ ファイル構成

 まずは全体を示してから、各部の処理を説明します。

▶ main.py
 1import sys, os
 2from mod.util import file as uf
 3
 4# 読み込み
 5def load():
 6    data = get_args()   # 引数の取得
 7    init(data)          # 各種初期化
 8    return data
 9
10# 引数の取得
11def get_args():
12    # 引数による設定と、configの読み込み
13    data = {'dirs': {}, 'epubcheck': False}
14
15    for i, item in enumerate(sys.argv):
16        # 設定を読み込む、入力パスを設定する
17        if item == '--config':
18            p = sys.argv[i + 1] # 次の引数をパスとみなす
19            p = os.path.abspath(p)  # 絶対パスに
20            if 'config' not in data:
21                data['config'] = {}     # config作成
22                data['dirs']['input'] = os.path.dirname(p)
23            data['config'] |= uf.read_yaml(p)   # 結合
24
25        # EPUBチェックをおこなう
26        if item == '--epubcheck':
27            data['epubcheck'] = True
28
29    if 'config' not in data:
30        print('引数が不正なので終了')
31        sys.exit()
32
33    return data
34
35# 各種初期化
36def init(data):
37    dir = data['dirs']
38    con = data['config']
39
40    # プログラム側の設定を読み込む
41    data['appConfig'] = uf.read_yaml('config.yaml')
42
43    # 実行ディレクトリ
44    dir['app'] = os.getcwd()
45
46    # 出力/EPUB生成/XHTMLディレクトリ、EPUBパス
47    dir['output'] = uf.join(dir['input'], con['outputDir'])
48    dir['outputEpub'] = uf.join(dir['output'], 'epub')
49    dir['outputXhtml'] = uf.join(dir['outputEpub'], 'item/xhtml')
50    con['pEpub'] = uf.join(dir['output'], con['outputName'] + '.epub')
51
52    # テンプレートの読み込み
53    p = uf.join(dir['input'], con['templatePath'])
54    con['templateLoaded'] = uf.read(p)
インポート部分

 インポート部分です。

1import sys, os
2from mod.util import file as uf

 Python標準ライブラリーのsysosを読み込みます。

 また、mod.utlからfileを読み込みます。読み込むファイルのパスはmod/util/file.pyです。

 処理のルートであるmain.pyがある場所をルートとして、from mod.utilと書いています。

 このモジュールの名前は、asを使ってufutil.fileの略)に変えます。ここでは短い名前で利用可能にします。

読み込み

 設定の読み込み処理をまとめたものです。関数を順番に実行していきます。最後に、作成したdataを返します。

4# 読み込み
5def load():
6    data = get_args()   # 引数の取得
7    init(data)          # 各種初期化
8    return data
引数の取得

 プログラムの実行時引数sys.argvを解析して、設定を読み込みます。

10# 引数の取得
11def get_args():
12    # 引数による設定と、configの読み込み
13    data = {'dirs': {}, 'epubcheck': False}
14
15    for i, item in enumerate(sys.argv):
16        # 設定を読み込む、入力パスを設定する
17        if item == '--config':
18            p = sys.argv[i + 1] # 次の引数をパスとみなす
19            p = os.path.abspath(p)  # 絶対パスに
20            if 'config' not in data:
21                data['config'] = {}     # config作成
22                data['dirs']['input'] = os.path.dirname(p)
23            data['config'] |= uf.read_yaml(p)   # 結合
24
25        # EPUBチェックをおこなう
26        if item == '--epubcheck':
27            data['epubcheck'] = True
28
29    if 'config' not in data:
30        print('引数が不正なので終了')
31        sys.exit()
32
33    return data

 ここでは次のような辞書dataを作ります。

 data['dirs']['input']は、最初に--configで指定したパスのディレクトリ部分です。

 data['config']は、--configで指定したYAMLファイルを読み込んだ辞書です。

 data['epubcheck']は、--epubcheckのフラグがあり、EPUBの確認をおこなうときはTrue、それ以外はFalseです。

 プログラムの実行時引数に、--config パスの設定は複数書けます。--config パス1 --config パス2のように書いた場合は、パス1のYAMLファイルを読み込んだあと、パス2のYAMLファイルを読み込んで結合します。同じキーがある場合は上書きます。

 この仕様を利用すると、複数の本を作る場合に、共通部分とそうでない部分とでファイルを分けることが可能です。

引数の取得:プログラムでおこなっていること

 プログラムを全て解説すると冗長なので、何をおこなっているのかを箇条書きします。

 辞書1 | 辞書2と書くと、辞書1辞書2をマージした内容を返します。辞書1 |= 辞書2と書くと、辞書1辞書2をマージした内容を辞書1に代入します。

 sys.exit()は、強制的にプログラムを終了する関数です。

各種初期化

 いくつかの雑多な処理をおこないます。

35# 各種初期化
36def init(data):
37    dir = data['dirs']
38    con = data['config']
39
40    # プログラム側の設定を読み込む
41    data['appConfig'] = uf.read_yaml('config.yaml')
42
43    # 実行ディレクトリ
44    dir['app'] = os.getcwd()
45
46    # 出力/EPUB生成/XHTMLディレクトリ、EPUBパス
47    dir['output'] = uf.join(dir['input'], con['outputDir'])
48    dir['outputEpub'] = uf.join(dir['output'], 'epub')
49    dir['outputXhtml'] = uf.join(dir['outputEpub'], 'item/xhtml')
50    con['pEpub'] = uf.join(dir['output'], con['outputName'] + '.epub')
51
52    # テンプレートの読み込み
53    p = uf.join(dir['input'], con['templatePath'])
54    con['templateLoaded'] = uf.read(p)

 まず、プログラム側の設定を読み込みます。gen-epubディレクトリー内にもconfig.yamlを用意しておきます。

▶ ファイル構成

 中身は次のようにします。

▶ config.yaml
1# epubcheckのパス
2epubcheck: ../epubcheck-3.0.1/epubcheck-3.0.1.jar

 ../epubcheck-3.0.1/epubcheck-3.0.1.jarの部分には、実際に配置したepubcheck-3.0.1.jarのパスを書きます。

 続いてdir(実体はdata['dirs'])に、出力用の各種パスを作成して代入していきます。また、出力するEPUBファイルのパスはcon['pEpub']に代入します。

 最後にXHTMLのテンプレート(01_md/template-h.xhtml)を読み込み、con['templateLoaded']に代入します。


目次に戻る

この連載について

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

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

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

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


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