review 4.2.0 → 5.0.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.
- checksums.yaml +4 -4
- data/.github/workflows/ruby-win.yml +11 -5
- data/.rubocop.yml +113 -24
- data/NEWS.ja.md +94 -0
- data/NEWS.md +94 -0
- data/bin/review-catalog-converter +1 -1
- data/bin/review-check +2 -4
- data/bin/review-checkdep +1 -1
- data/bin/review-compile +8 -14
- data/bin/review-validate +1 -1
- data/doc/config.yml.sample +4 -1
- data/doc/config.yml.sample-simple +1 -1
- data/doc/format.ja.md +83 -4
- data/doc/format.md +84 -7
- data/doc/makeindex.ja.md +2 -2
- data/doc/quickstart.ja.md +3 -3
- data/doc/quickstart.md +2 -2
- data/lib/epubmaker/content.rb +3 -2
- data/lib/epubmaker/epubcommon.rb +33 -25
- data/lib/epubmaker/epubv2.rb +5 -6
- data/lib/epubmaker/epubv3.rb +20 -18
- data/lib/review/book.rb +2 -2
- data/lib/review/book/base.rb +61 -25
- data/lib/review/book/bib.rb +21 -0
- data/lib/review/book/book_unit.rb +155 -0
- data/lib/review/book/chapter.rb +30 -26
- data/lib/review/book/index.rb +23 -185
- data/lib/review/book/index/item.rb +7 -1
- data/lib/review/book/part.rb +21 -9
- data/lib/review/book/volume.rb +1 -1
- data/lib/review/builder.rb +68 -13
- data/lib/review/catalog.rb +2 -2
- data/lib/review/compiler.rb +159 -73
- data/lib/review/configure.rb +22 -1
- data/lib/review/converter.rb +1 -1
- data/lib/review/epub2html.rb +6 -1
- data/lib/review/epubmaker.rb +12 -23
- data/lib/review/htmlbuilder.rb +36 -7
- data/lib/review/htmlutils.rb +7 -10
- data/lib/review/i18n.rb +1 -1
- data/lib/review/idgxmlbuilder.rb +51 -6
- data/lib/review/idgxmlmaker.rb +9 -14
- data/lib/review/index_builder.rb +653 -0
- data/lib/review/init.rb +5 -13
- data/lib/review/latexbuilder.rb +65 -4
- data/lib/review/logger.rb +2 -2
- data/lib/review/makerhelper.rb +11 -0
- data/lib/review/markdownbuilder.rb +19 -1
- data/lib/review/pdfmaker.rb +17 -36
- data/lib/review/plaintextbuilder.rb +48 -2
- data/lib/review/preprocessor.rb +5 -5
- data/lib/review/rstbuilder.rb +25 -6
- data/lib/review/sec_counter.rb +13 -0
- data/lib/review/textmaker.rb +4 -12
- data/lib/review/tocprinter.rb +2 -3
- data/lib/review/topbuilder.rb +26 -0
- data/lib/review/update.rb +7 -7
- data/lib/review/version.rb +1 -1
- data/lib/review/volumeprinter.rb +2 -3
- data/lib/review/webmaker.rb +9 -20
- data/review.gemspec +2 -2
- data/samples/sample-book/src/config.yml +1 -1
- data/samples/syntax-book/Gemfile +1 -1
- data/samples/syntax-book/config.yml +1 -1
- data/templates/latex/config.erb +27 -23
- data/templates/latex/review-jlreq/README.md +3 -1
- data/templates/latex/review-jlreq/review-base.sty +31 -15
- data/templates/latex/review-jlreq/review-jlreq.cls +8 -24
- data/templates/latex/review-jsbook/README.md +7 -5
- data/templates/latex/review-jsbook/review-base.sty +34 -16
- data/templates/latex/review-jsbook/review-jsbook.cls +4 -2
- data/templates/web/html/layout-html5.html.erb +1 -1
- data/test/assets/test_template.tex +3 -3
- data/test/assets/test_template_backmatter.tex +3 -3
- data/test/book_test_helper.rb +11 -5
- data/test/test_book.rb +54 -63
- data/test/test_book_chapter.rb +93 -52
- data/test/test_builder.rb +24 -15
- data/test/test_converter.rb +1 -0
- data/test/test_epub3maker.rb +2 -2
- data/test/test_epubmaker.rb +8 -0
- data/test/test_helper.rb +4 -1
- data/test/test_htmlbuilder.rb +627 -56
- data/test/test_htmlutils.rb +0 -12
- data/test/test_i18n.rb +33 -33
- data/test/test_idgxmlbuilder.rb +358 -11
- data/test/test_idgxmlmaker_cmd.rb +1 -1
- data/test/test_index.rb +62 -52
- data/test/test_indexbuilder.rb +52 -0
- data/test/test_latexbuilder.rb +547 -10
- data/test/test_latexbuilder_v2.rb +43 -5
- data/test/test_logger.rb +7 -7
- data/test/test_makerhelper.rb +0 -12
- data/test/test_markdownbuilder.rb +3 -0
- data/test/test_pdfmaker.rb +13 -12
- data/test/test_pdfmaker_cmd.rb +1 -1
- data/test/test_plaintextbuilder.rb +422 -7
- data/test/test_review_ext.rb +2 -1
- data/test/test_rstbuilder.rb +25 -1
- data/test/test_sec_counter.rb +156 -0
- data/test/test_textmaker_cmd.rb +1 -1
- data/test/test_topbuilder.rb +187 -10
- data/test/test_update.rb +10 -10
- data/test/test_webtocprinter.rb +12 -12
- 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 +14 -6
- data/.rubocop_todo.yml +0 -7
- data/lib/review/book/compilable.rb +0 -174
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Copyright (c) 2009-2020 Minero Aoki, Kenshi Muto
|
|
3
|
+
#
|
|
4
|
+
# This program is free software.
|
|
5
|
+
# You can distribute or modify this program under the terms of
|
|
6
|
+
# the GNU LGPL, Lesser General Public License version 2.1.
|
|
7
|
+
# For details of the GNU LGPL, see the file "COPYING".
|
|
8
|
+
#
|
|
9
|
+
require 'review/book/book_unit'
|
|
10
|
+
require 'review/lineinput'
|
|
11
|
+
require 'review/preprocessor'
|
|
12
|
+
|
|
13
|
+
module ReVIEW
|
|
14
|
+
module Book
|
|
15
|
+
class Bib < BookUnit
|
|
16
|
+
def number
|
|
17
|
+
nil
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
# Copyright (c) 2009-2017 Minero Aoki, Kenshi Muto
|
|
2
|
+
# 2002-2008 Minero Aoki
|
|
3
|
+
#
|
|
4
|
+
# This program is free software.
|
|
5
|
+
# You can distribute or modify this program under the terms of
|
|
6
|
+
# the GNU LGPL, Lesser General Public License version 2.1.
|
|
7
|
+
# For details of the GNU LGPL, see the file "COPYING".
|
|
8
|
+
#
|
|
9
|
+
require 'review/textutils'
|
|
10
|
+
require 'review/index_builder'
|
|
11
|
+
|
|
12
|
+
module ReVIEW
|
|
13
|
+
module Book
|
|
14
|
+
class BookUnit
|
|
15
|
+
include TextUtils
|
|
16
|
+
attr_reader :book
|
|
17
|
+
attr_reader :path
|
|
18
|
+
attr_reader :lines
|
|
19
|
+
attr_accessor :content
|
|
20
|
+
|
|
21
|
+
attr_reader :list_index, :table_index, :equation_index, :footnote_index,
|
|
22
|
+
:numberless_image_index, :image_index, :icon_index, :indepimage_index,
|
|
23
|
+
:headline_index, :column_index
|
|
24
|
+
|
|
25
|
+
def initialize(file_content: nil, book: nil)
|
|
26
|
+
if book
|
|
27
|
+
@book = book
|
|
28
|
+
end
|
|
29
|
+
if file_content
|
|
30
|
+
@content = file_content
|
|
31
|
+
end
|
|
32
|
+
if @content
|
|
33
|
+
@lines = @content.lines
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def execute_indexer(force: false)
|
|
38
|
+
if @index_builder && !force
|
|
39
|
+
return @index_builder
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
@index_builder = ReVIEW::IndexBuilder.new
|
|
43
|
+
compiler = ReVIEW::Compiler.new(@index_builder)
|
|
44
|
+
compiler.compile(self)
|
|
45
|
+
@index_builder
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def generate_indexes(use_bib: false)
|
|
49
|
+
return unless content
|
|
50
|
+
|
|
51
|
+
@lines = content.lines
|
|
52
|
+
|
|
53
|
+
@indexes = execute_indexer
|
|
54
|
+
|
|
55
|
+
@list_index = @indexes.list_index
|
|
56
|
+
@table_index = @indexes.table_index
|
|
57
|
+
@equation_index = @indexes.equation_index
|
|
58
|
+
@footnote_index = @indexes.footnote_index
|
|
59
|
+
@headline_index = @indexes.headline_index
|
|
60
|
+
@column_index = @indexes.column_index
|
|
61
|
+
if use_bib
|
|
62
|
+
@book.bibpaper_index = @indexes.bibpaper_index
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def dirname
|
|
67
|
+
@path && File.dirname(@path)
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def basename
|
|
71
|
+
@path && File.basename(@path)
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
def name
|
|
75
|
+
@name && File.basename(@name, '.*')
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
alias_method :id, :name
|
|
79
|
+
|
|
80
|
+
def title
|
|
81
|
+
return @title if @title
|
|
82
|
+
|
|
83
|
+
@title = ''
|
|
84
|
+
return @title unless content
|
|
85
|
+
content.each_line do |line|
|
|
86
|
+
if line =~ /\A=+/
|
|
87
|
+
@title = line.sub(/\A=+(\[.+?\])?(\{.+?\})?/, '').strip
|
|
88
|
+
break
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
@title
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
def size
|
|
95
|
+
content.size
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
def volume
|
|
99
|
+
@volume ||= Volume.count_file(path)
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
def list(id)
|
|
103
|
+
list_index[id]
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
def table(id)
|
|
107
|
+
table_index[id]
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
def equation(id)
|
|
111
|
+
equation_index[id]
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
def footnote(id)
|
|
115
|
+
footnote_index[id]
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
def image(id)
|
|
119
|
+
return image_index[id] if image_index.key?(id)
|
|
120
|
+
return icon_index[id] if icon_index.key?(id)
|
|
121
|
+
return numberless_image_index[id] if numberless_image_index.key?(id)
|
|
122
|
+
indepimage_index[id]
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
def bibpaper(id)
|
|
126
|
+
bibpaper_index[id]
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
def bibpaper_index
|
|
130
|
+
raise FileNotFound, "no such bib file: #{@book.bib_file}" unless @book.bib_exist?
|
|
131
|
+
@book.bibpaper_index
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
def headline(caption)
|
|
135
|
+
headline_index[caption]
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
def column(id)
|
|
139
|
+
column_index[id]
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
def next_chapter
|
|
143
|
+
book.next_chapter(self)
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
def prev_chapter
|
|
147
|
+
book.prev_chapter(self)
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
def image_bound?(item_id)
|
|
151
|
+
image(item_id).path
|
|
152
|
+
end
|
|
153
|
+
end
|
|
154
|
+
end
|
|
155
|
+
end
|
data/lib/review/book/chapter.rb
CHANGED
|
@@ -7,15 +7,13 @@
|
|
|
7
7
|
# the GNU LGPL, Lesser General Public License version 2.1.
|
|
8
8
|
# For details of the GNU LGPL, see the file "COPYING".
|
|
9
9
|
#
|
|
10
|
-
require 'review/book/
|
|
10
|
+
require 'review/book/book_unit'
|
|
11
11
|
require 'review/lineinput'
|
|
12
12
|
require 'review/preprocessor'
|
|
13
13
|
|
|
14
14
|
module ReVIEW
|
|
15
15
|
module Book
|
|
16
|
-
class Chapter
|
|
17
|
-
include Compilable
|
|
18
|
-
|
|
16
|
+
class Chapter < BookUnit
|
|
19
17
|
attr_reader :number, :book
|
|
20
18
|
|
|
21
19
|
def self.mkchap(book, name, number = nil)
|
|
@@ -53,35 +51,41 @@ module ReVIEW
|
|
|
53
51
|
@content = File.read(@path, mode: 'rt:BOM|utf-8')
|
|
54
52
|
@number = nil if %w[nonum nodisp notoc].include?(find_first_header_option)
|
|
55
53
|
end
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
@
|
|
66
|
-
@
|
|
54
|
+
|
|
55
|
+
super()
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def generate_indexes
|
|
59
|
+
super
|
|
60
|
+
|
|
61
|
+
return unless content
|
|
62
|
+
|
|
63
|
+
@numberless_image_index = @indexes.numberless_image_index
|
|
64
|
+
@image_index = @indexes.image_index
|
|
65
|
+
@icon_index = @indexes.icon_index
|
|
66
|
+
@indepimage_index = @indexes.indepimage_index
|
|
67
67
|
end
|
|
68
68
|
|
|
69
69
|
def find_first_header_option
|
|
70
70
|
f = LineInput.new(StringIO.new(@content))
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
71
|
+
begin
|
|
72
|
+
while f.next?
|
|
73
|
+
case f.peek
|
|
74
|
+
when /\A=+[\[\s{]/
|
|
75
|
+
m = /\A(=+)(?:\[(.+?)\])?(?:\{(.+?)\})?(.*)/.match(f.gets)
|
|
76
|
+
return m[2] # tag
|
|
77
|
+
when %r{/\A//[a-z]+/}
|
|
78
|
+
line = f.gets
|
|
79
|
+
if line.rstrip[-1, 1] == '{'
|
|
80
|
+
f.until_match(%r{\A//\}})
|
|
81
|
+
end
|
|
80
82
|
end
|
|
83
|
+
f.gets
|
|
81
84
|
end
|
|
82
|
-
|
|
85
|
+
nil
|
|
86
|
+
rescue ArgumentError => e
|
|
87
|
+
raise ReVIEW::CompileError, "#{@name}: #{e}"
|
|
83
88
|
end
|
|
84
|
-
nil
|
|
85
89
|
end
|
|
86
90
|
|
|
87
91
|
def inspect
|
data/lib/review/book/index.rb
CHANGED
|
@@ -17,21 +17,6 @@ require 'review/book/index/item'
|
|
|
17
17
|
module ReVIEW
|
|
18
18
|
module Book
|
|
19
19
|
class Index
|
|
20
|
-
def self.parse(src, *args)
|
|
21
|
-
index = self.new(*args)
|
|
22
|
-
seq = 1
|
|
23
|
-
src.grep(%r{\A//#{item_type}}) do |line|
|
|
24
|
-
if id = line.slice(/\[(.*?)\]/, 1)
|
|
25
|
-
index.add_item(ReVIEW::Book::Index::Item.new(id, seq))
|
|
26
|
-
seq += 1
|
|
27
|
-
if id.empty?
|
|
28
|
-
ReVIEW.logger.warn "warning: no ID of #{item_type} in #{line}"
|
|
29
|
-
end
|
|
30
|
-
end
|
|
31
|
-
end
|
|
32
|
-
index
|
|
33
|
-
end
|
|
34
|
-
|
|
35
20
|
include Enumerable
|
|
36
21
|
|
|
37
22
|
def item_type
|
|
@@ -44,9 +29,13 @@ module ReVIEW
|
|
|
44
29
|
@image_finder = nil
|
|
45
30
|
end
|
|
46
31
|
|
|
32
|
+
def size
|
|
33
|
+
@index.size
|
|
34
|
+
end
|
|
35
|
+
|
|
47
36
|
def add_item(item)
|
|
48
|
-
if @index[item.id]
|
|
49
|
-
@logger.warn "warning: duplicate ID: #{item.id} (#{item})"
|
|
37
|
+
if @index[item.id] && self.class != ReVIEW::Book::IconIndex
|
|
38
|
+
@logger.warn "warning: duplicate ID: #{item.id} (#{item.inspect})"
|
|
50
39
|
end
|
|
51
40
|
@index[item.id] = item
|
|
52
41
|
if item.class != ReVIEW::Book::Chapter
|
|
@@ -57,13 +46,13 @@ module ReVIEW
|
|
|
57
46
|
def [](id)
|
|
58
47
|
@index.fetch(id)
|
|
59
48
|
rescue
|
|
60
|
-
|
|
61
|
-
|
|
49
|
+
index_keys = @index.keys.map { |i| i.split('|').last }.flatten # unfold all ids
|
|
50
|
+
if index_keys.each_with_object(Hash.new(0)) { |i, h| h[i] += 1 }. # number of occurrences
|
|
62
51
|
select { |k, v| k == id && v > 1 }.present? # detect duplicated
|
|
63
52
|
raise KeyError, "key '#{id}' is ambiguous for #{self.class}"
|
|
64
53
|
end
|
|
65
54
|
|
|
66
|
-
@index.
|
|
55
|
+
@index.each_value do |item|
|
|
67
56
|
if item.id.split('|').include?(id)
|
|
68
57
|
return item
|
|
69
58
|
end
|
|
@@ -134,55 +123,24 @@ module ReVIEW
|
|
|
134
123
|
end
|
|
135
124
|
|
|
136
125
|
class FootnoteIndex < Index
|
|
137
|
-
def self.parse(src)
|
|
138
|
-
index = self.new
|
|
139
|
-
seq = 1
|
|
140
|
-
src.grep(%r{\A//footnote}) do |line|
|
|
141
|
-
if m = /\[(.*?)\]\[(.*)\]/.match(line)
|
|
142
|
-
m1 = m[1].gsub(/\\(\])/) { $1 }
|
|
143
|
-
m2 = m[2].gsub(/\\(\])/) { $1 }
|
|
144
|
-
index.add_item(Item.new(m1, seq, m2))
|
|
145
|
-
end
|
|
146
|
-
seq += 1
|
|
147
|
-
end
|
|
148
|
-
index
|
|
149
|
-
end
|
|
150
126
|
end
|
|
151
127
|
|
|
152
128
|
class ImageIndex < Index
|
|
153
|
-
def self.parse(src, *args)
|
|
154
|
-
index = self.new(*args)
|
|
155
|
-
seq = 1
|
|
156
|
-
src.grep(%r{\A//#{item_type}}) do |line|
|
|
157
|
-
# ex. ["//image", "id", "", "caption"]
|
|
158
|
-
elements = line.split(/\[(.*?)\]/)
|
|
159
|
-
if elements[1].present?
|
|
160
|
-
if line.start_with?('//imgtable')
|
|
161
|
-
index.add_item(ReVIEW::Book::Index::Item.new(elements[1], 0, elements[3]))
|
|
162
|
-
else ## %r<\A//(image|graph)>
|
|
163
|
-
index.add_item(ReVIEW::Book::Index::Item.new(elements[1], seq, elements[3]))
|
|
164
|
-
seq += 1
|
|
165
|
-
end
|
|
166
|
-
if elements[1] == ''
|
|
167
|
-
ReVIEW.logger.warn "warning: no ID of #{item_type} in #{line}"
|
|
168
|
-
end
|
|
169
|
-
end
|
|
170
|
-
end
|
|
171
|
-
index
|
|
172
|
-
end
|
|
173
|
-
|
|
174
129
|
def self.item_type
|
|
175
130
|
'(image|graph|imgtable)'
|
|
176
131
|
end
|
|
177
132
|
|
|
178
133
|
attr_reader :image_finder
|
|
179
134
|
|
|
180
|
-
def initialize(
|
|
135
|
+
def initialize(chapter)
|
|
181
136
|
super()
|
|
182
|
-
@
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
137
|
+
@chapter = chapter
|
|
138
|
+
book = @chapter.book
|
|
139
|
+
|
|
140
|
+
chapid = chapter.id
|
|
141
|
+
basedir = book.imagedir
|
|
142
|
+
builder = book.config['builder']
|
|
143
|
+
types = book.image_types
|
|
186
144
|
|
|
187
145
|
@image_finder = ReVIEW::Book::ImageFinder.new(basedir, chapid, builder, types)
|
|
188
146
|
end
|
|
@@ -193,43 +151,9 @@ module ReVIEW
|
|
|
193
151
|
end
|
|
194
152
|
|
|
195
153
|
class IconIndex < ImageIndex
|
|
196
|
-
def initialize(chapid, basedir, types, builder)
|
|
197
|
-
@index = {}
|
|
198
|
-
@chapid = chapid
|
|
199
|
-
@basedir = basedir
|
|
200
|
-
@types = types
|
|
201
|
-
@logger = ReVIEW.logger
|
|
202
|
-
|
|
203
|
-
@image_finder = ImageFinder.new(basedir, chapid, builder, types)
|
|
204
|
-
end
|
|
205
|
-
|
|
206
|
-
def self.parse(src, *args)
|
|
207
|
-
index = self.new(*args)
|
|
208
|
-
seq = 1
|
|
209
|
-
src.grep(/@<icon>/) do |line|
|
|
210
|
-
line.gsub(/@<icon>\{(.+?)\}/) do
|
|
211
|
-
index.add_item(ReVIEW::Book::Index::Item.new($1, seq))
|
|
212
|
-
seq += 1
|
|
213
|
-
end
|
|
214
|
-
end
|
|
215
|
-
index
|
|
216
|
-
end
|
|
217
154
|
end
|
|
218
155
|
|
|
219
156
|
class BibpaperIndex < Index
|
|
220
|
-
def self.parse(src)
|
|
221
|
-
index = self.new
|
|
222
|
-
seq = 1
|
|
223
|
-
src.grep(%r{\A//bibpaper}) do |line|
|
|
224
|
-
if m = /\[(.*?)\]\[(.*)\]/.match(line)
|
|
225
|
-
m1 = m[1].gsub(/\\(.)/) { $1 }
|
|
226
|
-
m2 = m[2].gsub(/\\(.)/) { $1 }
|
|
227
|
-
index.add_item(Item.new(m1, seq, m2))
|
|
228
|
-
end
|
|
229
|
-
seq += 1
|
|
230
|
-
end
|
|
231
|
-
index
|
|
232
|
-
end
|
|
233
157
|
end
|
|
234
158
|
|
|
235
159
|
class NumberlessImageIndex < ImageIndex
|
|
@@ -255,77 +179,9 @@ module ReVIEW
|
|
|
255
179
|
class HeadlineIndex < Index
|
|
256
180
|
HEADLINE_PATTERN = /\A(=+)(?:\[(.+?)\])?(?:\{(.+?)\})?(.*)/
|
|
257
181
|
|
|
258
|
-
def
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
headlines = []
|
|
262
|
-
inside_column = false
|
|
263
|
-
inside_block = nil
|
|
264
|
-
column_level = -1
|
|
265
|
-
src.each do |line|
|
|
266
|
-
if line =~ %r{\A//[a-z]+.*\{\Z}
|
|
267
|
-
inside_block = true
|
|
268
|
-
next
|
|
269
|
-
elsif line.start_with?('//}')
|
|
270
|
-
inside_block = nil
|
|
271
|
-
next
|
|
272
|
-
elsif inside_block
|
|
273
|
-
next
|
|
274
|
-
end
|
|
275
|
-
|
|
276
|
-
m = HEADLINE_PATTERN.match(line)
|
|
277
|
-
if m.nil? || m[1].size > 10 # Ignore too deep index
|
|
278
|
-
next
|
|
279
|
-
end
|
|
280
|
-
|
|
281
|
-
index = m[1].size - 2
|
|
282
|
-
|
|
283
|
-
# column
|
|
284
|
-
if m[2] == 'column'
|
|
285
|
-
inside_column = true
|
|
286
|
-
column_level = index
|
|
287
|
-
next
|
|
288
|
-
elsif m[2] == '/column'
|
|
289
|
-
inside_column = false
|
|
290
|
-
next
|
|
291
|
-
end
|
|
292
|
-
if indexs.blank? || index <= column_level
|
|
293
|
-
inside_column = false
|
|
294
|
-
end
|
|
295
|
-
next if inside_column
|
|
296
|
-
next if m[4].strip.empty? # no title
|
|
297
|
-
|
|
298
|
-
next unless index >= 0
|
|
299
|
-
if indexs.size > (index + 1)
|
|
300
|
-
unless %w[nonum notoc nodisp].include?(m[2])
|
|
301
|
-
indexs = indexs.take(index + 1)
|
|
302
|
-
end
|
|
303
|
-
headlines = headlines.take(index + 1)
|
|
304
|
-
end
|
|
305
|
-
if indexs[index].nil?
|
|
306
|
-
(0..index).each do |i|
|
|
307
|
-
indexs[i] ||= 0
|
|
308
|
-
end
|
|
309
|
-
end
|
|
310
|
-
|
|
311
|
-
if %w[nonum notoc nodisp].include?(m[2])
|
|
312
|
-
headlines[index] = m[3].present? ? m[3].strip : m[4].strip
|
|
313
|
-
item_id = headlines.join('|')
|
|
314
|
-
headline_index.add_item(Item.new(item_id, nil, m[4].strip))
|
|
315
|
-
else
|
|
316
|
-
indexs[index] += 1
|
|
317
|
-
headlines[index] = m[3].present? ? m[3].strip : m[4].strip
|
|
318
|
-
item_id = headlines.join('|')
|
|
319
|
-
headline_index.add_item(Item.new(item_id, indexs.dup, m[4].strip))
|
|
320
|
-
end
|
|
321
|
-
end
|
|
322
|
-
headline_index
|
|
323
|
-
end
|
|
324
|
-
|
|
325
|
-
def initialize(chap)
|
|
326
|
-
@chap = chap
|
|
327
|
-
@index = {}
|
|
328
|
-
@logger = ReVIEW.logger
|
|
182
|
+
def initialize(chapter)
|
|
183
|
+
super()
|
|
184
|
+
@chapter = chapter
|
|
329
185
|
end
|
|
330
186
|
|
|
331
187
|
def number(id)
|
|
@@ -333,34 +189,16 @@ module ReVIEW
|
|
|
333
189
|
# when notoc
|
|
334
190
|
return ''
|
|
335
191
|
end
|
|
336
|
-
n = @
|
|
192
|
+
n = @chapter.number
|
|
337
193
|
# XXX: remove magic number (move to lib/review/book/chapter.rb)
|
|
338
|
-
if @
|
|
339
|
-
n = @
|
|
194
|
+
if @chapter.on_appendix? && @chapter.number > 0 && @chapter.number < 28
|
|
195
|
+
n = @chapter.format_number(false)
|
|
340
196
|
end
|
|
341
197
|
([n] + self[id].number).join('.')
|
|
342
198
|
end
|
|
343
199
|
end
|
|
344
200
|
|
|
345
201
|
class ColumnIndex < Index
|
|
346
|
-
COLUMN_PATTERN = /\A(=+)\[column\](?:\{(.+?)\})?(.*)/
|
|
347
|
-
|
|
348
|
-
def self.parse(src, *_args)
|
|
349
|
-
index = self.new
|
|
350
|
-
seq = 1
|
|
351
|
-
src.each do |line|
|
|
352
|
-
m = COLUMN_PATTERN.match(line)
|
|
353
|
-
next unless m
|
|
354
|
-
_level = m[1] ## not use it yet
|
|
355
|
-
id = m[2]
|
|
356
|
-
caption = m[3].strip
|
|
357
|
-
id = caption if id.nil? || id.empty?
|
|
358
|
-
|
|
359
|
-
index.add_item(ReVIEW::Book::Index::Item.new(id, seq, caption))
|
|
360
|
-
seq += 1
|
|
361
|
-
end
|
|
362
|
-
index
|
|
363
|
-
end
|
|
364
202
|
end
|
|
365
203
|
end
|
|
366
204
|
end
|