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
@@ -0,0 +1,46 @@
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_accessor :index # internal use only
31
+
32
+ alias_method :content, :caption
33
+
34
+ def path
35
+ if @path
36
+ return @path
37
+ end
38
+
39
+ @path = @index.find_path(@id)
40
+
41
+ @path
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2009-2017 Minero Aoki, Kenshi Muto
1
+ # Copyright (c) 2009-2020 Minero Aoki, Kenshi Muto
2
2
  # 2002-2008 Minero Aoki
3
3
  #
4
4
  # This program is free software.
@@ -11,21 +11,21 @@ module ReVIEW
11
11
  class PageMetric
12
12
  MetricData = Struct.new(:n_lines, :n_columns)
13
13
 
14
- def initialize(list_lines, list_columns, text_lines, text_columns, page_per_kbyte)
14
+ def initialize(list_lines, list_columns, text_lines, text_columns, _page_per_kbyte = 1)
15
+ # page_per_kbyte is obsolete. Just for backward compatibility
15
16
  @list = MetricData.new(list_lines, list_columns)
16
17
  @text = MetricData.new(text_lines, text_columns)
17
- @page_per_kbyte = page_per_kbyte
18
18
  end
19
19
 
20
- A5 = PageMetric.new(46, 80, 30, 74, 1)
21
- B5 = PageMetric.new(46, 80, 30, 74, 2)
20
+ # based on review-jsbook's default
21
+ A5 = PageMetric.new(40, 34, 29, 34)
22
+ B5 = PageMetric.new(50, 40, 36, 40)
22
23
 
23
24
  attr_reader :list
24
25
  attr_reader :text
25
- attr_reader :page_per_kbyte
26
26
 
27
27
  def ==(other)
28
- self.list == other.list && self.text == other.text && self.page_per_kbyte == other.page_per_kbyte
28
+ self.list == other.list && self.text == other.text
29
29
  end
30
30
  end
31
31
  end
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2009-2018 Minero Aoki, Kenshi Muto
1
+ # Copyright (c) 2009-2020 Minero Aoki, Kenshi Muto, Masayoshi Takahashi
2
2
  # 2002-2008 Minero Aoki
3
3
  #
4
4
  # This program is free software.
@@ -6,27 +6,46 @@
6
6
  # the GNU LGPL, Lesser General Public License version 2.1.
7
7
  # For details of the GNU LGPL, see the file "COPYING".
8
8
  #
9
- require 'review/book/compilable'
9
+ require 'review/book/book_unit'
10
10
 
11
11
  module ReVIEW
12
12
  module Book
13
- class Part
14
- include Compilable
13
+ class Part < BookUnit
14
+ def self.mkpart_from_namelistfile(book, path)
15
+ chaps = []
16
+ File.read(path, mode: 'rt:BOM|utf-8').split.each_with_index do |name, number|
17
+ if path =~ /PREDEF/
18
+ chaps << Chapter.mkchap(book, name)
19
+ else
20
+ chaps << Chapter.mkchap(book, name, number + 1)
21
+ end
22
+ end
23
+ Part.mkpart(chaps)
24
+ end
25
+
26
+ def self.mkpart_from_namelist(book, names)
27
+ Part.mkpart(names.map { |name| Chapter.mkchap_ifexist(book, name) }.compact)
28
+ end
29
+
30
+ def self.mkpart(chaps)
31
+ chaps.empty? ? nil : Part.new(chaps[0].book, nil, chaps)
32
+ end
15
33
 
16
34
  # if Part is dummy, `number` is nil.
17
35
  #
18
36
  def initialize(book, number, chapters, name = '', io = nil)
19
37
  @book = book
20
38
  @number = number
21
- @chapters = chapters
22
39
  @name = name
40
+ @chapters = chapters
23
41
  @path = name
24
- @content = nil
25
42
  if io
26
43
  @content = io.read
27
44
  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')
29
- @name = File.basename(@name, '.re')
45
+ @content = File.read(File.join(@book.config['contentdir'], @path), mode: 'rt:BOM|utf-8')
46
+ @name = File.basename(name, '.re')
47
+ else
48
+ @content = ''
30
49
  end
31
50
  if file?
32
51
  @title = nil
@@ -34,6 +53,19 @@ module ReVIEW
34
53
  @title = name
35
54
  end
36
55
  @volume = nil
