この連載は、『PythonでMarkdownからEPUBをつくろう』を一部抜粋して編集したものです。
本編には、全てのソースコードや、生成する原稿のサンプルが付属しています。ぜひ、こちらもご購入ください。
姉妹版の『PythonとPygameで作る レトロ風RPG 全コード』もあります。
≫ 目次に戻る loader.pyには設定を読み込む処理を書きます。
ここでは、プログラムを実行するときに--configで指定したconfig.yamlを読み込み、設定を読み取ります。
また、その他の設定も初期化します。
gen-epub/main.pymod/loader.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標準ライブラリーのsysとosを読み込みます。
また、mod.utlからfileを読み込みます。読み込むファイルのパスはmod/util/file.pyです。
処理のルートであるmain.pyがある場所をルートとして、from mod.utilと書いています。
このモジュールの名前は、asを使ってuf(util.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を作ります。
datadirsinputconfigepubcheck data['dirs']['input']は、最初に--configで指定したパスのディレクトリ部分です。
data['config']は、--configで指定したYAMLファイルを読み込んだ辞書です。
data['epubcheck']は、--epubcheckのフラグがあり、EPUBの確認をおこなうときはTrue、それ以外はFalseです。
プログラムの実行時引数に、--config パスの設定は複数書けます。--config パス1 --config パス2のように書いた場合は、パス1のYAMLファイルを読み込んだあと、パス2のYAMLファイルを読み込んで結合します。同じキーがある場合は上書きます。
この仕様を利用すると、複数の本を作る場合に、共通部分とそうでない部分とでファイルを分けることが可能です。
プログラムを全て解説すると冗長なので、何をおこなっているのかを箇条書きします。
for文で、sys.argvの内容を1つずつ取り出して処理していく。--configなら、その次のデータをconfig.yamlのパスとして読み取る。data['config']に空の辞書を代入する。data['dirs']['input']に代入する。data['config']にマージする。'--epubcheck'なら、data['epubcheck']をTrueにする。--configがなかった場合は、エラーを表示して終了する。dataを戻り値として返す。 辞書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を用意しておきます。
gen-epub/main.pyconfig.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 全コード』もあります。