review 1.2.0 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (78) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +36 -0
  3. data/.rubocop.yml +1 -0
  4. data/ChangeLog +102 -0
  5. data/README.rdoc +2 -2
  6. data/bin/review-check +18 -16
  7. data/bin/review-compile +49 -42
  8. data/bin/review-epubmaker +23 -993
  9. data/bin/review-epubmaker-legacy +1024 -0
  10. data/bin/review-index +17 -15
  11. data/bin/review-init +39 -9
  12. data/bin/review-pdfmaker +124 -89
  13. data/bin/review-preproc +16 -14
  14. data/bin/review-vol +17 -15
  15. data/debian/docs +1 -1
  16. data/doc/catalog.rdoc +34 -0
  17. data/doc/format.rdoc +16 -2
  18. data/doc/libepubmaker/{config.yaml → config.yml} +63 -19
  19. data/doc/quickstart.rdoc +1 -1
  20. data/doc/{sample.yaml → sample.yml} +0 -0
  21. data/lib/epubmaker.rb +1 -1
  22. data/lib/epubmaker/content.rb +9 -1
  23. data/lib/epubmaker/epubv2.rb +59 -7
  24. data/lib/epubmaker/epubv3.rb +14 -9
  25. data/lib/epubmaker/producer.rb +68 -27
  26. data/lib/epubmaker/resource.rb +3 -1
  27. data/lib/lineinput.rb +2 -2
  28. data/lib/review/book/base.rb +125 -24
  29. data/lib/review/book/chapter.rb +42 -0
  30. data/lib/review/book/compilable.rb +23 -4
  31. data/lib/review/book/image_finder.rb +64 -0
  32. data/lib/review/book/index.rb +64 -50
  33. data/lib/review/book/page_metric.rb +1 -1
  34. data/lib/review/builder.rb +19 -12
  35. data/lib/review/catalog.rb +47 -0
  36. data/lib/review/compiler.rb +3 -2
  37. data/lib/review/configure.rb +5 -3
  38. data/lib/review/epubmaker.rb +130 -46
  39. data/lib/review/ewbbuilder.rb +27 -31
  40. data/lib/review/extentions/string.rb +4 -4
  41. data/lib/review/htmlbuilder.rb +140 -79
  42. data/lib/review/htmllayout.rb +26 -4
  43. data/lib/review/htmlutils.rb +20 -1
  44. data/lib/review/i18n.rb +5 -2
  45. data/lib/review/{i18n.yaml → i18n.yml} +4 -2
  46. data/lib/review/idgxmlbuilder.rb +65 -39
  47. data/lib/review/latexbuilder.rb +72 -24
  48. data/lib/review/latexutils.rb +3 -1
  49. data/lib/review/makerhelper.rb +8 -2
  50. data/lib/review/preprocessor.rb +20 -20
  51. data/lib/review/review.tex.erb +4 -0
  52. data/lib/review/sec_counter.rb +9 -11
  53. data/lib/review/tocparser.rb +2 -2
  54. data/lib/review/tocprinter.rb +12 -12
  55. data/lib/review/topbuilder.rb +15 -15
  56. data/lib/review/version.rb +1 -1
  57. data/lib/uuid.rb +7 -7
  58. data/review.gemspec +2 -2
  59. data/rubocop-todo.yml +443 -0
  60. data/test/sample-book/src/config.yml +2 -2
  61. data/test/sample-book/src/{main.css → style.css} +0 -0
  62. data/test/test_book.rb +46 -48
  63. data/test/test_book_chapter.rb +25 -13
  64. data/test/test_builder.rb +3 -3
  65. data/test/test_catalog.rb +107 -0
  66. data/test/test_epubmaker.rb +6 -6
  67. data/test/test_htmlbuilder.rb +160 -39
  68. data/test/test_htmlutils.rb +22 -0
  69. data/test/test_i18n.rb +2 -2
  70. data/test/test_idgxmlbuilder.rb +33 -47
  71. data/test/test_image_finder.rb +82 -0
  72. data/test/test_inaobuilder.rb +1 -1
  73. data/test/test_latexbuilder.rb +35 -39
  74. data/test/test_lineinput.rb +2 -2
  75. data/test/test_markdownbuilder.rb +2 -2
  76. data/test/test_topbuilder.rb +39 -23
  77. metadata +23 -14
  78. data/bin/review-epubmaker-ng +0 -23
