review 3.1.0 → 5.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (225) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ruby-win.yml +45 -0
  3. data/.github/workflows/ruby.yml +27 -0
  4. data/.rubocop.yml +161 -34
  5. data/.travis.yml +16 -15
  6. data/Dockerfile +21 -5
  7. data/NEWS.ja.md +394 -0
  8. data/NEWS.md +395 -1
  9. data/README.md +10 -7
  10. data/appveyor.yml +1 -3
  11. data/bin/review-catalog-converter +5 -5
  12. data/bin/review-check +10 -12
  13. data/bin/review-checkdep +2 -2
  14. data/bin/review-compile +17 -23
  15. data/bin/review-epubmaker +3 -35
  16. data/bin/review-idgxmlmaker +16 -0
  17. data/bin/review-index +2 -89
  18. data/bin/review-preproc +13 -13
  19. data/bin/review-validate +4 -4
  20. data/bin/review-vol +4 -78
  21. data/doc/config.yml.sample +47 -12
  22. data/doc/config.yml.sample-simple +3 -2
  23. data/doc/format.ja.md +120 -17
  24. data/doc/format.md +119 -27
  25. data/doc/makeindex.ja.md +2 -2
  26. data/doc/pdfmaker.ja.md +43 -1
  27. data/doc/pdfmaker.md +42 -1
  28. data/doc/quickstart.ja.md +45 -25
  29. data/doc/quickstart.md +37 -16
  30. data/lib/epubmaker/content.rb +3 -2
  31. data/lib/epubmaker/epubcommon.rb +34 -27
  32. data/lib/epubmaker/epubv2.rb +5 -6
  33. data/lib/epubmaker/epubv3.rb +21 -18
  34. data/lib/epubmaker/producer.rb +2 -1
  35. data/lib/review/book.rb +2 -2
  36. data/lib/review/book/base.rb +91 -96
  37. data/lib/review/book/bib.rb +21 -0
  38. data/lib/review/book/book_unit.rb +155 -0
  39. data/lib/review/book/chapter.rb +48 -29
  40. data/lib/review/book/index.rb +46 -240
  41. data/lib/review/book/index/item.rb +46 -0
  42. data/lib/review/book/page_metric.rb +7 -7
  43. data/lib/review/book/part.rb +45 -10
  44. data/lib/review/book/volume.rb +4 -5
  45. data/lib/review/builder.rb +172 -56
  46. data/lib/review/catalog.rb +14 -17
  47. data/lib/review/compiler.rb +219 -121
  48. data/lib/review/configure.rb +39 -7
  49. data/lib/review/converter.rb +1 -1
  50. data/lib/review/epub2html.rb +43 -5
  51. data/lib/review/epubmaker.rb +69 -27
  52. data/lib/review/extentions/string.rb +0 -4
  53. data/lib/review/htmlbuilder.rb +112 -101
  54. data/lib/review/htmlutils.rb +9 -13
  55. data/lib/review/i18n.rb +3 -3
  56. data/lib/review/idgxmlbuilder.rb +202 -78
  57. data/lib/review/idgxmlmaker.rb +186 -0
  58. data/lib/review/index_builder.rb +653 -0
  59. data/lib/review/init-web/finish.html +10 -0
  60. data/lib/review/init-web/index.html +190 -0
  61. data/lib/review/init-web/review-layout-design.js +691 -0
  62. data/lib/review/init.rb +129 -46
  63. data/lib/review/latexbuilder.rb +255 -92
  64. data/lib/review/lineinput.rb +1 -1
  65. data/lib/review/location.rb +32 -0
  66. data/lib/review/logger.rb +4 -8
  67. data/lib/review/makerhelper.rb +35 -5
  68. data/lib/review/markdownbuilder.rb +50 -38
  69. data/lib/review/md2inaobuilder.rb +3 -5
  70. data/lib/review/pdfmaker.rb +60 -57
  71. data/lib/review/plaintextbuilder.rb +154 -87
  72. data/lib/review/preprocessor.rb +20 -42
  73. data/lib/review/rstbuilder.rb +57 -38
  74. data/lib/review/sec_counter.rb +13 -0
  75. data/lib/review/textmaker.rb +23 -15
  76. data/lib/review/textutils.rb +76 -2
  77. data/lib/review/tocprinter.rb +230 -102
  78. data/lib/review/topbuilder.rb +139 -60
  79. data/lib/review/update.rb +24 -24
  80. data/lib/review/version.rb +1 -1
  81. data/lib/review/volumeprinter.rb +98 -0
  82. data/lib/review/webmaker.rb +20 -24
  83. data/lib/review/webtocprinter.rb +38 -35
  84. data/lib/review/yamlloader.rb +26 -16
  85. data/review.gemspec +6 -4
  86. data/samples/sample-book/README.md +7 -2
  87. data/samples/sample-book/src/.gitignore +154 -0
  88. data/samples/sample-book/src/config-ebook.yml +4 -0
  89. data/samples/sample-book/src/config-jlreq-ebook.yml +4 -0
  90. data/samples/sample-book/src/config-jlreq.yml +6 -0
  91. data/samples/sample-book/src/config.yml +2 -2
  92. data/samples/sample-book/src/lib/tasks/review.rake +29 -14
  93. data/samples/sample-book/src/lib/tasks/z01_copy_sty.rake +14 -8
  94. data/samples/syntax-book/Gemfile +1 -1
  95. data/samples/syntax-book/ch01.re +4 -2
  96. data/samples/syntax-book/ch02.re +8 -16
  97. data/samples/syntax-book/ch03.re +3 -6
  98. data/samples/syntax-book/config-jlreq-lualatex.yml +4 -0
  99. data/samples/syntax-book/config-jlreq.yml +5 -0
  100. data/samples/syntax-book/config-print.yml +3 -0
  101. data/samples/syntax-book/config.yml +1 -1
  102. data/samples/syntax-book/lib/tasks/review.rake +30 -15
  103. data/samples/syntax-book/lib/tasks/z01_copy_sty.rake +14 -8
  104. data/templates/latex/config.erb +39 -25
  105. data/templates/latex/layout.tex.erb +1 -0
  106. data/templates/latex/review-jlreq/README.md +3 -1
  107. data/templates/latex/review-jlreq/review-base.sty +161 -50
  108. data/templates/latex/review-jlreq/review-jlreq.cls +21 -22
  109. data/templates/latex/review-jlreq/review-style.sty +4 -1
  110. data/templates/latex/review-jsbook/README.md +46 -5
  111. data/templates/latex/review-jsbook/review-base.sty +123 -35
  112. data/templates/latex/review-jsbook/review-jsbook.cls +10 -4
  113. data/templates/latex/review-jsbook/review-style.sty +5 -2
  114. data/templates/opf/epubv3.opf.erb +1 -0
  115. data/templates/web/html/layout-html5.html.erb +3 -3
  116. data/test/assets/test_template.tex +19 -7
  117. data/test/assets/test_template_backmatter.tex +19 -7
  118. data/test/book_test_helper.rb +11 -5
  119. data/test/test_book.rb +124 -79
  120. data/test/test_book_chapter.rb +97 -54
  121. data/test/test_book_part.rb +3 -3
  122. data/test/test_builder.rb +38 -13
  123. data/test/test_catalog.rb +24 -42
  124. data/test/test_catalog_converter_cmd.rb +1 -1
  125. data/test/test_converter.rb +1 -0
  126. data/test/test_epub3maker.rb +2 -2
  127. data/test/test_epubmaker.rb +8 -0
  128. data/test/test_epubmaker_cmd.rb +14 -7
  129. data/test/test_helper.rb +18 -7
  130. data/test/test_htmlbuilder.rb +1491 -205
  131. data/test/test_htmlutils.rb +0 -12
  132. data/test/test_i18n.rb +37 -37
  133. data/test/test_idgxmlbuilder.rb +744 -42
  134. data/test/test_idgxmlmaker_cmd.rb +46 -0
  135. data/test/test_image_finder.rb +52 -70
  136. data/test/test_index.rb +94 -44
  137. data/test/test_indexbuilder.rb +52 -0
  138. data/test/test_latexbuilder.rb +1784 -161
  139. data/test/test_latexbuilder_v2.rb +671 -102
  140. data/test/test_logger.rb +17 -4
  141. data/test/test_makerhelper.rb +2 -14
  142. data/test/test_markdownbuilder.rb +137 -16
  143. data/test/test_md2inaobuilder.rb +32 -9
  144. data/test/test_pdfmaker.rb +30 -12
  145. data/test/test_pdfmaker_cmd.rb +100 -6
  146. data/test/test_plaintextbuilder.rb +791 -30
  147. data/test/test_preprocessor.rb +2 -16
  148. data/test/test_review_ext.rb +2 -1
  149. data/test/test_rstbuilder.rb +274 -27
  150. data/test/test_sec_counter.rb +156 -0
  151. data/test/test_textmaker_cmd.rb +54 -0
  152. data/test/test_textutils.rb +109 -2
  153. data/test/test_topbuilder.rb +724 -34
  154. data/test/test_update.rb +20 -11
  155. data/test/test_webtocprinter.rb +75 -43
  156. data/test/test_yamlloader.rb +13 -0
  157. data/vendor/gentombow/LICENSE +1 -1
  158. data/vendor/gentombow/Makefile +0 -1
  159. data/vendor/gentombow/bounddvi-en.pdf +0 -0
  160. data/vendor/gentombow/bounddvi-en.tex +1 -0
  161. data/vendor/gentombow/bounddvi.pdf +0 -0
  162. data/vendor/gentombow/bounddvi.sty +30 -7
  163. data/vendor/gentombow/bounddvi.tex +1 -0
  164. data/vendor/gentombow/create_archive.sh +1 -0
  165. data/vendor/gentombow/gentombow-ja.pdf +0 -0
  166. data/vendor/gentombow/gentombow-ja.tex +9 -0
  167. data/vendor/gentombow/gentombow.pdf +0 -0
  168. data/vendor/gentombow/gentombow.sty +32 -10
  169. data/vendor/gentombow/gentombow.tex +8 -0
  170. data/vendor/gentombow/tests/gentombow-01-pdfx.tex +8 -0
  171. data/vendor/gentombow/tests/gentombow-02-pdfx.tex +8 -0
  172. data/vendor/jsclasses/LICENSE +1 -1
  173. data/vendor/jsclasses/Makefile +3 -2
  174. data/vendor/jsclasses/create_archive.sh +5 -5
  175. data/vendor/jsclasses/jis/Makefile +3 -2
  176. data/vendor/jsclasses/jis/jsarticle.cls +74 -31
  177. data/vendor/jsclasses/jis/jsbook.cls +74 -31
  178. data/vendor/jsclasses/jis/jsclasses.dtx +176 -36
  179. data/vendor/jsclasses/jis/jsclasses.ins +15 -5
  180. data/vendor/jsclasses/jis/jslogo.dtx +4 -4
  181. data/vendor/jsclasses/jis/jslogo.ins +9 -0
  182. data/vendor/jsclasses/jis/jslogo.sty +4 -16
  183. data/vendor/jsclasses/jis/jspf.cls +73 -30
  184. data/vendor/jsclasses/jis/jsreport.cls +74 -31
  185. data/vendor/jsclasses/jis/jsverb.ins +9 -0
  186. data/vendor/jsclasses/jis/jsverb.sty +1 -13
  187. data/vendor/jsclasses/jis/kiyou.cls +74 -31
  188. data/vendor/jsclasses/jis/minijs.sty +65 -22
  189. data/vendor/jsclasses/jis/okumacro.dtx +4 -5
  190. data/vendor/jsclasses/jis/okumacro.ins +9 -0
  191. data/vendor/jsclasses/jis/okumacro.sty +4 -17
  192. data/vendor/jsclasses/jis/okuverb.ins +9 -0
  193. data/vendor/jsclasses/jis/okuverb.sty +1 -13
  194. data/vendor/jsclasses/jis/winjis.sty +23 -19
  195. data/vendor/jsclasses/jsarticle.cls +74 -31
  196. data/vendor/jsclasses/jsbook.cls +74 -31
  197. data/vendor/jsclasses/jsclasses.dtx +176 -36
  198. data/vendor/jsclasses/jsclasses.ins +15 -5
  199. data/vendor/jsclasses/jsclasses.pdf +0 -0
  200. data/vendor/jsclasses/jslogo.dtx +4 -4
  201. data/vendor/jsclasses/jslogo.ins +9 -0
  202. data/vendor/jsclasses/jslogo.pdf +0 -0
  203. data/vendor/jsclasses/jslogo.sty +4 -16
  204. data/vendor/jsclasses/jspf.cls +73 -30
  205. data/vendor/jsclasses/jsreport.cls +74 -31
  206. data/vendor/jsclasses/jsverb.ins +9 -0
  207. data/vendor/jsclasses/jsverb.pdf +0 -0
  208. data/vendor/jsclasses/jsverb.sty +1 -13
  209. data/vendor/jsclasses/kiyou.cls +74 -31
  210. data/vendor/jsclasses/minijs.sty +68 -22
  211. data/vendor/jsclasses/okumacro.dtx +4 -5
  212. data/vendor/jsclasses/okumacro.ins +9 -0
  213. data/vendor/jsclasses/okumacro.pdf +0 -0
  214. data/vendor/jsclasses/okumacro.sty +4 -17
  215. data/vendor/jsclasses/okuverb.ins +9 -0
  216. data/vendor/jsclasses/okuverb.pdf +0 -0
  217. data/vendor/jsclasses/okuverb.sty +1 -13
  218. data/vendor/jsclasses/tests/relfont.tex +10 -0
  219. data/vendor/jsclasses/winjis.sty +23 -19
  220. metadata +65 -12
  221. data/.rubocop_todo.yml +0 -7
  222. data/lib/review/book/compilable.rb +0 -173
  223. data/lib/review/tocparser.rb +0 -271
  224. data/samples/syntax-book/review-ext.rb +0 -14
  225. data/test/test_tocparser.rb +0 -25