56
+
57
+ super()
58
+ end
59
+
60
+ def generate_indexes
61
+ super
62
+
63
+ return unless content
64
+
65
+ @numberless_image_index = @indexes.numberless_image_index
66
+ @image_index = @indexes.image_index
67
+ @icon_index = @indexes.icon_index
68
+ @indepimage_index = @indexes.indepimage_index
37
69
  end
38
70
 
39
71
  attr_reader :number
@@ -45,8 +77,11 @@ module ReVIEW
45
77
  end
46
78
 
47
79
  def volume
48
- vol = Volume.sum(@chapters.map(&:volume))
49
- vol.page_per_kbyte = @book.page_metric.page_per_kbyte
80
+ if @number && file?
81
+ vol = Volume.count_file(File.join(@book.config['contentdir'], @path))
82
+ else
83
+ vol = Volume.new(0, 0, 0)
84
+ end
50
85
  vol
51
86
  end
52
87
 
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2007-2017 Minero Aoki, Kenshi Muto
1
+ # Copyright (c) 2007-2020 Minero Aoki, Kenshi Muto
2
2
  # 2002-2007 Minero Aoki
3
3
  #
4
4
  # This program is free software.
@@ -22,7 +22,7 @@ module ReVIEW
22
22
  end
23
23
 
24
24
  def self.sum(vols)
25
- vols.inject(new) { |sum, i| sum + i }
25
+ vols.inject(new) { |sum, i| sum + i } # rubocop:disable Performance/Sum
26
26
  end
27
27
 
28
28
  def self.dummy
@@ -33,20 +33,19 @@ module ReVIEW
33
33
  @bytes = bytes
34
34
  @chars = chars
35
35
  @lines = lines
36
- @page_per_kbyte = nil
37
36
  end
38
37
 
39
38
  attr_reader :bytes
40
39
  attr_reader :chars
41
40
  attr_accessor :lines
42
- attr_accessor :page_per_kbyte
43
41
 
44
42
  def kbytes
45
43
  (@bytes.to_f / 1024).ceil
46
44
  end
47
45
 
48
46
  def page
49
- (kbytes.to_f / @page_per_kbyte).ceil
47
+ # XXX:unrelibable
48
+ kbytes.to_f.ceil
50
49
  end
51
50
 
52
51
  def to_s
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2002-2018 Minero Aoki, Kenshi Muto
1
+ # Copyright (c) 2002-2020 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
@@ -11,7 +11,6 @@ require 'review/textutils'
11
11
  require 'review/compiler'
12
12
  require 'review/sec_counter'
13
13
  require 'stringio'
14
- require 'cgi'
15
14
  require 'fileutils'
16
15
  require 'tempfile'
17
16
  require 'csv'
@@ -20,7 +19,7 @@ module ReVIEW
20
19
  class Builder
21
20
  include TextUtils
22
21
 
23
- CAPTION_TITLES = %w[note memo tip info warning important caution notice].freeze
22
+ CAPTION_TITLES = Compiler.minicolumn_names
24
23
 
25
24
  def pre_paragraph
26
25
  nil
@@ -30,21 +29,17 @@ module ReVIEW
30
29
  nil
31
30
  end
32
31
 
33
- attr_accessor :doc_status
32
+ attr_accessor :doc_status, :previous_list_type
34
33
 
35
- def initialize(strict = false, *args)
34
+ def initialize(strict = false, *_args)
36
35
  @strict = strict
37
36
  @output = nil
38
37
  @logger = ReVIEW.logger
39
38
  @doc_status = {}
40
39
  @dictionary = {}
41
- builder_init(*args)
40
+ @previous_list_type = nil
42
41
  end
43
42
 
44
- def builder_init(*args)
45
- end
46
- private :builder_init
47
-
48
43
  def bind(compiler, chapter, location)
49
44
  @compiler = compiler
50
45
  @chapter = chapter
@@ -53,26 +48,62 @@ module ReVIEW
53
48
  if @chapter.present?
54
49
  @book = @chapter.book
55
50
  end
51
+ @chapter.generate_indexes
52
+ if @book
53
+ @book.generate_indexes
54
+ end
56
55
  @tabwidth = nil
57
56
  @tsize = nil
58
57
  if @book && @book.config
59
- if @book.config['words_file']
60
- load_words(@book.config['words_file'])
58
+ if words_file_path = @book.config['words_file']
59
+ if words_file_path.is_a?(String)
60
+ words_files = [words_file_path]
61
+ else
62
+ words_files = words_file_path
63
+ end
64
+ words_files.each do |f|
65
+ load_words(f)
66
+ end
61
67
  end