@@ -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
- parser = OptionParser.new
46
- parser.banner = "Usage: #{File.basename($0)} [-c|-d|-s|--replace] [<file>...]"
47
- parser.on('--inencoding=ENCODING', 'Set input encoding. (UTF-8, EUC, JIS, and
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
- parser.on('--outencoding=ENCODING', 'Set output encoding. (UTF-8[default], EUC
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
- parser.on('-c', '--check', 'Check if preprocess is needed.') {
57
+ opts.on('-c', '--check', 'Check if preprocess is needed.') {
56
58
  mode = :check
57
59
  }
58
- parser.on('-d', '--diff', 'Show diff from current file.') {
60
+ opts.on('-d', '--diff', 'Show diff from current file.') {
59
61
  mode = :diff
60
62
  }
61
- parser.on('--replace', 'Replace file by preprocessed one.') {
63
+ opts.on('--replace', 'Replace file by preprocessed one.') {
62
64
  mode = :replace
63
65
  }
64
- parser.on('-s', '--strip', 'Strip preprocessor tags.') {
66
+ opts.on('-s', '--strip', 'Strip preprocessor tags.') {
65
67
  mode = :strip
66
68
  }
67
- parser.on('--final', 'Unfold text and strip preprocessor tags. (deprecated)') {
69
+ opts.on('--final', 'Unfold text and strip preprocessor tags. (deprecated)') {
68
70
  mode = :final
69
71
  }
70
- parser.on('--tabwidth=WIDTH', "Replace tabs with space characters. (0: don't replace)") {|width| param["tabwidth"] = width.to_i }
71
- parser.on('--help', 'Print this message and quit.') {
72
- puts parser.help
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
- parser.parse!
78
+ opts.parse!
77
79
  rescue OptionParser::ParseError => err
78
80
  $stderr.puts err.message
79
- $stderr.puts parser.help
81
+ $stderr.puts opts.help
80
82
  exit 1
81
83
  end
82
84
 
@@ -23,40 +23,42 @@ include ReVIEW::TextUtils
23
23
  def main
24
24
  $KCODE = 'UTF-8' unless defined?(Encoding)
25
25
 
26
- @param = {
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
- parser = OptionParser.new
34
- parser.on('-P', '--part-sensitive', 'Prints volume of each parts.') {
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
- parser.on('--inencoding=ENCODING', 'Set input encoding. (UTF-8, EUC, JIS, and SJIS)') {|enc|
38
- @param["inencoding"] = enc
39
+ opts.on('--inencoding=ENCODING', 'Set input encoding. (UTF-8, EUC, JIS, and SJIS)') {|enc|
40
+ @config["inencoding"] = enc
39
41
  }
40
- parser.on('--outencoding=ENCODING', 'Set output encoding. (UTF-8[default], EUC, JIS, and SJIS)') {|enc|
41
- @param["outencoding"] = enc
42
+ opts.on('--outencoding=ENCODING', 'Set output encoding. (UTF-8[default], EUC, JIS, and SJIS)') {|enc|
43
+ @config["outencoding"] = enc
42
44
  }
43
- parser.on('--directory=DIR', 'Compile all chapters in DIR.') {|path|
45
+ opts.on('--directory=DIR', 'Compile all chapters in DIR.') {|path|
44
46
  basedir = path
45
47
  }
46
- parser.on('--help', 'Print this message and quit') {
47
- puts parser.help
48
+ opts.on('--help', 'Print this message and quit') {
49
+ puts opts.help
48
50
  exit 0
49
51
  }
50
52
  begin
51
- parser.parse!
53
+ opts.parse!
52
54
  rescue OptionParser::ParseError => err
53
55
  $stderr.puts err.message
54
- $stderr.puts parser.help
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.param = @param
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, @param["outencoding"])
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
@@ -3,4 +3,4 @@ ChangeLog
3
3
  doc/format.rdoc
4
4
  doc/quickstart.rdoc
5
5
  doc/sample.css
6
- doc/sample.yaml
6
+ doc/sample.yml
@@ -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が存在する場合、そちらが優先されます。
@@ -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.yaml というファイルを用意して、
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.yaml にあります。
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
- # 構成によっては、階層化目次ではepubcheckにパスしない目次ができるが、
81
- # そのようなときにはこれをtrueにする
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: 0
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
- # 表紙の後に権利表記ページを作成するか。デフォルトでは作成されない。ファイル名を指定するとそのファイルが使われる(data配列にも指定しておく必要がある)
104
- # titlepage: title.xhtml
105
-
106
- # 奥付を作成するか。デフォルトでは作成されない。trueを指定するとデフォルトの奥付、ファイル名を指定するとそれがcolophon.xhtmlとしてコピーされる(data配列にも指定しておく必要がある)
107
- # colophon: true
108
- # pubhistory: 奥付履歴
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
- # 前付の変換後に実行するプログラム。作業用展開ディレクトリにある目次ファイル(toc-html.txt)を操作したいときなどに利用する。
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
- # 後付の変換後に実行するプログラム。作業用展開ディレクトリにある目次ファイル(toc-html.txt)を操作したいときなどに利用する。
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: 奥付履歴文字列
@@ -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.yaml}[https://github.com/kmuto/review/blob/master/doc/sample.yaml] としてこのドキュメントと同じディレクトリに収録しています。
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
@@ -11,7 +11,7 @@
11
11
  # == Quick usage
12
12
  # require 'epubmaker'
13
13
  # epub = EPUBMaker::Producer.new
14
- # params = epub.load("config.yaml")
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
  # ...
@@ -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
@@ -1,7 +1,7 @@
1
1
  # encoding: utf-8
2
2
  # = epubv2.rb -- EPUB version 2 producer.
3
3
  #
4
- # Copyright (c) 2010-2013 Kenshi Muto and Masayoshi Takahashi
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
- s << %Q[ <p>#{date_to_s(item)} #{editstr}#{revstr} 発行</p>\n] # FIXME:i18n
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.level == 0
428
- level = 0
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 > @producer.params["toclevel"].to_i
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="EPUBMaker::Producer"/>
585
+ <meta name="generator" content="Re:VIEW"/>
534
586
  EOT
535
587
 
536
588
  @producer.params["stylesheet"].each do |file|