review 2.3.0 → 2.4.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 (160) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +90 -66
  3. data/.travis.yml +1 -1
  4. data/Gemfile +0 -1
  5. data/NEWS.ja.md +82 -0
  6. data/NEWS.md +83 -0
  7. data/README.md +5 -3
  8. data/Rakefile +8 -8
  9. data/bin/review +1 -5
  10. data/bin/review-catalog-converter +22 -27
  11. data/bin/review-check +36 -43
  12. data/bin/review-checkdep +10 -15
  13. data/bin/review-compile +37 -55
  14. data/bin/review-epubmaker +4 -5
  15. data/bin/review-index +21 -29
  16. data/bin/review-init +26 -37
  17. data/bin/review-pdfmaker +0 -2
  18. data/bin/review-preproc +25 -45
  19. data/bin/review-validate +19 -18
  20. data/bin/review-vol +15 -27
  21. data/doc/config.yml.sample +5 -2
  22. data/doc/format.ja.md +20 -1
  23. data/doc/format.md +21 -5
  24. data/doc/images/review-generate.png +0 -0
  25. data/lib/epubmaker.rb +1 -3
  26. data/lib/epubmaker/content.rb +24 -27
  27. data/lib/epubmaker/epubcommon.rb +135 -148
  28. data/lib/epubmaker/epubv2.rb +39 -46
  29. data/lib/epubmaker/epubv3.rb +93 -103
  30. data/lib/epubmaker/producer.rb +138 -151
  31. data/lib/epubmaker/zip_exporter.rb +21 -26
  32. data/lib/review/book.rb +3 -6
  33. data/lib/review/book/base.rb +78 -103
  34. data/lib/review/book/chapter.rb +36 -40
  35. data/lib/review/book/compilable.rb +28 -31
  36. data/lib/review/book/image_finder.rb +6 -13
  37. data/lib/review/book/index.rb +100 -121
  38. data/lib/review/book/page_metric.rb +2 -7
  39. data/lib/review/book/part.rb +18 -20
  40. data/lib/review/book/volume.rb +9 -13
  41. data/lib/review/builder.rb +81 -116
  42. data/lib/review/catalog.rb +15 -19
  43. data/lib/review/compiler.rb +64 -83
  44. data/lib/review/configure.rb +87 -97
  45. data/lib/review/converter.rb +2 -7
  46. data/lib/review/epubbuilder.rb +1 -3
  47. data/lib/review/epubmaker.rb +213 -205
  48. data/lib/review/exception.rb +2 -4
  49. data/lib/review/extentions.rb +0 -1
  50. data/lib/review/extentions/hash.rb +2 -2
  51. data/lib/review/extentions/string.rb +5 -30
  52. data/lib/review/htmlbuilder.rb +320 -375
  53. data/lib/review/htmltoc.rb +4 -7
  54. data/lib/review/htmlutils.rb +29 -32
  55. data/lib/review/i18n.rb +33 -44
  56. data/lib/review/i18n.yml +3 -3
  57. data/lib/review/idgxmlbuilder.rb +309 -345
  58. data/lib/review/latexbuilder.rb +175 -212
  59. data/lib/review/latexindex.rb +2 -8
  60. data/lib/review/latexutils.rb +33 -43
  61. data/lib/review/lineinput.rb +1 -1
  62. data/lib/review/logger.rb +21 -0
  63. data/lib/review/makerhelper.rb +1 -4
  64. data/lib/review/markdownbuilder.rb +44 -53
  65. data/lib/review/md2inaobuilder.rb +6 -12
  66. data/lib/review/pdfmaker.rb +143 -173
  67. data/lib/review/preprocessor.rb +64 -101
  68. data/lib/review/rstbuilder.rb +126 -158
  69. data/lib/review/sec_counter.rb +18 -34
  70. data/lib/review/template.rb +4 -5
  71. data/lib/review/textbuilder.rb +2 -3
  72. data/lib/review/textutils.rb +7 -13
  73. data/lib/review/tocparser.rb +31 -56
  74. data/lib/review/tocprinter.rb +26 -52
  75. data/lib/review/topbuilder.rb +219 -247
  76. data/lib/review/unfold.rb +15 -24
  77. data/lib/review/version.rb +1 -1
  78. data/lib/review/webmaker.rb +75 -99
  79. data/lib/review/webtocprinter.rb +15 -20
  80. data/lib/review/yamlloader.rb +13 -15
  81. data/review.gemspec +20 -22
  82. data/templates/latex/layout.tex.erb +2 -2
  83. data/templates/opf/epubv2.opf.erb +7 -7
  84. data/templates/opf/epubv3.opf.erb +7 -7
  85. data/templates/web/html/layout-html5.html.erb +2 -2
  86. data/test/assets/black.eps +280 -0
  87. data/test/assets/fit.png +0 -0
  88. data/test/assets/large.gif +0 -0
  89. data/test/assets/large.jpg +0 -0
  90. data/test/assets/large.png +0 -0
  91. data/test/assets/large.svg +65 -0
  92. data/test/assets/test_template.tex +1 -1
  93. data/test/book_test_helper.rb +2 -2
  94. data/test/run_test.rb +4 -4
  95. data/test/sample-book/src/Rakefile +21 -22
  96. data/test/syntax-book/Gemfile +4 -0
  97. data/test/syntax-book/Rakefile +72 -0
  98. data/test/syntax-book/appA.re +22 -0
  99. data/test/syntax-book/bib.re +6 -0
  100. data/test/syntax-book/catalog.yml +15 -0
  101. data/test/syntax-book/ch01.re +136 -0
  102. data/test/syntax-book/ch02.re +351 -0
  103. data/test/syntax-book/ch03.re +82 -0
  104. data/test/syntax-book/config.yml +35 -0
  105. data/test/syntax-book/images/ball.png +0 -0
  106. data/test/syntax-book/images/cover.jpg +0 -0
  107. data/test/syntax-book/images/fractal.png +0 -0
  108. data/test/syntax-book/images/img3-1.png +0 -0
  109. data/test/syntax-book/images/inlineicon.jpg +0 -0
  110. data/test/syntax-book/images/logic.png +0 -0
  111. data/test/syntax-book/images/logic2.png +0 -0
  112. data/test/syntax-book/images/puzzle.jpg +0 -0
  113. data/test/syntax-book/images/table.jpg +0 -0
  114. data/test/syntax-book/part2.re +6 -0
  115. data/test/syntax-book/pre01.re +26 -0
  116. data/test/syntax-book/review-ext.rb +14 -0
  117. data/test/syntax-book/sty/jumoline.sty +310 -0
  118. data/test/syntax-book/sty/reviewmacro.sty +39 -0
  119. data/test/syntax-book/style.css +494 -0
  120. data/test/syntax-book/syntax.dic +2 -0
  121. data/test/test_book.rb +106 -111
  122. data/test/test_book_chapter.rb +21 -22
  123. data/test/test_book_part.rb +3 -5
  124. data/test/test_builder.rb +11 -22
  125. data/test/test_catalog.rb +17 -18
  126. data/test/test_catalog_converter_cmd.rb +5 -5
  127. data/test/test_compiler.rb +18 -16
  128. data/test/test_configure.rb +35 -38
  129. data/test/test_converter.rb +3 -4
  130. data/test/test_epub3maker.rb +136 -117
  131. data/test/test_epubmaker.rb +107 -114
  132. data/test/test_epubmaker_cmd.rb +2 -4
  133. data/test/test_extentions_hash.rb +32 -33
  134. data/test/test_helper.rb +9 -11
  135. data/test/test_htmlbuilder.rb +454 -420
  136. data/test/test_htmltoc.rb +8 -12
  137. data/test/test_htmlutils.rb +0 -2
  138. data/test/test_i18n.rb +159 -150
  139. data/test/test_idgxmlbuilder.rb +190 -197
  140. data/test/test_image_finder.rb +21 -22
  141. data/test/test_index.rb +24 -29
  142. data/test/test_latexbuilder.rb +274 -264
  143. data/test/test_lineinput.rb +7 -10
  144. data/test/test_location.rb +7 -7
  145. data/test/test_makerhelper.rb +13 -25
  146. data/test/test_markdownbuilder.rb +23 -26
  147. data/test/test_md2inaobuilder.rb +8 -11
  148. data/test/test_pdfmaker.rb +114 -123
  149. data/test/test_pdfmaker_cmd.rb +1 -3
  150. data/test/test_review_ext.rb +3 -5
  151. data/test/test_rstbuilder.rb +92 -97
  152. data/test/test_template.rb +3 -7
  153. data/test/test_textutils.rb +27 -27
  154. data/test/test_tocparser.rb +2 -2
  155. data/test/test_topbuilder.rb +98 -103
  156. data/test/test_webtocprinter.rb +5 -6
  157. data/test/test_yamlloader.rb +42 -42
  158. data/test/test_zip_exporter.rb +12 -18
  159. metadata +86 -9
  160. data/lib/review/ewbbuilder.rb +0 -382