@@ -1,5 +1,5 @@
1
1
  #
2
- # Copyright (c) 2009-2017 Minero Aoki, Kenshi Muto
2
+ # Copyright (c) 2009-2019 Minero Aoki, Kenshi Muto
3
3
  # 2002-2008 Minero Aoki
4
4
  #
5
5
  # This program is free software.
@@ -7,17 +7,30 @@
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
 
19
+ def self.mkchap(book, name, number = nil)
20
+ name += book.ext if File.extname(name).empty?
21
+ path = File.join(book.contentdir, name)
22
+ raise FileNotFound, "file not exist: #{path}" unless File.file?(path)
23
+ Chapter.new(book, number, name, path)
24
+ end
25
+
26
+ def self.mkchap_ifexist(book, name, number = nil)
27
+ name += book.ext if File.extname(name).empty?
28
+ path = File.join(book.contentdir, name)
29
+ if File.file?(path)
30
+ Chapter.new(book, number, name, path)
31
+ end
32
+ end
33
+
21
34
  def initialize(book, number, name, path, io = nil)
22
35
  @book = book
23
36
  @number = number
@@ -35,38 +48,44 @@ module ReVIEW
35
48
  @content = nil
36
49
  end
37
50
  if !@content && @path && File.exist?(@path)
38
- @content = File.read(@path, mode: 'r:BOM|utf-8')
51
+ @content = File.read(@path, mode: 'rt:BOM|utf-8')
39
52
  @number = nil if %w[nonum nodisp notoc].include?(find_first_header_option)
