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.
Files changed (165) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ruby-win.yml +11 -5
  3. data/.rubocop.yml +113 -24
  4. data/NEWS.ja.md +94 -0
  5. data/NEWS.md +94 -0
  6. data/bin/review-catalog-converter +1 -1
  7. data/bin/review-check +2 -4
  8. data/bin/review-checkdep +1 -1
  9. data/bin/review-compile +8 -14
  10. data/bin/review-validate +1 -1
  11. data/doc/config.yml.sample +4 -1
  12. data/doc/config.yml.sample-simple +1 -1
  13. data/doc/format.ja.md +83 -4
  14. data/doc/format.md +84 -7
  15. data/doc/makeindex.ja.md +2 -2
  16. data/doc/quickstart.ja.md +3 -3
  17. data/doc/quickstart.md +2 -2
  18. data/lib/epubmaker/content.rb +3 -2
  19. data/lib/epubmaker/epubcommon.rb +33 -25
  20. data/lib/epubmaker/epubv2.rb +5 -6
  21. data/lib/epubmaker/epubv3.rb +20 -18
  22. data/lib/review/book.rb +2 -2
  23. data/lib/review/book/base.rb +61 -25
  24. data/lib/review/book/bib.rb +21 -0
  25. data/lib/review/book/book_unit.rb +155 -0
  26. data/lib/review/book/chapter.rb +30 -26
  27. data/lib/review/book/index.rb +23 -185
  28. data/lib/review/book/index/item.rb +7 -1
  29. data/lib/review/book/part.rb +21 -9
  30. data/lib/review/book/volume.rb +1 -1
  31. data/lib/review/builder.rb +68 -13
  32. data/lib/review/catalog.rb +2 -2
  33. data/lib/review/compiler.rb +159 -73
  34. data/lib/review/configure.rb +22 -1
  35. data/lib/review/converter.rb +1 -1
  36. data/lib/review/epub2html.rb +6 -1
  37. data/lib/review/epubmaker.rb +12 -23
  38. data/lib/review/htmlbuilder.rb +36 -7
  39. data/lib/review/htmlutils.rb +7 -10
  40. data/lib/review/i18n.rb +1 -1
  41. data/lib/review/idgxmlbuilder.rb +51 -6
  42. data/lib/review/idgxmlmaker.rb +9 -14
  43. data/lib/review/index_builder.rb +653 -0
  44. data/lib/review/init.rb +5 -13
  45. data/lib/review/latexbuilder.rb +65 -4
  46. data/lib/review/logger.rb +2 -2
  47. data/lib/review/makerhelper.rb +11 -0
  48. data/lib/review/markdownbuilder.rb +19 -1
  49. data/lib/review/pdfmaker.rb +17 -36
  50. data/lib/review/plaintextbuilder.rb +48 -2
  51. data/lib/review/preprocessor.rb +5 -5
  52. data/lib/review/rstbuilder.rb +25 -6
  53. data/lib/review/sec_counter.rb +13 -0
  54. data/lib/review/textmaker.rb +4 -12
  55. data/lib/review/tocprinter.rb +2 -3
  56. data/lib/review/topbuilder.rb +26 -0
  57. data/lib/review/update.rb +7 -7
  58. data/lib/review/version.rb +1 -1
  59. data/lib/review/volumeprinter.rb +2 -3
  60. data/lib/review/webmaker.rb +9 -20
  61. data/review.gemspec +2 -2
  62. data/samples/sample-book/src/config.yml +1 -1
  63. data/samples/syntax-book/Gemfile +1 -1
  64. data/samples/syntax-book/config.yml +1 -1
  65. data/templates/latex/config.erb +27 -23
  66. data/templates/latex/review-jlreq/README.md +3 -1
  67. data/templates/latex/review-jlreq/review-base.sty +31 -15
  68. data/templates/latex/review-jlreq/review-jlreq.cls +8 -24
  69. data/templates/latex/review-jsbook/README.md +7 -5
  70. data/templates/latex/review-jsbook/review-base.sty +34 -16
  71. data/templates/latex/review-jsbook/review-jsbook.cls +4 -2
  72. data/templates/web/html/layout-html5.html.erb +1 -1
  73. data/test/assets/test_template.tex +3 -3
  74. data/test/assets/test_template_backmatter.tex +3 -3
  75. data/test/book_test_helper.rb +11 -5
  76. data/test/test_book.rb +54 -63
  77. data/test/test_book_chapter.rb +93 -52
  78. data/test/test_builder.rb +24 -15
  79. data/test/test_converter.rb +1 -0
  80. data/test/test_epub3maker.rb +2 -2
  81. data/test/test_epubmaker.rb +8 -0
  82. data/test/test_helper.rb +4 -1
  83. data/test/test_htmlbuilder.rb +627 -56
  84. data/test/test_htmlutils.rb +0 -12
  85. data/test/test_i18n.rb +33 -33
  86. data/test/test_idgxmlbuilder.rb +358 -11
  87. data/test/test_idgxmlmaker_cmd.rb +1 -1
  88. data/test/test_index.rb +62 -52
  89. data/test/test_indexbuilder.rb +52 -0
  90. data/test/test_latexbuilder.rb +547 -10
  91. data/test/test_latexbuilder_v2.rb +43 -5
  92. data/test/test_logger.rb +7 -7
  93. data/test/test_makerhelper.rb +0 -12
  94. data/test/test_markdownbuilder.rb +3 -0
  95. data/test/test_pdfmaker.rb +13 -12
  96. data/test/test_pdfmaker_cmd.rb +1 -1
  97. data/test/test_plaintextbuilder.rb +422 -7
  98. data/test/test_review_ext.rb +2 -1
  99. data/test/test_rstbuilder.rb +25 -1
  100. data/test/test_sec_counter.rb +156 -0
  101. data/test/test_textmaker_cmd.rb +1 -1
  102. data/test/test_topbuilder.rb +187 -10
  103. data/test/test_update.rb +10 -10
  104. data/test/test_webtocprinter.rb +12 -12
  105. data/vendor/gentombow/LICENSE +1 -1
  106. data/vendor/gentombow/Makefile +0 -1
  107. data/vendor/gentombow/bounddvi-en.pdf +0 -0
  108. data/vendor/gentombow/bounddvi-en.tex +1 -0
  109. data/vendor/gentombow/bounddvi.pdf +0 -0
  110. data/vendor/gentombow/bounddvi.sty +30 -7
  111. data/vendor/gentombow/bounddvi.tex +1 -0
  112. data/vendor/gentombow/create_archive.sh +1 -0
  113. data/vendor/gentombow/gentombow-ja.pdf +0 -0
  114. data/vendor/gentombow/gentombow-ja.tex +9 -0
  115. data/vendor/gentombow/gentombow.pdf +0 -0
  116. data/vendor/gentombow/gentombow.sty +32 -10
  117. data/vendor/gentombow/gentombow.tex +8 -0
  118. data/vendor/gentombow/tests/gentombow-01-pdfx.tex +8 -0
  119. data/vendor/gentombow/tests/gentombow-02-pdfx.tex +8 -0
  120. data/vendor/jsclasses/Makefile +3 -2
  121. data/vendor/jsclasses/create_archive.sh +5 -5
  122. data/vendor/jsclasses/jis/Makefile +3 -2
  123. data/vendor/jsclasses/jis/jsarticle.cls +22 -18
  124. data/vendor/jsclasses/jis/jsbook.cls +22 -18
  125. data/vendor/jsclasses/jis/jsclasses.dtx +94 -13
  126. data/vendor/jsclasses/jis/jsclasses.ins +15 -5
  127. data/vendor/jsclasses/jis/jslogo.ins +9 -0
  128. data/vendor/jsclasses/jis/jslogo.sty +1 -13
  129. data/vendor/jsclasses/jis/jspf.cls +22 -18
  130. data/vendor/jsclasses/jis/jsreport.cls +22 -18
  131. data/vendor/jsclasses/jis/jsverb.ins +9 -0
  132. data/vendor/jsclasses/jis/jsverb.sty +1 -13
  133. data/vendor/jsclasses/jis/kiyou.cls +22 -18
  134. data/vendor/jsclasses/jis/minijs.sty +65 -22
  135. data/vendor/jsclasses/jis/okumacro.ins +9 -0
  136. data/vendor/jsclasses/jis/okumacro.sty +1 -13
  137. data/vendor/jsclasses/jis/okuverb.ins +9 -0
  138. data/vendor/jsclasses/jis/okuverb.sty +1 -13
  139. data/vendor/jsclasses/jis/winjis.sty +23 -19
  140. data/vendor/jsclasses/jsarticle.cls +22 -18
  141. data/vendor/jsclasses/jsbook.cls +22 -18
  142. data/vendor/jsclasses/jsclasses.dtx +94 -13
  143. data/vendor/jsclasses/jsclasses.ins +15 -5
  144. data/vendor/jsclasses/jsclasses.pdf +0 -0
  145. data/vendor/jsclasses/jslogo.ins +9 -0
  146. data/vendor/jsclasses/jslogo.pdf +0 -0
  147. data/vendor/jsclasses/jslogo.sty +1 -13
  148. data/vendor/jsclasses/jspf.cls +22 -18
  149. data/vendor/jsclasses/jsreport.cls +22 -18
  150. data/vendor/jsclasses/jsverb.ins +9 -0
  151. data/vendor/jsclasses/jsverb.pdf +0 -0
  152. data/vendor/jsclasses/jsverb.sty +1 -13
  153. data/vendor/jsclasses/kiyou.cls +22 -18
  154. data/vendor/jsclasses/minijs.sty +68 -22
  155. data/vendor/jsclasses/okumacro.ins +9 -0
  156. data/vendor/jsclasses/okumacro.pdf +0 -0
  157. data/vendor/jsclasses/okumacro.sty +1 -13
  158. data/vendor/jsclasses/okuverb.ins +9 -0
  159. data/vendor/jsclasses/okuverb.pdf +0 -0
  160. data/vendor/jsclasses/okuverb.sty +1 -13
  161. data/vendor/jsclasses/tests/relfont.tex +10 -0
  162. data/vendor/jsclasses/winjis.sty +23 -19
  163. metadata +14 -6
  164. data/.rubocop_todo.yml +0 -7
  165. 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
