review 3.2.0 → 4.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (105) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +26 -4
  3. data/.travis.yml +1 -1
  4. data/NEWS.ja.md +97 -1
  5. data/NEWS.md +97 -1
  6. data/bin/review-catalog-converter +1 -1
  7. data/bin/review-check +5 -5
  8. data/bin/review-checkdep +1 -1
  9. data/bin/review-compile +5 -5
  10. data/bin/review-idgxmlmaker +16 -0
  11. data/bin/review-index +7 -7
  12. data/bin/review-preproc +9 -9
  13. data/bin/review-validate +2 -2
  14. data/bin/review-vol +5 -5
  15. data/doc/config.yml.sample +14 -6
  16. data/doc/config.yml.sample-simple +1 -1
  17. data/doc/format.ja.md +15 -5
  18. data/doc/format.md +30 -18
  19. data/doc/pdfmaker.ja.md +1 -1
  20. data/doc/pdfmaker.md +1 -1
  21. data/lib/review/book.rb +1 -1
  22. data/lib/review/book/base.rb +23 -63
  23. data/lib/review/book/chapter.rb +18 -3
  24. data/lib/review/book/compilable.rb +5 -0
  25. data/lib/review/book/index.rb +26 -65
  26. data/lib/review/book/index/item.rb +40 -0
  27. data/lib/review/book/part.rb +22 -2
  28. data/lib/review/builder.rb +60 -40
  29. data/lib/review/catalog.rb +12 -15
  30. data/lib/review/compiler.rb +68 -36
  31. data/lib/review/configure.rb +10 -7
  32. data/lib/review/epubmaker.rb +5 -2
  33. data/lib/review/htmlbuilder.rb +24 -71
  34. data/lib/review/htmlutils.rb +2 -3
  35. data/lib/review/i18n.rb +2 -2
  36. data/lib/review/idgxmlbuilder.rb +101 -55
  37. data/lib/review/idgxmlmaker.rb +184 -0
  38. data/lib/review/init-web/finish.html +10 -0
  39. data/lib/review/init-web/index.html +190 -0
  40. data/lib/review/init-web/review-layout-design.js +691 -0
  41. data/lib/review/init.rb +110 -26
  42. data/lib/review/latexbuilder.rb +76 -54
  43. data/lib/review/lineinput.rb +1 -1
  44. data/lib/review/logger.rb +4 -8
  45. data/lib/review/makerhelper.rb +6 -4
  46. data/lib/review/markdownbuilder.rb +25 -38
  47. data/lib/review/md2inaobuilder.rb +3 -5
  48. data/lib/review/pdfmaker.rb +15 -15
  49. data/lib/review/plaintextbuilder.rb +67 -76
  50. data/lib/review/preprocessor.rb +13 -13
  51. data/lib/review/rstbuilder.rb +31 -31
  52. data/lib/review/textmaker.rb +13 -3
  53. data/lib/review/textutils.rb +77 -2
  54. data/lib/review/tocparser.rb +17 -17
  55. data/lib/review/tocprinter.rb +8 -8
  56. data/lib/review/topbuilder.rb +76 -57
  57. data/lib/review/update.rb +16 -16
  58. data/lib/review/version.rb +1 -1
  59. data/lib/review/webmaker.rb +2 -2
  60. data/lib/review/yamlloader.rb +3 -0
  61. data/review.gemspec +4 -3
  62. data/samples/sample-book/README.md +7 -2
  63. data/samples/sample-book/src/.gitignore +153 -0
  64. data/samples/sample-book/src/config-jlreq.yml +6 -0
  65. data/samples/sample-book/src/lib/tasks/review.rake +20 -9
  66. data/samples/sample-book/src/lib/tasks/z01_copy_sty.rake +14 -8
  67. data/samples/syntax-book/ch03.re +3 -6
  68. data/samples/syntax-book/config-jlreq.yml +5 -0
  69. data/samples/syntax-book/lib/tasks/review.rake +7 -7
  70. data/samples/syntax-book/lib/tasks/z01_copy_sty.rake +14 -8
  71. data/templates/latex/config.erb +6 -0
  72. data/templates/latex/layout.tex.erb +1 -0
  73. data/templates/latex/review-jlreq/review-base.sty +93 -31
  74. data/templates/latex/review-jlreq/review-jlreq.cls +6 -0
  75. data/templates/latex/review-jlreq/review-style.sty +3 -0
  76. data/templates/latex/review-jsbook/README.md +39 -0
  77. data/templates/latex/review-jsbook/review-base.sty +65 -10
  78. data/templates/latex/review-jsbook/review-jsbook.cls +4 -0
  79. data/templates/latex/review-jsbook/review-style.sty +4 -1
  80. data/test/assets/test_template.tex +11 -3
  81. data/test/assets/test_template_backmatter.tex +11 -3
  82. data/test/test_book.rb +65 -19
  83. data/test/test_catalog.rb +18 -42
  84. data/test/test_catalog_converter_cmd.rb +1 -1
  85. data/test/test_epubmaker_cmd.rb +2 -2
  86. data/test/test_helper.rb +1 -1
  87. data/test/test_htmlbuilder.rb +144 -55
  88. data/test/test_i18n.rb +25 -25
  89. data/test/test_idgxmlbuilder.rb +60 -18
  90. data/test/test_image_finder.rb +6 -6
  91. data/test/test_latexbuilder.rb +128 -24
  92. data/test/test_latexbuilder_v2.rb +23 -23
  93. data/test/test_logger.rb +14 -1
  94. data/test/test_makerhelper.rb +3 -3
  95. data/test/test_markdownbuilder.rb +45 -4
  96. data/test/test_md2inaobuilder.rb +12 -2
  97. data/test/test_pdfmaker.rb +1 -1
  98. data/test/test_pdfmaker_cmd.rb +1 -1
  99. data/test/test_plaintextbuilder.rb +31 -6
  100. data/test/test_rstbuilder.rb +33 -4
  101. data/test/test_textutils.rb +109 -2
  102. data/test/test_topbuilder.rb +35 -7
  103. data/test/test_update.rb +17 -8
  104. data/test/test_yamlloader.rb +13 -0
  105. metadata +26 -2
