review 1.2.0 → 1.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +36 -0
- data/.rubocop.yml +1 -0
- data/ChangeLog +102 -0
- data/README.rdoc +2 -2
- data/bin/review-check +18 -16
- data/bin/review-compile +49 -42
- data/bin/review-epubmaker +23 -993
- data/bin/review-epubmaker-legacy +1024 -0
- data/bin/review-index +17 -15
- data/bin/review-init +39 -9
- data/bin/review-pdfmaker +124 -89
- data/bin/review-preproc +16 -14
- data/bin/review-vol +17 -15
- data/debian/docs +1 -1
- data/doc/catalog.rdoc +34 -0
- data/doc/format.rdoc +16 -2
- data/doc/libepubmaker/{config.yaml → config.yml} +63 -19
- data/doc/quickstart.rdoc +1 -1
- data/doc/{sample.yaml → sample.yml} +0 -0
- data/lib/epubmaker.rb +1 -1
- data/lib/epubmaker/content.rb +9 -1
- data/lib/epubmaker/epubv2.rb +59 -7
- data/lib/epubmaker/epubv3.rb +14 -9
- data/lib/epubmaker/producer.rb +68 -27
- data/lib/epubmaker/resource.rb +3 -1
- data/lib/lineinput.rb +2 -2
- data/lib/review/book/base.rb +125 -24
- data/lib/review/book/chapter.rb +42 -0
- data/lib/review/book/compilable.rb +23 -4
- data/lib/review/book/image_finder.rb +64 -0
- data/lib/review/book/index.rb +64 -50
- data/lib/review/book/page_metric.rb +1 -1
- data/lib/review/builder.rb +19 -12
- data/lib/review/catalog.rb +47 -0
- data/lib/review/compiler.rb +3 -2
- data/lib/review/configure.rb +5 -3
- data/lib/review/epubmaker.rb +130 -46
- data/lib/review/ewbbuilder.rb +27 -31
- data/lib/review/extentions/string.rb +4 -4
- data/lib/review/htmlbuilder.rb +140 -79
- data/lib/review/htmllayout.rb +26 -4
- data/lib/review/htmlutils.rb +20 -1
- data/lib/review/i18n.rb +5 -2
- data/lib/review/{i18n.yaml → i18n.yml} +4 -2
- data/lib/review/idgxmlbuilder.rb +65 -39
- data/lib/review/latexbuilder.rb +72 -24
- data/lib/review/latexutils.rb +3 -1
- data/lib/review/makerhelper.rb +8 -2
- data/lib/review/preprocessor.rb +20 -20
- data/lib/review/review.tex.erb +4 -0
- data/lib/review/sec_counter.rb +9 -11
- data/lib/review/tocparser.rb +2 -2
- data/lib/review/tocprinter.rb +12 -12
- data/lib/review/topbuilder.rb +15 -15
- data/lib/review/version.rb +1 -1
- data/lib/uuid.rb +7 -7
- data/review.gemspec +2 -2
- data/rubocop-todo.yml +443 -0
- data/test/sample-book/src/config.yml +2 -2
- data/test/sample-book/src/{main.css → style.css} +0 -0
- data/test/test_book.rb +46 -48
- data/test/test_book_chapter.rb +25 -13
- data/test/test_builder.rb +3 -3
- data/test/test_catalog.rb +107 -0
- data/test/test_epubmaker.rb +6 -6
- data/test/test_htmlbuilder.rb +160 -39
- data/test/test_htmlutils.rb +22 -0
- data/test/test_i18n.rb +2 -2
- data/test/test_idgxmlbuilder.rb +33 -47
- data/test/test_image_finder.rb +82 -0
- data/test/test_inaobuilder.rb +1 -1
- data/test/test_latexbuilder.rb +35 -39
- data/test/test_lineinput.rb +2 -2
- data/test/test_markdownbuilder.rb +2 -2
- data/test/test_topbuilder.rb +39 -23
- metadata +23 -14
- data/bin/review-epubmaker-ng +0 -23
data/bin/review-preproc
CHANGED
@@ -18,6 +18,7 @@ $LOAD_PATH.unshift((bindir + '../lib').realpath)
|
|
18
18
|
|
19
19
|
require 'review/preprocessor'
|
20
20
|
require 'review/unfold'
|
21
|
+
require 'review/version'
|
21
22
|
require 'lineinput'
|
22
23
|
require 'stringio'
|
23
24
|
require 'fileutils'
|
@@ -42,41 +43,42 @@ def main
|
|
42
43
|
}
|
43
44
|
|
44
45
|
mode = :output
|
45
|
-
|
46
|
-
|
47
|
-
|
46
|
+
opts = OptionParser.new
|
47
|
+
opts.version = ReVIEW::VERSION
|
48
|
+
opts.banner = "Usage: #{File.basename($0)} [-c|-d|-s|--replace] [<file>...]"
|
49
|
+
opts.on('--inencoding=ENCODING', 'Set input encoding. (UTF-8, EUC, JIS, and
|
48
50
|
SJIS)') {|enc|
|
49
51
|
param["inencoding"] = enc
|
50
52
|
}
|
51
|
-
|
53
|
+
opts.on('--outencoding=ENCODING', 'Set output encoding. (UTF-8[default], EUC
|
52
54
|
, JIS, and SJIS)') {|enc|
|
53
55
|
param["outencoding"] = enc
|
54
56
|
}
|
55
|
-
|
57
|
+
opts.on('-c', '--check', 'Check if preprocess is needed.') {
|
56
58
|
mode = :check
|
57
59
|
}
|
58
|
-
|
60
|
+
opts.on('-d', '--diff', 'Show diff from current file.') {
|
59
61
|
mode = :diff
|
60
62
|
}
|
61
|
-
|
63
|
+
opts.on('--replace', 'Replace file by preprocessed one.') {
|
62
64
|
mode = :replace
|
63
65
|
}
|
64
|
-
|
66
|
+
opts.on('-s', '--strip', 'Strip preprocessor tags.') {
|
65
67
|
mode = :strip
|
66
68
|
}
|
67
|
-
|
69
|
+
opts.on('--final', 'Unfold text and strip preprocessor tags. (deprecated)') {
|
68
70
|
mode = :final
|
69
71
|
}
|
70
|
-
|
71
|
-
|
72
|
-
puts
|
72
|
+
opts.on('--tabwidth=WIDTH', "Replace tabs with space characters. (0: don't replace)") {|width| param["tabwidth"] = width.to_i }
|
73
|
+
opts.on('--help', 'Print this message and quit.') {
|
74
|
+
puts opts.help
|
73
75
|
exit 0
|
74
76
|
}
|
75
77
|
begin
|
76
|
-
|
78
|
+
opts.parse!
|
77
79
|
rescue OptionParser::ParseError => err
|
78
80
|
$stderr.puts err.message
|
79
|
-
$stderr.puts
|
81
|
+
$stderr.puts opts.help
|
80
82
|
exit 1
|
81
83
|
end
|
82
84
|
|
data/bin/review-vol
CHANGED
@@ -23,40 +23,42 @@ include ReVIEW::TextUtils
|
|
23
23
|
def main
|
24
24
|
$KCODE = 'UTF-8' unless defined?(Encoding)
|
25
25
|
|
26
|
-
@
|
26
|
+
@config = ReVIEW::Configure.values
|
27
|
+
@config.merge!({
|
27
28
|
"inencoding" => "UTF-8",
|
28
29
|
"outencoding" => "UTF-8"
|
29
|
-
}
|
30
|
+
})
|
30
31
|
|
31
32
|
part_sensitive = false
|
32
33
|
basedir = nil
|
33
|
-
|
34
|
-
|
34
|
+
opts = OptionParser.new
|
35
|
+
opts.version = ReVIEW::VERSION
|
36
|
+
opts.on('-P', '--part-sensitive', 'Prints volume of each parts.') {
|
35
37
|
part_sensitive = true
|
36
38
|
}
|
37
|
-
|
38
|
-
@
|
39
|
+
opts.on('--inencoding=ENCODING', 'Set input encoding. (UTF-8, EUC, JIS, and SJIS)') {|enc|
|
40
|
+
@config["inencoding"] = enc
|
39
41
|
}
|
40
|
-
|
41
|
-
@
|
42
|
+
opts.on('--outencoding=ENCODING', 'Set output encoding. (UTF-8[default], EUC, JIS, and SJIS)') {|enc|
|
43
|
+
@config["outencoding"] = enc
|
42
44
|
}
|
43
|
-
|
45
|
+
opts.on('--directory=DIR', 'Compile all chapters in DIR.') {|path|
|
44
46
|
basedir = path
|
45
47
|
}
|
46
|
-
|
47
|
-
puts
|
48
|
+
opts.on('--help', 'Print this message and quit') {
|
49
|
+
puts opts.help
|
48
50
|
exit 0
|
49
51
|
}
|
50
52
|
begin
|
51
|
-
|
53
|
+
opts.parse!
|
52
54
|
rescue OptionParser::ParseError => err
|
53
55
|
$stderr.puts err.message
|
54
|
-
$stderr.puts
|
56
|
+
$stderr.puts opts.help
|
55
57
|
exit 1
|
56
58
|
end
|
57
59
|
|
58
60
|
book = basedir ? ReVIEW::Book.load(basedir) : ReVIEW.book
|
59
|
-
ReVIEW.book.
|
61
|
+
ReVIEW.book.config = @config
|
60
62
|
if part_sensitive
|
61
63
|
sep = ""
|
62
64
|
book.each_part do |part|
|
@@ -85,7 +87,7 @@ end
|
|
85
87
|
|
86
88
|
def print_chapter_volume(chap)
|
87
89
|
vol = chap.volume
|
88
|
-
title = convert_outencoding(chap.title, @
|
90
|
+
title = convert_outencoding(chap.title, @config["outencoding"])
|
89
91
|
printf "%s %3dKB %6dC %5dL %3dP %s %-s\n",
|
90
92
|
chapnumstr(chap.number), vol.kbytes, vol.chars, vol.lines, vol.page,
|
91
93
|
"#{chap.name} ".ljust(25, '.'), title
|
data/debian/docs
CHANGED
data/doc/catalog.rdoc
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
= Re:VIEW カタログファイル ガイド
|
2
|
+
|
3
|
+
Re:VIEW のカタログファイル catalog.ymlについて説明します。
|
4
|
+
|
5
|
+
== カタログファイルとは
|
6
|
+
|
7
|
+
Re:VIEW フォーマットで記述された各ファイルを特に一冊の本(例えばpdfやepub)にまとめる際に、どのようにそれらのファイルを構造化するかを指定するファイルです。
|
8
|
+
現在はカタログファイルと言えばcatalog.ymlのことを指します。
|
9
|
+
|
10
|
+
== catalog.ymlを用いた場合の設定方法
|
11
|
+
|
12
|
+
catalog.yml内で、PREDEF(前付け)、CHAPS(本編)、POSTDEF(後付け)を記述します。CHAPSのみ必須です。
|
13
|
+
|
14
|
+
PREDEF:
|
15
|
+
- intro.re
|
16
|
+
|
17
|
+
CHAPS:
|
18
|
+
- ch01.re
|
19
|
+
- ch02.re
|
20
|
+
|
21
|
+
POSTDEF:
|
22
|
+
- appendix.re
|
23
|
+
|
24
|
+
本編に対して、「部」構成を加えたい場合、CHAPSを段階的にして記述します。
|
25
|
+
|
26
|
+
(旧バージョンの利用者の方へ: PARTという項目はありません。CHAPSに記述してください)
|
27
|
+
|
28
|
+
== バージョン 1.2以前について
|
29
|
+
|
30
|
+
1.2以前のRe:VIEWではカタログファイルとしてPREDEF, CHAPS, POSTDEF, PARTという独立した4つのファイルを使用していました。
|
31
|
+
そのため、当時のバージョンを利用する際にはcatalog.ymlではなくそちらを記述する必要があります。
|
32
|
+
|
33
|
+
現在のRe:VIEWはcatalog.ymlを用いた方法と旧バージョンが使用していたCHAPS, PREDEF, POSTDEF, PARTを用いた方法と両方をサポートしています。
|
34
|
+
ただしcatalog.ymlが存在する場合、そちらが優先されます。
|
data/doc/format.rdoc
CHANGED
@@ -568,6 +568,20 @@ PART:
|
|
568
568
|
:
|
569
569
|
@<hd>{hajimeni|まずわ}
|
570
570
|
|
571
|
+
=== コラム見出し参照
|
572
|
+
|
573
|
+
コラムの見出しの参照は、@<column>を使います。
|
574
|
+
|
575
|
+
例:
|
576
|
+
|
577
|
+
@<column>{Re:VIEWの用途いろいろ}
|
578
|
+
|
579
|
+
ラベルでの参照もできます。
|
580
|
+
|
581
|
+
==[column]{review-application} Re:VIEWの応用
|
582
|
+
:
|
583
|
+
@<column>{review-application}
|
584
|
+
|
571
585
|
== リンク
|
572
586
|
|
573
587
|
Web ハイパーリンクを記述するには、リンクに @<href>、アンカーに //label
|
@@ -588,7 +602,7 @@ Web ハイパーリンクを記述するには、リンクに @<href>、アン
|
|
588
602
|
Re:VIEWが出力する文字列(「第◯章」「図」「表」など)を、指定した言語に
|
589
603
|
合わせて出力することができます。デフォルトは日本語です。
|
590
604
|
|
591
|
-
CHAPS などと同じディレクトリに locale.
|
605
|
+
CHAPS などと同じディレクトリに locale.yml というファイルを用意して、
|
592
606
|
以下のように記述します(日本語の場合)。
|
593
607
|
|
594
608
|
例:
|
@@ -596,7 +610,7 @@ CHAPS などと同じディレクトリに locale.yaml というファイルを
|
|
596
610
|
locale: ja
|
597
611
|
|
598
612
|
既存の表記を書き換えたい場合は、該当する項目を上書きします。
|
599
|
-
既存の設定ファイルは lib/review/i18n.
|
613
|
+
既存の設定ファイルは lib/review/i18n.yml にあります。
|
600
614
|
|
601
615
|
例:
|
602
616
|
|
@@ -62,9 +62,6 @@ aut: ["Minero Aoki", "Kenshi Muto", "Masayoshi Takahashi", "Masanori Kado"]
|
|
62
62
|
# coverage: 内容の範囲や領域(配列で複数指定可)
|
63
63
|
|
64
64
|
# htmlext: HTMLファイルの拡張子(省略した場合はhtml)
|
65
|
-
# cover: カバーページのファイル名(省略した場合はbookname.xhtmlになる)
|
66
|
-
#
|
67
|
-
# coverimage: カバー用画像
|
68
65
|
#
|
69
66
|
# CSSファイル(配列で複数指定可)
|
70
67
|
stylesheet: ["stylesheet.css"]
|
@@ -77,41 +74,64 @@ stylesheet: ["stylesheet.css"]
|
|
77
74
|
# 目次として抽出する見出しレベル
|
78
75
|
# toclevel: 2
|
79
76
|
# 目次を要素の階層表現にしない。省略した場合(null)は階層化する。
|
80
|
-
#
|
81
|
-
#
|
77
|
+
# 特に部扉が入るなどの理由で、構成によっては階層化目次でepubcheckに
|
78
|
+
# パスしない目次ができるが、そのようなときにはこれをtrueにする
|
82
79
|
# flattoc: null
|
83
80
|
# 目次のインデントレベルをスペース文字で表現する(flattocがtrueのときのみ)
|
84
81
|
# flattocindent: true
|
82
|
+
|
83
|
+
# 採番の設定。採番させたくない見出しには「==[nonum]」のようにnonum指定をする
|
84
|
+
#
|
85
85
|
# 本文でセクション番号を表示する見出しレベル
|
86
86
|
# secnolevel: 2
|
87
|
-
|
87
|
+
|
88
|
+
# 付録の連番のスタイル。null(アラビア数字1〜。デフォルト)、alpha(英字A〜)、roman(ローマ数字I〜)
|
89
|
+
# appendix_format: null
|
90
|
+
|
91
|
+
# 以下のsecnolevelはまだ未実装。
|
92
|
+
# 前付でセクション番号を表示する見出しレベル(未実装)
|
88
93
|
# pre_secnolevel: 0
|
89
|
-
#
|
90
|
-
# post_secnolevel:
|
91
|
-
# 部番号を表示する見出しレベル
|
94
|
+
# 後付(付録)でセクション番号を表示する見出しレベル(未実装)
|
95
|
+
# post_secnolevel: 1
|
96
|
+
# 部番号を表示する見出しレベル(未実装)
|
92
97
|
# part_secnolevel: 1
|
93
98
|
|
94
|
-
# NCX目次の見出しレベルごとの飾り(配列で設定)
|
99
|
+
# NCX目次の見出しレベルごとの飾り(配列で設定)。EPUB3ではNCXは作られない
|
95
100
|
#ncxindent:
|
96
101
|
#-
|
97
102
|
#- -
|
98
103
|
|
99
104
|
# EPUB2標準の目次以外に物理目次ファイルを作成するか。省略した場合はnull (作成しない)
|
100
|
-
# ePUB3
|
105
|
+
# ePUB3においてはこの設定によらず必ず作成される
|
101
106
|
# mytoc: true
|
102
107
|
|
103
|
-
#
|
104
|
-
#
|
105
|
-
|
106
|
-
#
|
107
|
-
#
|
108
|
-
#
|
108
|
+
# 表紙にするHTMLファイル。ファイル名を指定すると表紙として入る
|
109
|
+
# cover: null
|
110
|
+
# 表紙に配置し、書籍の影絵にも利用する画像ファイル。省略した場合はnull (画像を使わない)
|
111
|
+
# coverimage: null
|
112
|
+
# 表紙の後に大扉ページを作成するか。省略した場合はnull (作成しない)
|
113
|
+
# titlepage: null
|
114
|
+
# 自動生成される大扉ページを上書きするファイル。ファイル名を指定すると大扉として入る
|
115
|
+
# titlefile: null
|
116
|
+
# 原書大扉ページにするHTMLファイル。ファイル名を指定すると原書大扉として入る
|
117
|
+
# originaltitlefile: null
|
118
|
+
# 権利表記ページファイル。ファイル名を指定すると権利表記として入る
|
119
|
+
# creditfile: null
|
109
120
|
|
110
121
|
# プロフィールページファイル。ファイル名を指定すると著者紹介として入る
|
111
122
|
# profile: null
|
112
123
|
# プロフィールページの目次上の見出し
|
113
124
|
# profiletitle: 著者紹介
|
114
125
|
|
126
|
+
# 広告ファイル。ファイル名を指定すると広告として入る
|
127
|
+
# advfile: null
|
128
|
+
|
129
|
+
# 奥付を作成するか。デフォルトでは作成されない。trueを指定するとデフォルトの奥付、ファイル名を指定するとそれがcolophon.htmlとしてコピーされる
|
130
|
+
# colophon: true
|
131
|
+
|
132
|
+
# 裏表紙ファイル (画像はcoversまたはimagesに配置する)。ファイル名を指定すると裏表紙として入る
|
133
|
+
# backcover: null
|
134
|
+
|
115
135
|
# フックは、各段階で介入したいときのプログラムを指定する。自動で適切な引数が渡される
|
116
136
|
# プログラムには実行権限が必要
|
117
137
|
|
@@ -119,7 +139,7 @@ stylesheet: ["stylesheet.css"]
|
|
119
139
|
# 渡される引数1=作業用展開ディレクトリ
|
120
140
|
# hook_beforeprocess: null
|
121
141
|
|
122
|
-
#
|
142
|
+
# 前付の作成後に実行するプログラム。作業用展開ディレクトリにある目次ファイル(toc-html.txt)を操作したいときなどに利用する。
|
123
143
|
# 渡される引数1=作業用展開ディレクトリ
|
124
144
|
# hook_afterfrontmatter: null
|
125
145
|
|
@@ -127,7 +147,7 @@ stylesheet: ["stylesheet.css"]
|
|
127
147
|
# 渡される引数1=作業用展開ディレクトリ
|
128
148
|
# hook_afterbody: null
|
129
149
|
|
130
|
-
#
|
150
|
+
# 後付の作成後に実行するプログラム。作業用展開ディレクトリにある目次ファイル(toc-html.txt)を操作したいときなどに利用する。
|
131
151
|
# 渡される引数1=作業用展開ディレクトリ
|
132
152
|
# hook_afterbackmatter: null
|
133
153
|
|
@@ -154,6 +174,12 @@ stylesheet: ["stylesheet.css"]
|
|
154
174
|
# fontdir内から取り込まれる対象となるファイル拡張子。省略した場合は以下
|
155
175
|
# font_ext: ["ttf", "woff", "otf"]
|
156
176
|
|
177
|
+
# 変換したHTMLファイルおよびCSSを解析して厳密に使用している画像ファイルだけを取り込むか。デフォルトはnull(imagesディレクトリすべてを取り込む)
|
178
|
+
# なお、フォント、カバー、広告についてはこの設定によらずディレクトリ内のものがすべて取り込まれる
|
179
|
+
# verify_target_images: null
|
180
|
+
# verify_target_imagesがtrueの状態において、解析で発見されなくても強制的に取り込むファイルの相対パスの配列
|
181
|
+
# force_include_images: []
|
182
|
+
|
157
183
|
# Re:VIEWファイル名を使わず、前付にpre01,pre02...、本文にchap01,chap02l...、後付にpost01,post02...という名前付けルールにするか
|
158
184
|
# rename_for_legacy: null
|
159
185
|
|
@@ -161,3 +187,21 @@ stylesheet: ["stylesheet.css"]
|
|
161
187
|
# zip_stage1: "zip -0Xq"
|
162
188
|
# ePUBアーカイブの圧縮実行
|
163
189
|
# zip_stage2: "zip -Xr9Dq"
|
190
|
+
# ePUBアーカイブに追加するパス(デフォルトはmimetype、META-INF、OEBPS)
|
191
|
+
# zip_addpath: null
|
192
|
+
|
193
|
+
# 以下は古いreview-epubmaker実装で使用されていたパラメータで、
|
194
|
+
# 互換性のために同じ機能を提供しているが、将来廃止予定であり、使うべきではない。
|
195
|
+
#
|
196
|
+
# ヘッダ・フッタのない、表紙のHTMLファイル。
|
197
|
+
# (※ヘッダ・フッタを入れたcoverを使うように変更することを勧告する。)
|
198
|
+
# coverfile: null
|
199
|
+
# ヘッダ・フッタのない、大扉ページ差し替えのHTMLファイル。
|
200
|
+
# (※ヘッダ・フッタを入れたtitlefileを使うように変更することを勧告する。)
|
201
|
+
# titlepagefile: null
|
202
|
+
# ヘッダ・フッタのない、裏表紙のHTMLファイル。
|
203
|
+
# (※ヘッダ・フッタを入れたbackcoverを使うように変更することを勧告する。)
|
204
|
+
# backcoverfile: null
|
205
|
+
# 奥付の日付文字列。
|
206
|
+
# (※history配列を使うように変更することを勧告する。)
|
207
|
+
# pubhistory: 奥付履歴文字列
|
data/doc/quickstart.rdoc
CHANGED
@@ -174,7 +174,7 @@ review-pdfmaker コマンドで PDF ブックの作成、review-epubmaker コマ
|
|
174
174
|
|
175
175
|
PDF を作成するには、pTeXLive2009 以上の環境が必要です。EPUB を作成するには、zip コマンドが必要です (MathML も使いたいときには、 {MathML ライブラリ}[http://www.hinet.mydns.jp/?mathml.rb]も必要です)。
|
176
176
|
|
177
|
-
いずれのコマンドも、必要な設定情報を記した YAML ファイルを引数に指定して実行します。YAML ファイルのサンプルは、 {sample.
|
177
|
+
いずれのコマンドも、必要な設定情報を記した YAML ファイルを引数に指定して実行します。YAML ファイルのサンプルは、 {sample.yml}[https://github.com/kmuto/review/blob/master/doc/sample.yml] としてこのドキュメントと同じディレクトリに収録しています。
|
178
178
|
|
179
179
|
review-pdfmaker YAMLファイル ←PDFの作成
|
180
180
|
review-epubmaker YAMLファイル ←EPUBの作成
|
File without changes
|
data/lib/epubmaker.rb
CHANGED
@@ -11,7 +11,7 @@
|
|
11
11
|
# == Quick usage
|
12
12
|
# require 'epubmaker'
|
13
13
|
# epub = EPUBMaker::Producer.new
|
14
|
-
# params = epub.load("config.
|
14
|
+
# params = epub.load("config.yml")
|
15
15
|
# epub.contents.push(EPUBMaker::Content.new({"file" => "ch01.xhtml"}))
|
16
16
|
# epub.contents.push(EPUBMaker::Content.new({"file" => "ch02.xhtml"}))
|
17
17
|
# ...
|
data/lib/epubmaker/content.rb
CHANGED
@@ -26,6 +26,10 @@ module EPUBMaker
|
|
26
26
|
attr_accessor :level
|
27
27
|
# Show in TOC? nil:No.
|
28
28
|
attr_accessor :notoc
|
29
|
+
# Properties (EPUB3)
|
30
|
+
attr_accessor :properties
|
31
|
+
# Chapter type (pre/post/part/nil(body))
|
32
|
+
attr_accessor :chaptype
|
29
33
|
|
30
34
|
# :call-seq:
|
31
35
|
# initialize(file, id, media, title, level, notoc)
|
@@ -33,7 +37,7 @@ module EPUBMaker
|
|
33
37
|
# Construct Content object by passing a sequence of parameters or hash.
|
34
38
|
# Keys of +hash+ relate with each parameters.
|
35
39
|
# +file+ (or +hash+["file"]) is required. Others are optional.
|
36
|
-
def initialize(fileorhash, id=nil, media=nil, title=nil, level=nil, notoc=nil)
|
40
|
+
def initialize(fileorhash, id=nil, media=nil, title=nil, level=nil, notoc=nil, properties=nil, chaptype=nil)
|
37
41
|
if fileorhash.instance_of?(Hash)
|
38
42
|
@id = fileorhash["id"]
|
39
43
|
@file = fileorhash["file"]
|
@@ -41,6 +45,8 @@ module EPUBMaker
|
|
41
45
|
@title = fileorhash["title"]
|
42
46
|
@level = fileorhash["level"]
|
43
47
|
@notoc = fileorhash["notoc"]
|
48
|
+
@properties = fileorhash["properties"] || []
|
49
|
+
@chaptype = fileorhash["chaptype"]
|
44
50
|
else
|
45
51
|
@file = fileorhash
|
46
52
|
@id = id
|
@@ -48,6 +54,8 @@ module EPUBMaker
|
|
48
54
|
@title = title
|
49
55
|
@level = level
|
50
56
|
@notoc = notoc
|
57
|
+
@properties = properties || []
|
58
|
+
@chaptype = chaptype
|
51
59
|
end
|
52
60
|
complement
|
53
61
|
end
|
data/lib/epubmaker/epubv2.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
# = epubv2.rb -- EPUB version 2 producer.
|
3
3
|
#
|
4
|
-
# Copyright (c) 2010-
|
4
|
+
# Copyright (c) 2010-2014 Kenshi Muto and Masayoshi Takahashi
|
5
5
|
#
|
6
6
|
# This program is free software.
|
7
7
|
# You can distribute or modify this program under the terms of
|
@@ -352,7 +352,14 @@ EOT
|
|
352
352
|
items.each_with_index do |item, rev|
|
353
353
|
editstr = (edit == 0) ? "初版" : "第#{edit + 1}版" # FIXME:i18n
|
354
354
|
revstr = "第#{rev + 1}刷"
|
355
|
-
|
355
|
+
if item =~ /\A\d+\-\d+\-\d+\Z/
|
356
|
+
s << %Q[ <p>#{date_to_s(item)} #{editstr}#{revstr} 発行</p>\n] # FIXME:i18n
|
357
|
+
else
|
358
|
+
# custom date with string
|
359
|
+
item.match(/\A(\d+\-\d+\-\d+)[\s ](.+)/) do |m|
|
360
|
+
s << %Q[ <p>#{date_to_s(m[1])} #{m[2]}</p>\n]
|
361
|
+
end
|
362
|
+
end
|
356
363
|
end
|
357
364
|
end
|
358
365
|
else
|
@@ -382,6 +389,12 @@ EOT
|
|
382
389
|
end
|
383
390
|
s << <<EOT
|
384
391
|
</table>
|
392
|
+
EOT
|
393
|
+
if !@producer.params["rights"].nil? && @producer.params["rights"].size > 0
|
394
|
+
s << %Q[ <p class="copyright">#{@producer.params["rights"].join("<br />")}</p>]
|
395
|
+
end
|
396
|
+
|
397
|
+
s << <<EOT
|
385
398
|
</div>
|
386
399
|
</body>
|
387
400
|
</html>
|
@@ -421,19 +434,30 @@ EOT
|
|
421
434
|
require 'rexml/document'
|
422
435
|
level = 1
|
423
436
|
find_jump = nil
|
437
|
+
has_part = nil
|
438
|
+
toclevel = @producer.params["toclevel"].to_i
|
424
439
|
|
425
440
|
# check part existance
|
426
441
|
@producer.contents.each do |item|
|
427
|
-
if item.notoc.nil? && item.
|
428
|
-
|
442
|
+
if item.notoc.nil? && item.chaptype == "part"
|
443
|
+
has_part = true
|
444
|
+
break
|
429
445
|
end
|
430
446
|
end
|
431
447
|
|
448
|
+
if !has_part.nil?
|
449
|
+
@producer.contents.each do |item|
|
450
|
+
item.level += 1 if item.chaptype == "part" || item.chaptype == "body"
|
451
|
+
item.notoc = true if (item.chaptype == "pre" || item.chaptype == "post") && !item.level.nil? && (item.level + 1 == toclevel)
|
452
|
+
end
|
453
|
+
toclevel += 1
|
454
|
+
end
|
455
|
+
|
432
456
|
doc = REXML::Document.new(%Q[<#{type} class="toc-h#{level}"><li /></#{type}>])
|
433
457
|
|
434
458
|
e = doc.root.elements[1] # first <li/>
|
435
459
|
@producer.contents.each do |item|
|
436
|
-
next if !item.notoc.nil? || item.level.nil? || item.file.nil? || item.title.nil? || item.level >
|
460
|
+
next if !item.notoc.nil? || item.level.nil? || item.file.nil? || item.title.nil? || item.level > toclevel
|
437
461
|
|
438
462
|
if item.level == level
|
439
463
|
e2 = e.parent.add_element("li")
|
@@ -442,6 +466,12 @@ EOT
|
|
442
466
|
find_jump = true if (item.level - level) > 1
|
443
467
|
# deeper
|
444
468
|
(level + 1).upto(item.level) do |n|
|
469
|
+
if e.size == 0
|
470
|
+
# empty span for epubcheck
|
471
|
+
es = e.add_element("span")
|
472
|
+
es.add_text(REXML::Text.new(" ", false, nil, true))
|
473
|
+
end
|
474
|
+
|
445
475
|
e2 = e.add_element(type, {"class" => "toc-h#{n}"})
|
446
476
|
e3 = e2.add_element("li")
|
447
477
|
e = e3
|
@@ -516,7 +546,29 @@ EOT
|
|
516
546
|
|
517
547
|
def export_zip(tmpdir, epubfile)
|
518
548
|
Dir.chdir(tmpdir) {|d| system("#{@producer.params["zip_stage1"]} #{epubfile} mimetype") }
|
519
|
-
Dir.chdir(tmpdir) {|d| system("#{@producer.params["zip_stage2"]} #{epubfile} META-INF OEBPS") }
|
549
|
+
Dir.chdir(tmpdir) {|d| system("#{@producer.params["zip_stage2"]} #{epubfile} META-INF OEBPS #{@producer.params["zip_addpath"]}") }
|
550
|
+
end
|
551
|
+
|
552
|
+
def legacy_cover_and_title_file(loadfile, writefile)
|
553
|
+
s = common_header
|
554
|
+
s << <<EOT
|
555
|
+
<title>#{@producer.params["booktitle"]}</title>
|
556
|
+
</head>
|
557
|
+
<body>
|
558
|
+
EOT
|
559
|
+
File.open(loadfile) do |f|
|
560
|
+
f.each_line do |l|
|
561
|
+
s << l
|
562
|
+
end
|
563
|
+
end
|
564
|
+
s << <<EOT
|
565
|
+
</body>
|
566
|
+
</html>
|
567
|
+
EOT
|
568
|
+
|
569
|
+
File.open(writefile, "w") do |f|
|
570
|
+
f.puts s
|
571
|
+
end
|
520
572
|
end
|
521
573
|
|
522
574
|
private
|
@@ -530,7 +582,7 @@ EOT
|
|
530
582
|
<head>
|
531
583
|
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/>
|
532
584
|
<meta http-equiv="Content-Style-Type" content="text/css"/>
|
533
|
-
<meta name="generator" content="
|
585
|
+
<meta name="generator" content="Re:VIEW"/>
|
534
586
|
EOT
|
535
587
|
|
536
588
|
@producer.params["stylesheet"].each do |file|
|