review 1.0.0 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.travis.yml +1 -2
- data/ChangeLog +65 -0
- data/Gemfile +5 -0
- data/README.rdoc +6 -1
- data/Rakefile +14 -28
- data/bin/review-check +9 -21
- data/bin/review-compile +45 -12
- data/bin/review-epubmaker +477 -220
- data/bin/review-epubmaker-ng +5 -14
- data/bin/review-index +4 -2
- data/bin/review-init +94 -0
- data/bin/review-pdfmaker +70 -287
- data/bin/review-preproc +5 -2
- data/bin/review-vol +4 -11
- data/debian/changelog +3 -3
- data/debian/copyright +5 -3
- data/debian/docs +1 -0
- data/doc/format.rdoc +57 -11
- data/doc/quickstart.rdoc +4 -4
- data/doc/sample.yaml +11 -7
- data/lib/epubmaker.rb +1 -1
- data/lib/epubmaker/epubv2.rb +26 -27
- data/lib/epubmaker/epubv3.rb +13 -13
- data/lib/epubmaker/producer.rb +1 -1
- data/lib/review.rb +3 -4
- data/lib/review/book.rb +17 -581
- data/lib/review/book/base.rb +247 -0
- data/lib/review/book/chapter.rb +81 -0
- data/lib/review/book/compilable.rb +163 -0
- data/lib/review/book/index.rb +339 -0
- data/lib/review/book/page_metric.rb +38 -0
- data/lib/review/book/parameters.rb +97 -0
- data/lib/review/book/part.rb +44 -0
- data/lib/review/book/volume.rb +65 -0
- data/lib/review/builder.rb +34 -40
- data/lib/review/compiler.rb +32 -13
- data/lib/review/configure.rb +38 -0
- data/lib/review/ewbbuilder.rb +23 -21
- data/lib/review/extentions.rb +3 -0
- data/lib/review/extentions/object.rb +9 -0
- data/lib/review/{compat.rb → extentions/string.rb} +11 -0
- data/lib/review/htmlbuilder.rb +162 -74
- data/lib/review/htmlutils.rb +28 -1
- data/lib/review/i18n.yaml +11 -0
- data/lib/review/idgxmlbuilder.rb +119 -35
- data/lib/review/inaobuilder.rb +355 -0
- data/lib/review/latexbuilder.rb +133 -59
- data/lib/review/latexutils.rb +15 -6
- data/lib/review/makerhelper.rb +59 -0
- data/lib/review/markdownbuilder.rb +129 -0
- data/lib/review/preprocessor.rb +20 -7
- data/lib/review/review.tex.erb +250 -0
- data/lib/review/textutils.rb +28 -3
- data/lib/review/tocparser.rb +20 -12
- data/lib/review/tocprinter.rb +7 -3
- data/lib/review/topbuilder.rb +44 -27
- data/lib/review/version.rb +3 -0
- data/review.gemspec +20 -117
- data/test/book_test_helper.rb +35 -0
- data/test/sample-book/README.md +5 -0
- data/test/sample-book/src/CHAPS +2 -0
- data/test/sample-book/src/PREDEF +1 -0
- data/test/sample-book/src/Rakefile +26 -0
- data/test/sample-book/src/_cover.html +3 -0
- data/test/sample-book/src/ch01.re +71 -0
- data/test/sample-book/src/ch02.re +3 -0
- data/test/sample-book/src/config.yml +55 -0
- data/test/sample-book/src/images/ch01-imgsample.jpg +0 -0
- data/test/sample-book/src/images/cover.jpg +0 -0
- data/test/sample-book/src/main.css +251 -0
- data/test/sample-book/src/preface.re +15 -0
- data/test/sample-book/src/sty/jumoline.sty +310 -0
- data/test/sample-book/src/sty/samplemacro.sty +21 -0
- data/test/sample-book/src/vendor/jumoline/README +29 -0
- data/test/sample-book/src/vendor/jumoline/jumoline.dtx +2988 -0
- data/test/sample-book/src/vendor/jumoline/jumoline.ins +6 -0
- data/test/test_book.rb +26 -646
- data/test/test_book_chapter.rb +418 -0
- data/test/test_book_parameter.rb +42 -0
- data/test/test_book_part.rb +53 -0
- data/test/test_builder.rb +17 -10
- data/test/test_compiler.rb +46 -0
- data/test/test_epubmaker.rb +1 -1
- data/test/test_epubmaker_cmd.rb +36 -0
- data/test/test_helper.rb +17 -0
- data/test/test_htmlbuilder.rb +156 -24
- data/test/test_htmlutils.rb +4 -0
- data/test/test_i18n.rb +6 -2
- data/test/test_idgxmlbuilder.rb +33 -11
- data/test/test_inaobuilder.rb +247 -0
- data/test/test_index.rb +31 -0
- data/test/test_latexbuilder.rb +115 -35
- data/test/test_makerhelper.rb +50 -0
- data/test/test_pdfmaker_cmd.rb +36 -0
- data/test/test_preprocessor.rb +7 -7
- data/test/test_topbuilder.rb +6 -7
- data/test/test_uuid.rb +1 -0
- metadata +117 -12
- data/lib/review/index.rb +0 -323
- data/lib/review/volume.rb +0 -66
data/.travis.yml
CHANGED
data/ChangeLog
CHANGED
@@ -1,3 +1,68 @@
|
|
1
|
+
Thu Aug 29 21:33:19 2013 Masayoshi Takahashi <takahashimm@gmail.com>
|
2
|
+
|
3
|
+
* Version bump to 1.1.0.
|
4
|
+
|
5
|
+
Sat Jun 29 01:34:14 2013 Masayoshi Takahashi <takahashimm@gmail.com>
|
6
|
+
|
7
|
+
* lib/review/htmlbuilder.rb, lib/review/latexbuilder.rb:
|
8
|
+
|
9
|
+
use split_paragraph for //bibpaper block.
|
10
|
+
|
11
|
+
Sat Mar 30 03:15:43 2013 Masayoshi Takahashi <takahashimm@gmail.com>
|
12
|
+
|
13
|
+
* lib/review/latexbuilder.rb, lib/review/review.tex.erb,
|
14
|
+
test/test_latexbuilder.rb:
|
15
|
+
|
16
|
+
move alltt environment into ReVIEW macros
|
17
|
+
(reviewbox, reviewemlist, reviewlist, reviewcmd,
|
18
|
+
reviewdummyimage.)
|
19
|
+
|
20
|
+
If you redefine these macros, you should add \begin{alltt}
|
21
|
+
and \end{alltt} in your definitions.
|
22
|
+
|
23
|
+
Sun Mar 24 15:55:43 2013 Kenshi Muto <kmuto@debian.org>
|
24
|
+
|
25
|
+
* lib/review/idgxmlbuilder.rb, test/test_idgxmlbuilder.rb:
|
26
|
+
support PART.
|
27
|
+
|
28
|
+
Mon Aug 27 20:27:11 2012 Kenshi Muto <kmuto@debian.org>
|
29
|
+
|
30
|
+
* lib/review/compiler.rb, lib/review/htmlbuilder.rb,
|
31
|
+
lib/review/idgxmlbuilder.rb, lib/review/latexbuilder.rb,
|
32
|
+
lib/review/topbuilder.rb, test/test_htmlbuilder.rb,
|
33
|
+
test/test_idgxmlbuilder.rb, test/test_latexbuilder.rb:
|
34
|
+
Add //centering to centerize contents.
|
35
|
+
|
36
|
+
Wed Aug 8 18:47:33 2012 Kenshi Muto <kmuto@debian.org>
|
37
|
+
|
38
|
+
* bin/review-compile, lib/review/idgxmlbuilder.rb:
|
39
|
+
Add --structuredxml option to produce structured XML for sections.
|
40
|
+
|
41
|
+
Sat Jul 14 16:07:54 2012 Masayoshi Takahashi <takahashimm@gmail.com>
|
42
|
+
|
43
|
+
* lib/review/review.tex.erb: \usepackage{jumoline} is optional
|
44
|
+
|
45
|
+
Sat Jun 16 00:57:14 2012 Masayoshi Takahashi <takahashimm@gmail.com>
|
46
|
+
|
47
|
+
* bin/review-compile, lib/review/builder.rb:
|
48
|
+
support --tabwidth=WIDTH option in review-compile
|
49
|
+
|
50
|
+
Fri Apr 20 16:07:35 2012 Kenshi Muto <kmuto@debian.org>
|
51
|
+
|
52
|
+
* lib/epubmaker/epubv*.rb: escape entity strings in meta informations.
|
53
|
+
|
54
|
+
Tue Mar 13 02:58:41 2012 Masayoshi Takahashi <takahashimm@gmail.com>
|
55
|
+
|
56
|
+
* lib/review/htmlbuilder.rb: support @<bou> in HTMLBuilder
|
57
|
+
|
58
|
+
Tue Mar 13 02:57:24 2012 Masayoshi Takahashi <takahashimm@gmail.com>
|
59
|
+
|
60
|
+
* lib/review/latexbuilder.rb: support @<ami> in LATEXBuilder
|
61
|
+
|
62
|
+
Sun Feb 12 16:06:52 2012 Masayoshi Takahashi <takahashimm@gmail.com>
|
63
|
+
|
64
|
+
* bin/review-pdfmaker: fix ebb and extractbb options for PDF as images
|
65
|
+
|
1
66
|
Mon Jan 30 20:39:17 2012 Masayoshi Takahashi <takahashimm@gmail.com>
|
2
67
|
|
3
68
|
* Version bump to 1.0.0.
|
data/Gemfile
ADDED
data/README.rdoc
CHANGED
@@ -12,6 +12,7 @@ Output formats ReVIEW supports are:
|
|
12
12
|
* LaTeX(ptexlive)
|
13
13
|
* InDesign(IDGXML)
|
14
14
|
* plain text(TOPBuilder Markup Lang.)
|
15
|
+
* Inao(gihyo.jp original markup)
|
15
16
|
|
16
17
|
== Commands
|
17
18
|
|
@@ -37,10 +38,14 @@ And some useful commands.
|
|
37
38
|
(if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
|
38
39
|
* Send me a pull request. Bonus points for topic branches.
|
39
40
|
|
41
|
+
== Build status
|
42
|
+
|
43
|
+
* {<img src="https://secure.travis-ci.org/kmuto/review.png"/>}[http://travis-ci.org/kmuto/review]
|
44
|
+
|
40
45
|
== License
|
41
46
|
|
42
47
|
LGPL. See COPYING file.
|
43
48
|
|
44
49
|
== Copyright
|
45
50
|
|
46
|
-
Copyright (c) 2006-
|
51
|
+
Copyright (c) 2006-2012 Minero Aoki, Kenshi Muto, Masayoshi Takahashi.
|
data/Rakefile
CHANGED
@@ -1,31 +1,15 @@
|
|
1
|
+
require 'bundler'
|
2
|
+
Bundler::GemHelper.install_tasks
|
3
|
+
|
1
4
|
require 'rubygems'
|
2
|
-
require 'rake'
|
3
5
|
require 'rake/testtask'
|
4
6
|
require 'rake/clean'
|
5
7
|
|
6
|
-
begin
|
7
|
-
require 'jeweler'
|
8
|
-
Jeweler::Tasks.new do |gem|
|
9
|
-
gem.name = "review"
|
10
|
-
gem.summary = %Q{ReVIEW: a easy-to-use digital publishing system}
|
11
|
-
gem.description = %Q{ReVIEW is a digital publishing system for books and ebooks. It supports InDesign, EPUB and LaTeX.}
|
12
|
-
gem.email = "kmuto@debian.org"
|
13
|
-
gem.homepage = "http://github.com/kmuto/review"
|
14
|
-
gem.authors = ["kmuto", "takahashim"]
|
15
|
-
# gem.add_development_dependency "thoughtbot-shoulda", ">= 0"
|
16
|
-
# gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
|
17
|
-
end
|
18
|
-
Jeweler::GemcutterTasks.new
|
19
|
-
rescue LoadError
|
20
|
-
puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
|
21
|
-
end
|
22
|
-
|
23
|
-
|
24
8
|
task :default => [:test]
|
25
9
|
|
26
10
|
Rake::TestTask.new("test") do |t|
|
27
11
|
t.libs << "test"
|
28
|
-
t.
|
12
|
+
t.test_files = Dir.glob("test/**/test_*.rb")
|
29
13
|
t.verbose = true
|
30
14
|
end
|
31
15
|
|
@@ -41,12 +25,14 @@ begin
|
|
41
25
|
rescue LoadError
|
42
26
|
end
|
43
27
|
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
28
|
+
begin
|
29
|
+
require 'rdoc/task'
|
30
|
+
Rake::RDocTask.new do |rdoc|
|
31
|
+
version = File.exist?('VERSION') ? File.read('VERSION') : ""
|
32
|
+
rdoc.rdoc_dir = 'rdoc'
|
33
|
+
rdoc.title = "review #{version}"
|
34
|
+
rdoc.rdoc_files.include('README*')
|
35
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
36
|
+
end
|
37
|
+
rescue LoadError
|
52
38
|
end
|
data/bin/review-check
CHANGED
@@ -15,13 +15,16 @@ require 'pathname'
|
|
15
15
|
bindir = Pathname.new(__FILE__).realpath.dirname
|
16
16
|
$LOAD_PATH.unshift((bindir + '../lib').realpath)
|
17
17
|
|
18
|
-
require 'review
|
18
|
+
require 'review'
|
19
19
|
require 'optparse'
|
20
|
-
|
20
|
+
|
21
|
+
include ReVIEW::TextUtils
|
21
22
|
|
22
23
|
def sigmain
|
23
24
|
Signal.trap(:INT) { exit 1 }
|
24
|
-
|
25
|
+
if RUBY_PLATFORM !~ /mswin(?!ce)|mingw|cygwin|bccwin/
|
26
|
+
Signal.trap(:PIPE, 'IGNORE')
|
27
|
+
end
|
25
28
|
main
|
26
29
|
rescue Errno::EPIPE
|
27
30
|
exit 0
|
@@ -92,15 +95,7 @@ def check_text(files)
|
|
92
95
|
next if neg and neg =~ s
|
93
96
|
str, offset = find_line(para, re)
|
94
97
|
out = sprintf("%s:%d: %s\n", path, lineno + offset, str)
|
95
|
-
|
96
|
-
print NKF.nkf("-e", out)
|
97
|
-
elsif @param["outencoding"] =~ /^SJIS$/
|
98
|
-
print NKF.nkf("-s", out)
|
99
|
-
elsif @param["outencoding"] =~ /^JIS$/
|
100
|
-
print NKF.nkf("-j", out)
|
101
|
-
else
|
102
|
-
print out
|
103
|
-
end
|
98
|
+
print convert_outencoding(out, @param["outencoding"])
|
104
99
|
end
|
105
100
|
end
|
106
101
|
}
|
@@ -142,15 +137,8 @@ end
|
|
142
137
|
def each_paragraph(f)
|
143
138
|
$ReVIEW_utils_word_ok = nil
|
144
139
|
while line = f.gets
|
145
|
-
|
146
|
-
|
147
|
-
elsif @param["inencoding"] =~ /SJIS$/
|
148
|
-
line = NKF.nkf("-S -w", line)
|
149
|
-
elsif @param["inencoding"] =~ /^JIS$/
|
150
|
-
line = NKF.nkf("-J -w", line)
|
151
|
-
else
|
152
|
-
line = NKF.nkf("-w", line)
|
153
|
-
end
|
140
|
+
line = convert_inencoding(line, @param["inencoding"])
|
141
|
+
|
154
142
|
case line
|
155
143
|
when /\A\#@ok\((.*)\)/
|
156
144
|
$ReVIEW_utils_word_ok = $1
|
data/bin/review-compile
CHANGED
@@ -23,7 +23,9 @@ require 'optparse'
|
|
23
23
|
|
24
24
|
def main
|
25
25
|
Signal.trap(:INT) { exit 1 }
|
26
|
-
|
26
|
+
if RUBY_PLATFORM !~ /mswin(?!ce)|mingw|cygwin|bccwin/
|
27
|
+
Signal.trap(:PIPE, 'IGNORE')
|
28
|
+
end
|
27
29
|
_main
|
28
30
|
rescue Errno::EPIPE
|
29
31
|
exit 0
|
@@ -40,12 +42,14 @@ def _main
|
|
40
42
|
target = nil
|
41
43
|
end
|
42
44
|
check_only = false
|
45
|
+
output_filename = nil
|
43
46
|
|
44
47
|
param = {
|
45
48
|
"secnolevel" => 2, # for IDGXML and HTML
|
46
49
|
"tableopt" => nil, # for IDGXML
|
47
50
|
"nolf" => nil, # for IDGXML
|
48
51
|
"chapref" => nil, # for IDGXML
|
52
|
+
"structuredxml" => nil, # for IDGXML
|
49
53
|
"inencoding" => "UTF-8",
|
50
54
|
"outencoding" => "UTF-8",
|
51
55
|
"subdirmode" => nil,
|
@@ -69,7 +73,9 @@ def _main
|
|
69
73
|
parser.on('--outencoding=ENCODING', 'Set output encoding. (UTF-8[default], EUC, JIS, and SJIS)') {|enc| param["outencoding"] = enc }
|
70
74
|
parser.on('-c', '--check', 'Check manuscript') { check_only = true }
|
71
75
|
parser.on('--level=LVL', 'Section level to append number.') {|lvl| param["secnolevel"] = lvl.to_i }
|
76
|
+
parser.on('--toclevel=LVL', 'Section level to append number.') {|lvl| param["toclevel"] = lvl.to_i }
|
72
77
|
parser.on('--nolfinxml', 'Do not insert LF in XML. (idgxml)') { param["nolf"] = true }
|
78
|
+
parser.on('--structuredxml', 'Produce XML with structured sections. (idgxml)') { param["structuredxml"] = true }
|
73
79
|
parser.on('--table=WIDTH', 'Default table width. (idgxml)') {|tbl| param["tableopt"] = tbl }
|
74
80
|
parser.on('--listinfo', 'Append listinfo tag to lists to indicate begin/end. (idgxml)') { param["listinfo"] = true }
|
75
81
|
parser.on('--chapref="before,middle,after"', 'Chapref decoration.') {|cdec| param["chapref"] = cdec }
|
@@ -101,6 +107,10 @@ def _main
|
|
101
107
|
mode = :dir
|
102
108
|
basedir = path
|
103
109
|
end
|
110
|
+
parser.on('--output-file=FILENAME', 'Write all results into file instead of stdout.') do |filename|
|
111
|
+
output_filename = filename
|
112
|
+
end
|
113
|
+
parser.on('--tabwidth=WIDTH', 'tab width') {|width| param["tabwidth"] = width.to_i }
|
104
114
|
parser.on('--help', 'Prints this message and quit.') do
|
105
115
|
puts parser.help
|
106
116
|
exit 0
|
@@ -120,25 +130,40 @@ def _main
|
|
120
130
|
exit 1
|
121
131
|
end
|
122
132
|
|
123
|
-
# array parameter
|
124
|
-
["stylesheet"].each do |k|
|
125
|
-
if param["k"].instance_of?(String)
|
126
|
-
param["k"] = [param["k"]]
|
127
|
-
end
|
128
|
-
end
|
129
|
-
|
130
133
|
begin
|
131
|
-
compiler = ReVIEW::Compiler.new(load_strategy_class(target, check_only))
|
132
134
|
ReVIEW.book.param = param
|
135
|
+
compiler = ReVIEW::Compiler.new(load_strategy_class(target, check_only))
|
133
136
|
case mode
|
134
137
|
when :files
|
135
138
|
if ARGV.empty?
|
136
139
|
error 'no input'
|
137
140
|
exit 1
|
138
141
|
end
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
+
|
143
|
+
begin
|
144
|
+
ReVIEW::Book::Chapter.intern_pathes(ARGV).each do |chap|
|
145
|
+
result = compiler.compile(chap)
|
146
|
+
if output_filename
|
147
|
+
write output_filename, result
|
148
|
+
else
|
149
|
+
puts result unless check_only
|
150
|
+
end
|
151
|
+
end
|
152
|
+
rescue => e
|
153
|
+
# PART
|
154
|
+
part = ReVIEW.book.parts_in_file.select do |part|
|
155
|
+
ARGV.map{|path| File.basename path}.include? part.path
|
156
|
+
end
|
157
|
+
if part.present?
|
158
|
+
result = compiler.compile(part.first)
|
159
|
+
if output_filename
|
160
|
+
write output_filename, result
|
161
|
+
else
|
162
|
+
puts result unless check_only
|
163
|
+
end
|
164
|
+
else
|
165
|
+
raise e
|
166
|
+
end
|
142
167
|
end
|
143
168
|
when :dir
|
144
169
|
book = basedir ? ReVIEW::Book.load(basedir) : ReVIEW.book
|
@@ -146,6 +171,14 @@ def _main
|
|
146
171
|
str = compiler.compile(chap)
|
147
172
|
write "#{chap.name}#{compiler.strategy.extname}", str unless check_only
|
148
173
|
end
|
174
|
+
# PART
|
175
|
+
book.parts_in_file.each do |part|
|
176
|
+
str = compiler.compile(part)
|
177
|
+
if compiler.strategy.extname == ".tex"
|
178
|
+
str.gsub!(/\A\\chapter\{/, '\part{') # FIXME: UGLY...
|
179
|
+
end
|
180
|
+
write "#{part.name}#{compiler.strategy.extname}", str unless check_only
|
181
|
+
end
|
149
182
|
else
|
150
183
|
raise "must not happen: #{mode}"
|
151
184
|
end
|
data/bin/review-epubmaker
CHANGED
@@ -14,6 +14,7 @@ require 'fileutils'
|
|
14
14
|
require 'yaml'
|
15
15
|
require 'optparse'
|
16
16
|
require 'rexml/document'
|
17
|
+
require 'time'
|
17
18
|
|
18
19
|
require 'pathname'
|
19
20
|
|
@@ -21,61 +22,48 @@ bindir = Pathname.new(__FILE__).realpath.dirname
|
|
21
22
|
$LOAD_PATH.unshift((bindir + '../lib').realpath)
|
22
23
|
|
23
24
|
require 'uuid'
|
25
|
+
require 'review'
|
26
|
+
require 'review/i18n'
|
24
27
|
|
28
|
+
require 'review/htmlutils'
|
29
|
+
include ReVIEW::HTMLUtils
|
30
|
+
|
31
|
+
$essential_files = ['top', 'toc', 'colophon']
|
25
32
|
def main
|
26
|
-
values = { # These parameters can be overridden by YAML file.
|
27
|
-
"bookname"=> nil, # it defines epub file name also
|
28
|
-
"booktitle" => "ReVIEW EPUBサンプル",
|
29
|
-
"aut" => nil, # author
|
30
|
-
"prt" => nil, # printer(publisher)
|
31
|
-
"asn" => nil, # associated name
|
32
|
-
"ant" => nil, # bibliographic antecedent
|
33
|
-
"clb" => nil, # Collaborator
|
34
|
-
"edt" => nil, # Editor
|
35
|
-
"dsr" => nil, # Designer
|
36
|
-
"ill" => nil, # Illustrator
|
37
|
-
"pht" => nil, # Photographer
|
38
|
-
"trl" => nil, # Translator
|
39
|
-
"date" => nil, # publishing date
|
40
|
-
"rights" => nil, # Copyright messages
|
41
|
-
"description" => nil, # Description
|
42
|
-
"urnid" => nil, # Identifier (nil makes random uuid)
|
43
|
-
"stylesheet" => "stylesheet.css", # stylesheet file
|
44
|
-
"coverfile" => nil, # content file of body of cover page
|
45
|
-
"mytoc" => nil, # whether make own table of contents or not
|
46
|
-
"params" => "", # specify review2html parameters
|
47
|
-
"toclevel" => 3, # level of toc
|
48
|
-
"secnolevel" => 2, # level of section #
|
49
|
-
"posthook" => nil, # command path of post hook
|
50
|
-
"debug" => nil, # debug flag
|
51
|
-
}
|
52
33
|
if ARGV.size != 1
|
53
34
|
puts "Usage: #{$0} configfile"
|
54
35
|
exit 0
|
55
36
|
end
|
56
|
-
|
37
|
+
|
57
38
|
yamlfile = ARGV[0]
|
58
|
-
values = values.merge(YAML.load_file(yamlfile))
|
39
|
+
values = ReVIEW::Configure.values.merge(YAML.load_file(yamlfile))
|
59
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
|
60
50
|
|
61
51
|
if File.exist?("#{bookname}.epub")
|
62
52
|
STDERR.puts "#{bookname}.epub exists. Please remove or rename first."
|
63
53
|
exit 1
|
64
54
|
end
|
65
|
-
if File.exist?(
|
66
|
-
STDERR.puts "#{
|
55
|
+
if File.exist?(@bookdir)
|
56
|
+
STDERR.puts "#{@bookdir} directory exists. Please remove or rename first."
|
67
57
|
exit 1
|
68
58
|
end
|
69
59
|
|
70
|
-
identifier = values["urnid"].nil? ? "urn:uuid:#{UUID.create}" : values["urnid"]
|
60
|
+
@identifier = values["urnid"].nil? ? "urn:uuid:#{UUID.create}" : values["urnid"]
|
71
61
|
|
72
|
-
tmp = values["debug"].nil? ? Dir.mktmpdir : "."
|
73
|
-
@bookdir = "#{tmp}/#{bookname}"
|
74
62
|
Dir.mkdir(@bookdir)
|
75
63
|
|
76
64
|
# MIME type
|
77
65
|
File.open("#{@bookdir}/mimetype", "w") {|f|
|
78
|
-
f.
|
66
|
+
f.write "application/epub+zip"
|
79
67
|
}
|
80
68
|
|
81
69
|
Dir.mkdir("#{@bookdir}/OEBPS")
|
@@ -83,21 +71,57 @@ def main
|
|
83
71
|
@manifeststr = ""
|
84
72
|
@ncxstr = ""
|
85
73
|
@tocdesc = Array.new
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
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
|
+
end
|
87
|
+
file_id = "part_#{part.number}"
|
88
|
+
part_name = "#{ReVIEW::I18n.t("part", part.number)} #{part.name.strip}"
|
89
|
+
@tocdesc << [1, htmlfile, nil, part_name]
|
90
|
+
@manifeststr << %Q(<item id="#{file_id}" href="#{htmlfile}" media-type="application/xhtml+xml" />\n)
|
91
|
+
@ncxstr << %Q(<itemref idref="#{file_id}" />\n)
|
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
|
95
98
|
end
|
99
|
+
|
96
100
|
if File.exist?("images")
|
97
101
|
Dir.mkdir("#{@bookdir}/OEBPS/images")
|
98
|
-
|
102
|
+
image_files = ReVIEW::MakerHelper.copy_images_to_dir("images", "#{@bookdir}/OEBPS/images")
|
103
|
+
image_files.each do |image_file|
|
104
|
+
dirname = File.dirname(image_file)
|
105
|
+
fname = File.basename(image_file)
|
106
|
+
figid = getFigId(dirname.gsub(%r|/|,'-')+"-"+fname)
|
107
|
+
mime = nil
|
108
|
+
next unless fname =~ /\.(png|gif|jpg|jpeg|svg)$/i
|
109
|
+
case fname.downcase.match(/\.(png|gif|jpg|jpeg|svg)$/)[1]
|
110
|
+
when "png"
|
111
|
+
mime = "image/png"
|
112
|
+
when "gif"
|
113
|
+
mime = "image/gif"
|
114
|
+
when "jpg", "jpeg"
|
115
|
+
mime = "image/jpeg"
|
116
|
+
when "svg"
|
117
|
+
mime = "image/svg+xml"
|
118
|
+
else
|
119
|
+
raise "unsupported type #{fname}"
|
120
|
+
end
|
121
|
+
@manifeststr << %Q(<item id="#{figid}" href="#{image_file}" media-type="#{mime}" />\n)
|
122
|
+
end
|
99
123
|
end
|
100
|
-
|
124
|
+
|
101
125
|
# container
|
102
126
|
Dir.mkdir("#{@bookdir}/META-INF")
|
103
127
|
File.open("#{@bookdir}/META-INF/container.xml", "w") {|f|
|
@@ -111,102 +135,21 @@ def main
|
|
111
135
|
EOT
|
112
136
|
}
|
113
137
|
|
114
|
-
# opf (meta info)
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
<dc:title>#{values["booktitle"]}</dc:title>
|
121
|
-
EOT
|
122
|
-
|
123
|
-
f.puts %Q(<dc:creator opf:role="aut">#{values["aut"]}</dc:creator>) unless values["aut"].nil? # FIXME: support multiple members
|
124
|
-
|
125
|
-
f.puts %Q(<dc:publisher>#{values["prt"]}</dc:publisher>) unless values["prt"].nil?
|
126
|
-
|
127
|
-
f.puts %Q(<dc:date>#{values["date"]}</dc:date>) unless values["date"].nil?
|
128
|
-
f.puts %Q(<dc:rights>#{values["rights"]}</dc:rights>) unless values["rights"].nil?
|
129
|
-
|
130
|
-
f.puts %Q(<dc:contributor opf:role="asn">#{values["asn"]}</dc:contributor>) unless values["asn"].nil?
|
131
|
-
f.puts %Q(<dc:contributor opf:role="ant">#{values["ant"]}</dc:contributor>) unless values["ant"].nil?
|
132
|
-
f.puts %Q(<dc:contributor opf:role="clb">#{values["clb"]}</dc:contributor>) unless values["clb"].nil?
|
133
|
-
f.puts %Q(<dc:contributor opf:role="edt">#{values["edt"]}</dc:contributor>) unless values["edt"].nil?
|
134
|
-
f.puts %Q(<dc:contributor opf:role="dsr">#{values["dsr"]}</dc:contributor>) unless values["dsr"].nil?
|
135
|
-
f.puts %Q(<dc:contributor opf:role="ill">#{values["ill"]}</dc:contributor>) unless values["ill"].nil?
|
136
|
-
f.puts %Q(<dc:contributor opf:role="pht">#{values["pht"]}</dc:contributor>) unless values["pht"].nil?
|
137
|
-
f.puts %Q(<dc:contributor opf:role="trl">#{values["trl"]}</dc:contributor>) unless values["trl"].nil?
|
138
|
-
|
139
|
-
f.puts %Q(<dc:description>#{values["description"]}</dc:description>) unless values["description"].nil?
|
140
|
-
|
141
|
-
if values["coverimage"]
|
142
|
-
f.puts %Q(<meta name="cover" content="#{getFigId(values["coverimage"])}"/>)
|
143
|
-
end
|
144
|
-
f.puts <<EOT
|
145
|
-
<dc:language>ja</dc:language>
|
146
|
-
<dc:identifier id="BookId">#{identifier}</dc:identifier>
|
147
|
-
</metadata>
|
148
|
-
<manifest>
|
149
|
-
<item id="ncx" href="#{bookname}.ncx" media-type="application/x-dtbncx+xml" />
|
150
|
-
<item id="style" href="#{values["stylesheet"]}" media-type="text/css" />
|
151
|
-
<item id="#{bookname}" href="#{bookname}.html" media-type="application/xhtml+xml" />
|
152
|
-
<item id="top" href="top.html" media-type="application/xhtml+xml" />
|
153
|
-
EOT
|
154
|
-
|
155
|
-
unless values["mytoc"].nil?
|
156
|
-
f.puts <<EOT
|
157
|
-
<item id="toc" href="toc.html" media-type="application/xhtml+xml" />
|
158
|
-
EOT
|
159
|
-
end
|
160
|
-
|
161
|
-
f.puts @manifeststr
|
162
|
-
unless values["colophon"].nil?
|
163
|
-
f.puts <<EOT
|
164
|
-
<item id="colophon" href="colophon.html" media-type="application/xhtml+xml" />
|
165
|
-
EOT
|
166
|
-
end
|
167
|
-
cover_linear = values["cover_linear"] || "no"
|
168
|
-
f.puts <<EOT
|
169
|
-
</manifest>
|
170
|
-
<spine toc="ncx">
|
171
|
-
<itemref idref="#{bookname}" linear="#{cover_linear}" />
|
172
|
-
<itemref idref="top" />
|
173
|
-
EOT
|
174
|
-
unless values["mytoc"].nil?
|
175
|
-
f.puts <<EOT
|
176
|
-
<itemref idref="toc" />
|
177
|
-
EOT
|
178
|
-
end
|
179
|
-
|
180
|
-
f.puts @ncxstr
|
181
|
-
unless values["colophon"].nil?
|
182
|
-
f.puts <<EOT
|
183
|
-
<itemref idref="colophon" />
|
184
|
-
EOT
|
185
|
-
end
|
186
|
-
f.puts <<EOT
|
187
|
-
</spine>
|
188
|
-
<guide>
|
189
|
-
<reference type="cover" title="表紙" href="#{bookname}.html"/>
|
190
|
-
<reference type="title-page" title="Title Page" href="top.html"/>
|
191
|
-
EOT
|
192
|
-
unless values["mytoc"].nil?
|
193
|
-
f.puts <<EOT
|
194
|
-
<reference type="toc" title="目次" href="toc.html"/>
|
195
|
-
EOT
|
196
|
-
end
|
197
|
-
f.puts <<EOT
|
198
|
-
</guide>
|
199
|
-
</package>
|
200
|
-
EOT
|
201
|
-
}
|
138
|
+
# opf (meta info)
|
139
|
+
if @epubversion == 3
|
140
|
+
make_opf_filev3(values, bookname)
|
141
|
+
else
|
142
|
+
make_opf_file(values, bookname)
|
143
|
+
end
|
202
144
|
|
203
145
|
# ncx (toc)
|
204
|
-
|
205
|
-
|
146
|
+
if values["toc"]
|
147
|
+
File.open("#{@bookdir}/OEBPS/#{bookname}.ncx", "w") {|f|
|
148
|
+
f.puts <<EOT
|
206
149
|
<?xml version="1.0" encoding="UTF-8"?>
|
207
150
|
<ncx xmlns="http://www.daisy.org/z3986/2005/ncx/" version="2005-1">
|
208
151
|
<head>
|
209
|
-
<meta name="dtb:uid" content="#{identifier}"/>
|
152
|
+
<meta name="dtb:uid" content="#{@identifier}"/>
|
210
153
|
<meta name="dtb:depth" content="1"/>
|
211
154
|
<meta name="dtb:totalPageCount" content="0"/>
|
212
155
|
<meta name="dtb:maxPageNumber" content="0"/>
|
@@ -226,10 +169,10 @@ EOT
|
|
226
169
|
</navPoint>
|
227
170
|
EOT
|
228
171
|
|
229
|
-
|
172
|
+
nav_count = 2
|
230
173
|
|
231
|
-
|
232
|
-
|
174
|
+
if values["mytoc"]
|
175
|
+
f.puts <<EOT
|
233
176
|
<navPoint id="toc" playOrder="2">
|
234
177
|
<navLabel>
|
235
178
|
<text>目次</text>
|
@@ -237,44 +180,61 @@ EOT
|
|
237
180
|
<content src="toc.html"/>
|
238
181
|
</navPoint>
|
239
182
|
EOT
|
240
|
-
|
241
|
-
end
|
242
|
-
|
243
|
-
@tocdesc.each {|item|
|
244
|
-
level, file, id, content = item
|
245
|
-
# values["level"]
|
246
|
-
next if level > values["toclevel"].to_i
|
247
|
-
indent = ""
|
248
|
-
if level > values["secnolevel"].to_i
|
249
|
-
indent = "- "
|
183
|
+
nav_count = 3
|
250
184
|
end
|
251
|
-
|
185
|
+
|
186
|
+
@tocdesc.each {|item|
|
187
|
+
level, file, id, content = item
|
188
|
+
# values["level"]
|
189
|
+
next if level > values["toclevel"].to_i
|
190
|
+
indent = ""
|
191
|
+
if level > values["secnolevel"].to_i
|
192
|
+
indent = "- "
|
193
|
+
end
|
194
|
+
fragment_id = (id ? '#'+id : '')
|
195
|
+
f.puts <<EOT
|
252
196
|
<navPoint id="navPoint-#{nav_count}" playOrder="#{nav_count}">
|
253
197
|
<navLabel>
|
254
|
-
<text>#{indent}#{content}</text>
|
198
|
+
<text>#{indent}#{strip_html(content)}</text>
|
255
199
|
</navLabel>
|
256
|
-
<content src="#{file}
|
200
|
+
<content src="#{file}#{fragment_id}"/>
|
257
201
|
</navPoint>
|
258
202
|
EOT
|
259
|
-
|
260
|
-
|
261
|
-
|
203
|
+
nav_count += 1
|
204
|
+
}
|
205
|
+
f.puts <<EOT
|
262
206
|
</navMap>
|
263
207
|
</ncx>
|
264
208
|
EOT
|
265
|
-
|
266
|
-
|
209
|
+
}
|
210
|
+
end
|
211
|
+
|
267
212
|
# Cover page
|
268
213
|
File.open("#{@bookdir}/OEBPS/#{bookname}.html", "w") {|f|
|
269
214
|
f.puts <<EOT
|
270
215
|
<?xml version="1.0" encoding="UTF-8"?>
|
271
|
-
|
272
|
-
|
216
|
+
EOT
|
217
|
+
doctype = make_doctype()
|
218
|
+
f.puts doctype
|
219
|
+
f.puts <<EOT
|
220
|
+
<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">
|
273
221
|
<head>
|
222
|
+
EOT
|
223
|
+
if @htmlversion == 4
|
224
|
+
f.puts <<EOT
|
274
225
|
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/>
|
275
226
|
<meta http-equiv="Content-Style-Type" content="text/css"/>
|
276
227
|
<link rel="stylesheet" type="text/css" href="#{values["stylesheet"]}"/>
|
277
|
-
<meta name="generator" content="ReVIEW"/>
|
228
|
+
<meta name="generator" content="ReVIEW EPUB Maker"/>
|
229
|
+
EOT
|
230
|
+
else
|
231
|
+
f.puts <<EOT
|
232
|
+
<meta charset="UTF-8" />
|
233
|
+
<link rel="stylesheet" type="text/css" href="#{values["stylesheet"]}"/>
|
234
|
+
<meta name="generator" content="ReVIEW EPUB Maker"/>
|
235
|
+
EOT
|
236
|
+
end
|
237
|
+
f.puts <<EOT
|
278
238
|
<title>#{values["booktitle"]}</title>
|
279
239
|
</head>
|
280
240
|
<body>
|
@@ -302,13 +262,28 @@ EOT
|
|
302
262
|
File.open("#{@bookdir}/OEBPS/top.html", "w") {|f|
|
303
263
|
f.puts <<EOT
|
304
264
|
<?xml version="1.0" encoding="UTF-8"?>
|
305
|
-
|
306
|
-
|
265
|
+
EOT
|
266
|
+
doctype = make_doctype()
|
267
|
+
f.puts doctype
|
268
|
+
f.puts <<EOT
|
269
|
+
<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">
|
307
270
|
<head>
|
271
|
+
EOT
|
272
|
+
if @htmlversion == 4
|
273
|
+
f.puts <<EOT
|
308
274
|
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/>
|
309
275
|
<meta http-equiv="Content-Style-Type" content="text/css"/>
|
310
276
|
<link rel="stylesheet" type="text/css" href="#{values["stylesheet"]}"/>
|
311
277
|
<meta name="generator" content="ReVIEW EPUB Maker"/>
|
278
|
+
EOT
|
279
|
+
else
|
280
|
+
f.puts <<EOT
|
281
|
+
<meta charset="UTF-8" />
|
282
|
+
<link rel="stylesheet" type="text/css" href="#{values["stylesheet"]}"/>
|
283
|
+
<meta name="generator" content="ReVIEW EPUB Maker"/>
|
284
|
+
EOT
|
285
|
+
end
|
286
|
+
f.puts <<EOT
|
312
287
|
<title>#{values["booktitle"]}</title>
|
313
288
|
</head>
|
314
289
|
<body>
|
@@ -352,24 +327,46 @@ EOT
|
|
352
327
|
}
|
353
328
|
|
354
329
|
# Additional toc page
|
355
|
-
|
330
|
+
if values["toc"] && values["mytoc"]
|
356
331
|
File.open("#{@bookdir}/OEBPS/toc.html", "w") {|f|
|
332
|
+
if @epubversion == 3
|
333
|
+
listelm = "ol"
|
334
|
+
else
|
335
|
+
listelm = "ul"
|
336
|
+
end
|
357
337
|
f.puts <<EOT
|
358
338
|
<?xml version="1.0" encoding="UTF-8"?>
|
359
|
-
|
360
|
-
|
339
|
+
EOT
|
340
|
+
doctype = make_doctype()
|
341
|
+
f.puts doctype
|
342
|
+
f.puts <<EOT
|
343
|
+
<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">
|
361
344
|
<head>
|
345
|
+
EOT
|
346
|
+
if @htmlversion == 4
|
347
|
+
f.puts <<EOT
|
362
348
|
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/>
|
363
349
|
<meta http-equiv="Content-Style-Type" content="text/css"/>
|
364
350
|
<link rel="stylesheet" type="text/css" href="#{values["stylesheet"]}"/>
|
365
351
|
<meta name="generator" content="ReVIEW EPUB Maker"/>
|
352
|
+
EOT
|
353
|
+
else
|
354
|
+
f.puts <<EOT
|
355
|
+
<meta charset="UTF-8" />
|
356
|
+
<link rel="stylesheet" type="text/css" href="#{values["stylesheet"]}"/>
|
357
|
+
<meta name="generator" content="ReVIEW EPUB Maker"/>
|
358
|
+
EOT
|
359
|
+
end
|
360
|
+
f.puts <<EOT
|
366
361
|
<title>目次</title>
|
367
362
|
</head>
|
368
363
|
<body>
|
364
|
+
EOT
|
365
|
+
f.puts %q(<nav epub:type="toc" id="toc">) if @epubversion == 3
|
366
|
+
f.puts <<EOT
|
369
367
|
<h1>目次</h1>
|
370
|
-
|
368
|
+
<#{listelm} class=\"toc-h1\">
|
371
369
|
EOT
|
372
|
-
|
373
370
|
current = 1
|
374
371
|
init_item = true
|
375
372
|
@tocdesc.each {|item|
|
@@ -379,20 +376,20 @@ EOT
|
|
379
376
|
if level > current
|
380
377
|
current += 1
|
381
378
|
f.puts ""
|
382
|
-
f.puts "
|
379
|
+
f.puts "<#{listelm} class=\"toc-h#{current}\">"
|
383
380
|
while current < level
|
384
381
|
current += 1
|
385
382
|
f.puts "<li>"
|
386
|
-
f.puts "
|
383
|
+
f.puts "<#{listelm} class=\"toc-h#{current}\">"
|
387
384
|
end
|
388
385
|
elsif level < current
|
389
386
|
current -= 1
|
390
387
|
f.puts "</li>"
|
391
|
-
f.puts "
|
388
|
+
f.puts "</#{listelm}>"
|
392
389
|
f.puts "</li>"
|
393
390
|
while current > level
|
394
391
|
current -= 1
|
395
|
-
f.puts "
|
392
|
+
f.puts "</#{listelm}>"
|
396
393
|
f.puts "</li>"
|
397
394
|
end
|
398
395
|
elsif init_item
|
@@ -400,20 +397,22 @@ EOT
|
|
400
397
|
else
|
401
398
|
f.puts "</li>"
|
402
399
|
end
|
403
|
-
|
400
|
+
fragment_id = (id ? '#'+id : '')
|
401
|
+
f.write "<li><a href=\"#{file}#{fragment_id}\">#{content}</a>"
|
404
402
|
init_item = false
|
405
403
|
}
|
406
404
|
|
407
405
|
(current - 1).downto(1) {|n|
|
408
406
|
f.puts "</li>"
|
409
|
-
f.puts "
|
407
|
+
f.puts "</#{listelm}>"
|
410
408
|
}
|
411
409
|
if !init_item
|
412
410
|
f.puts "</li>"
|
413
411
|
end
|
414
412
|
|
413
|
+
f.puts "</#{listelm}>"
|
414
|
+
f.puts %q(</nav>) if @epubversion == 3
|
415
415
|
f.puts <<EOT
|
416
|
-
</ul>
|
417
416
|
</body>
|
418
417
|
</html>
|
419
418
|
EOT
|
@@ -436,7 +435,7 @@ EOT
|
|
436
435
|
end
|
437
436
|
|
438
437
|
# Colophon page
|
439
|
-
if
|
438
|
+
if values["colophon"]
|
440
439
|
make_colophon_page(tmp, bookname, values)
|
441
440
|
end
|
442
441
|
|
@@ -452,69 +451,279 @@ EOT
|
|
452
451
|
fork {
|
453
452
|
basedir = Dir.pwd
|
454
453
|
Dir.chdir(@bookdir) {|d|
|
455
|
-
exec("zip -0X #{basedir}/#{bookname}.epub mimetype")
|
454
|
+
exec("zip", "-0X", "#{basedir}/#{bookname}.epub", "mimetype")
|
456
455
|
}
|
457
456
|
}
|
458
457
|
Process.waitall
|
459
458
|
fork {
|
460
459
|
basedir = Dir.pwd
|
461
460
|
Dir.chdir(@bookdir) {|d|
|
462
|
-
exec("zip -Xr9D #{basedir}/#{bookname}.epub META-INF OEBPS")
|
461
|
+
exec("zip", "-Xr9D", "#{basedir}/#{bookname}.epub", "META-INF", "OEBPS")
|
463
462
|
}
|
464
463
|
}
|
465
464
|
Process.waitall
|
466
|
-
|
465
|
+
|
467
466
|
FileUtils.rm_r(tmp) if values["debug"].nil?
|
468
467
|
end
|
469
468
|
|
469
|
+
def make_doctype
|
470
|
+
if @htmlversion == 5
|
471
|
+
%q(<!DOCTYPE html>)
|
472
|
+
else
|
473
|
+
%q(<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">)
|
474
|
+
end
|
475
|
+
end
|
476
|
+
|
477
|
+
|
478
|
+
def make_opf_file(values, bookname)
|
479
|
+
File.open("#{@bookdir}/OEBPS/#{bookname}.opf", "w") {|f|
|
480
|
+
f.puts <<EOT
|
481
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
482
|
+
<package version="2.0" xmlns="http://www.idpf.org/2007/opf" unique-identifier="BookId">
|
483
|
+
<metadata xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:opf="http://www.idpf.org/2007/opf">
|
484
|
+
<dc:title>#{values["booktitle"]}</dc:title>
|
485
|
+
EOT
|
486
|
+
|
487
|
+
f.puts %Q(<dc:creator opf:role="aut">#{values["aut"]}</dc:creator>) unless values["aut"].nil? # FIXME: support multiple members
|
488
|
+
|
489
|
+
f.puts %Q(<dc:publisher>#{values["prt"]}</dc:publisher>) unless values["prt"].nil?
|
490
|
+
|
491
|
+
f.puts %Q(<dc:date>#{values["date"]}</dc:date>) unless values["date"].nil?
|
492
|
+
f.puts %Q(<dc:rights>#{values["rights"]}</dc:rights>) unless values["rights"].nil?
|
493
|
+
|
494
|
+
f.puts %Q(<dc:contributor opf:role="asn">#{values["asn"]}</dc:contributor>) unless values["asn"].nil?
|
495
|
+
f.puts %Q(<dc:contributor opf:role="ant">#{values["ant"]}</dc:contributor>) unless values["ant"].nil?
|
496
|
+
f.puts %Q(<dc:contributor opf:role="clb">#{values["clb"]}</dc:contributor>) unless values["clb"].nil?
|
497
|
+
f.puts %Q(<dc:contributor opf:role="edt">#{values["edt"]}</dc:contributor>) unless values["edt"].nil?
|
498
|
+
f.puts %Q(<dc:contributor opf:role="dsr">#{values["dsr"]}</dc:contributor>) unless values["dsr"].nil?
|
499
|
+
f.puts %Q(<dc:contributor opf:role="ill">#{values["ill"]}</dc:contributor>) unless values["ill"].nil?
|
500
|
+
f.puts %Q(<dc:contributor opf:role="pht">#{values["pht"]}</dc:contributor>) unless values["pht"].nil?
|
501
|
+
f.puts %Q(<dc:contributor opf:role="trl">#{values["trl"]}</dc:contributor>) unless values["trl"].nil?
|
502
|
+
|
503
|
+
f.puts %Q(<dc:description>#{values["description"]}</dc:description>) unless values["description"].nil?
|
504
|
+
|
505
|
+
if values["coverimage"]
|
506
|
+
f.puts %Q(<meta name="cover" content="#{getFigId("images-"+values["coverimage"])}"/>)
|
507
|
+
end
|
508
|
+
f.puts <<EOT
|
509
|
+
<dc:language>ja</dc:language>
|
510
|
+
<dc:identifier id="BookId">#{@identifier}</dc:identifier>
|
511
|
+
</metadata>
|
512
|
+
<manifest>
|
513
|
+
EOT
|
514
|
+
|
515
|
+
if values["toc"]
|
516
|
+
f.puts <<EOT
|
517
|
+
<item id="ncx" href="#{bookname}.ncx" media-type="application/x-dtbncx+xml" />
|
518
|
+
EOT
|
519
|
+
end
|
520
|
+
|
521
|
+
f.puts <<EOT
|
522
|
+
<item id="style" href="#{values["stylesheet"]}" media-type="text/css" />
|
523
|
+
<item id="#{bookname}" href="#{bookname}.html" media-type="application/xhtml+xml" />
|
524
|
+
<item id="top" href="top.html" media-type="application/xhtml+xml" />
|
525
|
+
EOT
|
526
|
+
|
527
|
+
if values["toc"] && values["mytoc"]
|
528
|
+
f.puts <<EOT
|
529
|
+
<item id="toc" href="toc.html" media-type="application/xhtml+xml" />
|
530
|
+
EOT
|
531
|
+
end
|
532
|
+
|
533
|
+
f.puts @manifeststr
|
534
|
+
if values["colophon"]
|
535
|
+
f.puts <<EOT
|
536
|
+
<item id="colophon" href="colophon.html" media-type="application/xhtml+xml" />
|
537
|
+
EOT
|
538
|
+
end
|
539
|
+
|
540
|
+
if values["cover_linear"] && values["cover_linear"] != "no"
|
541
|
+
cover_linear = "yes"
|
542
|
+
else
|
543
|
+
cover_linear = "no"
|
544
|
+
end
|
545
|
+
|
546
|
+
f.puts <<EOT
|
547
|
+
</manifest>
|
548
|
+
<spine toc="ncx">
|
549
|
+
<itemref idref="#{bookname}" linear="#{cover_linear}" />
|
550
|
+
<itemref idref="top" />
|
551
|
+
EOT
|
552
|
+
|
553
|
+
if values["toc"] && values["mytoc"]
|
554
|
+
f.puts <<EOT
|
555
|
+
<itemref idref="toc" />
|
556
|
+
EOT
|
557
|
+
end
|
558
|
+
|
559
|
+
f.puts @ncxstr
|
560
|
+
if values["colophon"]
|
561
|
+
f.puts <<EOT
|
562
|
+
<itemref idref="colophon" />
|
563
|
+
EOT
|
564
|
+
end
|
565
|
+
f.puts <<EOT
|
566
|
+
</spine>
|
567
|
+
<guide>
|
568
|
+
EOT
|
569
|
+
|
570
|
+
if values["titlepage"]
|
571
|
+
f.puts <<EOT
|
572
|
+
<reference type="cover" title="表紙" href="#{bookname}.html"/>
|
573
|
+
<reference type="title-page" title="Title Page" href="top.html"/>
|
574
|
+
EOT
|
575
|
+
end
|
576
|
+
|
577
|
+
if values["toc"] && values["mytoc"]
|
578
|
+
f.puts <<EOT
|
579
|
+
<reference type="toc" title="目次" href="toc.html"/>
|
580
|
+
EOT
|
581
|
+
end
|
582
|
+
f.puts <<EOT
|
583
|
+
</guide>
|
584
|
+
</package>
|
585
|
+
EOT
|
586
|
+
}
|
587
|
+
end
|
588
|
+
|
589
|
+
def make_opf_filev3(values, bookname)
|
590
|
+
File.open("#{@bookdir}/OEBPS/#{bookname}.opf", "w") {|f|
|
591
|
+
f.puts <<EOT
|
592
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
593
|
+
<package version="3.0" xmlns="http://www.idpf.org/2007/opf" unique-identifier="BookId">
|
594
|
+
<metadata xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:opf="http://www.idpf.org/2007/opf">
|
595
|
+
<dc:title>#{values["booktitle"]}</dc:title>
|
596
|
+
EOT
|
597
|
+
unless values["aut"].nil? # FIXME: support multiple members
|
598
|
+
f.puts %Q(<dc:creator id="author">#{values["aut"]}</dc:creator>)
|
599
|
+
f.puts %Q(<meta refines="#author" property="role" scheme="marc:relators" id="role">aut</meta>)
|
600
|
+
end
|
601
|
+
f.puts %Q(<dc:publisher id="publisher">#{values["prt"]}</dc:publisher>) unless values["prt"].nil?
|
602
|
+
|
603
|
+
f.puts %Q(<dc:date>#{values["date"]}</dc:date>) unless values["date"].nil?
|
604
|
+
f.puts %Q(<dc:rights>#{values["rights"]}</dc:rights>) unless values["rights"].nil?
|
605
|
+
|
606
|
+
%w(asn ant clb edt dsr ill pht trl).each do |attr|
|
607
|
+
unless values[attr].nil?
|
608
|
+
f.puts %Q(<dc:contributor id="#{attr}">#{values[attr]}</dc:contributor>)
|
609
|
+
f.puts %Q(<meta refines='##{attr}' property='role' scheme='marc:relators'>#{attr}</meta>)
|
610
|
+
end
|
611
|
+
end
|
612
|
+
f.puts %Q(<dc:description>#{values["description"]}</dc:description>) unless values["description"].nil?
|
613
|
+
f.puts %Q(<meta property="dcterms:modified">#{Time.now.utc.iso8601(0)}</meta>)
|
614
|
+
if values["coverimage"]
|
615
|
+
f.puts %Q(<meta name="cover" content="#{getFigId("images-"+values["coverimage"])}"/>)
|
616
|
+
end
|
617
|
+
f.puts <<EOT
|
618
|
+
<dc:language>ja</dc:language>
|
619
|
+
<dc:identifier id="BookId">#{@identifier}</dc:identifier>
|
620
|
+
</metadata>
|
621
|
+
<manifest>
|
622
|
+
EOT
|
623
|
+
|
624
|
+
if values["toc"]
|
625
|
+
f.puts <<EOT
|
626
|
+
<item id="ncx" href="#{bookname}.ncx" media-type="application/x-dtbncx+xml" />
|
627
|
+
EOT
|
628
|
+
end
|
629
|
+
|
630
|
+
f.puts <<EOT
|
631
|
+
<item id="style" href="#{values["stylesheet"]}" media-type="text/css" />
|
632
|
+
<item id="#{bookname}" href="#{bookname}.html" media-type="application/xhtml+xml" />
|
633
|
+
<item id="top" href="top.html" media-type="application/xhtml+xml" />
|
634
|
+
EOT
|
635
|
+
|
636
|
+
if values["toc"] && values["mytoc"]
|
637
|
+
f.puts <<EOT
|
638
|
+
<item id="toc" href="toc.html" properties="nav" media-type="application/xhtml+xml" />
|
639
|
+
EOT
|
640
|
+
end
|
641
|
+
|
642
|
+
f.puts @manifeststr
|
643
|
+
if values["colophon"]
|
644
|
+
f.puts <<EOT
|
645
|
+
<item id="colophon" href="colophon.html" media-type="application/xhtml+xml" />
|
646
|
+
EOT
|
647
|
+
end
|
648
|
+
|
649
|
+
if values["cover_linear"] && values["cover_linear"] != "no"
|
650
|
+
cover_linear = "yes"
|
651
|
+
else
|
652
|
+
cover_linear = "no"
|
653
|
+
end
|
654
|
+
|
655
|
+
f.puts <<EOT
|
656
|
+
</manifest>
|
657
|
+
<spine toc="ncx">
|
658
|
+
<itemref idref="#{bookname}" linear="#{cover_linear}" />
|
659
|
+
<itemref idref="top" />
|
660
|
+
EOT
|
661
|
+
|
662
|
+
if values["toc"] && values["mytoc"]
|
663
|
+
f.puts <<EOT
|
664
|
+
<itemref idref="toc" />
|
665
|
+
EOT
|
666
|
+
end
|
667
|
+
|
668
|
+
f.puts @ncxstr
|
669
|
+
if values["colophon"]
|
670
|
+
f.puts <<EOT
|
671
|
+
<itemref idref="colophon" />
|
672
|
+
EOT
|
673
|
+
end
|
674
|
+
f.puts <<EOT
|
675
|
+
</spine>
|
676
|
+
<guide>
|
677
|
+
EOT
|
678
|
+
|
679
|
+
if values["titlepage"]
|
680
|
+
f.puts <<EOT
|
681
|
+
<reference type="cover" title="表紙" href="#{bookname}.html"/>
|
682
|
+
<reference type="title-page" title="Title Page" href="top.html"/>
|
683
|
+
EOT
|
684
|
+
end
|
685
|
+
|
686
|
+
if values["toc"] && values["mytoc"]
|
687
|
+
f.puts <<EOT
|
688
|
+
<reference type="toc" title="目次" href="toc.html"/>
|
689
|
+
EOT
|
690
|
+
end
|
691
|
+
f.puts <<EOT
|
692
|
+
</guide>
|
693
|
+
</package>
|
694
|
+
EOT
|
695
|
+
}
|
696
|
+
end
|
697
|
+
|
698
|
+
|
470
699
|
def output_chaps(chapsfile, values)
|
471
700
|
File.open(chapsfile) {|chaps|
|
472
701
|
chaps.each_line {|l|
|
473
702
|
next if l =~ /^#/
|
474
|
-
|
475
|
-
filename = "#{file_id}.html"
|
476
|
-
fork {
|
477
|
-
STDOUT.reopen("#{@bookdir}/OEBPS/#{filename}")
|
478
|
-
exec("review-compile --target=html --level=#{values["secnolevel"]} #{values["params"]} #{l}")
|
479
|
-
}
|
480
|
-
Process.waitall
|
481
|
-
getanchors("#{@bookdir}/OEBPS/#{filename}")
|
482
|
-
@manifeststr << %Q(<item id="#{file_id}" href="#{filename}" media-type="application/xhtml+xml" />\n)
|
483
|
-
@ncxstr << %Q(<itemref idref="#{file_id}" />\n)
|
703
|
+
output_chaps_by_file(l, values)
|
484
704
|
}
|
485
705
|
}
|
486
706
|
end
|
487
707
|
|
488
|
-
|
489
|
-
|
490
|
-
|
491
|
-
|
492
|
-
|
493
|
-
|
494
|
-
|
495
|
-
|
496
|
-
|
497
|
-
|
498
|
-
|
499
|
-
|
500
|
-
|
501
|
-
|
502
|
-
when "png"
|
503
|
-
mime = "image/png"
|
504
|
-
when "gif"
|
505
|
-
mime = "image/gif"
|
506
|
-
when "jpg", "jpeg"
|
507
|
-
mime = "image/jpeg"
|
508
|
-
when "svg"
|
509
|
-
mime = "image/svg+xml"
|
510
|
-
else
|
511
|
-
raise "unsupported type #{fname}"
|
512
|
-
end
|
513
|
-
@manifeststr << %Q(<item id="#{figid}" href="#{dirname}/#{fname}" media-type="#{mime}" />\n)
|
514
|
-
end
|
515
|
-
end
|
516
|
-
}
|
708
|
+
def output_chaps_by_file(l, values)
|
709
|
+
file_id = File.basename(l.chomp.strip,".*")
|
710
|
+
if (idx = $essential_files.index(file_id))
|
711
|
+
if idx == $essential_files.size - 1
|
712
|
+
STDERR.puts "#{file_id} is book name. Please rename #{l.chomp.strip}."
|
713
|
+
else
|
714
|
+
STDERR.puts "#{file_id} is special name. Please rename #{l.chomp.strip}."
|
715
|
+
end
|
716
|
+
exit 1
|
717
|
+
end
|
718
|
+
filename = "#{file_id}.html"
|
719
|
+
fork {
|
720
|
+
STDOUT.reopen("#{@bookdir}/OEBPS/#{filename}")
|
721
|
+
exec("review-compile --target=html --level=#{values["secnolevel"]} --htmlversion=#{values["htmlversion"]} #{values["params"]} #{l}")
|
517
722
|
}
|
723
|
+
Process.waitall
|
724
|
+
getanchors("#{@bookdir}/OEBPS/#{filename}")
|
725
|
+
@manifeststr << %Q(<item id="#{file_id}" href="#{filename}" media-type="application/xhtml+xml" />\n)
|
726
|
+
@ncxstr << %Q(<itemref idref="#{file_id}" />\n)
|
518
727
|
end
|
519
728
|
|
520
729
|
def getFigId(filename)
|
@@ -532,7 +741,7 @@ def getanchors(filename)
|
|
532
741
|
File.open(filename) {|f|
|
533
742
|
file = filename.sub(/.+\//, '')
|
534
743
|
f.each_line {|l|
|
535
|
-
if l =~ /\A<h(\d)
|
744
|
+
if l =~ /\A<h(\d)[^>]*><a id=\"(.+?)\"><\/a>(.+?)<\/h/
|
536
745
|
# level, ID, content
|
537
746
|
@tocdesc << [$1.to_i, file, $2, $3]
|
538
747
|
end
|
@@ -544,13 +753,27 @@ def make_colophon_page(tmp,bookname,values)
|
|
544
753
|
|
545
754
|
header = <<EOT
|
546
755
|
<?xml version="1.0" encoding="UTF-8"?>
|
547
|
-
|
548
|
-
|
756
|
+
EOT
|
757
|
+
header += make_doctype()
|
758
|
+
header += <<EOT
|
759
|
+
<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">
|
549
760
|
<head>
|
761
|
+
EOT
|
762
|
+
if @htmlversion == 4
|
763
|
+
header += <<EOT
|
550
764
|
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/>
|
551
765
|
<meta http-equiv="Content-Style-Type" content="text/css"/>
|
552
766
|
<link rel="stylesheet" type="text/css" href="#{values["stylesheet"]}"/>
|
553
767
|
<meta name="generator" content="ReVIEW EPUB Maker"/>
|
768
|
+
EOT
|
769
|
+
else
|
770
|
+
header += <<EOT
|
771
|
+
<meta charset="UTF-8" />
|
772
|
+
<link rel="stylesheet" type="text/css" href="#{values["stylesheet"]}"/>
|
773
|
+
<meta name="generator" content="ReVIEW EPUB Maker"/>
|
774
|
+
EOT
|
775
|
+
end
|
776
|
+
header += <<EOT
|
554
777
|
<title>#{values["booktitle"]}</title>
|
555
778
|
</head>
|
556
779
|
<body>
|
@@ -606,4 +829,38 @@ EOT
|
|
606
829
|
end
|
607
830
|
end
|
608
831
|
|
832
|
+
def make_part_page(part, filename, values)
|
833
|
+
File.open("#{@bookdir}/OEBPS/#{filename}", "w") {|f|
|
834
|
+
f.puts <<-EOT
|
835
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
836
|
+
EOT
|
837
|
+
doctype = make_doctype()
|
838
|
+
f.puts doctype
|
839
|
+
f.puts <<-EOT
|
840
|
+
<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">
|
841
|
+
<head>
|
842
|
+
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/>
|
843
|
+
<meta http-equiv="Content-Style-Type" content="text/css"/>
|
844
|
+
<link rel="stylesheet" type="text/css" href="#{values["stylesheet"]}"/>
|
845
|
+
<meta name="generator" content="ReVIEW EPUB Maker"/>
|
846
|
+
<title>#{values["booktitle"]}</title>
|
847
|
+
</head>
|
848
|
+
<body>
|
849
|
+
<h1 class="part-number">#{ReVIEW::I18n.t("part", part.number)}</h1>
|
850
|
+
EOT
|
851
|
+
|
852
|
+
if part.name.strip.present?
|
853
|
+
f.puts <<-EOT
|
854
|
+
<h2 class="part-title">#{part.name.strip}</h2>
|
855
|
+
EOT
|
856
|
+
end
|
857
|
+
|
858
|
+
f.puts <<-EOT
|
859
|
+
</body>
|
860
|
+
</html>
|
861
|
+
EOT
|
862
|
+
}
|
863
|
+
end
|
864
|
+
|
865
|
+
|
609
866
|
main
|