@@ -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.
@@ -18,6 +18,21 @@ module ReVIEW
18
18
 
19
19
  attr_reader :number, :book
20
20
 
21
+ def self.mkchap(book, name, number = nil)
22
+ name += book.ext if File.extname(name).empty?
23
+ path = File.join(book.contentdir, name)
24
+ raise FileNotFound, "file not exist: #{path}" unless File.file?(path)
25
+ Chapter.new(book, number, name, path)
26
+ end
27
+
28
+ def self.mkchap_ifexist(book, name, number = nil)
29
+ name += book.ext if File.extname(name).empty?
30
+ path = File.join(book.contentdir, name)
31
+ if File.file?(path)
32
+ Chapter.new(book, number, name, path)
33
+ end
34
+ end
35
+
21
36
  def initialize(book, number, name, path, io = nil)
22
37
  @book = book
23
38
  @number = number
@@ -35,7 +50,7 @@ module ReVIEW
35
50
  @content = nil
36
51
  end
37
52
  if !@content && @path && File.exist?(@path)
38
- @content = File.read(@path, mode: 'r:BOM|utf-8')
53
+ @content = File.read(@path, mode: 'rt:BOM|utf-8')
39
54
  @number = nil if %w[nonum nodisp notoc].include?(find_first_header_option)
40
55
  end
41
56
  @list_index = nil
@@ -125,7 +140,7 @@ module ReVIEW
125
140
  private
126
141
 
127
142
  def on_file?(contents)
128
- contents.lines.map(&:strip).include?("#{id}#{@book.ext}")
143
+ contents.map(&:strip).include?("#{id}#{@book.ext}")
129
144
  end
130
145
 
131
146
  # backward compatibility
@@ -168,6 +168,11 @@ module ReVIEW
168
168
  def prev_chapter
169
169
  book.prev_chapter(self)
170
170
  end
171
+
172
+ def image_bound?(item_id)
173
+ item = self.image(item_id)
174
+ item.path
175
+ end
171
176
  end