@@ -1,8 +1,5 @@
1
- #
2
- # $Id: book.rb 4315 2009-09-02 04:15:24Z kmuto $
3
- #
4
- # Copyright (c) 2002-2008 Minero Aoki
5
- # 2009-2017 Minero Aoki, Kenshi Muto
1
+ # Copyright (c) 2009-2017 Minero Aoki, Kenshi Muto
2
+ # 2002-2008 Minero Aoki
6
3
  #
7
4
  # This program is free software.
8
5
  # You can distribute or modify this program under the terms of
@@ -10,6 +7,7 @@
10
7
  # For details of the GNU LGPL, see the file "COPYING".
11
8
  #
12
9
  require 'review/textutils'
10
+
13
11
  module ReVIEW
14
12
  module Book
15
13
  module Compilable
@@ -42,7 +40,7 @@ module ReVIEW
42
40
  return @title if @title
43
41
 
44
42
  @title = ''
45
- return @title if !content
43
+ return @title unless content
46
44
  content.each_line do |line|
47
45
  if line =~ /\A=+/
48
46
  @title = line.sub(/\A=+(\[.+?\])?(\{.+?\})?/, '').strip
@@ -57,16 +55,16 @@ module ReVIEW
57
55
  end
58
56
 
59
57
  def volume
