PythonでMarkdownからEPUBをつくろう

この連載について

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

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

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

目次に戻る

2-1 config.yaml

公開:2025-03-17

 config.yamlは原稿の設定ファイルです。

 YAML形式は、人間が読みやすい形で設定を書くためのファイル形式です。仕様を知らなくても、読んだり書き換えたりするだけなら誰でも簡単におこなえます。1から書くには、仕様を知っている必要があります。

 YAMLの公式サイトを示しておきます。このサイトはYAML形式で表記されています。

The Official YAML Web Site
https://yaml.org/

▶ YAMLのWebサイト
config.YAMLの読み方

 YAMLの読み方を簡単に説明します。各行の#以降はコメント(プログラムに無視される部分)になります。

 連想配列(キーと値のペアが連なるデータ)は、「キー: 値」で書きます。複数のデータをまとめて書くときは「{キー: 値, キー: 値}」のようにも書けます。

 リスト(複数の値を持つデータ)は、各行の先頭を「-、半角スペース、値」で書くか、「[値, 値]」のように書きます。

 これらのキーや値はクォーテーションで囲っても囲わなくてもよいです。

▶ YAMLの例
 1# キーと値
 2キー1: 値1
 3
 4キー2:
 5  値2
 6
 7# 連想配列とリスト
 8連想配列1:
 9  {キー1: 値1, キー2: 値2}
10
11リスト1:
12  - 値1
13  - 値2
14
15リスト2: [値1, 値2]
16
17# クォーテーションで囲う
18"リスト3":
19  ['値1', "値2"]
config.yamlの全体

 それでは解説に進みましょう。ここでは、まずはサンプルとしてconfig.yamlの全体を示します。そのあと、各部の説明をおこないます。

▶ config.yaml
 1# 出力先ディレクトリー
 2outputDir: ../02_epub
 3
 4# 出力名
 5# 出力先ディレクトリーに「出力名のディレクトリー」と「出力名.epub」ファイルが作られる。
 6outputName: py-md-epub
 7
 8# カバー画像
 9coverPath: cover.jpg
10
11# カバー画像の横幅と高さ
12coverWidth: 1785
13coverHeight: 2560
14
15# 複製ディレクトリ
16# 使用していないファイルは、なるべく含めない。
17# 画像ファイルは、KDP用にjpgファイルのみにする。
18sendDirs:
19  - {src: css,   dst: css}
20  - {src: image, dst: image}
21
22# 追加複製ディレクトリ/ファイル
23# 追加で複製するディレクトリやファイル。
24sendEx:
25  - {src: css2/add.css, dst: css}
26#  - {src: css2/vertical.css, dst: css}
27
28# テンプレートHTML名
29# 「template-v.xhtml」は縦書き用、「template-h.xhtml」は横書き用。
30# 縦書きにした時の変更箇所。
31#   「pageProgressionDirection」(ページ送り方向)を「rtl」に。
32#   「sendEx」(複製追加)で「css2/vertical.css」を「css」に。
33templatePath:
34#  template-v.xhtml
35  template-h.xhtml
36
37# ------------------------------
38# 電書情報
39
40# タイトル
41title: PythonでMarkdownからEPUBをつくろう
42
43# 著者
44author: 柳井 政和
45
46# 概要
47description: プログラムでテキストファイルから電子書籍を作成する本です。
48
49# 日時
50dateISO: '2025-02-07T00:00:00Z'
51
52# 言語
53lang: ja
54
55# ページ送り方向
56# ltr (左から右、横書き用), rtl (右から左、縦書き用), default
57pageProgressionDirection:
58#  rtl
59  ltr
60
61# ユニークID
62# Webブラウザーのコンソールで「crypto.randomUUID()」を実行して作る。
63# あるいはPythonのREPLで「import uuid; uuid.uuid1()」を実行して作る。
64uid: XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
65
66# ------------------------------
67# 自動生成目次用
68
69# 表紙タイトル
70coverTitle: 表紙
71
72# 目次タイトル
73tocTitle: 目次
74
75# 目次ページ挿入テキスト前
76tocPreBody: |
77
78# 目次ページ挿入テキスト後
79tocPostBody: |
80
81# レベル先頭文字(レベル1,レベル2、…)
82tocLevelHead:
83  - ""
84  - "- "
85
86# ------------------------------
87# XHTML化するファイル
88# リストの順番にEPUBを構成する。
89docs:
90  - {src: d_000_前書き.md,           dst: d_000.xhtml}
91  - {src: d_802_宣伝.md,             dst: d_802.xhtml}
92  - {src: d_900_奥付.md,             dst: d_900.xhtml}
出力先ディレクトリー、出力名

 EPUBファイルを出力するディレクトリーを指定します。ここでは1つ上のディレクトリー内の、02_epubディレクトリーに出力します。

 また、出力ファイル名を指定します。