172
177
  end
173
178
  end
@@ -12,6 +12,7 @@ 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
@@ -21,7 +22,7 @@ module ReVIEW
21
22
  seq = 1
22
23
  src.grep(%r{\A//#{item_type}}) do |line|
23
24
  if id = line.slice(/\[(.*?)\]/, 1)
24
- items.push item_class.new(id, seq)
25
+ items.push(ReVIEW::Book::Index::Item.new(id, seq))
25
26
  seq += 1
26
27
  if id.empty?
27
28
  ReVIEW.logger.warn "warning: no ID of #{item_type} in #{line}"
@@ -31,12 +32,6 @@ module ReVIEW
31
32
  new(items, *args)
32
33
  end
33
34
 
34
- Item = Struct.new(:id, :number)
35
-
36
- def self.item_class
37
- self::Item
38
- end
39
-
40
35
  include Enumerable
41
36
 
42
37
  def item_type
@@ -47,11 +42,11 @@ module ReVIEW
47
42
  @items = items
48
43
  @index = {}
49
44
  @logger = ReVIEW.logger
50
- items.each do |i|
51
- if @index[i.id]
52
- @logger.warn "warning: duplicate ID: #{i.id} (#{i})"
45
+ items.each do |item|
46
+ if @index[item.id]
47
+ @logger.warn "warning: duplicate ID: #{item.id} (#{item})"
53
48
  end
54
- @index[i.id] = i
49
+ @index[item.id] = item
55
50
  end
56
51
  @image_finder = nil
57
52
  end
@@ -65,9 +60,9 @@ module ReVIEW
65
60
  raise KeyError, "key '#{id}' is ambiguous for #{self.class}"
66
61
  end
67
62
 
68
- @items.each do |i|
69
- if i.id.split('|').include?(id)
70
- return i
63
+ @items.each do |item|
64
+ if item.id.split('|').include?(id)
65
+ return item
71
66
  end
72
67
  end
73
68
  raise KeyError, "not found key '#{id}' for #{self.class}"
@@ -135,8 +130,6 @@ module ReVIEW
135
130
  end
136
131
 
137
132
  class FootnoteIndex < Index
138
- Item = Struct.new(:id, :number, :content)
139
-
140
133
  def self.parse(src)
141
134
  items = []
142
135
  seq = 1
@@ -144,7 +137,7 @@ module ReVIEW
144
137
  if m = /\[(.*?)\]\[(.*)\]/.match(line)
145
138
  m1 = m[1].gsub(/\\(\])/) { $1 }
146
139
  m2 = m[2].gsub(/\\(\])/) { $1 }
147
- items.push Item.new(m1, seq, m2)
140
+ items.push(Item.new(m1, seq, m2))
148
141
  end
149
142
  seq += 1
150
143
  end
@@ -161,9 +154,9 @@ module ReVIEW
161
154
  elements = line.split(/\[(.*?)\]/)
162
155
  if elements[1].present?