@@ -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/compilable'
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
- @list_index = nil
57
- @table_index = nil
58
- @equation_index = nil
59
- @footnote_index = nil
60
- @image_index = nil
61
- @icon_index = nil
62
- @numberless_image_index = nil
63
- @indepimage_index = nil
64
- @headline_index = nil
65
- @column_index = nil
66
- @volume = nil
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
- while f.next?
72
- case f.peek
73
- when /\A=+[\[\s\{]/
74
- m = /\A(=+)(?:\[(.+?)\])?(?:\{(.+?)\})?(.*)/.match(f.gets)
75
- return m[2] # tag
76
- when %r{/\A//[a-z]+/}
77
- line = f.gets
78
- if line.rstrip[-1, 1] == '{'
79
- f.until_match(%r{\A//\}})
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
- f.gets
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
@@ -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
- if @index.keys.map { |i| i.split('|').last }.flatten. # unfold all ids
61
- each_with_object(Hash.new(0)) { |i, h| h[i] += 1 }. # number of occurrences
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.values.each do |item|
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(chapid, basedir, types, builder)
135
+ def initialize(chapter)
181
136
  super()
182
- @chapid = chapid
183
- @basedir = basedir
184
- @types = types
185
- @logger = ReVIEW.logger
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 self.parse(src, chap)
259
- headline_index = self.new(chap)
260
- indexs = []
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 = @chap.number
192
+ n = @chapter.number
337
193
  # XXX: remove magic number (move to lib/review/book/chapter.rb)
338
- if @chap.on_appendix? && @chap.number > 0 && @chap.number < 28
339
- n = @chap.format_number(false)
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