review 4.2.0 → 5.0.0

Sign up to get free protection for your applications and to get access to all the features.
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