163
156
  if line =~ %r{\A//imgtable}
164
- items.push item_class.new(elements[1], 0, elements[3])
157
+ items.push(ReVIEW::Book::Index::Item.new(elements[1], 0, elements[3]))
165
158
  else ## %r<\A//(image|graph)>
166
- items.push item_class.new(elements[1], seq, elements[3])
159
+ items.push(ReVIEW::Book::Index::Item.new(elements[1], seq, elements[3]))
167
160
  seq += 1
168
161
  end
169
162
  if elements[1] == ''
@@ -178,34 +171,12 @@ module ReVIEW
178
171
  '(image|graph|imgtable)'
179
172
  end
180
173
 
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
174
  attr_reader :image_finder
204
175
 
205
176
  def initialize(items, chapid, basedir, types, builder)
206
- super items
207
- items.each do |i|
208
- i.index = self
177
+ super(items)
178
+ items.each do |item|
179
+ item.index = self
209
180
  end
210
181
  @chapid = chapid
211
182
  @basedir = basedir
@@ -223,8 +194,8 @@ module ReVIEW
223
194
  def initialize(items, chapid, basedir, types, builder)
224
195
  @items = items
225
196
  @index = {}
226
- items.each { |i| @index[i.id] = i }
227
- items.each { |i| i.index = self }
197
+ items.each { |item| @index[item.id] = item }
198
+ items.each { |item| item.index = self }
228
199
  @chapid = chapid
229
200
  @basedir = basedir
230
201
  @types = types
@@ -237,7 +208,7 @@ module ReVIEW
237
208
  seq = 1
238
209
  src.grep(/@<icon>/) do |line|
239
210
  line.gsub(/@<icon>\{(.+?)\}/) do
240
- items.push item_class.new($1, seq)
211
+ items.push(ReVIEW::Book::Index::Item.new($1, seq))
241
212
  seq += 1
242
213
  end
243
214
  end
@@ -246,8 +217,6 @@ module ReVIEW
246
217
  end
247
218
 
248
219
  class BibpaperIndex < Index
249
- Item = Struct.new(:id, :number, :caption)
250
-
251
220
  def self.parse(src)
252
221
  items = []
253
222
  seq = 1
@@ -255,7 +224,7 @@ module ReVIEW
255
224
  if m = /\[(.*?)\]\[(.*)\]/.match(line)
256
225
  m1 = m[1].gsub(/\\(.)/) { $1 }
257
226
  m2 = m[2].gsub(/\\(.)/) { $1 }
258
- items.push Item.new(m1, seq, m2)
227
+ items.push(Item.new(m1, seq, m2))
259
228
  end
260
229
  seq += 1
261
230
  end
@@ -268,18 +237,12 @@ module ReVIEW
268
237
  'numberlessimage'
269
238
  end
270
239
 
271
- class Item < ImageIndex::Item
272
- end
273
-
274
240
  def number(_id)
275
241
  ''
276
242
  end
277
243
  end
278
244
 
279
245
  class IndepImageIndex < ImageIndex
280
- class Item < ImageIndex::Item
281
- end
282
-
283
246
  def self.item_type
284
247
  '(indepimage|imgtable)'
285
248
  end
@@ -291,7 +254,6 @@ module ReVIEW
291
254
 
292
255
  class HeadlineIndex < Index
293
256
  HEADLINE_PATTERN = /\A(=+)(?:\[(.+?)\])?(?:\{(.+?)\})?(.*)/
294
- Item = Struct.new(:id, :number, :caption)
295
257
  attr_reader :items
296
258
 
297
259
  def self.parse(src, chap)
@@ -349,11 +311,11 @@ module ReVIEW
349
311
 
350
312
  if %w[nonum notoc nodisp].include?(m[2])
351
313
  headlines[index] = m[3].present? ? m[3].strip : m[4].strip
352
- items.push Item.new(headlines.join('|'), nil, m[4].strip)
314
+ items.push(Item.new(headlines.join('|'), nil, m[4].strip))
353
315
  else
354
316
  indexs[index] += 1
355
317
  headlines[index] = m[3].present? ? m[3].strip : m[4].strip
356
- items.push Item.new(headlines.join('|'), indexs.dup, m[4].strip)
318
+ items.push(Item.new(headlines.join('|'), indexs.dup, m[4].strip))
357
319
  end
358
320
  end
359
321
  new(items, chap)
@@ -364,11 +326,11 @@ module ReVIEW
364
326
  @chap = chap
365
327
  @index = {}
366
328
  @logger = ReVIEW.logger
367
- items.each do |i|
368
- if @index[i.id]
369
- @logger.warn "warning: duplicate ID: #{i.id}"
329
+ items.each do |item|
330
+ if @index[item.id]
331
+ @logger.warn "warning: duplicate ID: #{item.id}"
370
332
  end
371
- @index[i.id] = i
333
+ @index[item.id] = item
372
334
  end
373
335
  end
374
336
 
@@ -388,7 +350,6 @@ module ReVIEW
388
350
 
389
351
  class ColumnIndex < Index
390
352
  COLUMN_PATTERN = /\A(=+)\[column\](?:\{(.+?)\})?(.*)/
391
- Item = Struct.new(:id, :number, :caption)
392
353
 
393
354
  def self.parse(src, *_args)
394
355
  items = []
@@ -401,7 +362,7 @@ module ReVIEW
401
362
  caption = m[3].strip
402
363
  id = caption if id.nil? || id.empty?
403
364
 
404
- items.push item_class.new(id, seq, caption)
365
+ items.push(ReVIEW::Book::Index::Item.new(id, seq, caption))
405
366
  seq += 1
406
367
  end
407
368
  new(items)
@@ -0,0 +1,40 @@
1
+ # Copyright (c) 2008-2019 Minero Aoki, Kenshi Muto
2
+ #
3
+ # This program is free software.
4
+ # You can distribute or modify this program under the terms of
5
+ # the GNU LGPL, Lesser General Public License version 2.1.
6
+ # For details of LGPL, see the file "COPYING".
7
+ #
8
+
9
+ require 'review/extentions'
10
+ require 'review/exception'
11
+ require 'review/book/image_finder'
12
+ require 'review/i18n'
13
+ require 'review/logger'
14
+
15
+ module ReVIEW
16
+ module Book
17
+ class Index
18
+ class Item
19
+ def initialize(id, number, caption = nil)
20
+ @id = id
21
+ @number = number
22
+ @caption = caption
23
+ @path = nil
24
+ @index = nil
25
+ end
26
+
27
+ attr_reader :id
28
+ attr_reader :number
29
+ attr_reader :caption
30
+ attr_writer :index # internal use only
31
+
32
+ alias_method :content, :caption
33
+
34
+ def path
35
+ @path ||= @index.find_path(id)
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2009-2018 Minero Aoki, Kenshi Muto
1
+ # Copyright (c) 2009-2019 Minero Aoki, Kenshi Muto
2
2
  # 2002-2008 Minero Aoki
3
3
  #
4
4
  # This program is free software.
@@ -13,6 +13,26 @@ module ReVIEW
13
13
  class Part
14
14
  include Compilable
15
15
 
16
+ def self.mkpart_from_namelistfile(book, path)
17
+ chaps = []
18
+ File.read(path, mode: 'rt:BOM|utf-8').split.each_with_index do |name, number|
19
+ if path =~ /PREDEF/
20
+ chaps << Chapter.mkchap(book, name)
21
+ else
22
+ chaps << Chapter.mkchap(book, name, number + 1)
23
+ end
24
+ end
25
+ Part.mkpart(chaps)
26
+ end
27
+
28
+ def self.mkpart_from_namelist(book, names)
29
+ Part.mkpart(names.map { |name| Chapter.mkchap_ifexist(book, name) }.compact)
30
+ end
31
+
32
+ def self.mkpart(chaps)
33
+ chaps.empty? ? nil : Part.new(self, nil, chaps)
34
+ end
35
+
16
36
  # if Part is dummy, `number` is nil.
17
37
  #
18
38
  def initialize(book, number, chapters, name = '', io = nil)
@@ -25,7 +45,7 @@ module ReVIEW
25
45
  if io
26
46
  @content = io.read
27
47
  elsif @path.present? && File.exist?(File.join(@book.config['contentdir'], @path))
28
- @content = File.read(File.join(@book.config['contentdir'], @path), mode: 'r:BOM|utf-8')
48
+ @content = File.read(File.join(@book.config['contentdir'], @path), mode: 'rt:BOM|utf-8')
29
49
  @name = File.basename(@name, '.re')
30
50
  end
31
51
  if file?
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2002-2018 Minero Aoki, Kenshi Muto
1
+ # Copyright (c) 2002-2019 Minero Aoki, Kenshi Muto
2
2
  #
3
3
  # This program is free software.
4
4
  # You can distribute or modify this program under the terms of
@@ -62,6 +62,15 @@ module ReVIEW
62
62
  if @book.config['tabwidth']
63
63
  @tabwidth = @book.config['tabwidth']
64
64
  end
65
+
66
+ if @book.config['join_lines_by_lang']
67
+ begin
68
+ require 'unicode/eaw'
69
+ rescue LoadError
70
+ warn 'not found unicode/eaw. disabled join_lines_by_lang feature.'
71
+ @book.config['join_lines_by_lang'] = nil
72
+ end
73
+ end
65
74
  end
66
75
  builder_init_file
67
76
  end
@@ -71,6 +80,10 @@ module ReVIEW
71
80
  end
72
81
  private :builder_init_file
73
82
 
83
+ def highlight?
84
+ false
85
+ end
86
+
74
87
  def result
75
88
  @output.string
76
89
  end
@@ -122,43 +135,55 @@ module ReVIEW
122
135
 
123
136
  def list(lines, id, caption, lang = nil)
124
137
  begin
125
- list_header id, caption, lang
138
+ list_header(id, caption, lang)
126
139
  rescue KeyError
127
140
  error "no such list: #{id}"
128
141
  end
129
- list_body id, lines, lang
142
+ list_body(id, lines, lang)
130
143
  end
131
144
 
132
145
  def listnum(lines, id, caption, lang = nil)
133
146
  begin
134
- list_header id, caption, lang
147
+ list_header(id, caption, lang)
135
148
  rescue KeyError
136
149
  error "no such list: #{id}"
137
150
  end
138
- listnum_body lines, lang
151
+ listnum_body(lines, lang)
139
152
  end
140
153
 
141
154
  def source(lines, caption, lang = nil)
142
- source_header caption
143
- source_body lines, lang
155
+ source_header(caption)
156
+ source_body(lines, lang)
144
157
  end
145
158
 
146
159
  def image(lines, id, caption, metric = nil)
147
- if @chapter.image(id).bound?
148
- image_image id, caption, metric
160
+ if @chapter.image_bound?(id)
161
+ image_image(id, caption, metric)
149
162
  else
150
163
  warn "image not bound: #{id}" if @strict
151
- image_dummy id, caption, lines
164
+ image_dummy(id, caption, lines)
152
165
  end
153
166
  end
154
167
 
155
168
  def table(lines, id = nil, caption = nil)
156
- rows = []
169
+ sepidx, rows = parse_table_rows(lines)
170
+ begin
171
+ if caption.present?
172
+ table_header(id, caption)
173
+ end
174
+ rescue KeyError
175
+ error "no such table: #{id}"
176
+ end
177
+ table_begin(rows.first.size)
178
+ table_rows(sepidx, rows)
179
+ table_end
180
+ end
181
+
182
+ def parse_table_rows(lines)
157
183
  sepidx = nil
184
+ rows = []
158
185
  lines.each_with_index do |line, idx|
159
- if /\A[\=\-]{12}/ =~ line
160
- # just ignore
161
- # error "too many table separator" if sepidx
186
+ if /\A[\=\-]{12}/ =~ line || /\A[\=\{\-\}]{12}/ =~ line
162
187
  sepidx ||= idx
163
188
  next
164
189
  end
@@ -166,15 +191,10 @@ module ReVIEW
166
191
  end
167
192
  rows = adjust_n_cols(rows)
168
193
  error 'no rows in the table' if rows.empty?
194
+ [sepidx, rows]
195
+ end
169
196
 
170
- begin
171
- if caption.present?
172
- table_header id, caption
173
- end
174
- rescue KeyError
175
- error "no such table: #{id}"
176
- end
177
- table_begin rows.first.size
197
+ def table_rows(sepidx, rows)
178
198
  if sepidx
179
199
  sepidx.times do
180
200
  tr(rows.shift.map { |s| th(s) })
@@ -188,7 +208,6 @@ module ReVIEW
188
208
  tr([th(h)] + cs.map { |s| td(s) })
189
209
  end
190
210
  end
191
- table_end
192
211
  end
193
212
 
194
213
  def adjust_n_cols(rows)
@@ -199,7 +218,7 @@ module ReVIEW
199
218
  end
200
219
  n_maxcols = rows.map(&:size).max
201
220
  rows.each do |cols|
202
- cols.concat [''] * (n_maxcols - cols.size)
221
+ cols.concat([''] * (n_maxcols - cols.size))
203
222
  end
204
223
  rows
205
224
  end
@@ -230,7 +249,7 @@ module ReVIEW
230
249
  end
231
250
 
232
251
  def inline_chapref(id)
233
- compile_inline @book.chapter_index.display_string(id)
252
+ compile_inline(@book.chapter_index.display_string(id))
234
253
  rescue KeyError
235
254
  error "unknown chapter: #{id}"
236
255
  end
@@ -242,7 +261,7 @@ module ReVIEW
242
261
  end
243
262
 
244
263
  def inline_title(id)
245
- compile_inline @book.chapter_index.title(id)
264
+ compile_inline(@book.chapter_index.title(id))
246
265
  rescue KeyError
247
266
  error "unknown chapter: #{id}"
248
267
  end
@@ -341,10 +360,10 @@ module ReVIEW
341
360
  end
342
361
 
343
362
  def bibpaper(lines, id, caption)
344
- bibpaper_header id, caption
363
+ bibpaper_header(id, caption)
345
364
  unless lines.empty?
346
365
  puts
347
- bibpaper_bibpaper id, caption, lines
366
+ bibpaper_bibpaper(id, caption, lines)
348
367
  end
349
368
  puts
350
369
  end
@@ -404,7 +423,12 @@ module ReVIEW
404
423
  end
405
424
 
406
425
  def inline_wb(s)
407
- inline_b(unescape(inline_w(s)))
426
+ translated = @dictionary[s]
427
+ if translated
428
+ inline_b(translated)
429
+ else
430
+ inline_b("[missing word: #{s}]")
431
+ end
408
432
  end
409
433
 
410
434
  def raw(str)
@@ -423,9 +447,9 @@ module ReVIEW
423
447
  if arg
424
448
  builders = arg.gsub(/^\s*\|/, '').gsub(/\|\s*$/, '').gsub(/\s/, '').split(',')
425
449
  c = target_name
426
- print lines.join if builders.include?(c)
450
+ print lines.join("\n") + "\n" if builders.include?(c)
427
451
  else
428
- print lines.join
452
+ print lines.join("\n") + "\n"
429
453
  end
430
454
  end
431
455
 
@@ -504,13 +528,13 @@ module ReVIEW
504
528
  file = "#{id}.#{image_ext}"
505
529
  file_path = File.join(dir, file)
506
530
 
507
- line = self.unescape(lines.join("\n"))
531
+ content = lines.join("\n") + "\n"
508
532
 
509
533
  tf = Tempfile.new('review_graph')
510
- tf.puts line
534
+ tf.puts content
511
535
  tf.close
512
536
  begin
513
- file_path = send("graph_#{command}".to_sym, id, file_path, line, tf.path)
537
+ file_path = send("graph_#{command}".to_sym, id, file_path, content, tf.path)
514
538
  ensure
515
539
  tf.unlink
516
540
  end
@@ -558,7 +582,7 @@ EOTGNUPLOT
558
582
  file_path.sub!(/\.pdf\Z/, '.eps')
559
583
  end
560
584
  system_graph(id, 'java', '-jar', 'plantuml.jar', "-t#{ext}", '-charset', 'UTF-8', tf_path)
561
- FileUtils.mv "#{tf_path}.#{ext}", file_path
585
+ FileUtils.mv("#{tf_path}.#{ext}", file_path)
562
586
  file_path
563
587
  end
564
588
 
@@ -567,7 +591,7 @@ EOTGNUPLOT
567
591
  end
568
592
 
569
593
  def inline_include(file_name)
570
- compile_inline File.read(file_name, mode: 'rt:BOM|utf-8').chomp
594
+ compile_inline(File.read(file_name, mode: 'rt:BOM|utf-8').chomp)
571
595
  end
572
596
 
573
597
  def ul_item_begin(lines)
@@ -634,9 +658,5 @@ EOTGNUPLOT
634
658
  def escape(str)
635
659
  str
636
660
  end
637
-
638
- def unescape(str)
639
- str
640
- end
641
661
  end
642
662
  end # module ReVIEW