62
68
  if @book.config['tabwidth']
63
69
  @tabwidth = @book.config['tabwidth']
64
70
  end
71
+
72
+ if @book.config['join_lines_by_lang']
73
+ begin
74
+ require 'unicode/eaw'
75
+ rescue LoadError
76
+ warn 'not found unicode/eaw. disabled join_lines_by_lang feature.'
77
+ @book.config['join_lines_by_lang'] = nil
78
+ end
79
+ end
65
80
  end
66
81
  builder_init_file
67
82
  end
68
83
 
69
84
  def builder_init_file
70
85
  @sec_counter = SecCounter.new(5, @chapter)
86
+ @doc_status = {}
71
87
  end
72
88
  private :builder_init_file
73
89
 
90
+ def highlight?
91
+ false
92
+ end
93
+
94
+ def solve_nest(s)
95
+ check_nest
96
+ s.gsub(/\x01→.+?←\x01/, '')
97
+ end
98
+
99
+ def check_nest
100
+ if @children && !@children.empty?
101
+ error "//beginchild of #{@children.reverse.join(',')} misses //endchild"
102
+ end
103
+ end
104
+
74
105
  def result
75
- @output.string
106
+ solve_nest(@output.string)
76
107
  end
77
108
 
78
109
  alias_method :raw_result, :result
@@ -122,59 +153,87 @@ module ReVIEW
122
153
 
123
154
  def list(lines, id, caption, lang = nil)
124
155
  begin
125
- list_header id, caption, lang
156
+ list_header(id, caption, lang) if caption_top?('list')
157
+ list_body(id, lines, lang)
158
+ list_header(id, caption, lang) unless caption_top?('list')
126
159
  rescue KeyError
127
160
  error "no such list: #{id}"
128
161
  end
129
- list_body id, lines, lang
130
162
  end
131
163
 
132
164
  def listnum(lines, id, caption, lang = nil)
133
165
  begin
134
- list_header id, caption, lang
166
+ list_header(id, caption, lang) if caption_top?('list')
167
+ listnum_body(lines, lang)
168
+ list_header(id, caption, lang) unless caption_top?('list')
135
169
  rescue KeyError
136
170
  error "no such list: #{id}"
137
171
  end
138
- listnum_body lines, lang
139
172
  end
140
173
 
141
- def source(lines, caption, lang = nil)
142
- source_header caption
143
- source_body lines, lang
174
+ def source(lines, caption = nil, lang = nil)
175
+ source_header(caption) if caption_top?('list')
176
+ source_body(lines, lang)
177
+ source_header(caption) unless caption_top?('list')
144
178
  end
145
179
 
146
180
  def image(lines, id, caption, metric = nil)
147
- if @chapter.image(id).bound?
148
- image_image id, caption, metric
181
+ if @chapter.image_bound?(id)
182
+ image_image(id, caption, metric)
149
183
  else
150
184
  warn "image not bound: #{id}" if @strict
151
- image_dummy id, caption, lines
185
+ image_dummy(id, caption, lines)
152
186
  end
153
187
  end
154
188
 
155
189
  def table(lines, id = nil, caption = nil)
156
- rows = []
190
+ sepidx, rows = parse_table_rows(lines)
191
+ begin
192
+ if caption_top?('table') && caption.present?
193
+ table_header(id, caption)
194
+ end
195
+ table_begin(rows.first.size)
196
+ table_rows(sepidx, rows)
197
+ table_end
198
+ if !caption_top?('table') && caption.present?
199
+ table_header(id, caption)
200
+ end
201
+ rescue KeyError
202
+ error "no such table: #{id}"
203
+ end
204
+ end
205
+
206
+ def table_row_separator_regexp
207
+ case @book.config['table_row_separator']
208
+ when 'tabs'
209
+ Regexp.new('\t+')
210
+ when 'singletab'
211
+ Regexp.new('\t')
212
+ when 'spaces'
213
+ Regexp.new('\s+')
214
+ when 'verticalbar'
215
+ Regexp.new('\s*\\' + escape('|') + '\s*')
216
+ else
217
+ error "Unknown value for 'table_row_separator', shold be: tabs, singletab, spaces, verticalbar"
218
+ end
219
+ end
220
+
221
+ def parse_table_rows(lines)
157
222
  sepidx = nil
223
+ rows = []
158
224
  lines.each_with_index do |line, idx|