60
- if !@volume
61
- @volume = Volume.count_file(path())
58
+ unless @volume
59
+ @volume = Volume.count_file(path)
62
60
  @volume.page_per_kbyte = @book.page_metric.page_per_kbyte
63
61
  end
64
62
  @volume
65
63
  end
66
64
 
67
65
  # deprecated; use content()
68
- def open(&block)
69
- return (block_given?() ? yield(@io) : @io) if @io
66
+ def open(&_block)
67
+ return (block_given? ? yield(@io) : @io) if @io
70
68
  StringIO.new(content)
71
69
  end
72
70
 
@@ -78,59 +76,59 @@ module ReVIEW
78
76
 
79
77
  def lines
80
78
  # FIXME: we cannot duplicate Enumerator on ruby 1.9 HEAD
81
- (@lines ||= content().lines.to_a).dup
79
+ (@lines ||= content.lines.to_a).dup
82
80
  end
83
81
 
84
82
  def list(id)
85
- list_index()[id]
83
+ list_index[id]
86
84
  end
87
85
 
88
86
  def list_index
89
- @list_index ||= ListIndex.parse(lines())
87
+ @list_index ||= ListIndex.parse(lines)
90
88
  @list_index
91
89
  end
92
90
 
93
91
  def table(id)
94
- table_index()[id]
92
+ table_index[id]
95
93
  end
96
94
 
97
95
  def table_index
98
- @table_index ||= TableIndex.parse(lines())
96
+ @table_index ||= TableIndex.parse(lines)
99
97
  @table_index
100
98
  end
101
99
 
102
100
  def footnote(id)
103
- footnote_index()[id]
101
+ footnote_index[id]
104
102
  end
105
103
 
106
104
  def footnote_index
107
- @footnote_index ||= FootnoteIndex.parse(lines())
105
+ @footnote_index ||= FootnoteIndex.parse(lines)
108
106
  @footnote_index
109
107
  end
110
108
 
111
109
  def image(id)
