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
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: be841a3905cc8d1771d130b04df3c067a748e15b
4
- data.tar.gz: af6f9c3dc732bd39db56231dc5f996e796111f8a
3
+ metadata.gz: ede64a20eecee63934877cb311e35313c6ffeb75
4
+ data.tar.gz: 629a36d714fd028da9d7b7fda334406f6f128843
5
5
  SHA512:
6
- metadata.gz: f0f1b28e80f8f5fdf3ec468dc30b038cf7b931fd2c15efef6b2c6d381a49e44c8965bb577304e0e43804f44d12fec3fb8119ce689f85b217a067d47f7ac1806f
7
- data.tar.gz: de7d44f7431871751a88e2b8d3e9e28c4ede8181aece50246c68af5a8049f095534248ce2ff110f2d97b3fe052f4f39a5c02caa2c03c4a0c6b5c1fc3635a192e
6
+ metadata.gz: a2b09524e28687e28c86df4cb5971bb999e09813db2c52fe1d4af4e25bb3f00ce66eb4570c21a907ca3d3f9d708fde6a82b101c3b8564f34c62ec01976ad19a8
7
+ data.tar.gz: 0623f1131de71a1bfcc388c78fd2bce77ad191ba8c338d82f6390c92172457707220a18e626c24e5965dba643bf40aab7d2041a8759eae2de883b4d3d4b281bb
@@ -0,0 +1,36 @@
1
+ *.gem
2
+ *.rbc
3
+ /.config
4
+ /coverage/
5
+ /InstalledFiles
6
+ /pkg/
7
+ /spec/reports/
8
+ /test/tmp/
9
+ /test/version_tmp/
10
+ /tmp/
11
+
12
+ ## Specific to RubyMotion:
13
+ .dat*
14
+ .repl_history
15
+ build/
16
+
17
+ ## Documentation cache and generated files:
18
+ /.yardoc/
19
+ /_yardoc/
20
+ /rdoc/
21
+
22
+ ## Environment normalisation:
23
+ /.bundle/
24
+ /lib/bundler/man/
25
+
26
+ # for a library or gem, you might want to ignore these files since the code is
27
+ # intended to run in multiple environments; otherwise, check them in:
28
+ # Gemfile.lock
29
+ # .ruby-version
30
+ # .ruby-gemset
31
+
32
+ # unless supporting rvm < 1.11.0 or doing something fancy, ignore this:
33
+ .rvmrc
34
+
35
+ # IntelliJ
36
+ .idea
@@ -0,0 +1 @@
1
+ inherit_from: rubocop-todo.yml
data/ChangeLog CHANGED
@@ -1,3 +1,105 @@
1
+ Sun Jun 29 10:40:02 2014 Kenshi Muto <kmuto@debian.org>
2
+
3
+ * Now review-epubmaker-ng becomes review-epubmaker.
4
+ Previous review-epubmaker is renamed to review-epubmaker-legacy.
5
+ We believe new review-epubmaker has a compatibility with
6
+ previous version, but please inform us if you meet a different
7
+ behavior. See doc/libepubmaker/config.yml for details of
8
+ configurations.
9
+
10
+ Fri Jun 27 22:49:17 2014 Kenshi Muto <kmuto@debian.org>
11
+
12
+ * lib/epubmaker/epubv2.rb: insert dummy <span> element with
13
+ double-width space in tree toc when <li> element has only
14
+ child <ol> element. Closes #285.
15
+
16
+ Tue Jun 17 10:36:31 2014 Masayoshi Takahashi <takahashimm@gmail.com>
17
+
18
+ * lib/review/book/base.rb:
19
+ remove (rarely used) features.
20
+ * ignore ./config.rb file
21
+ * ignore ./lib/review/* files
22
+ * ignore ./*/*.re and ./*/*/*.re files
23
+
24
+ Wed Jun 11 20:15:00 2014 KADO Masanori <kdmsnr@gmail.com>
25
+
26
+ * lib/review/book/base.rb (ReVIEW::Book::Base#config):
27
+ Rename method and instance variable from param to config.
28
+
29
+ Sun Jun 8 22:55:39 2014 Kenshi Muto <kmuto@debian.org>
30
+
31
+ * lib/review/htmlbuilder.rb, lib/review/htmlutils.rb,
32
+ test/test_htmlbuilder.rb, test/test_htmlutils.rb:
33
+ normalize html ID. ID must be /\A[a-z][0-9a-z_.-]*/
34
+ with case insensitive.
35
+
36
+ Sun Jun 8 22:04:29 2014 Kenshi Muto <kmuto@debian.org>
37
+
38
+ * bin/review-epubmaker, bin/review-pdfmaker,
39
+ lib/review/epubmaker.rb, lib/review/makerhelper.rb:
40
+ review-*maker calls review-compile of exactly same
41
+ directory. Closes #228, #288.
42
+
43
+ Sat Jun 7 00:37:17 2014 Kenshi Muto <kmuto@debian.org>
44
+
45
+ * lib/review/htmlbuilder.rb:
46
+ use the value of htmlext variable for html file
47
+ extension, instead of static ".html".
48
+
49
+ Sat Jun 7 00:06:37 2014 Kenshi Muto <kmuto@debian.org>
50
+
51
+ * lib/epubmaker/content.rb, lib/epubmaker/epubv3.rb,
52
+ lib/review/epubmaker.rb:
53
+ add properties='svg' attribute to OPF item of HTML
54
+ which links SVG file (to satisfy EPUB3 spec.)
55
+
56
+ Wed Jun 4 12:05:36 2014 Kenshi Muto <kmuto@debian.org>
57
+
58
+ * add safe mode.
59
+ This feature checks a numeric value of REVIEW_SAFE_MODE
60
+ environment variable.
61
+ bit1(+1) : blocks any hooks of epubmaker.
62
+ bit2(+2) : blocks review-ext.rb.
63
+ bit3(+4) : blocks user's custom html layouts.
64
+
65
+ Mon Jun 2 14:23:28 2014 Kenshi Muto <kmuto@debian.org>
66
+
67
+ * doc/libepubmaker/config.yml, lib/epubmaker/producer.rb,
68
+ lib/review/epubmaker.rb: implement strict image finder mode
69
+ for review-epubmaker-ng.
70
+ review-epubmaker-ng picks up the images which are used in each
71
+ HTMLs and CSSs by declareing 'verify_target_images: true' in yml.
72
+
73
+ Thu May 28 00:51:08 2014 Masayoshi Takahashi <takahashimm@gmail.com>
74
+
75
+ * lib/review/book/image_finder.rb:
76
+ add new class ReVIEW::Book::ImageFinder extracted from ReVIEW::Book::Index
77
+
78
+ Index#find_pathes moves to ImageFinder#find_path, and select only one (first) path
79
+ because rest pathes is not used.
80
+ ImageFinder is an independent class, so you can get image pathes without ImageIndex.
81
+
82
+
83
+ Sat Apr 12 16:31:11 2014 Masayoshi Takahashi <takahashimm@gmail.com>
84
+
85
+ * lib/review/book/index.rb: allow same @<icon>s in one document (remove warning)
86
+
87
+ Thu Apr 3 19:03:03 2014 Kenshi Muto <kmuto@debian.org>
88
+
89
+ * change all .yaml to .yml. (#244)
90
+ locale.yaml is still supported for backward compatibility.
91
+ (but locale.yml is preferred.)
92
+
93
+ Thu Apr 3 18:41:42 2014 Kenshi Muto <kmuto@debian.org>
94
+
95
+ * lib/review/latexbuilder.rb: escape idx string.
96
+
97
+ Thu Apr 3 09:53:26 2014 Kenshi Muto <kmuto@debian.org>
98
+
99
+ * lib/epubmaker: add zip_addpath parameter to include
100
+ extra pathes in ePUB file.
101
+ * Rename sample YAML file's extension from .yaml to .yml.
102
+
1
103
  Wed Apr 2 22:34:56 2014 Masayoshi Takahashi <takahashimm@gmail.com>
2
104
 
3
105
  * Release 1.2.0.
@@ -3,7 +3,7 @@
3
3
  {<img src="https://secure.travis-ci.org/kmuto/review.png"/>}[http://travis-ci.org/kmuto/review]
4
4
  {<img src="https://badge.fury.io/rb/review.png" alt="Gem Version" />}[http://badge.fury.io/rb/review]
5
5
 
6
- Re:VIEW is a easy-to-use digital publishing system for books and ebooks.
6
+ Re:VIEW is an easy-to-use digital publishing system for books and ebooks.
7
7
 
8
8
  == Format
9
9
 
@@ -47,4 +47,4 @@ LGPL. See COPYING file.
47
47
 
48
48
  == Copyright
49
49
 
50
- Copyright (c) 2006-2014 Minero Aoki, Kenshi Muto, Masayoshi Takahashi.
50
+ Copyright (c) 2006-2014 Minero Aoki, Kenshi Muto, Masayoshi Takahashi, Masanori Kado.
@@ -32,40 +32,42 @@ end
32
32
 
33
33
  def main
34
34
  $KCODE = 'UTF-8' unless defined?(Encoding)
35
- @param = {
35
+ @config = ReVIEW::Configure.values
36
+ @config.merge!({
36
37
  "inencoding" => "UTF-8",
37
38
  "outencoding" => "UTF-8"
38
- }
39
+ })
39
40
 
40
41
  modes = nil
41
42
  files = ARGV unless ARGV.empty?
42
- parser = OptionParser.new
43
- parser.on('--inencoding=ENCODING', 'Set input encoding. (UTF-8, EUC, JIS, and SJIS)') {|enc|
44
- @param["inencoding"] = enc
43
+ opts = OptionParser.new
44
+ opts.version = ReVIEW::VERSION
45
+ opts.on('--inencoding=ENCODING', 'Set input encoding. (UTF-8, EUC, JIS, and SJIS)') {|enc|
46
+ @config["inencoding"] = enc
45
47
  }
46
- parser.on('--outencoding=ENCODING', 'Set output encoding. (UTF-8[default], EUC, JIS, and SJIS)') {|enc|
47
- @param["outencoding"] = enc
48
+ opts.on('--outencoding=ENCODING', 'Set output encoding. (UTF-8[default], EUC, JIS, and SJIS)') {|enc|
49
+ @config["outencoding"] = enc
48
50
  }
49
- parser.on('-a', '--all-chapters', 'Check all chapters.') {
51
+ opts.on('-a', '--all-chapters', 'Check all chapters.') {
50
52
  files = ReVIEW.book.chapters.map {|ent| ent.path }
51
53
  }
52
- parser.on('-s', '--section N', 'Check section N. (deprecated)') {|n|
54
+ opts.on('-s', '--section N', 'Check section N. (deprecated)') {|n|
53
55
  ents = ReVIEW.env.parts[Integer(n) - 1] or
54
56
  raise ReVIEW::ApplicationError, "section #{n} not exist"
55
57
  files = ents.map {|ent| ent.path }
56
58
  }
57
- parser.on('--text', 'Check text.') {
59
+ opts.on('--text', 'Check text.') {
58
60
  (modes ||= []).push :text
59
61
  }
60
- parser.on('--help', 'print this message and quit.') {
61
- puts parser.help
62
+ opts.on('--help', 'print this message and quit.') {
63
+ puts opts.help
62
64
  exit 0
63
65
  }
64
66
  begin
65
- parser.parse!
67
+ opts.parse!
66
68
  rescue OptionParser::ParseError => err
67
69
  $stderr.puts err.message
68
- $stderr.puts parser.help
70
+ $stderr.puts opts.help
69
71
  exit 1
70
72
  end
71
73
  unless files
@@ -95,7 +97,7 @@ def check_text(files)
95
97
  next if neg and neg =~ s
96
98
  str, offset = find_line(para, re)
97
99
  out = sprintf("%s:%d: %s\n", path, lineno + offset, str)
98
- print convert_outencoding(out, @param["outencoding"])
100
+ print convert_outencoding(out, @config["outencoding"])
99
101
  end
100
102
  end
101
103
  }
@@ -137,7 +139,7 @@ end
137
139
  def each_paragraph(f)
138
140
  $ReVIEW_utils_word_ok = nil
139
141
  while line = f.gets
140
- line = convert_inencoding(line, @param["inencoding"])
142
+ line = convert_inencoding(line, @config["inencoding"])
141
143
 
142
144
  case line
143
145
  when /\A\#@ok\((.*)\)/
@@ -45,7 +45,8 @@ def _main
45
45
  check_only = false
46
46
  output_filename = nil
47
47
 
48
- param = {
48
+ config = ReVIEW::Configure.values
49
+ config.merge!({
49
50
  "secnolevel" => 2, # for IDGXML and HTML
50
51
  "tableopt" => nil, # for IDGXML
51
52
  "nolf" => nil, # for IDGXML
@@ -60,71 +61,75 @@ def _main
60
61
  "footnotetext" => false,
61
62
  "htmlext" => "html",
62
63
  "htmlversion" => 4,
63
- }
64
+ })
64
65
 
65
- parser = OptionParser.new
66
- parser.banner = "Usage: #{File.basename($0)} [--target=FMT]"
67
- parser.on('--yaml=YAML', 'Read configurations from YAML file.') do |yaml|
66
+ opts = OptionParser.new
67
+ opts.version = ReVIEW::VERSION
68
+ opts.banner = "Usage: #{File.basename($0)} [--target=FMT]"
69
+ opts.on('--yaml=YAML', 'Read configurations from YAML file.') do |yaml|
68
70
  require 'yaml'
69
- param = param.merge(YAML.load_file(yaml))
71
+ config = config.merge(YAML.load_file(yaml))
70
72
  end
71
- parser.on('--inencoding=ENCODING', 'Set input encoding. (UTF-8, EUC, JIS, and SJIS)') {|enc| param["inencoding"] = enc }
72
- parser.on('--outencoding=ENCODING', 'Set output encoding. (UTF-8[default], EUC, JIS, and SJIS)') {|enc| param["outencoding"] = enc }
73
- parser.on('-c', '--check', 'Check manuscript') { check_only = true }
74
- parser.on('--level=LVL', 'Section level to append number.') {|lvl| param["secnolevel"] = lvl.to_i }
75
- parser.on('--toclevel=LVL', 'Section level to append number.') {|lvl| param["toclevel"] = lvl.to_i }
76
- parser.on('--nolfinxml', 'Do not insert LF in XML. (idgxml)') { param["nolf"] = true }
77
- parser.on('--structuredxml', 'Produce XML with structured sections. (idgxml)') { param["structuredxml"] = true }
78
- parser.on('--table=WIDTH', 'Default table width. (idgxml)') {|tbl| param["tableopt"] = tbl }
79
- parser.on('--listinfo', 'Append listinfo tag to lists to indicate begin/end. (idgxml)') { param["listinfo"] = true }
80
- parser.on('--chapref="before,middle,after"', 'Chapref decoration.') {|cdec| param["chapref"] = cdec }
81
- parser.on('--subdirmode', 'Use chapter/id.ext path style to find images. (deprecated)') do
73
+ opts.on('--inencoding=ENCODING', 'Set input encoding. (UTF-8, EUC, JIS, and SJIS)') {|enc| config["inencoding"] = enc }
74
+ opts.on('--outencoding=ENCODING', 'Set output encoding. (UTF-8[default], EUC, JIS, and SJIS)') {|enc| config["outencoding"] = enc }
75
+ opts.on('-c', '--check', 'Check manuscript') { check_only = true }
76
+ opts.on('--level=LVL', 'Section level to append number.') {|lvl| config["secnolevel"] = lvl.to_i }
77
+ opts.on('--toclevel=LVL', 'Section level to append number.') {|lvl| config["toclevel"] = lvl.to_i }
78
+ opts.on('--nolfinxml', 'Do not insert LF in XML. (idgxml)') { config["nolf"] = true }
79
+ opts.on('--structuredxml', 'Produce XML with structured sections. (idgxml)') { config["structuredxml"] = true }
80
+ opts.on('--table=WIDTH', 'Default table width. (idgxml)') {|tbl| config["tableopt"] = tbl }
81
+ opts.on('--listinfo', 'Append listinfo tag to lists to indicate begin/end. (idgxml)') { config["listinfo"] = true }
82
+ opts.on('--chapref="before,middle,after"', 'Chapref decoration.') {|cdec| config["chapref"] = cdec }
83
+ opts.on('--subdirmode', 'Use chapter/id.ext path style to find images. (deprecated)') do
82
84
  STDERR.puts "Warning: --subdirmode is deprecated. Images are automatically detected."
83
85
  end
84
- parser.on('--singledirmode', 'Use id.ext path style to find images. (deprecated)') do
86
+ opts.on('--singledirmode', 'Use id.ext path style to find images. (deprecated)') do
85
87
  STDERR.puts "Warning: --singledirmode is deprecated. Images are automatically detected."
86
88
  end
87
- parser.on('--chapterlink', 'make chapref hyperlink') { param["chapterlink"] = true }
88
- parser.on('--stylesheet=file', 'Stylesheet file for HTML (comma separated)') {|files| param["stylesheet"] = files.split(/\s*,\s*/) }
89
- parser.on('--mathml', 'Use MathML for TeX equation in HTML') do
90
- param["mathml"] = true
89
+ opts.on('--chapterlink', 'make chapref hyperlink') { config["chapterlink"] = true }
90
+ opts.on('--stylesheet=file', 'Stylesheet file for HTML (comma separated)') {|files| config["stylesheet"] = files.split(/\s*,\s*/) }
91
+ opts.on('--mathml', 'Use MathML for TeX equation in HTML') do
92
+ config["mathml"] = true
91
93
  require 'math_ml'
92
94
  require "math_ml/symbol/character_reference"
93
95
  end
94
- parser.on('--htmlversion=VERSION', 'HTML version.') do |v|
96
+ opts.on('--htmlversion=VERSION', 'HTML version.') do |v|
95
97
  v = v.to_i
96
- param["htmlversion"] = v if v == 4 || v == 5
98
+ config["htmlversion"] = v if v == 4 || v == 5
97
99
  end
98
- parser.on('--epubversion=VERSION', 'EPUB version.') do |v|
100
+ opts.on('--epubversion=VERSION', 'EPUB version.') do |v|
99
101
  v = v.to_i
100
- param["epubversion"] = v if v == 2 || v == 3
102
+ config["epubversion"] = v if v == 2 || v == 3
101
103
  end
102
- parser.on('--hdnumberingmode', 'Output numbering headlines. (deprecated)') { param["hdnumberingmode"] = true }
103
- parser.on('--deprecated-blocklines', 'Disable paragrahs in block tags. Treat physical line as a paragraph. (deprecated)') { param["deprecated-blocklines"] = true }
104
- parser.on('--target=FMT', 'Target format.') {|fmt| target = fmt } unless target
105
- parser.on('--footnotetext',
104
+ opts.on('--hdnumberingmode', 'Output numbering headlines. (deprecated)') { config["hdnumberingmode"] = true }
105
+ opts.on('--deprecated-blocklines', 'Disable paragrahs in block tags. Treat physical line as a paragraph. (deprecated)') { config["deprecated-blocklines"] = true }
106
+ opts.on('--target=FMT', 'Target format.') {|fmt| target = fmt } unless target
107
+ opts.on('--footnotetext',
106
108
  'Use footnotetext and footnotemark instead of footnote (latex)') {
107
- param["footnotetext"] = true
109
+ config["footnotetext"] = true
108
110
  }
109
- parser.on('--draft', 'use draft mode(inline comment)') { param["draft"] = true }
110
- parser.on('-a', '--all', 'Compile all chapters.') do
111
+ opts.on('--draft', 'use draft mode(inline comment)') { config["draft"] = true }
112
+ opts.on('-a', '--all', 'Compile all chapters.') do
111
113
  mode = :dir
112
114
  basedir = nil
113
115
  end
114
- parser.on('--directory=DIR', 'Compile all chapters in DIR.') do |path|
116
+ opts.on('--directory=DIR', 'Compile all chapters in DIR.') do |path|
115
117
  mode = :dir
116
118
  basedir = path
117
119
  end
118
- parser.on('--output-file=FILENAME', 'Write all results into file instead of stdout.') do |filename|
120
+ opts.on('--output-file=FILENAME', 'Write all results into file instead of stdout.') do |filename|
119
121
  output_filename = filename
120
122
  end
121
- parser.on('--tabwidth=WIDTH', 'tab width') {|width| param["tabwidth"] = width.to_i }
122
- parser.on('--help', 'Prints this message and quit.') do
123
- puts parser.help
123
+ opts.on('--tabwidth=WIDTH', 'tab width') {|width| config["tabwidth"] = width.to_i }
124
+ opts.on('--catalogfile=FILENAME', 'Set catalog file') do |catalogfile|
125
+ config["catalogfile"] = catalogfile
126
+ end
127
+ opts.on('--help', 'Prints this message and quit.') do
128
+ puts opts.help
124
129
  exit 0
125
130
  end
126
131
  begin
127
- parser.parse!
132
+ opts.parse!
128
133
  unless target
129
134
  if check_only
130
135
  target = 'html'
@@ -134,13 +139,14 @@ def _main
134
139
  end
135
140
  rescue OptionParser::ParseError => err
136
141
  error err.message
137
- $stderr.puts parser.help
142
+ $stderr.puts opts.help
138
143
  exit 1
139
144
  end
140
145
 
141
146
  begin
142
- ReVIEW.book.param = param
143
- ReVIEW.book.param["builder"] = target
147
+ config["builder"] = target
148
+
149
+ ReVIEW.book.config = config
144
150
  compiler = ReVIEW::Compiler.new(load_strategy_class(target, check_only))
145
151
  case mode
146
152
  when :files
@@ -151,6 +157,7 @@ def _main
151
157
 
152
158
  begin
153
159
  ReVIEW::Book::Chapter.intern_pathes(ARGV).each do |chap|
160
+ chap.book.config = config
154
161
  result = compiler.compile(chap)
155
162
  if output_filename
156
163
  write output_filename, result
@@ -1,1014 +1,44 @@
1
1
  #!/usr/bin/env ruby
2
2
  # encoding: utf-8
3
3
  #
4
- # Copyright (c) 2010-2014 Kenshi Muto and Masayoshi Takahashi
4
+ # Copyright (c) 2010-2013 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
8
8
  # the GNU LGPL, Lesser General Public License version 2.1.
9
9
  # For details of the GNU LGPL, see the file "COPYING".
10
10
  #
11
-
12
- require 'tmpdir'
13
- require 'fileutils'
14
- require 'yaml'
15
- require 'optparse'
16
- require 'rexml/document'
17
- require 'time'
18
-
19
11
  require 'pathname'
20
-
12
+ require 'optparse'
21
13
  bindir = Pathname.new(__FILE__).realpath.dirname
22
14
  $LOAD_PATH.unshift((bindir + '../lib').realpath)
15
+ require 'review/epubmaker'
16
+ require 'review/version'
23
17
 
24
- require 'uuid'
25
- require 'review'
26
- require 'review/i18n'
27
-
28
- require 'review/htmlutils'
29
- include ReVIEW::HTMLUtils
30
-
31
- $essential_files = ['top', 'toc', 'colophon']
32
- def main
33
- if ARGV.size != 1
34
- puts "Usage: #{$0} configfile"
35
- exit 0
36
- end
37
-
38
- yamlfile = ARGV[0]
39
- values = ReVIEW::Configure.values.merge(YAML.load_file(yamlfile))
40
- bookname = values["bookname"]
41
- $essential_files <<= bookname
42
- tmp = values["debug"].nil? ? Dir.mktmpdir : "."
43
- @bookdir = "#{tmp}/#{bookname}-epub"
44
- @epubversion = values["epubversion"] || 2
45
- @htmlversion = values["htmlversion"] || 4
46
- if @epubversion == 3
47
- ## if epubversion is 3, htmlversion should be 5
48
- @htmlversion = 5
49
- end
50
-
51
- if File.exist?("#{bookname}.epub")
52
- STDERR.puts "#{bookname}.epub exists. Please remove or rename first."
53
- exit 1
54
- end
55
- if File.exist?(@bookdir)
56
- STDERR.puts "#{@bookdir} directory exists. Please remove or rename first."
57
- exit 1
58
- end
59
-
60
- @identifier = values["urnid"].nil? ? "urn:uuid:#{UUID.create}" : values["urnid"]
61
-
62
- Dir.mkdir(@bookdir)
63
-
64
- # MIME type
65
- File.open("#{@bookdir}/mimetype", "w") {|f|
66
- f.write "application/epub+zip"
67
- }
68
-
69
- Dir.mkdir("#{@bookdir}/OEBPS")
70
- # XHTML
71
- @manifeststr = ""
72
- @ncxstr = ""
73
- @tocdesc = Array.new
74
-
75
- basedir = Dir.pwd
76
- base_path = Pathname.new(basedir)
77
- ReVIEW::Book.load(basedir).parts.each do |part|
78
- if part.name.present?
79
- if part.file?
80
- filename = (base_path + part.path).to_s
81
- output_chaps_by_file(filename, values)
82
- htmlfile = File.basename(filename.chomp.strip,".*")+".html"
83
- else
84
- htmlfile = "part_#{part.number}.html"
85
- make_part_page(part, htmlfile, values)
86
- file_id = "part_#{part.number}"
87
- part_name = "#{ReVIEW::I18n.t("part", part.number)} #{part.name.strip}"
88
- @tocdesc << [1, htmlfile, nil, part_name]
89
- @manifeststr << %Q(<item id="rv-#{file_id}" href="#{htmlfile}" media-type="application/xhtml+xml" />\n)
90
- @ncxstr << %Q(<itemref idref="rv-#{file_id}" />\n)
91
- end
92
- end
93
-
94
- part.chapters.each do |chap|
95
- filename = Pathname.new(chap.path).relative_path_from(base_path).to_s
96
- output_chaps_by_file(filename, values)
97
- end
98
- end
99
-
100
- # images
101
- if File.exist?("images")
102
- allow_exts = values["image_ext"] || %w(png gif jpg jpeg svg ttf woff otf)
103
- Dir.mkdir("#{@bookdir}/OEBPS/images")
104
- image_files = ReVIEW::MakerHelper.copy_images_to_dir("images", "#{@bookdir}/OEBPS/images", :exts=>allow_exts)
105
- image_files.each do |image_file|
106
- dirname = File.dirname(image_file)
107
- fname = File.basename(image_file)
108
- figid = getFigId(dirname.gsub(%r|/|,'-')+"-"+fname)
109
- mime = nil
110
- fname_pattern = /\.(#{allow_exts.join("|")})$/i
111
- next unless fname =~ fname_pattern
112
- case fname.downcase.match(fname_pattern)[1]
113
- when "png"
114
- mime = "image/png"
115
- when "gif"
116
- mime = "image/gif"
117
- when "jpg", "jpeg"
118
- mime = "image/jpeg"
119
- when "svg"
120
- mime = "image/svg+xml"
121
- when "ttf", "otf"
122
- mime = "application/vnd.ms-opentype"
123
- when "woff"
124
- mime = "application/font-woff"
125
- else
126
- raise "unsupported type #{fname}"
127
- end
128
- if @epubversion == 3 && File.join("images",values["coverimage"]) == image_file
129
- properties = ' properties="cover-image"'
130
- end
131
- @manifeststr << %Q(<item id="#{figid}" href="#{image_file}"#{properties} media-type="#{mime}" />\n)
132
- end
133
- end
134
-
135
- # fonts
136
- fontdir = values["fontdir"] || "fonts"
137
- if File.exist?(fontdir)
138
- font_ext = values["font_ext"]
139
- Dir.mkdir("#{@bookdir}/OEBPS/#{fontdir}")
140
- font_files = ReVIEW::MakerHelper.copy_images_to_dir(fontdir, "#{@bookdir}/OEBPS/#{fontdir}", :exts=>font_ext)
141
- font_files.each do |font_file|
142
- dirname = File.dirname(font_file)
143
- fname = File.basename(font_file)
144
- font_id = "font-"+fname
145
- mime = nil
146
- fname_pattern = /\.(#{font_ext.join("|")})$/i
147
- next unless fname =~ fname_pattern
148
- case fname.downcase.match(fname_pattern)[1]
149
- when "svg"
150
- mime = "image/svg+xml"
151
- when "ttf", "otf"
152
- mime = "application/vnd.ms-opentype"
153
- when "woff"
154
- mime = "application/font-woff"
155
- else
156
- raise "unsupported type #{fname}"
157
- end
158
- @manifeststr << %Q(<item id="#{font_id}" href="#{font_file}" media-type="#{mime}" />\n)
159
- end
160
- end
161
-
162
- # container
163
- Dir.mkdir("#{@bookdir}/META-INF")
164
- File.open("#{@bookdir}/META-INF/container.xml", "w") {|f|
165
- f.puts <<EOT
166
- <?xml version="1.0" encoding="UTF-8"?>
167
- <container xmlns="urn:oasis:names:tc:opendocument:xmlns:container" version="1.0">
168
- <rootfiles>
169
- <rootfile full-path="OEBPS/#{bookname}.opf" media-type="application/oebps-package+xml" />
170
- </rootfiles>
171
- </container>
172
- EOT
173
- }
174
-
175
- # opf (meta info)
176
- if @epubversion == 3
177
- make_opf_filev3(values, bookname)
178
- else
179
- make_opf_file(values, bookname)
180
- end
181
-
182
- # ncx (toc)
183
- if values["toc"]
184
- File.open("#{@bookdir}/OEBPS/#{bookname}.ncx", "w") {|f|
185
- f.puts <<EOT
186
- <?xml version="1.0" encoding="UTF-8"?>
187
- <ncx xmlns="http://www.daisy.org/z3986/2005/ncx/" version="2005-1">
188
- <head>
189
- <meta name="dtb:uid" content="#{@identifier}"/>
190
- <meta name="dtb:depth" content="1"/>
191
- <meta name="dtb:totalPageCount" content="0"/>
192
- <meta name="dtb:maxPageNumber" content="0"/>
193
- </head>
194
- <docTitle>
195
- <text>#{values["booktitle"]}</text>
196
- </docTitle>
197
- <docAuthor>
198
- <text>#{values["aut"].nil? ? "" : values["aut"]}</text>
199
- </docAuthor>
200
- <navMap>
201
- <navPoint id="top" playOrder="1">
202
- <navLabel>
203
- <text>#{values["booktitle"]}</text>
204
- </navLabel>
205
- <content src="#{bookname}.html"/>
206
- </navPoint>
207
- EOT
208
-
209
- nav_count = 2
210
-
211
- if values["mytoc"]
212
- f.puts <<EOT
213
- <navPoint id="toc" playOrder="2">
214
- <navLabel>
215
- <text>目次</text>
216
- </navLabel>
217
- <content src="toc.html"/>
218
- </navPoint>
219
- EOT
220
- nav_count = 3
221
- end
222
-
223
- @tocdesc.each {|item|
224
- level, file, id, content = item
225
- # values["level"]
226
- next if level > values["toclevel"].to_i
227
- indent = ""
228
- if level > values["secnolevel"].to_i
229
- indent = "- "
230
- end
231
- fragment_id = (id ? '#'+id : '')
232
- f.puts <<EOT
233
- <navPoint id="navPoint-#{nav_count}" playOrder="#{nav_count}">
234
- <navLabel>
235
- <text>#{indent}#{strip_html(content)}</text>
236
- </navLabel>
237
- <content src="#{file}#{fragment_id}"/>
238
- </navPoint>
239
- EOT
240
- nav_count += 1
241
- }
242
- f.puts <<EOT
243
- </navMap>
244
- </ncx>
245
- EOT
246
- }
247
- end
248
-
249
- # Cover page
250
- File.open("#{@bookdir}/OEBPS/#{bookname}.html", "w") {|f|
251
- f.puts <<EOT
252
- <?xml version="1.0" encoding="UTF-8"?>
253
- EOT
254
- doctype = make_doctype()
255
- f.puts doctype
256
- f.puts <<EOT
257
- <html xmlns="http://www.w3.org/1999/xhtml" xmlns:ops="http://www.idpf.org/2007/ops" xmlns:epub="http://www.idpf.org/2007/ops" xml:lang="ja">
258
- <head>
259
- EOT
260
- if @htmlversion == 4
261
- f.puts <<EOT
262
- <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/>
263
- <meta http-equiv="Content-Style-Type" content="text/css"/>
264
- <link rel="stylesheet" type="text/css" href="#{values["stylesheet"]}"/>
265
- <meta name="generator" content="Re:VIEW EPUB Maker"/>
266
- EOT
267
- else
268
- f.puts <<EOT
269
- <meta charset="UTF-8" />
270
- <link rel="stylesheet" type="text/css" href="#{values["stylesheet"]}"/>
271
- <meta name="generator" content="Re:VIEW EPUB Maker"/>
272
- EOT
273
- end
274
- f.puts <<EOT
275
- <title>#{values["booktitle"]}</title>
276
- </head>
277
- <body>
278
- EOT
279
- if !values["coverfile"].nil? && File.exist?(values["coverfile"])
280
- File.open(values["coverfile"]) {|f2|
281
- f2.each_line {|l|
282
- f.puts l
283
- }
284
- }
285
- else
286
- f.puts <<EOT
287
- <h1>#{values["booktitle"]}</h1>
288
- EOT
289
- end
290
-
291
- f.puts <<EOT
292
- </body>
293
- </html>
294
- EOT
295
- }
296
-
297
- if values["backcoverfile"]
298
- make_backcover_image(bookname, values)
299
- end
18
+ rv = ReVIEW::EPUBMaker.new
300
19
 
301
- # Title page
302
- File.open("#{@bookdir}/OEBPS/top.html", "w") {|f|
303
- f.puts <<EOT
304
- <?xml version="1.0" encoding="UTF-8"?>
305
- EOT
306
- doctype = make_doctype()
307
- f.puts doctype
308
- f.puts <<EOT
309
- <html xmlns="http://www.w3.org/1999/xhtml" xmlns:ops="http://www.idpf.org/2007/ops" xmlns:epub="http://www.idpf.org/2007/ops" xml:lang="ja">
310
- <head>
311
- EOT
312
- if @htmlversion == 4
313
- f.puts <<EOT
314
- <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/>
315
- <meta http-equiv="Content-Style-Type" content="text/css"/>
316
- <link rel="stylesheet" type="text/css" href="#{values["stylesheet"]}"/>
317
- <meta name="generator" content="Re:VIEW EPUB Maker"/>
318
- EOT
319
- else
320
- f.puts <<EOT
321
- <meta charset="UTF-8" />
322
- <link rel="stylesheet" type="text/css" href="#{values["stylesheet"]}"/>
323
- <meta name="generator" content="Re:VIEW EPUB Maker"/>
324
- EOT
325
- end
326
- f.puts <<EOT
327
- <title>#{values["booktitle"]}</title>
328
- </head>
329
- <body>
330
- EOT
331
- if !values["titlepagefile"].nil? && File.exist?(values["titlepagefile"])
332
- File.open(values["titlepagefile"]) {|f2|
333
- f2.each_line {|l|
334
- f.puts l
335
- }
336
- }
337
- else
338
- f.puts <<EOT
339
- <h1 class="tp-title">#{values["booktitle"]}</h1>
340
- EOT
341
- if values["aut"]
342
- f.puts <<EOT
343
- <p>
344
- <br />
345
- <br />
346
- </p>
347
- <h2 class="tp-author">#{values["aut"]}</h2>
348
- EOT
349
- end
350
- if values["prt"]
351
- f.puts <<EOT
352
- <p>
353
- <br />
354
- <br />
355
- <br />
356
- <br />
357
- </p>
358
- <h3 class="tp-publisher">#{values["prt"]}</h3>
359
- EOT
360
- end
361
- end
362
-
363
- f.puts <<EOT
364
- </body>
365
- </html>
366
- EOT
367
- }
368
-
369
- # Additional toc page
370
- if values["toc"] && values["mytoc"]
371
- File.open("#{@bookdir}/OEBPS/toc.html", "w") {|f|
372
- if @epubversion == 3
373
- listelm = "ol"
374
- else
375
- listelm = "ul"
376
- end
377
- f.puts <<EOT
378
- <?xml version="1.0" encoding="UTF-8"?>
379
- EOT
380
- doctype = make_doctype()
381
- f.puts doctype
382
- f.puts <<EOT
383
- <html xmlns="http://www.w3.org/1999/xhtml" xmlns:ops="http://www.idpf.org/2007/ops" xmlns:epub="http://www.idpf.org/2007/ops" xml:lang="ja">
384
- <head>
385
- EOT
386
- if @htmlversion == 4
387
- f.puts <<EOT
388
- <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/>
389
- <meta http-equiv="Content-Style-Type" content="text/css"/>
390
- <link rel="stylesheet" type="text/css" href="#{values["stylesheet"]}"/>
391
- <meta name="generator" content="Re:VIEW EPUB Maker"/>
392
- EOT
393
- else
394
- f.puts <<EOT
395
- <meta charset="UTF-8" />
396
- <link rel="stylesheet" type="text/css" href="#{values["stylesheet"]}"/>
397
- <meta name="generator" content="Re:VIEW EPUB Maker"/>
398
- EOT
399
- end
400
- f.puts <<EOT
401
- <title>目次</title>
402
- </head>
403
- <body>
404
- EOT
405
- f.puts %q(<nav epub:type="toc" id="toc">) if @epubversion == 3
406
- f.puts <<EOT
407
- <h1>目次</h1>
408
- <#{listelm} class=\"toc-h1\">
409
- EOT
410
- current = 1
411
- init_item = true
412
- @tocdesc.each {|item|
413
- level, file, id, content = item
414
- # values["level"]
415
- next if level > values["toclevel"].to_i
416
- if level > current
417
- current += 1
418
- f.puts ""
419
- f.puts "<#{listelm} class=\"toc-h#{current}\">"
420
- while current < level
421
- current += 1
422
- f.puts "<li>"
423
- f.puts "<#{listelm} class=\"toc-h#{current}\">"
424
- end
425
- elsif level < current
426
- current -= 1
427
- f.puts "</li>"
428
- f.puts "</#{listelm}>"
429
- f.puts "</li>"
430
- while current > level
431
- current -= 1
432
- f.puts "</#{listelm}>"
433
- f.puts "</li>"
434
- end
435
- elsif init_item
436
- # noop
437
- else
438
- f.puts "</li>"
439
- end
440
- fragment_id = (id ? '#'+id : '')
441
- f.write "<li><a href=\"#{file}#{fragment_id}\">#{strip_html(content)}</a>"
442
- init_item = false
443
- }
444
-
445
- (current - 1).downto(1) {|n|
446
- f.puts "</li>"
447
- f.puts "</#{listelm}>"
448
- }
449
- if !init_item
450
- f.puts "</li>"
451
- end
452
-
453
- f.puts "</#{listelm}>"
454
- f.puts %q(</nav>) if @epubversion == 3
455
- f.puts <<EOT
456
- </body>
457
- </html>
458
- EOT
459
- }
460
- end
461
-
462
- # stylesheet
463
- if File.exist?(values["stylesheet"])
464
- FileUtils.cp values["stylesheet"], "#{@bookdir}/OEBPS/#{values["stylesheet"]}"
465
- else
466
- File.open("#{@bookdir}/OEBPS/#{values["stylesheet"]}", "w") {|f|
467
- f.puts <<EOT
468
- /* sample style sheet for epub */
469
- @charset "utf-8";
470
-
471
- body {
472
- }
473
- EOT
474
- }
475
- end
476
-
477
- # Colophon page
478
- if values["colophon"]
479
- make_colophon_page(tmp, bookname, values)
480
- end
481
-
482
- # hook
483
- if !values["posthook"].nil? && !values["posthook"].empty? && FileTest.executable?(values["posthook"])
484
- fork {
485
- exec(values["posthook"], @bookdir, Dir.pwd, yamlfile)
486
- }
487
- Process.waitall
488
- end
489
-
490
- # Zip epubファイルの作成。mimetypeは圧縮しないようにする
491
- fork {
492
- basedir = Dir.pwd
493
- Dir.chdir(@bookdir) {|d|
494
- exec("zip", "-0X", "#{basedir}/#{bookname}.epub", "mimetype")
495
- }
496
- }
497
- Process.waitall
498
- fork {
499
- basedir = Dir.pwd
500
- Dir.chdir(@bookdir) {|d|
501
- exec("zip", "-Xr9D", "#{basedir}/#{bookname}.epub", "META-INF", "OEBPS")
502
- }
503
- }
504
- Process.waitall
505
-
506
- FileUtils.rm_r(tmp) if values["debug"].nil?
20
+ opts = OptionParser.new
21
+ opts.version = ReVIEW::VERSION
22
+ opts.banner = "Usage: #{File.basename($0)} [options] YAML_filename [export_filename]"
23
+ opts.on('--help', 'Prints this message and quit.') do
24
+ puts opts.help
25
+ exit 0
507
26
  end
508
27
 
509
- def make_doctype
510
- if @htmlversion == 5
511
- %q(<!DOCTYPE html>)
512
- else
513
- %q(<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">)
514
- end
28
+ begin
29
+ opts.parse!
30
+ rescue OptionParser::ParseError => err
31
+ $stderr.puts err.message
32
+ $stderr.puts opts.help
33
+ exit 1
515
34
  end
516
35
 
517
36
 
518
- def make_opf_file(values, bookname)
519
- File.open("#{@bookdir}/OEBPS/#{bookname}.opf", "w") {|f|
520
- f.puts <<EOT
521
- <?xml version="1.0" encoding="UTF-8"?>
522
- <package version="2.0" xmlns="http://www.idpf.org/2007/opf" unique-identifier="BookId">
523
- <metadata xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:opf="http://www.idpf.org/2007/opf">
524
- <dc:title>#{values["booktitle"]}</dc:title>
525
- EOT
526
-
527
- f.puts %Q(<dc:creator opf:role="aut">#{values["aut"]}</dc:creator>) unless values["aut"].nil? # FIXME: support multiple members
528
-
529
- f.puts %Q(<dc:publisher>#{values["prt"]}</dc:publisher>) unless values["prt"].nil?
530
-
531
- f.puts %Q(<dc:date>#{values["date"]}</dc:date>) unless values["date"].nil?
532
- f.puts %Q(<dc:rights>#{values["rights"]}</dc:rights>) unless values["rights"].nil?
533
-
534
- f.puts %Q(<dc:contributor opf:role="asn">#{values["asn"]}</dc:contributor>) unless values["asn"].nil?
535
- f.puts %Q(<dc:contributor opf:role="ant">#{values["ant"]}</dc:contributor>) unless values["ant"].nil?
536
- f.puts %Q(<dc:contributor opf:role="clb">#{values["clb"]}</dc:contributor>) unless values["clb"].nil?
537
- f.puts %Q(<dc:contributor opf:role="edt">#{values["edt"]}</dc:contributor>) unless values["edt"].nil?
538
- f.puts %Q(<dc:contributor opf:role="dsr">#{values["dsr"]}</dc:contributor>) unless values["dsr"].nil?
539
- f.puts %Q(<dc:contributor opf:role="ill">#{values["ill"]}</dc:contributor>) unless values["ill"].nil?
540
- f.puts %Q(<dc:contributor opf:role="pht">#{values["pht"]}</dc:contributor>) unless values["pht"].nil?
541
- f.puts %Q(<dc:contributor opf:role="trl">#{values["trl"]}</dc:contributor>) unless values["trl"].nil?
542
-
543
- f.puts %Q(<dc:description>#{values["description"]}</dc:description>) unless values["description"].nil?
544
-
545
- if values["coverimage"]
546
- f.puts %Q(<meta name="cover" content="#{getFigId("images-"+values["coverimage"])}"/>)
547
- end
548
- f.puts <<EOT
549
- <dc:language>ja</dc:language>
550
- <dc:identifier id="BookId">#{@identifier}</dc:identifier>
551
- </metadata>
552
- <manifest>
553
- EOT
554
-
555
- if values["toc"]
556
- f.puts <<EOT
557
- <item id="ncx" href="#{bookname}.ncx" media-type="application/x-dtbncx+xml" />
558
- EOT
559
- end
560
-
561
- f.puts <<EOT
562
- <item id="style" href="#{values["stylesheet"]}" media-type="text/css" />
563
- <item id="#{bookname}" href="#{bookname}.html" media-type="application/xhtml+xml" />
564
- <item id="top" href="top.html" media-type="application/xhtml+xml" />
565
- EOT
566
-
567
- if values["toc"] && values["mytoc"]
568
- f.puts <<EOT
569
- <item id="toc" href="toc.html" media-type="application/xhtml+xml" />
570
- EOT
571
- end
572
-
573
- f.puts @manifeststr
574
- if values["colophon"]
575
- f.puts <<EOT
576
- <item id="colophon" href="colophon.html" media-type="application/xhtml+xml" />
577
- EOT
578
- end
579
- if values["backcoverfile"]
580
- f.puts <<EOT
581
- <item id="backcover" href="#{values["backcoverfile"]}" media-type="application/xhtml+xml" />
582
- EOT
583
- end
584
-
585
- if values["cover_linear"] && values["cover_linear"] != "no"
586
- cover_linear = "yes"
587
- else
588
- cover_linear = "no"
589
- end
590
-
591
- f.puts <<EOT
592
- </manifest>
593
- <spine toc="ncx">
594
- <itemref idref="#{bookname}" linear="#{cover_linear}" />
595
- <itemref idref="top" />
596
- EOT
597
-
598
- if values["toc"] && values["mytoc"]
599
- f.puts <<EOT
600
- <itemref idref="toc" />
601
- EOT
602
- end
603
-
604
- f.puts @ncxstr
605
- if values["colophon"]
606
- f.puts <<EOT
607
- <itemref idref="colophon" />
608
- EOT
609
- end
610
- if values["backcoverfile"]
611
- f.puts <<EOT
612
- <itemref idref="backcover" />
613
- EOT
614
- end
615
- f.puts <<EOT
616
- </spine>
617
- <guide>
618
- EOT
619
-
620
- if values["titlepage"]
621
- f.puts <<EOT
622
- <reference type="cover" title="表紙" href="#{bookname}.html"/>
623
- <reference type="title-page" title="Title Page" href="top.html"/>
624
- EOT
625
- end
626
-
627
- if values["toc"] && values["mytoc"]
628
- f.puts <<EOT
629
- <reference type="toc" title="目次" href="toc.html"/>
630
- EOT
631
- end
632
- f.puts <<EOT
633
- </guide>
634
- </package>
635
- EOT
636
- }
637
- end
638
-
639
- def make_opf_filev3(values, bookname)
640
- File.open("#{@bookdir}/OEBPS/#{bookname}.opf", "w") {|f|
641
- f.puts <<EOT
642
- <?xml version="1.0" encoding="UTF-8"?>
643
- <package version="3.0" xmlns="http://www.idpf.org/2007/opf" unique-identifier="BookId">
644
- <metadata xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:opf="http://www.idpf.org/2007/opf">
645
- <dc:title>#{values["booktitle"]}</dc:title>
646
- EOT
647
- unless values["aut"].nil? # FIXME: support multiple members
648
- f.puts %Q(<dc:creator id="author">#{values["aut"]}</dc:creator>)
649
- f.puts %Q(<meta refines="#author" property="role" scheme="marc:relators" id="role">aut</meta>)
650
- end
651
- f.puts %Q(<dc:publisher id="publisher">#{values["prt"]}</dc:publisher>) unless values["prt"].nil?
652
-
653
- f.puts %Q(<dc:date>#{values["date"]}</dc:date>) unless values["date"].nil?
654
- f.puts %Q(<dc:rights>#{values["rights"]}</dc:rights>) unless values["rights"].nil?
655
-
656
- %w(asn ant clb edt dsr ill pht trl).each do |attr|
657
- unless values[attr].nil?
658
- f.puts %Q(<dc:contributor id="#{attr}">#{values[attr]}</dc:contributor>)
659
- f.puts %Q(<meta refines='##{attr}' property='role' scheme='marc:relators'>#{attr}</meta>)
660
- end
661
- end
662
- f.puts %Q(<dc:description>#{values["description"]}</dc:description>) unless values["description"].nil?
663
- f.puts %Q(<meta property="dcterms:modified">#{Time.now.utc.iso8601(0)}</meta>)
664
- if values["coverimage"]
665
- f.puts %Q(<meta name="cover" content="#{getFigId("images-"+values["coverimage"])}"/>)
666
- end
667
- f.puts <<EOT
668
- <dc:language>ja</dc:language>
669
- <dc:identifier id="BookId">#{@identifier}</dc:identifier>
670
- </metadata>
671
- <manifest>
672
- EOT
673
-
674
- if values["toc"]
675
- f.puts <<EOT
676
- <item id="ncx" href="#{bookname}.ncx" media-type="application/x-dtbncx+xml" />
677
- EOT
678
- end
679
-
680
- f.puts <<EOT
681
- <item id="style" href="#{values["stylesheet"]}" media-type="text/css" />
682
- <item id="#{bookname}" href="#{bookname}.html" media-type="application/xhtml+xml" />
683
- <item id="top" href="top.html" media-type="application/xhtml+xml" />
684
- EOT
685
-
686
- if values["toc"] && values["mytoc"]
687
- f.puts <<EOT
688
- <item id="toc" href="toc.html" properties="nav" media-type="application/xhtml+xml" />
689
- EOT
690
- end
691
-
692
- f.puts @manifeststr
693
- if values["colophon"]
694
- f.puts <<EOT
695
- <item id="colophon" href="colophon.html" media-type="application/xhtml+xml" />
696
- EOT
697
- end
698
-
699
- if values["backcoverfile"]
700
- f.puts <<EOT
701
- <item id="backcover" href="#{values["backcoverfile"]}" media-type="application/xhtml+xml" />
702
- EOT
703
- end
704
-
705
- if values["cover_linear"] && values["cover_linear"] != "no"
706
- cover_linear = "yes"
707
- else
708
- cover_linear = "no"
709
- end
710
-
711
- f.puts <<EOT
712
- </manifest>
713
- <spine toc="ncx">
714
- <itemref idref="#{bookname}" linear="#{cover_linear}" />
715
- <itemref idref="top" />
716
- EOT
717
-
718
- if values["toc"] && values["mytoc"]
719
- f.puts <<EOT
720
- <itemref idref="toc" />
721
- EOT
722
- end
723
-
724
- f.puts @ncxstr
725
- if values["colophon"]
726
- f.puts <<EOT
727
- <itemref idref="colophon" />
728
- EOT
729
- end
730
- if values["backcoverfile"]
731
- f.puts <<EOT
732
- <itemref idref="backcover" />
733
- EOT
734
- end
735
- f.puts <<EOT
736
- </spine>
737
- <guide>
738
- EOT
739
-
740
- if values["titlepage"]
741
- f.puts <<EOT
742
- <reference type="cover" title="表紙" href="#{bookname}.html"/>
743
- <reference type="title-page" title="Title Page" href="top.html"/>
744
- EOT
745
- end
746
-
747
- if values["toc"] && values["mytoc"]
748
- f.puts <<EOT
749
- <reference type="toc" title="目次" href="toc.html"/>
750
- EOT
751
- end
752
- f.puts <<EOT
753
- </guide>
754
- </package>
755
- EOT
756
- }
757
- end
758
-
759
-
760
- def output_chaps(chapsfile, values)
761
- File.open(chapsfile) {|chaps|
762
- chaps.each_line {|l|
763
- next if l =~ /^#/
764
- output_chaps_by_file(l, values)
765
- }
766
- }
767
- end
768
-
769
- def output_chaps_by_file(l, values)
770
- file_id = File.basename(l.chomp.strip,".*")
771
- if (idx = $essential_files.index(file_id))
772
- if idx == $essential_files.size - 1
773
- STDERR.puts "#{file_id} is book name. Please rename #{l.chomp.strip}."
774
- else
775
- STDERR.puts "#{file_id} is special name. Please rename #{l.chomp.strip}."
776
- end
777
- exit 1
778
- end
779
- filename = "#{file_id}.html"
780
- fork {
781
- STDOUT.reopen("#{@bookdir}/OEBPS/#{filename}")
782
- exec("review-compile --target=html --level=#{values["secnolevel"]} --htmlversion=#{values["htmlversion"]} --epubversion=#{values["epubversion"]} #{values["params"]} #{l}")
783
- }
784
- Process.waitall
785
- getanchors("#{@bookdir}/OEBPS/#{filename}")
786
- if @epubversion == 3 && include_mathml?("#{@bookdir}/OEBPS/#{filename}")
787
- @manifeststr << %Q(<item id="rv-#{file_id}" href="#{filename}" properties="mathml" media-type="application/xhtml+xml" />\n)
788
- else
789
- @manifeststr << %Q(<item id="rv-#{file_id}" href="#{filename}" media-type="application/xhtml+xml" />\n)
790
- end
791
- @ncxstr << %Q(<itemref idref="rv-#{file_id}" />\n)
37
+ if ARGV.size < 1 || !File.exist?(ARGV[0])
38
+ puts opts.help
39
+ exit 1
792
40
  end
793
41
 
794
- def include_mathml?(filename)
795
- File.open(filename) {|f|
796
- REXML::Document.new(f).each_element("//math"){
797
- return true
798
- }
799
- return false
800
- }
801
- rescue
802
- false
803
- end
804
-
805
- def getFigId(filename)
806
- figid = filename.sub(/\.(png|gif|jpg|jpeg|svg)$/, '')
807
- "fig-#{figid}"
808
- end
809
-
810
- def getTitle(filename)
811
- File.open(filename) {|f|
812
- return REXML::Document.new(f).elements["//html/head/title"].text
813
- }
814
- end
815
-
816
- def getanchors(filename)
817
- File.open(filename) {|f|
818
- file = filename.sub(/.+\//, '')
819
- f.each_line {|l|
820
- if l =~ /\A<h(\d)[^>]*><a id=\"(.+?)\"><\/a>(.+?)<\/h/
821
- # level, ID, content
822
- @tocdesc << [$1.to_i, file, $2, $3]
823
- end
824
- }
825
- }
826
- end
827
-
828
- def make_colophon_page(tmp,bookname,values)
829
-
830
- header = <<EOT
831
- <?xml version="1.0" encoding="UTF-8"?>
832
- EOT
833
- header += make_doctype()
834
- header += <<EOT
835
- <html xmlns="http://www.w3.org/1999/xhtml" xmlns:ops="http://www.idpf.org/2007/ops" xmlns:epub="http://www.idpf.org/2007/ops" xml:lang="ja">
836
- <head>
837
- EOT
838
- if @htmlversion == 4
839
- header += <<EOT
840
- <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/>
841
- <meta http-equiv="Content-Style-Type" content="text/css"/>
842
- <link rel="stylesheet" type="text/css" href="#{values["stylesheet"]}"/>
843
- <meta name="generator" content="Re:VIEW EPUB Maker"/>
844
- EOT
845
- else
846
- header += <<EOT
847
- <meta charset="UTF-8" />
848
- <link rel="stylesheet" type="text/css" href="#{values["stylesheet"]}"/>
849
- <meta name="generator" content="Re:VIEW EPUB Maker"/>
850
- EOT
851
- end
852
- header += <<EOT
853
- <title>#{values["booktitle"]}</title>
854
- </head>
855
- <body>
856
- EOT
857
-
858
- footer = <<EOT
859
- </body>
860
- </html>
861
- EOT
862
-
863
- colophon_path = "#{@bookdir}/OEBPS/colophon.html"
864
- colophon = values["colophon"]
865
- if colophon.kind_of?(String) && File.exist?(colophon)
866
- File.open(colophon_path, "w") {|f|
867
- f.puts header
868
- File.open(values["colophon"]) {|f2|
869
- f2.each_line {|l|
870
- f.puts l
871
- }
872
- }
873
- f.puts footer
874
- }
875
- else
876
- File.open(colophon_path, "w") {|f|
877
- f.puts header
878
- f.puts <<EOT
879
- <div class="colophon">
880
- <p class="title">#{values["booktitle"]}</p>
881
- EOT
882
- if values["pubhistory"]
883
- f.puts %Q[<div class="pubhistory">\n<p>#{values["pubhistory"].gsub(/\n/,"<br />")}</p>\n</div>]
884
- end
885
-
886
- f.puts <<EOT
887
- <table>
888
- EOT
889
- f.puts %Q[<tr>\n <th>著 者</th><td>#{values["aut"]}</td>\n</tr>] if values["aut"]
890
- f.puts %Q[<tr>\n <th>監 修</th><td>#{values["csl"]}</td>\n</tr>] if values["csl"]
891
- f.puts %Q[<tr>\n <th>翻 訳</th><td>#{values["trl"]}</td>\n</tr>] if values["trl"]
892
- f.puts %Q[<tr>\n <th>デザイン</th><td>#{values["dsr"]}</td>\n</tr>] if values["dsr"]
893
- f.puts %Q[<tr>\n <th>イラスト</th><td>#{values["ill"]}</td>\n</tr>] if values["ill"]
894
- f.puts %Q[<tr>\n <th>表 紙</th><td>#{values["cov"]}</td>\n</tr>] if values["cov"]
895
- f.puts %Q[<tr>\n <th>編 集</th><td>#{values["edt"]}</td>\n</tr>] if values["edt"]
896
- f.puts %Q[<tr>\n <th>発行所</th><td>#{values["prt"]}</td>\n</tr>] if values["prt"]
897
- f.puts <<EOT
898
- </table>
899
- EOT
900
- if values["rights"]
901
- f.puts %Q[<p class="copyright">#{values["rights"]}</p>]
902
- end
903
-
904
- f.puts "</div>"
905
- f.puts footer
906
- }
907
- end
908
- end
909
-
910
- def make_part_page(part, filename, values)
911
- File.open("#{@bookdir}/OEBPS/#{filename}", "w") {|f|
912
- f.puts <<-EOT
913
- <?xml version="1.0" encoding="UTF-8"?>
914
- EOT
915
- doctype = make_doctype()
916
- f.puts doctype
917
- if @htmlversion == 4
918
- header = <<-EOT
919
- <html xmlns="http://www.w3.org/1999/xhtml" xmlns:ops="http://www.idpf.org/2007/ops" xmlns:epub="http://www.idpf.org/2007/ops" xml:lang="ja">
920
- <head>
921
- <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/>
922
- <meta http-equiv="Content-Style-Type" content="text/css"/>
923
- <link rel="stylesheet" type="text/css" href="#{values["stylesheet"]}"/>
924
- <meta name="generator" content="Re:VIEW EPUB Maker"/>
925
- <title>#{values["booktitle"]}</title>
926
- </head>
927
- EOT
928
- else
929
- header = <<-EOT
930
- <html xmlns="http://www.w3.org/1999/xhtml" xmlns:ops="http://www.idpf.org/2007/ops" xmlns:epub="http://www.idpf.org/2007/ops" xml:lang="ja">
931
- <head>
932
- <meta charset="UTF-8" />
933
- <link rel="stylesheet" type="text/css" href="#{values["stylesheet"]}"/>
934
- <meta name="generator" content="Re:VIEW EPUB Maker"/>
935
- <title>#{values["booktitle"]}</title>
936
- </head>
937
- EOT
938
- end
939
- f.puts header
940
-
941
- f.puts <<-EOT
942
- <body>
943
- <h1 class="part-number">#{ReVIEW::I18n.t("part", part.number)}</h1>
944
- EOT
945
-
946
- if part.name.strip.present?
947
- f.puts <<-EOT
948
- <h2 class="part-title">#{part.name.strip}</h2>
949
- EOT
950
- end
951
-
952
- f.puts <<-EOT
953
- </body>
954
- </html>
955
- EOT
956
- }
957
- end
958
-
959
- def make_backcover_image(bookname, values)
960
- backcoverfile = values["backcoverfile"]
961
- File.open("#{@bookdir}/OEBPS/#{backcoverfile}", "w") {|f|
962
- f.puts <<EOT
963
- <?xml version="1.0" encoding="UTF-8"?>
964
- EOT
965
- doctype = make_doctype()
966
- f.puts doctype
967
- f.puts <<EOT
968
- <html xmlns="http://www.w3.org/1999/xhtml" xmlns:ops="http://www.idpf.org/2007/ops" xmlns:epub="http://www.idpf.org/2007/ops" xml:lang="ja">
969
- <head>
970
- EOT
971
- if @htmlversion == 4
972
- f.puts <<EOT
973
- <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/>
974
- <meta http-equiv="Content-Style-Type" content="text/css"/>
975
- <link rel="stylesheet" type="text/css" href="#{values["stylesheet"]}"/>
976
- <meta name="generator" content="Re:VIEW EPUB Maker"/>
977
- EOT
978
- else
979
- f.puts <<EOT
980
- <meta charset="UTF-8" />
981
- <link rel="stylesheet" type="text/css" href="#{values["stylesheet"]}"/>
982
- <meta name="generator" content="Re:VIEW EPUB Maker"/>
983
- EOT
984
- end
985
- f.puts <<EOT
986
- <title>#{values["booktitle"]}</title>
987
- </head>
988
- <body>
989
- EOT
990
- if File.exist?(backcoverfile)
991
- File.open(backcoverfile) {|f2|
992
- f2.each_line {|l|
993
- f.puts l
994
- }
995
- }
996
- else
997
- f.puts <<EOT
998
- <div id="back-cover-image" class="full">
999
- <img src="images/#{backcoverfile}" alt="back-cover"/>
1000
- </div>
1001
- EOT
1002
- end
1003
-
1004
- f.puts <<EOT
1005
- </body>
1006
- </html>
1007
- EOT
1008
- }
1009
- end
1010
-
1011
-
1012
-
1013
-
1014
- main
42
+ yaml_file = ARGV[0]
43
+ bookname = ARGV[1]
44
+ rv.produce(yaml_file, bookname)