この連載は、『PythonでMarkdownからEPUBをつくろう』を一部抜粋して編集したものです。
本編には、全てのソースコードや、生成する原稿のサンプルが付属しています。ぜひ、こちらもご購入ください。
姉妹版の『PythonとPygameで作る レトロ風RPG 全コード』もあります。
≫ 目次に戻る loader.py
には設定を読み込む処理を書きます。
ここでは、プログラムを実行するときに--config
で指定したconfig.yaml
を読み込み、設定を読み取ります。
また、その他の設定も初期化します。
gen-epub/
main.py
mod/
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
を作ります。
data
dirs
input
config
epubcheck
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.py
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 全コード』もあります。