159
- if /\A[\=\-]{12}/ =~ line
160
- # just ignore
161
- # error "too many table separator" if sepidx
225
+ if /\A[=\-]{12}/ =~ line || /\A[={\-}]{12}/ =~ line
162
226
  sepidx ||= idx
163
227
  next
164
228
  end
165
- rows.push(line.strip.split(/\t+/).map { |s| s.sub(/\A\./, '') })
229
+ rows.push(line.strip.split(table_row_separator_regexp).map { |s| s.sub(/\A\./, '') })
166
230
  end
167
231
  rows = adjust_n_cols(rows)
232
+ error 'no rows in the table' if rows.empty?
233
+ [sepidx, rows]
234
+ end
168
235
 
169
- begin
170
- if caption.present?
171
- table_header id, caption
172
- end
173
- rescue KeyError
174
- error "no such table: #{id}"
175
- end
176
- return if rows.empty?
177
- table_begin rows.first.size
236
+ def table_rows(sepidx, rows)
178
237
  if sepidx
179
238
  sepidx.times do
180
239
  tr(rows.shift.map { |s| th(s) })
@@ -188,18 +247,17 @@ module ReVIEW
188
247
  tr([th(h)] + cs.map { |s| td(s) })
189
248
  end
190
249
  end
191
- table_end
192
250
  end
193
251
 
194
252
  def adjust_n_cols(rows)
195
253
  rows.each do |cols|
196
- while cols.last and cols.last.strip.empty?
254
+ while cols.last && cols.last.strip.empty?
197
255
  cols.pop
198
256
  end
199
257
  end
200
258
  n_maxcols = rows.map(&:size).max
201
259
  rows.each do |cols|
202
- cols.concat [''] * (n_maxcols - cols.size)
260
+ cols.concat([''] * (n_maxcols - cols.size))
203
261
  end
204
262
  rows
205
263
  end
@@ -230,7 +288,7 @@ module ReVIEW
230
288
  end
231
289
 
232
290
  def inline_chapref(id)
233
- compile_inline @book.chapter_index.display_string(id)
291
+ compile_inline(@book.chapter_index.display_string(id))
234
292
  rescue KeyError
235
293
  error "unknown chapter: #{id}"
236
294
  end
@@ -242,7 +300,7 @@ module ReVIEW
242
300
  end
243
301
 
244
302
  def inline_title(id)
245
- compile_inline @book.chapter_index.title(id)
303
+ compile_inline(@book.chapter_index.title(id))
246
304
  rescue KeyError
247
305
  error "unknown chapter: #{id}"
248
306
  end
@@ -341,10 +399,10 @@ module ReVIEW
341
399
  end
342
400
 
343
401
  def bibpaper(lines, id, caption)
344
- bibpaper_header id, caption
402
+ bibpaper_header(id, caption)
345
403
  unless lines.empty?
346
404
  puts
347
- bibpaper_bibpaper id, caption, lines
405
+ bibpaper_bibpaper(id, caption, lines)
348
406
  end
349
407
  puts
350
408
  end
@@ -404,7 +462,12 @@ module ReVIEW
404
462
  end
405
463
 
406
464
  def inline_wb(s)
407
- inline_b(unescape(inline_w(s)))
465
+ translated = @dictionary[s]
466
+ if translated
467
+ inline_b(translated)
468
+ else
469
+ inline_b("[missing word: #{s}]")
470
+ end
408
471
  end
409
472
 
410
473
  def raw(str)
@@ -423,9 +486,9 @@ module ReVIEW
423
486
  if arg
424
487
  builders = arg.gsub(/^\s*\|/, '').gsub(/\|\s*$/, '').gsub(/\s/, '').split(',')
425
488
  c = target_name
426
- print lines.join if builders.include?(c)
489
+ print lines.join("\n") + "\n" if builders.include?(c)
427
490
  else
428
- print lines.join
491
+ print lines.join("\n") + "\n"
429
492
  end
430
493
  end
431
494
 
@@ -478,7 +541,9 @@ module ReVIEW
478
541
  def extract_chapter_id(chap_ref)
479
542
  m = /\A([\w+-]+)\|(.+)/.match(chap_ref)
480
543
  if m
481
- return [@book.contents.detect { |chap| chap.id == m[1] }, m[2]]
544
+ ch = @book.contents.detect { |chap| chap.id == m[1] }
545
+ raise KeyError unless ch
546
+ return [ch, m[2]]
482
547
  end