112
- return image_index()[id] if image_index().key?(id)
113
- return icon_index()[id] if icon_index().key?(id)
114
- return numberless_image_index()[id] if numberless_image_index().key?(id)
115
- indepimage_index()[id]
110
+ return image_index[id] if image_index.key?(id)
111
+ return icon_index[id] if icon_index.key?(id)
112
+ return numberless_image_index[id] if numberless_image_index.key?(id)
113
+ indepimage_index[id]
116
114
  end
117
115
 
118
116
  def numberless_image_index
119
117
  @numberless_image_index ||=
120
- NumberlessImageIndex.parse(lines(), id(),
118
+ NumberlessImageIndex.parse(lines, id,
121
119
  "#{book.basedir}/#{@book.config['imagedir']}",
122
120
  @book.image_types, @book.config['builder'])
123
121
  end
124
122
 
125
123
  def image_index
126
- @image_index ||= ImageIndex.parse(lines(), id(),
124
+ @image_index ||= ImageIndex.parse(lines, id,
127
125
  "#{book.basedir}/#{@book.config['imagedir']}",
128
126
  @book.image_types, @book.config['builder'])
129
127
  @image_index
130
128
  end
131
129
 
132
130
  def icon_index
133
- @icon_index ||= IconIndex.parse(lines(), id(),
131
+ @icon_index ||= IconIndex.parse(lines, id,
134
132
  "#{book.basedir}/#{@book.config['imagedir']}",
135
133
  @book.image_types, @book.config['builder'])
136
134
  @icon_index
@@ -138,13 +136,13 @@ module ReVIEW
138
136
 
139
137
  def indepimage_index
140
138
  @indepimage_index ||=
141
- IndepImageIndex.parse(lines(), id(),
139
+ IndepImageIndex.parse(lines, id,
142
140
  "#{book.basedir}/#{@book.config['imagedir']}",
143
141
  @book.image_types, @book.config['builder'])
144
142
  end
145
143
 
146
144
  def bibpaper(id)
147
- bibpaper_index()[id]
145
+ bibpaper_index[id]
148
146
  end
149
147
 
150
148
  def bibpaper_index
@@ -154,19 +152,19 @@ module ReVIEW
154
152
  end
155
153
 
156
154
  def headline(caption)
157
- headline_index()[caption]
155
+ headline_index[caption]
158
156
  end
159
157
 
160
158
  def headline_index
161
- @headline_index ||= HeadlineIndex.parse(lines(), self)
159
+ @headline_index ||= HeadlineIndex.parse(lines, self)
162
160
  end
163
161
 
164
162
  def column(id)
165
- column_index()[id]
163
+ column_index[id]
166
164
  end
167
165
 
168
166
  def column_index
169
- @column_index ||= ColumnIndex.parse(lines())
167
+ @column_index ||= ColumnIndex.parse(lines)
170
168
  end
171
169
 
172
170
  def next_chapter
@@ -179,4 +177,3 @@ module ReVIEW
179
177
  end
180
178
  end
181
179
  end
182
-
@@ -1,5 +1,5 @@
1
1
  #
2
- # Copyright (c) 2014 Minero Aoki, Kenshi Muto, Masayoshi Takahashi
2
+ # Copyright (c) 2014-2017 Minero Aoki, Kenshi Muto, Masayoshi Takahashi
3
3
  #
4
4
  # This program is free software.
5
5
  # You can distribute or modify this program under the terms of
@@ -18,28 +18,22 @@ module ReVIEW
18
18
  @chapid = chapid
19
19
  @builder = builder
20
20
  @exts = exts
21
- @entries = get_entries()
21
+ @entries = dir_entries
22
22
  end
23
23
 
24
- def get_entries
25
- Dir.glob(File.join(@basedir, "**{,/*/**}/*.*")).uniq
24
+ def dir_entries
25
+ Dir.glob(File.join(@basedir, '**{,/*/**}/*.*')).uniq
26
26
  end
27
27
 
28
28
  def add_entry(path)
29
- unless @entries.include?(path)
30
- @entries << path
31
- end
29
+ @entries << path unless @entries.include?(path)
32
30
  @entries
33
31
  end
34
32
 
35
33
  def find_path(id)
36
34
  targets = target_list(id)
37
35
  targets.each do |target|
38
- @exts.each do |ext|
39
- if @entries.include?("#{target}#{ext}")
40
- return "#{target}#{ext}"
41
- end
42
- end
36
+ @exts.each { |ext| return "#{target}#{ext}" if @entries.include?("#{target}#{ext}") }
43
37
  end
44
38
  nil
45
39
  end
@@ -65,7 +59,6 @@ module ReVIEW
65
59
  "#{@basedir}/#{id}"
66
60
  ]
67
61
  end
68
-
69
62
  end
70
63
  end
71
64
  end
@@ -1,7 +1,5 @@
1
- # encoding: utf-8
2
-
3
- # Copyright (c) 2002-2007 Minero Aoki
4
- # 2008-2017 Minero Aoki, Kenshi Muto
1
+ # Copyright (c) 2008-2017 Minero Aoki, Kenshi Muto
2
+ # 2002-2007 Minero Aoki
5
3
  #
6
4
  # This program is free software.
7
5
  # You can distribute or modify this program under the terms of
@@ -13,20 +11,19 @@ require 'review/extentions'
13
11
  require 'review/exception'
14
12
  require 'review/book/image_finder'
15
13
  require 'review/i18n'
14
+ require 'review/logger'
16
15
 
17
16
  module ReVIEW
18
17
  module Book
19
18
  class Index
20
- def Index.parse(src, *args)
19
+ def self.parse(src, *args)
21
20
  items = []
22
21
  seq = 1
23
- src.grep(%r<^//#{item_type()}>) do |line|
22
+ src.grep(%r{\A//#{item_type}}) do |line|
24
23
  if id = line.slice(/\[(.*?)\]/, 1)
25
- items.push item_class().new(id, seq)
24
+ items.push item_class.new(id, seq)
26
25
  seq += 1
27
- if id == ""
28
- warn "warning: no ID of #{item_type()} in #{line}"
29
- end
26
+ ReVIEW.logger.warn "warning: no ID of #{item_type} in #{line}" if id.empty?
30
27
  end
31
28
  end
32
29
  new(items, *args)
@@ -34,7 +31,7 @@ module ReVIEW
34
31
 
35
32
  Item = Struct.new(:id, :number)
36
33
 
37
- def Index.item_class
34
+ def self.item_class
38
35
  self::Item
39
36
  end
40
37
 
@@ -47,8 +44,9 @@ module ReVIEW
47
44
  def initialize(items)
48
45
  @items = items
49
46
  @index = {}
47
+ @logger = ReVIEW.logger
50
48
  items.each do |i|
51
- warn "warning: duplicate ID: #{i.id} (#{i})" unless @index[i.id].nil?
49
+ @logger.warn "warning: duplicate ID: #{i.id} (#{i})" if @index[i.id]
52
50
  @index[i.id] = i
53
51
  end
54
52
  @image_finder = nil
@@ -57,16 +55,14 @@ module ReVIEW
57
55
  def [](id)
58
56
  @index.fetch(id)
59
57
  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
62
- select{|k, v| k == id && v > 1 }.present? # detect duplicated
58
+ if @index.keys.map { |i| i.split('|').last }.flatten. # unfold all ids
59
+ each_with_object(Hash.new(0)) { |i, h| h[i] += 1 }. # number of occurrences
60
+ select { |k, v| k == id && v > 1 }.present? # detect duplicated
63
61
  raise KeyError, "key '#{id}' is ambiguous for #{self.class}"
64
62
  end
65
63
 
66
64
  @items.each do |i|
67
- if i.id.split(/\|/).include?(id)
68
- return i
69
- end
65
+ return i if i.id.split('|').include?(id)
70
66
  end
71
67
  raise KeyError, "not found key '#{id}' for #{self.class}"
72
68
  end
@@ -80,12 +76,11 @@ module ReVIEW
80
76
  end
81
77
 
82
78
  def key?(id)
83
- return @index.key?(id)
79
+ @index.key?(id)
84
80
  end
85
81
  alias_method :has_key?, :key?
86
82
  end
87
83
 
88
-
89
84
  class ChapterIndex < Index
90
85
  def item_type
91
86
  'chapter'
@@ -95,7 +90,7 @@ module ReVIEW
95
90
  chapter = @index.fetch(id)
96
91
  chapter.format_number
97
92
  rescue # part
98
- "#{I18n.t("part", chapter.number)}"
93
+ I18n.t('part', chapter.number)
99
94
  end
100
95
 
101
96
  def title(id)
@@ -105,35 +100,32 @@ module ReVIEW
105
100
  end
106
101
 
107
102
  def display_string(id)
108
- "#{number(id)}#{I18n.t("chapter_quote", title(id))}"
103
+ "#{number(id)}#{I18n.t('chapter_quote', title(id))}"
109
104
  end
110
105
  end
111
106
 
112
-
113
107
  class ListIndex < Index
114
- def ListIndex.item_type
108
+ def self.item_type
115
109
  '(list|listnum)'
116
110
  end
117
111
  end
118
112
 
119
-
120
113
  class TableIndex < Index
121
- def TableIndex.item_type
114
+ def self.item_type
122
115
  '(table|imgtable)'
123
116
  end
124
117
  end
125
118
 
126
-
127
119
  class FootnoteIndex < Index
128
120
  Item = Struct.new(:id, :number, :content)
129
121
 
130
- def FootnoteIndex.parse(src)
122
+ def self.parse(src)
131
123
  items = []
132
124
  seq = 1
133
- src.grep(%r<^//footnote>) do |line|
125
+ src.grep(%r{\A//footnote}) do |line|
134
126
  if m = /\[(.*?)\]\[(.*)\]/.match(line)
135
- m1 = m[1].gsub(/\\(\])/){$1}
136
- m2 = m[2].gsub(/\\(\])/){$1}
127
+ m1 = m[1].gsub(/\\(\])/) { $1 }
128
+ m2 = m[2].gsub(/\\(\])/) { $1 }
137
129
  items.push Item.new(m1, seq, m2)
138
130
  end
139
131
  seq += 1
@@ -142,31 +134,31 @@ module ReVIEW
142
134
  end
143
135
  end
144
136
 
145
-
146
137
  class ImageIndex < Index
147
138
  def self.parse(src, *args)
148
139
  items = []
149
140
  seq = 1
150
- src.grep(%r<^//#{item_type()}>) do |line|
141
+ src.grep(%r{\A//#{item_type}}) do |line|
151
142
  # ex. ["//image", "id", "", "caption"]
152
143
  elements = line.split(/\[(.*?)\]/)
153
144
  if elements[1].present?
154
- if line =~ %r{^//imgtable}
155
- items.push item_class().new(elements[1], 0, elements[3])
156
- else ## %r<^//(image|graph)>
157
- items.push item_class().new(elements[1], seq, elements[3])
145
+ if line =~ %r{\A//imgtable}
146
+ items.push item_class.new(elements[1], 0, elements[3])
147
+ else ## %r<\A//(image|graph)>
148
+ items.push item_class.new(elements[1], seq, elements[3])
158
149
  seq += 1
159
150
  end
160
- if elements[1] == ""
161
- warn "warning: no ID of #{item_type()} in #{line}"
162
- end
151
+ ReVIEW.logger.warn "warning: no ID of #{item_type} in #{line}" if elements[1] == ''
163
152
  end
164
153
  end
165
154
  new(items, *args)
166
155
  end
167
156
 
168
- class Item
157
+ def self.item_type
158
+ '(image|graph|imgtable)'
159
+ end
169
160
 
161
+ class Item
170
162
  def initialize(id, number, caption = nil)
171
163
  @id = id
172
164
  @number = number
@@ -188,10 +180,6 @@ module ReVIEW
188
180
  end
189
181
  end
190
182
 
191
- def ImageIndex.item_type
192
- '(image|graph|imgtable)'
193
- end
194
-
195
183
  attr_reader :image_finder
196
184
 
197
185
  def initialize(items, chapid, basedir, types, builder)
@@ -203,8 +191,7 @@ module ReVIEW
203
191
  @basedir = basedir
204
192
  @types = types
205
193
 
206
- @image_finder = ReVIEW::Book::ImageFinder.new(basedir, chapid,
207
- builder, types)
194
+ @image_finder = ReVIEW::Book::ImageFinder.new(basedir, chapid, builder, types)
208
195
  end
209
196
 
210
197
  def find_path(id)
@@ -216,13 +203,8 @@ module ReVIEW
216
203
  def initialize(items, chapid, basedir, types, builder)
217
204
  @items = items
218
205
  @index = {}
219
- items.each do |i|
220
- ## warn "warning: duplicate ID: #{i.id} (#{i})" unless @index[i.id].nil?
221
- @index[i.id] = i
222
- end
223
- items.each do |i|
224
- i.index = self
225
- end
206
+ items.each { |i| @index[i.id] = i }
207
+ items.each { |i| i.index = self }
226
208
  @chapid = chapid
227
209
  @basedir = basedir
228
210
  @types = types
@@ -230,12 +212,12 @@ module ReVIEW
230
212
  @image_finder = ImageFinder.new(basedir, chapid, builder, types)
231
213
  end
232
214
 
233
- def IconIndex.parse(src, *args)
215
+ def self.parse(src, *args)
234
216
  items = []
235
217
  seq = 1
236
- src.grep(%r!@<icon>!) do |line|
237
- line.gsub(/@<icon>\{(.+?)\}/) do |m|
238
- items.push item_class().new($1, seq)
218
+ src.grep(/@<icon>/) do |line|
219
+ line.gsub(/@<icon>\{(.+?)\}/) do
220
+ items.push item_class.new($1, seq)
239
221
  seq += 1
240
222
  end
241
223
  end
@@ -246,13 +228,13 @@ module ReVIEW
246
228
  class BibpaperIndex < Index
247
229
  Item = Struct.new(:id, :number, :caption)
248
230
 
249
- def BibpaperIndex.parse(src)
231
+ def self.parse(src)
250
232
  items = []
251
233
  seq = 1
252
- src.grep(%r<^//bibpaper>) do |line|
234
+ src.grep(%r{\A//bibpaper}) do |line|
253
235
  if m = /\[(.*?)\]\[(.*)\]/.match(line)
254
- m1 = m[1].gsub(/\\(.)/){$1}
255
- m2 = m[2].gsub(/\\(.)/){$1}
236
+ m1 = m[1].gsub(/\\(.)/) { $1 }
237
+ m2 = m[2].gsub(/\\(.)/) { $1 }
256
238
  items.push Item.new(m1, seq, m2)
257
239
  end
258
240
  seq += 1
@@ -262,15 +244,15 @@ module ReVIEW
262
244
  end
263
245
 
264
246
  class NumberlessImageIndex < ImageIndex
265
- class Item < ImageIndex::Item
247
+ def self.item_type
248
+ 'numberlessimage'
266
249
  end
267
250
 
268
- def NumberlessImageIndex.item_type
269
- 'numberlessimage'
251
+ class Item < ImageIndex::Item
270
252
  end
271
253
 
272
- def number(id)
273
- ""
254
+ def number(_id)
255
+ ''
274
256
  end
275
257
  end
276
258
 
@@ -278,12 +260,12 @@ module ReVIEW
278
260
  class Item < ImageIndex::Item
279
261
  end
280
262
 
281
- def IndepImageIndex.item_type
263
+ def self.item_type
282
264
  '(indepimage|imgtable)'
283
265
  end
284
266
 
285
- def number(id)
286
- ""
267
+ def number(_id)
268
+ ''
287
269
  end
288
270
  end
289
271
 
@@ -292,45 +274,48 @@ module ReVIEW
292
274
  Item = Struct.new(:id, :number, :caption)
293
275
  attr_reader :items
294
276
 
295
- def HeadlineIndex.parse(src, chap)
277
+ def self.parse(src, chap)
296
278
  items = []
297
279
  indexs = []
298
280
  headlines = []
299
281
  inside_column = false
282
+ inside_block = nil
300
283
  src.each do |line|
301
- if m = HEADLINE_PATTERN.match(line)
302
- next if m[1].size > 10 # Ignore too deep index
303
- index = m[1].size - 2
304
-
305
- # column
306
- if m[2] == 'column'
307
- inside_column = true
308
- next
309
- end
310
- if m[2] == '/column'
311
- inside_column = false
312
- next
313
- end
314
- if indexs.blank? || index <= indexs[-1]
315
- inside_column = false
316
- end
317
- if inside_column
318
- next
319
- end
284
+ if line =~ %r{\A//[a-z]+.*\{\Z}
285
+ inside_block = true
286
+ next
287
+ elsif line =~ %r{\A//\}}
288
+ inside_block = nil
289
+ next
290
+ elsif inside_block
291
+ next
292
+ end
320
293
 
321
- if index >= 0
322
- if indexs.size > (index + 1)
323
- indexs = indexs.take(index + 1)
324
- headlines = headlines.take(index + 1)
325
- end
326
- if indexs[index].nil?
327
- (0..index).each{|i| indexs[i] = 0 if indexs[i].nil?}
328
- end
329
- indexs[index] += 1
330
- headlines[index] = m[3].present? ? m[3].strip : m[4].strip
331
- items.push Item.new(headlines.join("|"), indexs.dup, m[4].strip)
332
- end
294
+ m = HEADLINE_PATTERN.match(line)
295
+ next if m.nil? || m[1].size > 10 # Ignore too deep index
296
+ next if m[4].strip.empty? # no title
297
+ index = m[1].size - 2
298
+
299
+ # column
300
+ if m[2] == 'column'
301
+ inside_column = true
302
+ next
303
+ elsif m[2] == '/column'
304
+ inside_column = false
305
+ next
306
+ end
307
+ inside_column = false if indexs.blank? || index <= indexs[-1]
308
+ next if inside_column
309
+
310
+ next unless index >= 0
311
+ if indexs.size > (index + 1)
312
+ indexs = indexs.take(index + 1)
313
+ headlines = headlines.take(index + 1)
333
314
  end
315
+ (0..index).each { |i| indexs[i] = 0 if indexs[i].nil? } if indexs[index].nil?
316
+ indexs[index] += 1
317
+ headlines[index] = m[3].present? ? m[3].strip : m[4].strip
318
+ items.push Item.new(headlines.join('|'), indexs.dup, m[4].strip)
334
319
  end
335
320
  new(items, chap)
336
321
  end
@@ -340,17 +325,15 @@ module ReVIEW
340
325
  @chap = chap
341
326
  @index = {}
342
327
  items.each do |i|
343
- warn "warning: duplicate ID: #{i.id}" unless @index[i.id].nil?
328
+ @logger.warn "warning: duplicate ID: #{i.id}" if @index[i.id]
344
329
  @index[i.id] = i
345
330
  end
346
331
  end
347
332
 
348
333
  def number(id)
349
334
  n = @chap.number
350
- if @chap.on_APPENDIX? && @chap.number > 0 && @chap.number < 28
351
- n = @chap.format_number(false)
352
- end
353
- return ([n] + self[id].number).join(".")
335
+ n = @chap.format_number(false) if @chap.on_appendix? && @chap.number > 0 && @chap.number < 28
336
+ ([n] + self[id].number).join('.')
354
337
  end
355
338
  end
356
339
 
@@ -358,26 +341,22 @@ module ReVIEW
358
341
  COLUMN_PATTERN = /\A(=+)\[column\](?:\{(.+?)\})?(.*)/
359
342
  Item = Struct.new(:id, :number, :caption)
360
343
 
361
- def ColumnIndex.parse(src, *args)
344
+ def self.parse(src, *_args)
362
345
  items = []
363
346
  seq = 1
364
347
  src.each do |line|
365
- if m = COLUMN_PATTERN.match(line)
366
- _level = m[1] ## not use it yet
367
- id = m[2]
368
- caption = m[3].strip
369
- if !id || id == ""
370
- id = caption
371
- end
372
-
373
- items.push item_class().new(id, seq, caption)
374
- seq += 1
375
- end
348
+ m = COLUMN_PATTERN.match(line)
349
+ next unless m
350
+ _level = m[1] ## not use it yet
351
+ id = m[2]
352
+ caption = m[3].strip
353
+ id = caption if id.nil? || id.empty?
354
+
355
+ items.push item_class.new(id, seq, caption)
356
+ seq += 1
376
357
  end
377
358
  new(items)
378
359
  end
379
-
380
360
  end
381
-
382
361
  end
383
362
  end