review 4.1.0 → 5.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/ruby-tex.yml +35 -0
- data/.github/workflows/ruby-win.yml +19 -9
- data/.github/workflows/ruby.yml +7 -3
- data/.rubocop.yml +138 -34
- data/NEWS.ja.md +285 -0
- data/NEWS.md +285 -1
- data/README.md +7 -6
- data/Rakefile +7 -2
- data/bin/review +2 -4
- data/bin/review-catalog-converter +4 -4
- data/bin/review-check +8 -12
- data/bin/review-checkdep +2 -5
- data/bin/review-compile +18 -34
- data/bin/review-epub2html +1 -4
- data/bin/review-epubmaker +3 -4
- data/bin/review-idgxmlmaker +1 -3
- data/bin/review-index +5 -86
- data/bin/review-init +1 -4
- data/bin/review-pdfmaker +1 -3
- data/bin/review-preproc +30 -38
- data/bin/review-textmaker +1 -3
- data/bin/review-update +1 -4
- data/bin/review-validate +4 -4
- data/bin/review-vol +5 -82
- data/bin/review-webmaker +1 -3
- data/doc/config.yml.sample +45 -11
- data/doc/config.yml.sample-simple +3 -3
- data/doc/format.ja.md +103 -13
- data/doc/format.md +104 -16
- data/doc/makeindex.ja.md +2 -2
- data/doc/pdfmaker.ja.md +42 -0
- data/doc/pdfmaker.md +41 -0
- data/doc/quickstart.ja.md +19 -6
- data/doc/quickstart.md +18 -6
- data/doc/writing_vertical.ja.md +6 -0
- data/lib/review.rb +1 -1
- data/lib/review/book.rb +2 -2
- data/lib/review/book/base.rb +67 -29
- data/lib/review/book/bib.rb +21 -0
- data/lib/review/book/book_unit.rb +158 -0
- data/lib/review/book/chapter.rb +33 -26
- data/lib/review/book/index.rb +24 -185
- data/lib/review/book/index/item.rb +7 -1
- data/lib/review/book/page_metric.rb +7 -7
- data/lib/review/book/part.rb +26 -11
- data/lib/review/book/volume.rb +5 -5
- data/lib/review/builder.rb +121 -52
- data/lib/review/call_hook.rb +20 -0
- data/lib/review/catalog.rb +3 -2
- data/lib/review/compiler.rb +230 -111
- data/lib/review/configure.rb +91 -7
- data/lib/review/converter.rb +1 -1
- data/lib/review/epub2html.rb +6 -1
- data/lib/review/epubmaker.rb +124 -152
- data/lib/review/epubmaker/content.rb +113 -0
- data/lib/review/epubmaker/epubcommon.rb +372 -0
- data/lib/review/epubmaker/epubv2.rb +178 -0
- data/lib/review/epubmaker/epubv3.rb +231 -0
- data/lib/review/epubmaker/producer.rb +167 -0
- data/lib/review/epubmaker/reviewheaderlistener.rb +12 -2
- data/lib/review/epubmaker/zip_exporter.rb +84 -0
- data/lib/review/exception.rb +13 -0
- data/lib/review/htmlbuilder.rb +176 -89
- data/lib/review/htmlutils.rb +8 -11
- data/lib/review/i18n.rb +2 -1
- data/lib/review/idgxmlbuilder.rb +165 -75
- data/lib/review/idgxmlmaker.rb +24 -28
- data/lib/review/img_math.rb +238 -0
- data/lib/review/index_builder.rb +645 -0
- data/lib/review/init.rb +9 -17
- data/lib/review/latexbox.rb +58 -0
- data/lib/review/latexbuilder.rb +193 -75
- data/lib/review/latexutils.rb +9 -1
- data/lib/review/lineinput.rb +112 -2
- data/lib/review/loggable.rb +27 -0
- data/lib/review/logger.rb +90 -3
- data/lib/review/makerhelper.rb +17 -188
- data/lib/review/markdownbuilder.rb +54 -4
- data/lib/review/pdfmaker.rb +76 -84
- data/lib/review/plaintextbuilder.rb +106 -22
- data/lib/review/preprocessor.rb +107 -303
- data/lib/review/preprocessor/directive.rb +35 -0
- data/lib/review/preprocessor/line.rb +34 -0
- data/lib/review/preprocessor/repository.rb +177 -0
- data/lib/review/rstbuilder.rb +27 -8
- data/lib/review/sec_counter.rb +14 -0
- data/lib/review/template.rb +11 -1
- data/lib/review/textmaker.rb +27 -32
- data/lib/review/textutils.rb +3 -12
- data/lib/review/tocprinter.rb +242 -97
- data/lib/review/topbuilder.rb +98 -31
- data/lib/review/update.rb +12 -13
- data/lib/review/version.rb +1 -1
- data/lib/review/volumeprinter.rb +97 -0
- data/lib/review/webmaker.rb +40 -47
- data/lib/review/webtocprinter.rb +39 -35
- data/lib/review/yamlloader.rb +2 -1
- data/review.gemspec +5 -3
- data/samples/sample-book/src/config-epub2.yml +1 -1
- data/samples/sample-book/src/config.yml +3 -3
- data/samples/sample-book/src/lib/tasks/review.rake +19 -1
- data/samples/sample-book/src/lib/tasks/z01_copy_sty.rake +2 -1
- data/samples/syntax-book/Gemfile +1 -1
- data/samples/syntax-book/ch01.re +1 -1
- data/samples/syntax-book/ch02.re +21 -6
- data/samples/syntax-book/ch03.re +1 -1
- data/samples/syntax-book/config.yml +1 -1
- data/samples/syntax-book/images/img3-2.png +0 -0
- data/samples/syntax-book/lib/tasks/z01_copy_sty.rake +2 -1
- data/templates/html/_colophon.html.erb +23 -0
- data/templates/html/_colophon_history.html.erb +9 -0
- data/templates/html/_cover.html.erb +10 -0
- data/templates/html/_part_body.html.erb +6 -0
- data/templates/html/_titlepage.html.erb +20 -0
- data/templates/html/layout-html5.html.erb +6 -0
- data/templates/html/layout-xhtml1.html.erb +6 -0
- data/templates/latex/config.erb +35 -23
- data/templates/latex/review-jlreq/README.md +3 -1
- data/templates/latex/review-jlreq/review-base.sty +36 -23
- data/templates/latex/review-jlreq/review-jlreq.cls +18 -25
- data/templates/latex/review-jlreq/review-style.sty +6 -1
- data/templates/latex/review-jlreq/review-tcbox.sty +348 -0
- data/templates/latex/review-jlreq/reviewmacro.sty +5 -0
- data/templates/latex/review-jsbook/README.md +7 -5
- data/templates/latex/review-jsbook/review-base.sty +40 -24
- data/templates/latex/review-jsbook/review-jsbook.cls +13 -3
- data/templates/latex/review-jsbook/review-style.sty +6 -1
- data/templates/latex/review-jsbook/review-tcbox.sty +348 -0
- data/templates/latex/review-jsbook/reviewmacro.sty +5 -0
- data/templates/opf/epubv2.opf.erb +7 -7
- data/templates/opf/epubv3.opf.erb +7 -7
- data/templates/opf/opf_manifest_epubv2.opf.erb +10 -0
- data/templates/opf/opf_manifest_epubv3.opf.erb +10 -0
- data/templates/opf/opf_metainfo_epubv2.opf.erb +17 -0
- data/templates/opf/opf_metainfo_epubv3.opf.erb +49 -0
- data/templates/opf/opf_tocx_epubv2.opf.erb +9 -0
- data/templates/opf/opf_tocx_epubv3.opf.erb +17 -0
- data/templates/web/html/layout-html5.html.erb +9 -8
- data/templates/web/html/layout-xhtml1.html.erb +6 -0
- data/test/assets/header_listener.html +35 -0
- data/test/assets/img_math/img1.png +0 -0
- data/test/assets/img_math/img2.png +0 -0
- data/test/assets/img_math/img3.png +0 -0
- data/test/assets/syntax_book_index_detail.txt +58 -0
- data/test/assets/test_template.tex +6 -3
- data/test/assets/test_template_backmatter.tex +6 -3
- data/test/book_test_helper.rb +11 -5
- data/test/run_test.rb +1 -1
- data/test/test_book.rb +54 -63
- data/test/test_book_chapter.rb +95 -54
- data/test/test_book_part.rb +3 -3
- data/test/test_builder.rb +29 -20
- data/test/test_catalog_converter_cmd.rb +1 -1
- data/test/test_converter.rb +1 -0
- data/test/test_epub3maker.rb +170 -126
- data/test/test_epubmaker.rb +254 -129
- data/test/test_epubmaker_cmd.rb +15 -4
- data/test/test_helper.rb +12 -5
- data/test/test_htmlbuilder.rb +926 -76
- data/test/test_htmlutils.rb +0 -12
- data/test/test_i18n.rb +33 -33
- data/test/test_idgxmlbuilder.rb +531 -20
- data/test/test_idgxmlmaker_cmd.rb +7 -3
- data/test/test_img_math.rb +111 -0
- data/test/test_index.rb +62 -52
- data/test/test_indexbuilder.rb +52 -0
- data/test/test_latexbuilder.rb +891 -20
- data/test/test_latexbuilder_v2.rb +56 -10
- data/test/test_lineinput.rb +20 -93
- data/test/test_logger.rb +7 -7
- data/test/test_makerhelper.rb +0 -12
- data/test/test_markdownbuilder.rb +32 -0
- data/test/test_pdfmaker.rb +100 -11
- data/test/test_pdfmaker_cmd.rb +3 -3
- data/test/test_plaintextbuilder.rb +546 -32
- data/test/test_preprocessor.rb +188 -1
- data/test/test_review_ext.rb +2 -1
- data/test/test_reviewheaderlistener.rb +49 -0
- data/test/test_rstbuilder.rb +25 -1
- data/test/test_sec_counter.rb +156 -0
- data/test/test_template.rb +12 -2
- data/test/test_textmaker_cmd.rb +5 -1
- data/test/test_tocprinter.rb +46 -0
- data/test/test_topbuilder.rb +324 -20
- data/test/test_update.rb +44 -44
- data/test/test_webtocprinter.rb +75 -43
- data/test/test_zip_exporter.rb +5 -6
- data/vendor/gentombow/LICENSE +1 -1
- data/vendor/gentombow/Makefile +0 -1
- data/vendor/gentombow/bounddvi-en.pdf +0 -0
- data/vendor/gentombow/bounddvi-en.tex +1 -0
- data/vendor/gentombow/bounddvi.pdf +0 -0
- data/vendor/gentombow/bounddvi.sty +30 -7
- data/vendor/gentombow/bounddvi.tex +1 -0
- data/vendor/gentombow/create_archive.sh +1 -0
- data/vendor/gentombow/gentombow-ja.pdf +0 -0
- data/vendor/gentombow/gentombow-ja.tex +9 -0
- data/vendor/gentombow/gentombow.pdf +0 -0
- data/vendor/gentombow/gentombow.sty +32 -10
- data/vendor/gentombow/gentombow.tex +8 -0
- data/vendor/gentombow/tests/gentombow-01-pdfx.tex +8 -0
- data/vendor/gentombow/tests/gentombow-02-pdfx.tex +8 -0
- data/vendor/jsclasses/Makefile +3 -2
- data/vendor/jsclasses/create_archive.sh +5 -5
- data/vendor/jsclasses/jis/Makefile +3 -2
- data/vendor/jsclasses/jis/jsarticle.cls +22 -18
- data/vendor/jsclasses/jis/jsbook.cls +22 -18
- data/vendor/jsclasses/jis/jsclasses.dtx +94 -13
- data/vendor/jsclasses/jis/jsclasses.ins +15 -5
- data/vendor/jsclasses/jis/jslogo.ins +9 -0
- data/vendor/jsclasses/jis/jslogo.sty +1 -13
- data/vendor/jsclasses/jis/jspf.cls +22 -18
- data/vendor/jsclasses/jis/jsreport.cls +22 -18
- data/vendor/jsclasses/jis/jsverb.ins +9 -0
- data/vendor/jsclasses/jis/jsverb.sty +1 -13
- data/vendor/jsclasses/jis/kiyou.cls +22 -18
- data/vendor/jsclasses/jis/minijs.sty +65 -22
- data/vendor/jsclasses/jis/okumacro.ins +9 -0
- data/vendor/jsclasses/jis/okumacro.sty +1 -13
- data/vendor/jsclasses/jis/okuverb.ins +9 -0
- data/vendor/jsclasses/jis/okuverb.sty +1 -13
- data/vendor/jsclasses/jis/winjis.sty +23 -19
- data/vendor/jsclasses/jsarticle.cls +22 -18
- data/vendor/jsclasses/jsbook.cls +22 -18
- data/vendor/jsclasses/jsclasses.dtx +94 -13
- data/vendor/jsclasses/jsclasses.ins +15 -5
- data/vendor/jsclasses/jsclasses.pdf +0 -0
- data/vendor/jsclasses/jslogo.ins +9 -0
- data/vendor/jsclasses/jslogo.pdf +0 -0
- data/vendor/jsclasses/jslogo.sty +1 -13
- data/vendor/jsclasses/jspf.cls +22 -18
- data/vendor/jsclasses/jsreport.cls +22 -18
- data/vendor/jsclasses/jsverb.ins +9 -0
- data/vendor/jsclasses/jsverb.pdf +0 -0
- data/vendor/jsclasses/jsverb.sty +1 -13
- data/vendor/jsclasses/kiyou.cls +22 -18
- data/vendor/jsclasses/minijs.sty +68 -22
- data/vendor/jsclasses/okumacro.ins +9 -0
- data/vendor/jsclasses/okumacro.pdf +0 -0
- data/vendor/jsclasses/okumacro.sty +1 -13
- data/vendor/jsclasses/okuverb.ins +9 -0
- data/vendor/jsclasses/okuverb.pdf +0 -0
- data/vendor/jsclasses/okuverb.sty +1 -13
- data/vendor/jsclasses/tests/relfont.tex +10 -0
- data/vendor/jsclasses/winjis.sty +23 -19
- metadata +106 -22
- data/.rubocop_todo.yml +0 -7
- data/lib/epubmaker.rb +0 -23
- data/lib/epubmaker/content.rb +0 -110
- data/lib/epubmaker/epubcommon.rb +0 -441
- data/lib/epubmaker/epubv2.rb +0 -143
- data/lib/epubmaker/epubv3.rb +0 -233
- data/lib/epubmaker/producer.rb +0 -375
- data/lib/epubmaker/zip_exporter.rb +0 -81
- data/lib/lineinput.rb +0 -155
- data/lib/review/book/compilable.rb +0 -178
- data/lib/review/tocparser.rb +0 -275
- data/test/test_tocparser.rb +0 -25
data/.rubocop_todo.yml
DELETED
@@ -1,7 +0,0 @@
|
|
1
|
-
# This configuration was generated by
|
2
|
-
# `rubocop --auto-gen-config`
|
3
|
-
# on 2017-02-18 14:39:22 +0900 using RuboCop version 0.47.1.
|
4
|
-
# The point is for the user to remove these configuration records
|
5
|
-
# one by one as the offenses are removed from the code base.
|
6
|
-
# Note that changes in the inspected code, or installation of new
|
7
|
-
# versions of RuboCop, may require this file to be generated again.
|
data/lib/epubmaker.rb
DELETED
@@ -1,23 +0,0 @@
|
|
1
|
-
# = epubmaker.rb -- EPUB production set.
|
2
|
-
#
|
3
|
-
# Copyright (c) 2010-2017 Kenshi Muto
|
4
|
-
#
|
5
|
-
# This program is free software.
|
6
|
-
# You can distribute or modify this program under the terms of
|
7
|
-
# the GNU LGPL, Lesser General Public License version 2.1.
|
8
|
-
# For details of the GNU LGPL, see the file "COPYING".
|
9
|
-
#
|
10
|
-
# == Quick usage
|
11
|
-
# require 'epubmaker'
|
12
|
-
# producer = EPUBMaker::Producer.new
|
13
|
-
# config = producer.load("config.yml")
|
14
|
-
# producer.contents.push(EPUBMaker::Content.new({"file" => "ch01.xhtml"}))
|
15
|
-
# producer.contents.push(EPUBMaker::Content.new({"file" => "ch02.xhtml"}))
|
16
|
-
# ...
|
17
|
-
# producer.import_imageinfo("images")
|
18
|
-
# producer.produce
|
19
|
-
|
20
|
-
require 'epubmaker/producer'
|
21
|
-
require 'epubmaker/content'
|
22
|
-
require 'epubmaker/epubv2'
|
23
|
-
require 'epubmaker/epubv3'
|
data/lib/epubmaker/content.rb
DELETED
@@ -1,110 +0,0 @@
|
|
1
|
-
# = content.rb -- Content object for EPUBMaker.
|
2
|
-
#
|
3
|
-
# Copyright (c) 2010-2017 Kenshi Muto
|
4
|
-
#
|
5
|
-
# This program is free software.
|
6
|
-
# You can distribute or modify this program under the terms of
|
7
|
-
# the GNU LGPL, Lesser General Public License version 2.1.
|
8
|
-
# For details of the GNU LGPL, see the file "COPYING".
|
9
|
-
#
|
10
|
-
|
11
|
-
module EPUBMaker
|
12
|
-
# EPUBMaker::Content represents a content data for EPUBMaker.
|
13
|
-
# EPUBMaker#contents takes an array of Content.
|
14
|
-
class Content
|
15
|
-
# ID
|
16
|
-
attr_accessor :id
|
17
|
-
# File path (will accept #<anchor> suffix also)
|
18
|
-
attr_accessor :file
|
19
|
-
# MIME type
|
20
|
-
attr_accessor :media
|
21
|
-
# Title
|
22
|
-
attr_accessor :title
|
23
|
-
# Header level (from 1)
|
24
|
-
attr_accessor :level
|
25
|
-
# Show in TOC? nil:No.
|
26
|
-
attr_accessor :notoc
|
27
|
-
# Properties (EPUB3)
|
28
|
-
attr_accessor :properties
|
29
|
-
# Chapter type (pre/post/part/nil(body))
|
30
|
-
attr_accessor :chaptype
|
31
|
-
|
32
|
-
def inspect
|
33
|
-
"<Content id=#{@id}, file=#{@file}, media=#{@media}, title=#{@title}, level=#{@level}, notoc=#{@notoc}, properties=#{@properties}, chaptype=#{@chaptype}>"
|
34
|
-
end
|
35
|
-
|
36
|
-
# :call-seq:
|
37
|
-
# initialize(file, id, media, title, level, notoc)
|
38
|
-
# initialize(hash)
|
39
|
-
# Construct Content object by passing a sequence of parameters or hash.
|
40
|
-
# Keys of +hash+ relate with each parameters.
|
41
|
-
# +file+ (or +hash+["file"]) is required. Others are optional.
|
42
|
-
def initialize(fileorhash, id = nil, media = nil, title = nil, level = nil, notoc = nil, properties = nil, chaptype = nil)
|
43
|
-
if fileorhash.instance_of?(Hash)
|
44
|
-
@id = fileorhash['id']
|
45
|
-
@file = fileorhash['file']
|
46
|
-
@media = fileorhash['media']
|
47
|
-
@title = fileorhash['title']
|
48
|
-
@level = fileorhash['level']
|
49
|
-
@notoc = fileorhash['notoc']
|
50
|
-
@properties = fileorhash['properties'] || []
|
51
|
-
@chaptype = fileorhash['chaptype']
|
52
|
-
else
|
53
|
-
@file = fileorhash
|
54
|
-
@id = id
|
55
|
-
@media = media
|
56
|
-
@title = title
|
57
|
-
@level = level
|
58
|
-
@notoc = notoc
|
59
|
-
@properties = properties || []
|
60
|
-
@chaptype = chaptype
|
61
|
-
end
|
62
|
-
complement
|
63
|
-
end
|
64
|
-
|
65
|
-
def ==(other)
|
66
|
-
return false unless self.class == other.class
|
67
|
-
[self.id, self.file, self.media, self.title, self.level, self.notoc, self.chaptype, self.properties] ==
|
68
|
-
[other.id, other.file, other.media, other.title, other.level, other.notoc, other.chaptype, other.properties]
|
69
|
-
end
|
70
|
-
|
71
|
-
private
|
72
|
-
|
73
|
-
# Complement other parameters by using file parameter.
|
74
|
-
def complement
|
75
|
-
if @id.nil?
|
76
|
-
@id = @file.gsub(%r{[\\/\. ]}, '-')
|
77
|
-
end
|
78
|
-
if @id =~ /\A[^a-z]/i
|
79
|
-
@id = "rv-#{@id}"
|
80
|
-
end
|
81
|
-
|
82
|
-
if !@file.nil? && @media.nil?
|
83
|
-
@media = @file.sub(/.+\./, '').downcase
|
84
|
-
end
|
85
|
-
|
86
|
-
case @media
|
87
|
-
when 'xhtml', 'xml', 'html'
|
88
|
-
@media = 'application/xhtml+xml'
|
89
|
-
when 'css'
|
90
|
-
@media = 'text/css'
|
91
|
-
when 'jpg', 'jpeg', 'image/jpg'
|
92
|
-
@media = 'image/jpeg'
|
93
|
-
when 'png'
|
94
|
-
@media = 'image/png'
|
95
|
-
when 'gif'
|
96
|
-
@media = 'image/gif'
|
97
|
-
when 'svg', 'image/svg'
|
98
|
-
@media = 'image/svg+xml'
|
99
|
-
when 'ttf', 'otf'
|
100
|
-
@media = 'application/vnd.ms-opentype'
|
101
|
-
when 'woff'
|
102
|
-
@media = 'application/font-woff'
|
103
|
-
end
|
104
|
-
|
105
|
-
if @id.nil? || @file.nil? || @media.nil?
|
106
|
-
raise "Type error: #{id}, #{file}, #{media}, #{title}, #{notoc}"
|
107
|
-
end
|
108
|
-
end
|
109
|
-
end
|
110
|
-
end
|
data/lib/epubmaker/epubcommon.rb
DELETED
@@ -1,441 +0,0 @@
|
|
1
|
-
# = epubcommon.rb -- super class for EPUBv2 and EPUBv3
|
2
|
-
#
|
3
|
-
# Copyright (c) 2010-2019 Kenshi Muto and Masayoshi Takahashi
|
4
|
-
#
|
5
|
-
# This program is free software.
|
6
|
-
# You can distribute or modify this program under the terms of
|
7
|
-
# the GNU LGPL, Lesser General Public License version 2.1.
|
8
|
-
# For details of the GNU LGPL, see the file "COPYING".
|
9
|
-
#
|
10
|
-
|
11
|
-
require 'review/i18n'
|
12
|
-
require 'review/template'
|
13
|
-
require 'cgi'
|
14
|
-
|
15
|
-
module EPUBMaker
|
16
|
-
# EPUBCommon is the common class for EPUB producer.
|
17
|
-
class EPUBCommon
|
18
|
-
# Construct object with parameter hash +config+ and message resource hash +res+.
|
19
|
-
def initialize(producer)
|
20
|
-
@body_ext = ''
|
21
|
-
@producer = producer
|
22
|
-
@body_ext = nil
|
23
|
-
end
|
24
|
-
|
25
|
-
# Return mimetype content.
|
26
|
-
def mimetype
|
27
|
-
'application/epub+zip'
|
28
|
-
end
|
29
|
-
|
30
|
-
def opf_path
|
31
|
-
"OEBPS/#{@producer.config['bookname']}.opf"
|
32
|
-
end
|
33
|
-
|
34
|
-
def opf_coverimage
|
35
|
-
s = ''
|
36
|
-
if @producer.config['coverimage']
|
37
|
-
file = nil
|
38
|
-
@producer.contents.each do |item|
|
39
|
-
if !item.media.start_with?('image') || item.file !~ /#{@producer.config['coverimage']}\Z/
|
40
|
-
next
|
41
|
-
end
|
42
|
-
s << %Q( <meta name="cover" content="#{item.id}"/>\n)
|
43
|
-
file = item.file
|
44
|
-
break
|
45
|
-
end
|
46
|
-
|
47
|
-
if file.nil?
|
48
|
-
raise "coverimage #{@producer.config['coverimage']} not found. Abort."
|
49
|
-
end
|
50
|
-
end
|
51
|
-
s
|
52
|
-
end
|
53
|
-
|
54
|
-
def ncx_isbn
|
55
|
-
uid = @producer.config['isbn'] || @producer.config['urnid']
|
56
|
-
%Q( <meta name="dtb:uid" content="#{uid}"/>\n)
|
57
|
-
end
|
58
|
-
|
59
|
-
def ncx_doctitle
|
60
|
-
<<EOT
|
61
|
-
<docTitle>
|
62
|
-
<text>#{CGI.escapeHTML(@producer.config['title'])}</text>
|
63
|
-
</docTitle>
|
64
|
-
<docAuthor>
|
65
|
-
<text>#{@producer.config['aut'].nil? ? '' : CGI.escapeHTML(join_with_separator(@producer.config['aut'], ReVIEW::I18n.t('names_splitter')))}</text>
|
66
|
-
</docAuthor>
|
67
|
-
EOT
|
68
|
-
end
|
69
|
-
|
70
|
-
def ncx_navmap(indentarray)
|
71
|
-
s = <<EOT
|
72
|
-
<navMap>
|
73
|
-
<navPoint id="top" playOrder="1">
|
74
|
-
<navLabel>
|
75
|
-
<text>#{CGI.escapeHTML(@producer.config['title'])}</text>
|
76
|
-
</navLabel>
|
77
|
-
<content src="#{@producer.config['cover']}"/>
|
78
|
-
</navPoint>
|
79
|
-
EOT
|
80
|
-
|
81
|
-
nav_count = 2
|
82
|
-
|
83
|
-
unless @producer.config['mytoc'].nil?
|
84
|
-
s << <<EOT
|
85
|
-
<navPoint id="toc" playOrder="#{nav_count}">
|
86
|
-
<navLabel>
|
87
|
-
<text>#{CGI.escapeHTML(@producer.res.v('toctitle'))}</text>
|
88
|
-
</navLabel>
|
89
|
-
<content src="#{@producer.config['bookname']}-toc.#{@producer.config['htmlext']}"/>
|
90
|
-
</navPoint>
|
91
|
-
EOT
|
92
|
-
nav_count += 1
|
93
|
-
end
|
94
|
-
|
95
|
-
@producer.contents.each do |item|
|
96
|
-
next if item.title.nil?
|
97
|
-
indent = indentarray.nil? ? [''] : indentarray
|
98
|
-
level = item.level.nil? ? 0 : (item.level - 1)
|
99
|
-
level = indent.size - 1 if level >= indent.size
|
100
|
-
s << <<EOT
|
101
|
-
<navPoint id="nav-#{nav_count}" playOrder="#{nav_count}">
|
102
|
-
<navLabel>
|
103
|
-
<text>#{indent[level]}#{CGI.escapeHTML(item.title)}</text>
|
104
|
-
</navLabel>
|
105
|
-
<content src="#{item.file}"/>
|
106
|
-
</navPoint>
|
107
|
-
EOT
|
108
|
-
nav_count += 1
|
109
|
-
end
|
110
|
-
|
111
|
-
s << <<EOT
|
112
|
-
</navMap>
|
113
|
-
EOT
|
114
|
-
s
|
115
|
-
end
|
116
|
-
|
117
|
-
# Return container content.
|
118
|
-
def container
|
119
|
-
@opf_path = opf_path
|
120
|
-
tmplfile = File.expand_path('./xml/container.xml.erb', ReVIEW::Template::TEMPLATE_DIR)
|
121
|
-
tmpl = ReVIEW::Template.load(tmplfile)
|
122
|
-
tmpl.result(binding)
|
123
|
-
end
|
124
|
-
|
125
|
-
# Return cover content.
|
126
|
-
def cover(type = nil)
|
127
|
-
@body_ext = type.nil? ? '' : %Q( epub:type="#{type}")
|
128
|
-
|
129
|
-
if @producer.config['coverimage']
|
130
|
-
file = @producer.coverimage
|
131
|
-
raise "coverimage #{@producer.config['coverimage']} not found. Abort." unless file
|
132
|
-
@body = <<-EOT
|
133
|
-
<div id="cover-image" class="cover-image">
|
134
|
-
<img src="#{file}" alt="#{CGI.escapeHTML(@producer.config.name_of('title'))}" class="max"/>
|
135
|
-
</div>
|
136
|
-
EOT
|
137
|
-
else
|
138
|
-
@body = <<-EOT
|
139
|
-
<h1 class="cover-title">#{CGI.escapeHTML(@producer.config.name_of('title'))}</h1>
|
140
|
-
EOT
|
141
|
-
if @producer.config['subtitle']
|
142
|
-
@body << <<-EOT
|
143
|
-
<h2 class="cover-subtitle">#{CGI.escapeHTML(@producer.config.name_of('subtitle'))}</h2>
|
144
|
-
EOT
|
145
|
-
end
|
146
|
-
end
|
147
|
-
|
148
|
-
@title = CGI.escapeHTML(@producer.config.name_of('title'))
|
149
|
-
@language = @producer.config['language']
|
150
|
-
@stylesheets = @producer.config['stylesheet']
|
151
|
-
tmplfile = if @producer.config['htmlversion'].to_i == 5
|
152
|
-
File.expand_path('./html/layout-html5.html.erb', ReVIEW::Template::TEMPLATE_DIR)
|
153
|
-
else
|
154
|
-
File.expand_path('./html/layout-xhtml1.html.erb', ReVIEW::Template::TEMPLATE_DIR)
|
155
|
-
end
|
156
|
-
tmpl = ReVIEW::Template.load(tmplfile)
|
157
|
-
tmpl.result(binding)
|
158
|
-
end
|
159
|
-
|
160
|
-
# Return title (copying) content.
|
161
|
-
# NOTE: this method is not used yet.
|
162
|
-
# see lib/review/epubmaker.rb#build_titlepage
|
163
|
-
def titlepage
|
164
|
-
@title = CGI.escapeHTML(@producer.config.name_of('title'))
|
165
|
-
|
166
|
-
@body = <<EOT
|
167
|
-
<h1 class="tp-title">#{@title}</h1>
|
168
|
-
EOT
|
169
|
-
|
170
|
-
if @producer.config['subtitle']
|
171
|
-
@body << <<EOT
|
172
|
-
<h2 class="tp-subtitle">#{CGI.escapeHTML(@producer.config.name_of('subtitle'))}</h2>
|
173
|
-
EOT
|
174
|
-
end
|
175
|
-
|
176
|
-
if @producer.config['aut']
|
177
|
-
@body << <<EOT
|
178
|
-
<p>
|
179
|
-
<br />
|
180
|
-
<br />
|
181
|
-
</p>
|
182
|
-
<h2 class="tp-author">#{CGI.escapeHTML(join_with_separator(@producer.config.names_of('aut'), ReVIEW::I18n.t('names_splitter')))}</h2>
|
183
|
-
EOT
|
184
|
-
end
|
185
|
-
|
186
|
-
publisher = @producer.config.names_of('pbl')
|
187
|
-
if publisher
|
188
|
-
@body << <<EOT
|
189
|
-
<p>
|
190
|
-
<br />
|
191
|
-
<br />
|
192
|
-
<br />
|
193
|
-
<br />
|
194
|
-
</p>
|
195
|
-
<h3 class="tp-publisher">#{CGI.escapeHTML(join_with_separator(publisher, ReVIEW::I18n.t('names_splitter')))}</h3>
|
196
|
-
EOT
|
197
|
-
end
|
198
|
-
|
199
|
-
@language = @producer.config['language']
|
200
|
-
@stylesheets = @producer.config['stylesheet']
|
201
|
-
tmplfile = if @producer.config['htmlversion'].to_i == 5
|
202
|
-
File.expand_path('./html/layout-html5.html.erb', ReVIEW::Template::TEMPLATE_DIR)
|
203
|
-
else
|
204
|
-
File.expand_path('./html/layout-xhtml1.html.erb', ReVIEW::Template::TEMPLATE_DIR)
|
205
|
-
end
|
206
|
-
tmpl = ReVIEW::Template.load(tmplfile)
|
207
|
-
tmpl.result(binding)
|
208
|
-
end
|
209
|
-
|
210
|
-
# Return colophon content.
|
211
|
-
def colophon
|
212
|
-
@title = CGI.escapeHTML(@producer.res.v('colophontitle'))
|
213
|
-
@body = <<EOT
|
214
|
-
<div class="colophon">
|
215
|
-
EOT
|
216
|
-
|
217
|
-
if @producer.config['subtitle'].nil?
|
218
|
-
@body << <<EOT
|
219
|
-
<p class="title">#{CGI.escapeHTML(@producer.config.name_of('title'))}</p>
|
220
|
-
EOT
|
221
|
-
else
|
222
|
-
@body << <<EOT
|
223
|
-
<p class="title">#{CGI.escapeHTML(@producer.config.name_of('title'))}<br /><span class="subtitle">#{CGI.escapeHTML(@producer.config.name_of('subtitle'))}</span></p>
|
224
|
-
EOT
|
225
|
-
end
|
226
|
-
|
227
|
-
@body << colophon_history if @producer.config['date'] || @producer.config['history']
|
228
|
-
|
229
|
-
@body << %Q( <table class="colophon">\n)
|
230
|
-
@body << @producer.config['colophon_order'].map do |role|
|
231
|
-
if @producer.config[role]
|
232
|
-
%Q( <tr><th>#{CGI.escapeHTML(@producer.res.v(role))}</th><td>#{CGI.escapeHTML(join_with_separator(@producer.config.names_of(role), ReVIEW::I18n.t('names_splitter')))}</td></tr>\n)
|
233
|
-
else
|
234
|
-
''
|
235
|
-
end
|
236
|
-
end.join
|
237
|
-
|
238
|
-
@body << %Q( <tr><th>ISBN</th><td>#{@producer.isbn_hyphen}</td></tr>\n) if @producer.isbn_hyphen
|
239
|
-
@body << %Q( </table>\n)
|
240
|
-
if @producer.config['rights'] && !@producer.config['rights'].empty?
|
241
|
-
@body << %Q( <p class="copyright">#{join_with_separator(@producer.config.names_of('rights').map { |m| CGI.escapeHTML(m) }, '<br />')}</p>\n)
|
242
|
-
end
|
243
|
-
@body << %Q( </div>\n)
|
244
|
-
|
245
|
-
@language = @producer.config['language']
|
246
|
-
@stylesheets = @producer.config['stylesheet']
|
247
|
-
tmplfile = if @producer.config['htmlversion'].to_i == 5
|
248
|
-
File.expand_path('./html/layout-html5.html.erb', ReVIEW::Template::TEMPLATE_DIR)
|
249
|
-
else
|
250
|
-
File.expand_path('./html/layout-xhtml1.html.erb', ReVIEW::Template::TEMPLATE_DIR)
|
251
|
-
end
|
252
|
-
tmpl = ReVIEW::Template.load(tmplfile)
|
253
|
-
tmpl.result(binding)
|
254
|
-
end
|
255
|
-
|
256
|
-
def colophon_history
|
257
|
-
buf = ''
|
258
|
-
buf << %Q( <div class="pubhistory">\n)
|
259
|
-
if @producer.config['history']
|
260
|
-
@producer.config['history'].each_with_index do |items, edit|
|
261
|
-
items.each_with_index do |item, rev|
|
262
|
-
editstr = edit == 0 ? ReVIEW::I18n.t('first_edition') : ReVIEW::I18n.t('nth_edition', (edit + 1).to_s)
|
263
|
-
revstr = ReVIEW::I18n.t('nth_impression', (rev + 1).to_s)
|
264
|
-
if item =~ /\A\d+\-\d+\-\d+\Z/
|
265
|
-
buf << %Q( <p>#{ReVIEW::I18n.t('published_by1', [date_to_s(item), editstr + revstr])}</p>\n)
|
266
|
-
elsif item =~ /\A(\d+\-\d+\-\d+)[\s ](.+)/
|
267
|
-
# custom date with string
|
268
|
-
item.match(/\A(\d+\-\d+\-\d+)[\s ](.+)/) do |m|
|
269
|
-
buf << %Q( <p>#{ReVIEW::I18n.t('published_by3', [date_to_s(m[1]), m[2]])}</p>\n)
|
270
|
-
end
|
271
|
-
else
|
272
|
-
# free format
|
273
|
-
buf << %Q( <p>#{item}</p>\n)
|
274
|
-
end
|
275
|
-
end
|
276
|
-
end
|
277
|
-
else
|
278
|
-
buf << %Q( <p>#{ReVIEW::I18n.t('published_by2', date_to_s(@producer.config['date']))}</p>\n)
|
279
|
-
end
|
280
|
-
buf << %Q( </div>\n)
|
281
|
-
buf
|
282
|
-
end
|
283
|
-
|
284
|
-
def date_to_s(date)
|
285
|
-
require 'date'
|
286
|
-
d = Date.parse(date)
|
287
|
-
d.strftime(ReVIEW::I18n.t('date_format'))
|
288
|
-
end
|
289
|
-
|
290
|
-
# Return own toc content.
|
291
|
-
def mytoc
|
292
|
-
@title = CGI.escapeHTML(@producer.res.v('toctitle'))
|
293
|
-
|
294
|
-
@body = %Q( <h1 class="toc-title">#{CGI.escapeHTML(@producer.res.v('toctitle'))}</h1>\n)
|
295
|
-
if @producer.config['epubmaker']['flattoc'].nil?
|
296
|
-
@body << hierarchy_ncx('ul')
|
297
|
-
else
|
298
|
-
@body << flat_ncx('ul', @producer.config['epubmaker']['flattocindent'])
|
299
|
-
end
|
300
|
-
|
301
|
-
@language = @producer.config['language']
|
302
|
-
@stylesheets = @producer.config['stylesheet']
|
303
|
-
tmplfile = if @producer.config['htmlversion'].to_i == 5
|
304
|
-
File.expand_path('./html/layout-html5.html.erb', ReVIEW::Template::TEMPLATE_DIR)
|
305
|
-
else
|
306
|
-
File.expand_path('./html/layout-xhtml1.html.erb', ReVIEW::Template::TEMPLATE_DIR)
|
307
|
-
end
|
308
|
-
tmpl = ReVIEW::Template.load(tmplfile)
|
309
|
-
tmpl.result(binding)
|
310
|
-
end
|
311
|
-
|
312
|
-
def hierarchy_ncx(type)
|
313
|
-
require 'rexml/document'
|
314
|
-
level = 1
|
315
|
-
find_jump = nil
|
316
|
-
has_part = nil
|
317
|
-
toclevel = @producer.config['toclevel'].to_i
|
318
|
-
|
319
|
-
# check part existance
|
320
|
-
@producer.contents.each do |item|
|
321
|
-
next if item.notoc || item.chaptype != 'part'
|
322
|
-
|
323
|
-
has_part = true
|
324
|
-
break
|
325
|
-
end
|
326
|
-
|
327
|
-
if has_part
|
328
|
-
@producer.contents.each do |item|
|
329
|
-
if item.chaptype == 'part' && item.level > 0
|
330
|
-
# sections in part
|
331
|
-
item.level -= 1
|
332
|
-
end
|
333
|
-
# down level for part and chaps. pre, appendix, post are preserved
|
334
|
-
if item.chaptype == 'part' || item.chaptype == 'body'
|
335
|
-
item.level += 1
|
336
|
-
end
|
337
|
-
end
|
338
|
-
toclevel += 1
|
339
|
-
end
|
340
|
-
|
341
|
-
doc = REXML::Document.new(%Q(<#{type} class="toc-h#{level}"><li /></#{type}>))
|
342
|
-
doc.context[:attribute_quote] = :quote
|
343
|
-
|
344
|
-
e = doc.root.elements[1] # first <li/>
|
345
|
-
@producer.contents.each do |item|
|
346
|
-
next if !item.notoc.nil? || item.level.nil? || item.file.nil? || item.title.nil? || item.level > toclevel
|
347
|
-
|
348
|
-
if item.level == level
|
349
|
-
e2 = e.parent.add_element('li')
|
350
|
-
e = e2
|
351
|
-
elsif item.level > level
|
352
|
-
find_jump = true if (item.level - level) > 1
|
353
|
-
# deeper
|
354
|
-
(level + 1).upto(item.level) do |n|
|
355
|
-
if e.size == 0
|
356
|
-
# empty span for epubcheck
|
357
|
-
e.attributes['style'] = 'list-style-type: none;'
|
358
|
-
es = e.add_element('span', 'style' => 'display:none;')
|
359
|
-
es.add_text(REXML::Text.new(' ', false, nil, true))
|
360
|
-
end
|
361
|
-
|
362
|
-
e2 = e.add_element(type, 'class' => "toc-h#{n}")
|
363
|
-
e3 = e2.add_element('li')
|
364
|
-
e = e3
|
365
|
-
end
|
366
|
-
level = item.level
|
367
|
-
elsif item.level < level
|
368
|
-
# shallower
|
369
|
-
(level - 1).downto(item.level) { e = e.parent.parent }
|
370
|
-
e2 = e.parent.add_element('li')
|
371
|
-
e = e2
|
372
|
-
level = item.level
|
373
|
-
end
|
374
|
-
e2 = e.add_element('a', 'href' => item.file)
|
375
|
-
e2.add_text(REXML::Text.new(item.title, true))
|
376
|
-
end
|
377
|
-
|
378
|
-
warn %Q(found level jumping in table of contents. consider to use 'epubmaker:flattoc: true' for strict ePUB validator.) unless find_jump.nil?
|
379
|
-
|
380
|
-
doc.to_s.gsub('<li/>', '').gsub('</li>', "</li>\n").gsub("<#{type} ", "\n" + '\&') # ugly
|
381
|
-
end
|
382
|
-
|
383
|
-
def flat_ncx(type, indent = nil)
|
384
|
-
s = %Q(<#{type} class="toc-h1">\n)
|
385
|
-
@producer.contents.each do |item|
|
386
|
-
next if !item.notoc.nil? || item.level.nil? || item.file.nil? || item.title.nil? || item.level > @producer.config['toclevel'].to_i
|
387
|
-
is = indent == true ? ' ' * item.level : ''
|
388
|
-
s << %Q(<li><a href="#{item.file}">#{is}#{CGI.escapeHTML(item.title)}</a></li>\n)
|
389
|
-
end
|
390
|
-
s << %Q(</#{type}>\n)
|
391
|
-
|
392
|
-
s
|
393
|
-
end
|
394
|
-
|
395
|
-
def produce_write_common(basedir, tmpdir)
|
396
|
-
File.open("#{tmpdir}/mimetype", 'w') { |f| @producer.mimetype(f) }
|
397
|
-
|
398
|
-
FileUtils.mkdir_p("#{tmpdir}/META-INF")
|
399
|
-
File.open("#{tmpdir}/META-INF/container.xml", 'w') { |f| @producer.container(f) }
|
400
|
-
|
401
|
-
FileUtils.mkdir_p("#{tmpdir}/OEBPS")
|
402
|
-
File.open(File.join(tmpdir, opf_path), 'w') { |f| @producer.opf(f) }
|
403
|
-
|
404
|
-
if File.exist?("#{basedir}/#{@producer.config['cover']}")
|
405
|
-
FileUtils.cp("#{basedir}/#{@producer.config['cover']}", "#{tmpdir}/OEBPS")
|
406
|
-
else
|
407
|
-
File.open("#{tmpdir}/OEBPS/#{@producer.config['cover']}", 'w') { |f| @producer.cover(f) }
|
408
|
-
end
|
409
|
-
|
410
|
-
@producer.contents.each do |item|
|
411
|
-
next if item.file =~ /#/ # skip subgroup
|
412
|
-
fname = "#{basedir}/#{item.file}"
|
413
|
-
raise "#{fname} doesn't exist. Abort." unless File.exist?(fname)
|
414
|
-
FileUtils.mkdir_p(File.dirname("#{tmpdir}/OEBPS/#{item.file}"))
|
415
|
-
FileUtils.cp(fname, "#{tmpdir}/OEBPS/#{item.file}")
|
416
|
-
end
|
417
|
-
end
|
418
|
-
|
419
|
-
def legacy_cover_and_title_file(loadfile, writefile)
|
420
|
-
@title = @producer.config['booktitle']
|
421
|
-
s = ''
|
422
|
-
File.open(loadfile) do |f|
|
423
|
-
f.each_line do |l|
|
424
|
-
s << l
|
425
|
-
end
|
426
|
-
end
|
427
|
-
|
428
|
-
File.open(writefile, 'w') do |f|
|
429
|
-
f.puts s
|
430
|
-
end
|
431
|
-
end
|
432
|
-
|
433
|
-
def join_with_separator(value, sep)
|
434
|
-
if value.is_a?(Array)
|
435
|
-
value.join(sep)
|
436
|
-
else
|
437
|
-
value
|
438
|
-
end
|
439
|
-
end
|
440
|
-
end
|
441
|
-
end
|