483
548
  [@chapter, chap_ref]
484
549
  end
@@ -490,9 +555,36 @@ module ReVIEW
490
555
  CAPTION_TITLES.each do |name|
491
556
  class_eval %Q(
492
557
  def #{name}(lines, caption = nil)
558
+ check_nested_minicolumn
493
559
  captionblock("#{name}", lines, caption)
494
560
  end
495
- )
561
+
562
+ def #{name}_begin(caption = nil)
563
+ check_nested_minicolumn
564
+ @doc_status[:minicolumn] = '#{name}'
565
+ if caption
566
+ puts compile_inline(caption)
567
+ end
568
+ end
569
+
570
+ def #{name}_end
571
+ @doc_status[:minicolumn] = nil
572
+ end
573
+ ), __FILE__, __LINE__ - 17
574
+ end
575
+
576
+ def check_nested_minicolumn
577
+ if @doc_status[:minicolumn]
578
+ error "#{@location}: nested mini-column is not allowed"
579
+ end
580
+ end
581
+
582
+ def in_minicolumn?
583
+ @doc_status[:minicolumn]
584
+ end
585
+
586
+ def minicolumn_block_name?(name)
587
+ CAPTION_TITLES.include?(name)
496
588
  end
497
589
 
498
590
  def graph(lines, id, command, caption = '')
@@ -502,13 +594,13 @@ module ReVIEW
502
594
  file = "#{id}.#{image_ext}"
503
595
  file_path = File.join(dir, file)
504
596
 
505
- line = self.unescape(lines.join("\n"))
597
+ content = lines.join("\n") + "\n"
506
598
 
507
599
  tf = Tempfile.new('review_graph')
508
- tf.puts line
600
+ tf.puts content
509
601
  tf.close
510
602
  begin
511
- file_path = send("graph_#{command}".to_sym, id, file_path, line, tf.path)
603
+ file_path = send("graph_#{command}".to_sym, id, file_path, content, tf.path)
512
604
  ensure
513
605
  tf.unlink
514
606
  end
@@ -556,7 +648,7 @@ EOTGNUPLOT
556
648
  file_path.sub!(/\.pdf\Z/, '.eps')
557
649
  end
558
650
  system_graph(id, 'java', '-jar', 'plantuml.jar', "-t#{ext}", '-charset', 'UTF-8', tf_path)
559
- FileUtils.mv "#{tf_path}.#{ext}", file_path
651
+ FileUtils.mv("#{tf_path}.#{ext}", file_path)
560
652
  file_path
561
653
  end
562
654
 
@@ -565,7 +657,7 @@ EOTGNUPLOT
565
657
  end
566
658
 
567
659
  def inline_include(file_name)
568
- compile_inline File.read(file_name, mode: 'rt:BOM|utf-8').chomp
660
+ compile_inline(File.read(file_name, mode: 'rt:BOM|utf-8').chomp)
569
661
  end
570
662
 
571
663
  def ul_item_begin(lines)
@@ -614,6 +706,10 @@ EOTGNUPLOT
614
706
  end
615
707
  end
616
708
 
709
+ def over_secnolevel?(n)
710
+ @book.config['secnolevel'] >= n.to_s.split('.').size
711
+ end
712
+
617
713
  ## override TextUtils::detab
618
714
  def detab(str, num = nil)
619
715
  if num
@@ -629,8 +725,28 @@ EOTGNUPLOT
629
725
  str
630
726
  end
631
727
 
632
- def unescape(str)
633
- str
728
+ def beginchild
729
+ @children ||= []
730
+ unless @previous_list_type
731
+ error "//beginchild is shown, but previous element isn't ul, ol, or dl"
732
+ end
733
+ puts "\x01→#{@previous_list_type}←\x01"
734
+ @children.push(@previous_list_type)
735
+ end
736
+
737
+ def endchild
738
+ if @children.nil? || @children.empty?
739
+ error "//endchild is shown, but any opened //beginchild doesn't exist"
740
+ else
741
+ puts "\x01→/#{@children.pop}←\x01"
742
+ end
743
+ end
744
+
745
+ def caption_top?(type)
746
+ unless %w[top bottom].include?(@book.config['caption_position'][type])
747
+ warn("invalid caption_position/#{type} parameter. 'top' is assumed")
748
+ end
749
+ @book.config['caption_position'][type] != 'bottom'
634
750
  end
635
751
  end
636
752
  end # module ReVIEW