40
53
  end
41
- @list_index = nil
42
- @table_index = nil
43
- @equation_index = nil
44
- @footnote_index = nil
45
- @image_index = nil
46
- @icon_index = nil
47
- @numberless_image_index = nil
48
- @indepimage_index = nil
49
- @headline_index = nil
50
- @column_index = nil
51
- @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
52
67
  end
53
68
 
54
69
  def find_first_header_option
55
70
  f = LineInput.new(StringIO.new(@content))
56
- while f.next?
57
- case f.peek
58
- when /\A=+[\[\s\{]/
59
- m = /\A(=+)(?:\[(.+?)\])?(?:\{(.+?)\})?(.*)/.match(f.gets)
60
- return m[2] # tag
61
- when %r{/\A//[a-z]+/}
62
- line = f.gets
63
- if line.rstrip[-1, 1] == '{'
64
- 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
65
82
  end
83
+ f.gets
66
84
  end
67
- f.gets
85
+ nil
86
+ rescue ArgumentError => e
87
+ raise ReVIEW::CompileError, "#{@name}: #{e}"
68
88
  end
69
- nil
70
89
  end
71
90
 
72
91
  def inspect
@@ -125,7 +144,7 @@ module ReVIEW
125
144
  private
126
145
 
127
146
  def on_file?(contents)
128
- contents.lines.map(&:strip).include?("#{id}#{@book.ext}")
147
+ contents.map(&:strip).include?("#{id}#{@book.ext}")
129
148
  end
130
149
 
131
150
  # backward compatibility
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2008-2018 Minero Aoki, Kenshi Muto
1
+ # Copyright (c) 2008-2019 Minero Aoki, Kenshi Muto
2
2
  # 2002-2007 Minero Aoki
3
3
  #
4
4
  # This program is free software.
@@ -12,62 +12,49 @@ require 'review/exception'
12
12
  require 'review/book/image_finder'
13
13
  require 'review/i18n'
14
14
  require 'review/logger'
15
+ require 'review/book/index/item'
15
16
 
16
17
  module ReVIEW
17
18
  module Book
18
19
  class Index
19
- def self.parse(src, *args)
20
- items = []
21
- seq = 1
22
- src.grep(%r{\A//#{item_type}}) do |line|
23
- if id = line.slice(/\[(.*?)\]/, 1)
24
- items.push item_class.new(id, seq)
25
- seq += 1
26
- if id.empty?
27
- ReVIEW.logger.warn "warning: no ID of #{item_type} in #{line}"
28
- end
29
- end
30
- end
31
- new(items, *args)
32
- end
33
-
34
- Item = Struct.new(:id, :number)
35
-
36
- def self.item_class
37
- self::Item
38
- end
39
-
40
20
  include Enumerable
41
21
 
42
22
  def item_type
43
23
  self.class.item_type
44
24
  end
45
25
 
46
- def initialize(items)
47
- @items = items
26
+ def initialize
48
27
  @index = {}
49
28
  @logger = ReVIEW.logger
50
- items.each do |i|
51
- if @index[i.id]
52
- @logger.warn "warning: duplicate ID: #{i.id} (#{i})"
53
- end
54
- @index[i.id] = i
55
- end
56
29
  @image_finder = nil
57
30
  end
58
31
 
32
+ def size
33
+ @index.size
34
+ end
35
+
36
+ def add_item(item)
37
+ if @index[item.id] && self.class != ReVIEW::Book::IconIndex
38
+ @logger.warn "warning: duplicate ID: #{item.id} (#{item.inspect})"
39
+ end
40
+ @index[item.id] = item
41
+ if item.class != ReVIEW::Book::Chapter
42
+ item.index = self
43
+ end
44
+ end
45
+
59
46
  def [](id)
60
47
  @index.fetch(id)
61
48
  rescue
62
- if @index.keys.map { |i| i.split('|').last }.flatten. # unfold all ids
63
- 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
64
51
  select { |k, v| k == id && v > 1 }.present? # detect duplicated
65
52
  raise KeyError, "key '#{id}' is ambiguous for #{self.class}"
66
53
  end
67
54
 
68
- @items.each do |i|
69
- if i.id.split('|').include?(id)
70
- return i
55
+ @index.each_value do |item|
56
+ if item.id.split('|').include?(id)
57
+ return item
71
58
  end
72
59
  end
73
60
  raise KeyError, "not found key '#{id}' for #{self.class}"
@@ -78,7 +65,7 @@ module ReVIEW
78
65
  end
79
66
 
80
67
  def each(&block)
81
- @items.each(&block)
68
+ @index.values.each(&block)
82
69
  end
83
70
 
84
71
  def key?(id)
@@ -93,8 +80,9 @@ module ReVIEW
93
80
  end
94
81
 
95
82
  def number(id)
96
- chapter = @index.fetch(id)
83
+ chapter_item = @index.fetch(id)
97
84
  begin
85
+ chapter = chapter_item.content
98
86
  chapter.format_number
99
87
  rescue # part
100
88
  I18n.t('part', chapter.number)
@@ -102,9 +90,9 @@ module ReVIEW
102
90
  end
103
91
 
104
92
  def title(id)
105
- @index.fetch(id).title
93
+ @index.fetch(id).content.title
106
94
  rescue # non-file part
107
- @index.fetch(id).name
95
+ @index.fetch(id).content.name
108
96
  end
109
97
 
110
98
  def display_string(id)
@@ -135,81 +123,24 @@ module ReVIEW
135
123
  end
136
124
 
137
125
  class FootnoteIndex < Index
138
- Item = Struct.new(:id, :number, :content)
139
-
140
- def self.parse(src)
141
- items = []
142
- seq = 1
143
- src.grep(%r{\A//footnote}) do |line|
144
- if m = /\[(.*?)\]\[(.*)\]/.match(line)
145
- m1 = m[1].gsub(/\\(\])/) { $1 }
146
- m2 = m[2].gsub(/\\(\])/) { $1 }
147
- items.push Item.new(m1, seq, m2)
148
- end
149
- seq += 1
150
- end
151
- new(items)
152
- end
153
126
  end
154
127
 
155
128
  class ImageIndex < Index
156
- def self.parse(src, *args)
157
- items = []
158
- seq = 1
159
- src.grep(%r{\A//#{item_type}}) do |line|
160
- # ex. ["//image", "id", "", "caption"]
161
- elements = line.split(/\[(.*?)\]/)
162
- if elements[1].present?
163
- if line =~ %r{\A//imgtable}
164
- items.push item_class.new(elements[1], 0, elements[3])
165
- else ## %r<\A//(image|graph)>
166
- items.push item_class.new(elements[1], seq, elements[3])
167
- seq += 1
168
- end
169
- if elements[1] == ''
170
- ReVIEW.logger.warn "warning: no ID of #{item_type} in #{line}"
171
- end
172
- end
173
- end
174
- new(items, *args)
175
- end
176
-
177
129
  def self.item_type
178
130
  '(image|graph|imgtable)'
179
131
  end
180
132
 
181
- class Item
182
- def initialize(id, number, caption = nil)
183
- @id = id
184
- @number = number
185
- @caption = caption
186
- @path = nil
187
- end
188
-
189
- attr_reader :id
190
- attr_reader :number
191
- attr_reader :caption
192
- attr_writer :index # internal use only
193
-
194
- def bound?
195
- path
196
- end
197
-
198
- def path
199
- @path ||= @index.find_path(id)
200
- end
201
- end
202
-
203
133
  attr_reader :image_finder
204
134
 
205
- def initialize(items, chapid, basedir, types, builder)
206
- super items
207
- items.each do |i|
208
- i.index = self
209
- end
210
- @chapid = chapid
211
- @basedir = basedir
212
- @types = types
135
+ def initialize(chapter)
136
+ super()
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
213
144
 
214
145
  @image_finder = ReVIEW::Book::ImageFinder.new(basedir, chapid, builder, types)
215
146
  end
@@ -220,47 +151,9 @@ module ReVIEW
220
151
  end
221
152
 
222
153
  class IconIndex < ImageIndex
223
- def initialize(items, chapid, basedir, types, builder)
224
- @items = items
225
- @index = {}
226
- items.each { |i| @index[i.id] = i }
227
- items.each { |i| i.index = self }
228
- @chapid = chapid
229
- @basedir = basedir
230
- @types = types
231
-
232
- @image_finder = ImageFinder.new(basedir, chapid, builder, types)
233
- end
234
-
235
- def self.parse(src, *args)
236
- items = []
237
- seq = 1
238
- src.grep(/@<icon>/) do |line|
239
- line.gsub(/@<icon>\{(.+?)\}/) do
240
- items.push item_class.new($1, seq)
241
- seq += 1
242
- end
243
- end
244
- new(items, *args)
245
- end
246
154
  end
247
155
 
248
156
  class BibpaperIndex < Index
249
- Item = Struct.new(:id, :number, :caption)
250
-
251
- def self.parse(src)
252
- items = []
253
- seq = 1
254
- src.grep(%r{\A//bibpaper}) do |line|
255
- if m = /\[(.*?)\]\[(.*)\]/.match(line)
256
- m1 = m[1].gsub(/\\(.)/) { $1 }
257
- m2 = m[2].gsub(/\\(.)/) { $1 }
258
- items.push Item.new(m1, seq, m2)
259
- end
260
- seq += 1
261
- end
262
- new(items)
263
- end
264
157
  end
265
158
 
266
159
  class NumberlessImageIndex < ImageIndex
@@ -268,18 +161,12 @@ module ReVIEW
268
161
  'numberlessimage'
269
162
  end
270
163
 
271
- class Item < ImageIndex::Item
272
- end
273
-
274
164
  def number(_id)
275
165
  ''
276
166
  end
277
167
  end
278
168
 
279
169
  class IndepImageIndex < ImageIndex
280
- class Item < ImageIndex::Item
281
- end
282
-
283
170
  def self.item_type
284
171
  '(indepimage|imgtable)'
285
172
  end
@@ -291,108 +178,27 @@ module ReVIEW
291
178
 
292
179
  class HeadlineIndex < Index
293
180
  HEADLINE_PATTERN = /\A(=+)(?:\[(.+?)\])?(?:\{(.+?)\})?(.*)/
294
- Item = Struct.new(:id, :number, :caption)
295
- attr_reader :items
296
-
297
- def self.parse(src, chap)
298
- items = []
299
- indexs = []
300
- headlines = []
301
- inside_column = false
302
- inside_block = nil
303
- column_level = -1
304
- src.each do |line|
305
- if line =~ %r{\A//[a-z]+.*\{\Z}
306
- inside_block = true
307
- next
308
- elsif line =~ %r{\A//\}}
309
- inside_block = nil
310
- next
311
- elsif inside_block
312
- next
313
- end
314
181
 
315
- m = HEADLINE_PATTERN.match(line)
316
- if m.nil? || m[1].size > 10 # Ignore too deep index
317
- next
318
- end
319
- index = m[1].size - 2
320
-
321
- # column
322
- if m[2] == 'column'
323
- inside_column = true
324
- column_level = index
325
- next
326
- elsif m[2] == '/column'
327
- inside_column = false
328
- next
329
- end
330
- if indexs.blank? || index <= column_level
331
- inside_column = false
332
- end
333
- next if inside_column
334
- next if m[4].strip.empty? # no title
335
-
336
- next unless index >= 0
337
- if indexs.size > (index + 1)
338
- indexs = indexs.take(index + 1)
339
- headlines = headlines.take(index + 1)
340
- end
341
- if indexs[index].nil?
342
- (0..index).each do |i|
343
- indexs[i] ||= 0
344
- end
345
- end
346
- indexs[index] += 1
347
- headlines[index] = m[3].present? ? m[3].strip : m[4].strip
348
- items.push Item.new(headlines.join('|'), indexs.dup, m[4].strip)
349
- end
350
- new(items, chap)
351
- end
352
-
353
- def initialize(items, chap)
354
- @items = items
355
- @chap = chap
356
- @index = {}
357
- @logger = ReVIEW.logger
358
- items.each do |i|
359
- if @index[i.id]
360
- @logger.warn "warning: duplicate ID: #{i.id}"
361
- end
362
- @index[i.id] = i
363
- end
182
+ def initialize(chapter)
183
+ super()
184
+ @chapter = chapter
364
185
  end
365
186
 
366
187
  def number(id)
367
- n = @chap.number
188
+ unless self[id].number
189
+ # when notoc
190
+ return ''
191
+ end
192
+ n = @chapter.number
368
193
  # XXX: remove magic number (move to lib/review/book/chapter.rb)
369
- if @chap.on_appendix? && @chap.number > 0 && @chap.number < 28
370
- n = @chap.format_number(false)
194
+ if @chapter.on_appendix? && @chapter.number > 0 && @chapter.number < 28
195
+ n = @chapter.format_number(false)
371
196
  end
372
197
  ([n] + self[id].number).join('.')
373
198
  end
374
199
  end
375
200
 
376
201
  class ColumnIndex < Index
377
- COLUMN_PATTERN = /\A(=+)\[column\](?:\{(.+?)\})?(.*)/
378
- Item = Struct.new(:id, :number, :caption)
379
-
380
- def self.parse(src, *_args)
381
- items = []
382
- seq = 1
383
- src.each do |line|
384
- m = COLUMN_PATTERN.match(line)
385
- next unless m
386
- _level = m[1] ## not use it yet
387
- id = m[2]
388
- caption = m[3].strip
389
- id = caption if id.nil? || id.empty?
390
-
391
- items.push item_class.new(id, seq, caption)
392
- seq += 1
393
- end
394
- new(items)
395
- end
396
202
  end
397
203
  end
398
204
  end