# 出力先ディレクトリー
outputDir: ../02_epub

# 出力名
outputName: py-md-epub

 ファイル構造は、次のようになります。

カバー画像

 カバー画像のパスです。カバー画像の横幅と高さは、実際のファイルに合わせます。

# カバー画像
coverPath: cover.jpg

# カバー画像の横幅と高さ
coverWidth: 1785
coverHeight: 2560

 ファイル構造は、次のようになります。

複製ディレクトリ、追加複製ディレクトリ/ファイル

 EPUBのディレクトリーに複製するディレクトリーの設定です。

 srcは転送元で、dstは転送先です。

 また、追加で複製するディレクトリーやファイルの設定もあります。追加複製の設定は、細かな制御をしたいときに用います。こちらは、転送先のディレクトリー内にファイルやディレクトリーを送ります。

# 複製ディレクトリ
sendDirs:
  - {src: css,   dst: css}
  - {src: image, dst: image}

# 追加複製ディレクトリ/ファイル
sendEx:
  - {src: css2/add.css, dst: css}

 ここでは、cssimageディレクトリーを複製します。また、追加でcss2/add.csscss2/code.cssを複製します。

 ファイル構造は、次のようになります。

テンプレートHTML名

 XHTMLファイルを作る際に、テンプレートにするファイルを選びます。私は横書き用のtemplate-h.xhtmlと、縦書き用のtemplate-v.xhtmlを用意しています。違いは読み込むCSSファイルの種類です。

 他にもいくつかテンプレートを用意してもよいでしょう。

# テンプレートHTML名
templatePath:
#  template-v.xhtml
  template-h.xhtml

 どのファイルを利用するかは、#(コメント)で切り替えられるようにしています。

電書情報

 タイトルや著者といった電子書籍の情報です。適宜書き換えます。

 この情報は主にitem/content.opf<metadata>の場所で利用します。また、ページ送り方向の設定は<spine>の場所で利用します。

# タイトル
title: PythonでMarkdownからEPUBをつくろう

# 著者
author: 柳井 政和

# 概要
description: プログラムでテキストファイルから電子書籍を作成する本です。

# 日時
dateISO: '2025-01-31T00:00:00Z'

# 言語
lang: ja

# ページ送り方向
pageProgressionDirection:
#  rtl
  ltr

 言語は重要です。AmazonのKDPにファイルを登録するとき、Amazon側で選んだ言語と、ここで指定した言語が異なるとエラーが出ます。

 日本語の場合はjaで、英語の場合はenです。

 ページ送り方向は、横書き用にページを左から右に進むか(ltr)、縦書き用に右から左に進むか(rtl)を設定します。

 この設定をしたからといって、電子書籍が自動で縦書きになるわけではありません。縦書きにするにはXHTMLファイルから読み込むCSSで、文字の向きを設定する必要があります。

ユニークID

 電子書籍には、他とは被らないユニークなIDを設定する必要があります。

# ユニークID
uid: XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX

 ここでは、PythonのREPLを利用してUUIDを生成して利用しましょう。pythonコマンドを引数なしで実行したあと、import uuid; uuid.uuid1()を入力して実行します。

▶ REPLを利用
python
>>> import uuid; uuid.uuid1()
XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX

 XX~XXの部分には、英数字でランダムな値が入ります。

▶ UUIDの生成
自動生成目次用

 自動生成目次に使う名前などを設定します。

# 表紙タイトル
coverTitle: 表紙

# 目次タイトル
tocTitle: 目次

# 目次ページ挿入テキスト前
tocPreBody: |

# 目次ページ挿入テキスト後
tocPostBody: |

# レベル先頭文字(レベル1,レベル2、…)
tocLevelHead:
  - ""
  - "- "

 表紙のタイトルとして「表紙」、目次のタイトルとして「目次」を設定しています。英語の本を作るときには英語に書き換えます。

 目次ページ挿入テキスト前/後は、目次の前後に挿入するテキストです。HTMLタグなどで自由に内容を書けます。

 レベル先頭文字は、目次を生成するときに、見出しの階層の先頭に付け加える文字です。ここではレベル1の見出しの先頭に加えるのは空文字(なし)で、レベル2の見出しの先頭に加えるのは「-」という記号にしています。

XHTML化するファイル

 本の中身にする.mdファイルを指定します。

# XHTML化するファイル
docs:
  - {src: d_000_前書き.md, dst: d_000.xhtml}
  ︙
  - {src: d_802_宣伝.md,   dst: d_802.xhtml}
  - {src: d_900_奥付.md,   dst: d_900.xhtml}

 左側の名前が読み込むファイル名(拡張子は.md)、右側の名前が出力するファイル名(拡張子は.xhtml)です。

 出力するファイル名は英数字にします。リーダー側でどんなエラーが発生するのか分からないので日本語は避けた方がよいです。


目次に戻る

この連載について

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

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

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

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


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