review 4.2.0 → 5.0.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 (165) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ruby-win.yml +11 -5
  3. data/.rubocop.yml +113 -24
  4. data/NEWS.ja.md +94 -0
  5. data/NEWS.md +94 -0
  6. data/bin/review-catalog-converter +1 -1
  7. data/bin/review-check +2 -4
  8. data/bin/review-checkdep +1 -1
  9. data/bin/review-compile +8 -14
  10. data/bin/review-validate +1 -1
  11. data/doc/config.yml.sample +4 -1
  12. data/doc/config.yml.sample-simple +1 -1
  13. data/doc/format.ja.md +83 -4
  14. data/doc/format.md +84 -7
  15. data/doc/makeindex.ja.md +2 -2
  16. data/doc/quickstart.ja.md +3 -3
  17. data/doc/quickstart.md +2 -2
  18. data/lib/epubmaker/content.rb +3 -2
  19. data/lib/epubmaker/epubcommon.rb +33 -25
  20. data/lib/epubmaker/epubv2.rb +5 -6
  21. data/lib/epubmaker/epubv3.rb +20 -18
  22. data/lib/review/book.rb +2 -2
  23. data/lib/review/book/base.rb +61 -25
  24. data/lib/review/book/bib.rb +21 -0
  25. data/lib/review/book/book_unit.rb +155 -0
  26. data/lib/review/book/chapter.rb +30 -26
  27. data/lib/review/book/index.rb +23 -185
  28. data/lib/review/book/index/item.rb +7 -1
  29. data/lib/review/book/part.rb +21 -9
  30. data/lib/review/book/volume.rb +1 -1
  31. data/lib/review/builder.rb +68 -13
  32. data/lib/review/catalog.rb +2 -2
  33. data/lib/review/compiler.rb +159 -73
  34. data/lib/review/configure.rb +22 -1
  35. data/lib/review/converter.rb +1 -1
  36. data/lib/review/epub2html.rb +6 -1
  37. data/lib/review/epubmaker.rb +12 -23
  38. data/lib/review/htmlbuilder.rb +36 -7
  39. data/lib/review/htmlutils.rb +7 -10
  40. data/lib/review/i18n.rb +1 -1
  41. data/lib/review/idgxmlbuilder.rb +51 -6
  42. data/lib/review/idgxmlmaker.rb +9 -14
  43. data/lib/review/index_builder.rb +653 -0
  44. data/lib/review/init.rb +5 -13
  45. data/lib/review/latexbuilder.rb +65 -4
  46. data/lib/review/logger.rb +2 -2
  47. data/lib/review/makerhelper.rb +11 -0
  48. data/lib/review/markdownbuilder.rb +19 -1
  49. data/lib/review/pdfmaker.rb +17 -36
  50. data/lib/review/plaintextbuilder.rb +48 -2
  51. data/lib/review/preprocessor.rb +5 -5
  52. data/lib/review/rstbuilder.rb +25 -6
  53. data/lib/review/sec_counter.rb +13 -0
  54. data/lib/review/textmaker.rb +4 -12
  55. data/lib/review/tocprinter.rb +2 -3
  56. data/lib/review/topbuilder.rb +26 -0
  57. data/lib/review/update.rb +7 -7
  58. data/lib/review/version.rb +1 -1
  59. data/lib/review/volumeprinter.rb +2 -3
  60. data/lib/review/webmaker.rb +9 -20
  61. data/review.gemspec +2 -2
  62. data/samples/sample-book/src/config.yml +1 -1
  63. data/samples/syntax-book/Gemfile +1 -1
  64. data/samples/syntax-book/config.yml +1 -1
  65. data/templates/latex/config.erb +27 -23
  66. data/templates/latex/review-jlreq/README.md +3 -1
  67. data/templates/latex/review-jlreq/review-base.sty +31 -15
  68. data/templates/latex/review-jlreq/review-jlreq.cls +8 -24
  69. data/templates/latex/review-jsbook/README.md +7 -5
  70. data/templates/latex/review-jsbook/review-base.sty +34 -16
  71. data/templates/latex/review-jsbook/review-jsbook.cls +4 -2
  72. data/templates/web/html/layout-html5.html.erb +1 -1
  73. data/test/assets/test_template.tex +3 -3
  74. data/test/assets/test_template_backmatter.tex +3 -3
  75. data/test/book_test_helper.rb +11 -5
  76. data/test/test_book.rb +54 -63
  77. data/test/test_book_chapter.rb +93 -52
  78. data/test/test_builder.rb +24 -15
  79. data/test/test_converter.rb +1 -0
  80. data/test/test_epub3maker.rb +2 -2
  81. data/test/test_epubmaker.rb +8 -0
  82. data/test/test_helper.rb +4 -1
  83. data/test/test_htmlbuilder.rb +627 -56
  84. data/test/test_htmlutils.rb +0 -12
  85. data/test/test_i18n.rb +33 -33
  86. data/test/test_idgxmlbuilder.rb +358 -11
  87. data/test/test_idgxmlmaker_cmd.rb +1 -1
  88. data/test/test_index.rb +62 -52
  89. data/test/test_indexbuilder.rb +52 -0
  90. data/test/test_latexbuilder.rb +547 -10
  91. data/test/test_latexbuilder_v2.rb +43 -5
  92. data/test/test_logger.rb +7 -7
  93. data/test/test_makerhelper.rb +0 -12
  94. data/test/test_markdownbuilder.rb +3 -0
  95. data/test/test_pdfmaker.rb +13 -12
  96. data/test/test_pdfmaker_cmd.rb +1 -1
  97. data/test/test_plaintextbuilder.rb +422 -7
  98. data/test/test_review_ext.rb +2 -1
  99. data/test/test_rstbuilder.rb +25 -1
  100. data/test/test_sec_counter.rb +156 -0
  101. data/test/test_textmaker_cmd.rb +1 -1
  102. data/test/test_topbuilder.rb +187 -10
  103. data/test/test_update.rb +10 -10
  104. data/test/test_webtocprinter.rb +12 -12
  105. data/vendor/gentombow/LICENSE +1 -1
  106. data/vendor/gentombow/Makefile +0 -1
  107. data/vendor/gentombow/bounddvi-en.pdf +0 -0
  108. data/vendor/gentombow/bounddvi-en.tex +1 -0
  109. data/vendor/gentombow/bounddvi.pdf +0 -0
  110. data/vendor/gentombow/bounddvi.sty +30 -7
  111. data/vendor/gentombow/bounddvi.tex +1 -0
  112. data/vendor/gentombow/create_archive.sh +1 -0
  113. data/vendor/gentombow/gentombow-ja.pdf +0 -0
  114. data/vendor/gentombow/gentombow-ja.tex +9 -0
  115. data/vendor/gentombow/gentombow.pdf +0 -0
  116. data/vendor/gentombow/gentombow.sty +32 -10
  117. data/vendor/gentombow/gentombow.tex +8 -0
  118. data/vendor/gentombow/tests/gentombow-01-pdfx.tex +8 -0
  119. data/vendor/gentombow/tests/gentombow-02-pdfx.tex +8 -0
  120. data/vendor/jsclasses/Makefile +3 -2
  121. data/vendor/jsclasses/create_archive.sh +5 -5
  122. data/vendor/jsclasses/jis/Makefile +3 -2
  123. data/vendor/jsclasses/jis/jsarticle.cls +22 -18
  124. data/vendor/jsclasses/jis/jsbook.cls +22 -18
  125. data/vendor/jsclasses/jis/jsclasses.dtx +94 -13
  126. data/vendor/jsclasses/jis/jsclasses.ins +15 -5
  127. data/vendor/jsclasses/jis/jslogo.ins +9 -0
  128. data/vendor/jsclasses/jis/jslogo.sty +1 -13
  129. data/vendor/jsclasses/jis/jspf.cls +22 -18
  130. data/vendor/jsclasses/jis/jsreport.cls +22 -18
  131. data/vendor/jsclasses/jis/jsverb.ins +9 -0
  132. data/vendor/jsclasses/jis/jsverb.sty +1 -13
  133. data/vendor/jsclasses/jis/kiyou.cls +22 -18
  134. data/vendor/jsclasses/jis/minijs.sty +65 -22
  135. data/vendor/jsclasses/jis/okumacro.ins +9 -0
  136. data/vendor/jsclasses/jis/okumacro.sty +1 -13
  137. data/vendor/jsclasses/jis/okuverb.ins +9 -0
  138. data/vendor/jsclasses/jis/okuverb.sty +1 -13
  139. data/vendor/jsclasses/jis/winjis.sty +23 -19
  140. data/vendor/jsclasses/jsarticle.cls +22 -18
  141. data/vendor/jsclasses/jsbook.cls +22 -18
  142. data/vendor/jsclasses/jsclasses.dtx +94 -13
  143. data/vendor/jsclasses/jsclasses.ins +15 -5
  144. data/vendor/jsclasses/jsclasses.pdf +0 -0
  145. data/vendor/jsclasses/jslogo.ins +9 -0
  146. data/vendor/jsclasses/jslogo.pdf +0 -0
  147. data/vendor/jsclasses/jslogo.sty +1 -13
  148. data/vendor/jsclasses/jspf.cls +22 -18
  149. data/vendor/jsclasses/jsreport.cls +22 -18
  150. data/vendor/jsclasses/jsverb.ins +9 -0
  151. data/vendor/jsclasses/jsverb.pdf +0 -0
  152. data/vendor/jsclasses/jsverb.sty +1 -13
  153. data/vendor/jsclasses/kiyou.cls +22 -18
  154. data/vendor/jsclasses/minijs.sty +68 -22
  155. data/vendor/jsclasses/okumacro.ins +9 -0
  156. data/vendor/jsclasses/okumacro.pdf +0 -0
  157. data/vendor/jsclasses/okumacro.sty +1 -13
  158. data/vendor/jsclasses/okuverb.ins +9 -0
  159. data/vendor/jsclasses/okuverb.pdf +0 -0
  160. data/vendor/jsclasses/okuverb.sty +1 -13
  161. data/vendor/jsclasses/tests/relfont.tex +10 -0
  162. data/vendor/jsclasses/winjis.sty +23 -19
  163. metadata +14 -6
  164. data/.rubocop_todo.yml +0 -7
  165. data/lib/review/book/compilable.rb +0 -174
@@ -18,7 +18,7 @@ module ReVIEW
18
18
  'bookname' => 'book', # it defines epub file name also
19
19
  'booktitle' => 'Re:VIEW Sample Book',
20
20
  'title' => nil,
21
- 'aut' => ['anonymous'], # author
21
+ 'aut' => nil, # author
22
22
  'prt' => nil, # printer(publisher)
23
23
  'asn' => nil, # associated name
24
24
  'ant' => nil, # bibliographic antecedent
@@ -64,6 +64,7 @@ module ReVIEW
64
64
  'bib_file' => 'bib.re',
65
65
  'words_file' => nil,
66
66
  'colophon_order' => %w[aut csl trl dsr ill cov edt pbl contact prt],
67
+ 'chapterlink' => true,
67
68
  'externallink' => true,
68
69
  'join_lines_by_lang' => nil, # experimental. default should be nil
69
70
  'table_row_separator' => 'tabs',
@@ -118,6 +119,26 @@ module ReVIEW
118
119
  conf
119
120
  end
120
121
 
122
+ def self.create(maker: nil, yamlfile: nil, config: nil)
123
+ conf = self.values
124
+ conf.maker = maker
125
+
126
+ if yamlfile
127
+ begin
128
+ loader = ReVIEW::YAMLLoader.new
129
+ conf.deep_merge!(loader.load_file(yamlfile))
130
+ rescue => e
131
+ error "yaml error #{e.message}"
132
+ end
133
+ end
134
+ # YAML configs will be overridden by command line options.
135
+ if config
136
+ conf.deep_merge!(config)
137
+ end
138
+
139
+ conf
140
+ end
141
+
121
142
  def [](key)
122
143
  maker = self.maker
123
144
  if maker && self.key?(maker) && self.fetch(maker) && self.fetch(maker).key?(key)
@@ -17,7 +17,7 @@ module ReVIEW
17
17
  chap_name = File.basename(file, '.*')
18
18
  chap = @book.chapter(chap_name)
19
19
  result = @compiler.compile(chap)
20
- File.open(output_path, 'w') { |f| f.puts result }
20
+ File.write(output_path, result)
21
21
  end
22
22
  end
23
23
  end
@@ -8,10 +8,15 @@
8
8
 
9
9
  require 'zip'
10
10
  require 'rexml/document'
11
- require 'cgi'
12
11
  require 'optparse'
13
12
  require 'review/version'
14
13
 
14
+ begin
15
+ require 'cgi/escape'
16
+ rescue
17
+ require 'cgi/util'
18
+ end
19
+
15
20
  module ReVIEW
16
21
  class Epub2Html
17
22
  def self.execute(*args)
@@ -18,7 +18,6 @@ require 'review/version'
18
18
  require 'review/htmltoc'
19
19
  require 'review/htmlbuilder'
20
20
 
21
- require 'review/yamlloader'
22
21
  require 'rexml/document'
23
22
  require 'rexml/streamlistener'
24
23
  require 'epubmaker'
@@ -52,18 +51,9 @@ module ReVIEW
52
51
  end
53
52
 
54
53
  def load_yaml(yamlfile)
55
- loader = ReVIEW::YAMLLoader.new
56
- @config = ReVIEW::Configure.values
57
- begin
58
- @config.deep_merge!(loader.load_file(yamlfile))
59
- rescue => e
60
- error "yaml error #{e.message}"
61
- end
62
-
63
54
  @producer = Producer.new(@config)
64
55
  @producer.load(yamlfile)
65
56
  @config = @producer.config
66
- @config.maker = 'epubmaker'
67
57
  end
68
58
 
69
59
  def self.execute(*args)
@@ -94,13 +84,13 @@ module ReVIEW
94
84
  end
95
85
 
96
86
  def execute(*args)
97
- @config = ReVIEW::Configure.values
98
- @config.maker = 'epubmaker'
99
87
  cmd_config, yamlfile, exportfile = parse_opts(args)
100
88
  error "#{yamlfile} not found." unless File.exist?(yamlfile)
101
89
 
90
+ @config = ReVIEW::Configure.create(maker: 'epubmaker',
91
+ yamlfile: yamlfile,
92
+ config: cmd_config)
102
93
  load_yaml(yamlfile)
103
- @config.deep_merge!(cmd_config)
104
94
  update_log_level
105
95
  log("Loaded yaml file (#{yamlfile}).")
106
96
 
@@ -252,7 +242,7 @@ module ReVIEW
252
242
  if @config['epubmaker']['verify_target_images'].present?
253
243
  @config['epubmaker']['force_include_images'].each do |file|
254
244
  unless File.exist?(file)
255
- if file !~ /\Ahttp[s]?:/
245
+ if file !~ /\Ahttps?:/
256
246
  warn "#{file} is not found, skip."
257
247
  end
258
248
  next
@@ -307,8 +297,7 @@ module ReVIEW
307
297
 
308
298
  basedir = File.dirname(yamlfile)
309
299
  base_path = Pathname.new(basedir)
310
- book = ReVIEW::Book.load(basedir)
311
- book.config = @config
300
+ book = ReVIEW::Book::Base.new(basedir, config: @config)
312
301
  @converter = ReVIEW::Converter.new(book, ReVIEW::HTMLBuilder.new)
313
302
  @compile_errors = nil
314
303
 
@@ -340,9 +329,9 @@ module ReVIEW
340
329
  File.open(File.join(basetmpdir, htmlfile), 'w') do |f|
341
330
  @body = ''
342
331
  @body << %Q(<div class="part">\n)
343
- @body << %Q(<h1 class="part-number">#{CGI.escapeHTML(ReVIEW::I18n.t('part', part.number))}</h1>\n)
332
+ @body << %Q(<h1 class="part-number">#{h(ReVIEW::I18n.t('part', part.number))}</h1>\n)
344
333
  if part.name.strip.present?
345
- @body << %Q(<h2 class="part-title">#{CGI.escapeHTML(part.name.strip)}</h2>\n)
334
+ @body << %Q(<h2 class="part-title">#{h(part.name.strip)}</h2>\n)
346
335
  end
347
336
  @body << %Q(</div>\n)
348
337
 
@@ -563,19 +552,19 @@ module ReVIEW
563
552
 
564
553
  def build_titlepage(basetmpdir, htmlfile)
565
554
  # TODO: should be created via epubcommon
566
- @title = CGI.escapeHTML(@config.name_of('booktitle'))
555
+ @title = h(@config.name_of('booktitle'))
567
556
  File.open(File.join(basetmpdir, htmlfile), 'w') do |f|
568
557
  @body = ''
569
558
  @body << %Q(<div class="titlepage">\n)
570
- @body << %Q(<h1 class="tp-title">#{CGI.escapeHTML(@config.name_of('booktitle'))}</h1>\n)
559
+ @body << %Q(<h1 class="tp-title">#{h(@config.name_of('booktitle'))}</h1>\n)
571
560
  if @config['subtitle']
572
- @body << %Q(<h2 class="tp-subtitle">#{CGI.escapeHTML(@config.name_of('subtitle'))}</h2>\n)
561
+ @body << %Q(<h2 class="tp-subtitle">#{h(@config.name_of('subtitle'))}</h2>\n)
573
562
  end
574
563
  if @config['aut']
575
- @body << %Q(<h2 class="tp-author">#{CGI.escapeHTML(@config.names_of('aut').join(ReVIEW::I18n.t('names_splitter')))}</h2>\n)
564
+ @body << %Q(<h2 class="tp-author">#{h(@config.names_of('aut').join(ReVIEW::I18n.t('names_splitter')))}</h2>\n)
576
565
  end
577
566
  if @config['pbl']
578
- @body << %Q(<h3 class="tp-publisher">#{CGI.escapeHTML(@config.names_of('pbl').join(ReVIEW::I18n.t('names_splitter')))}</h3>\n)
567
+ @body << %Q(<h3 class="tp-publisher">#{h(@config.names_of('pbl').join(ReVIEW::I18n.t('names_splitter')))}</h3>\n)
579
568
  end
580
569
  @body << '</div>'
581
570
 
@@ -41,10 +41,6 @@ module ReVIEW
41
41
  ".#{@book.config['htmlext']}"
42
42
  end
43
43
 
44
- def builder_init
45
- end
46
- private :builder_init
47
-
48
44
  def builder_init_file
49
45
  @noindent = nil
50
46
  @ol_num = nil
@@ -92,7 +88,7 @@ module ReVIEW
92
88
  def result
93
89
  # default XHTML header/footer
94
90
  @title = strip_html(compile_inline(@chapter.title))
95
- @body = @output.string
91
+ @body = solve_nest(@output.string)
96
92
  @language = @book.config['language']
97
93
  @stylesheets = @book.config['stylesheet']
98
94
  @next = @chapter.next_chapter
@@ -107,6 +103,20 @@ module ReVIEW
107
103
  ReVIEW::Template.load(layoutfile).result(binding)
108
104
  end
109
105
 
106
+ def solve_nest(s)
107
+ check_nest
108
+ s.gsub("</dd>\n</dl>\n\x01→dl←\x01", '').
109
+ gsub("\x01→/dl←\x01", "</dd>\n</dl>←END\x01").
110
+ gsub("</li>\n</ul>\n\x01→ul←\x01", '').
111
+ gsub("\x01→/ul←\x01", "</li>\n</ul>←END\x01").
112
+ gsub("</li>\n</ol>\n\x01→ol←\x01", '').
113
+ gsub("\x01→/ol←\x01", "</li>\n</ol>←END\x01").
114
+ gsub("</dl>←END\x01\n<dl>", '').
115
+ gsub("</ul>←END\x01\n<ul>", '').
116
+ gsub("</ol>←END\x01\n<ol>", '').
117
+ gsub("←END\x01", '')
118
+ end
119
+
110
120
  def xmlns_ops_prefix
111
121
  if @book.config['epubversion'].to_i == 3
112
122
  'epub'
@@ -228,6 +238,7 @@ module ReVIEW
228
238
  end
229
239
 
230
240
  def captionblock(type, lines, caption)
241
+ check_nested_minicolumn
231
242
  puts %Q(<div class="#{type}">)
232
243
  if caption.present?
233
244
  puts %Q(<p class="caption">#{compile_inline(caption)}</p>)
@@ -312,6 +323,24 @@ module ReVIEW
312
323
  captionblock('note', lines, caption)
313
324
  end
314
325
 
326
+ CAPTION_TITLES.each do |name|
327
+ class_eval %Q(
328
+ def #{name}_begin(caption = nil)
329
+ check_nested_minicolumn
330
+ @doc_status[:minicolumn] = '#{name}'
331
+ puts %Q(<div class="#{name}">)
332
+ if caption.present?
333
+ puts %Q(<p class="caption">\#{compile_inline(caption)}</p>)
334
+ end
335
+ end
336
+
337
+ def #{name}_end
338
+ puts '</div>'
339
+ @doc_status[:minicolumn] = nil
340
+ end
341
+ ), __FILE__, __LINE__ - 14
342
+ end
343
+
315
344
  def ul_begin
316
345
  puts '<ul>'
317
346
  end
@@ -1018,7 +1047,7 @@ EOS
1018
1047
 
1019
1048
  def inline_column_chap(chapter, id)
1020
1049
  if @book.config['chapterlink']
1021
- %Q(<a href="\##{column_label(id, chapter)}" class="columnref">#{I18n.t('column', compile_inline(chapter.column(id).caption))}</a>)
1050
+ %Q(<a href="#{chapter.id}#{extname}##{column_label(id, chapter)}" class="columnref">#{I18n.t('column', compile_inline(chapter.column(id).caption))}</a>)
1022
1051
  else
1023
1052
  I18n.t('column', compile_inline(chapter.column(id).caption))
1024
1053
  end
@@ -1180,7 +1209,7 @@ EOS
1180
1209
  %Q(<span class="balloon">#{escape_html(str)}</span>)
1181
1210
  end
1182
1211
 
1183
- def inline_raw(str)
1212
+ def inline_raw(str) # rubocop:disable Lint/UselessMethodDefinition
1184
1213
  super(str)
1185
1214
  end
1186
1215
 
@@ -7,19 +7,16 @@
7
7
  # the GNU LGPL, Lesser General Public License version 2.1.
8
8
  #
9
9
 
10
- require 'cgi/util'
10
+ begin
11
+ require 'cgi/escape'
12
+ rescue
13
+ require 'cgi/util'
14
+ end
15
+
11
16
  module ReVIEW
12
17
  module HTMLUtils
13
- ESC = {
14
- '&' => '&amp;',
15
- '<' => '&lt;',
16
- '>' => '&gt;',
17
- '"' => '&quot;'
18
- } # .freeze
19
-
20
18
  def escape(str)
21
- t = ESC
22
- str.gsub(/[&"<>]/) { |c| t[c] }
19
+ CGI.escapeHTML(str)
23
20
  end
24
21
 
25
22
  alias_method :escape_html, :escape # for backward compatibility
@@ -125,7 +125,7 @@ module ReVIEW
125
125
  frmt.gsub!('%%', '##')
126
126
 
127
127
  unless args.is_a?(Array)
128
- args = args.nil? && frmt !~ /\%/ ? [] : [args]
128
+ args = args.nil? && frmt !~ /%/ ? [] : [args]
129
129
  end
130
130
 
131
131
  percents = frmt.scan(/%[A-Za-z]{1,3}/)
@@ -46,10 +46,6 @@ module ReVIEW
46
46
  '.xml'
47
47
  end
48
48
 
49
- def builder_init
50
- end
51
- private :builder_init
52
-
53
49
  def builder_init_file
54
50
  @warns = []
55
51
  @errors = []
@@ -89,7 +85,21 @@ module ReVIEW
89
85
  s += '</sect>' if @section > 0
90
86
  s += '</chapter>' if @chapter.number > 0
91
87
  end
92
- @output.string + s + "</#{@rootelement}>\n"
88
+ solve_nest(@output.string) + s + "</#{@rootelement}>\n"
89
+ end
90
+
91
+ def solve_nest(s)
92
+ check_nest
93
+ s.gsub("</dd></dl>\x01→dl←\x01", '').
94
+ gsub("\x01→/dl←\x01", "</dd></dl>←END\x01").
95
+ gsub("</li></ul>\x01→ul←\x01", '').
96
+ gsub("\x01→/ul←\x01", "</li></ul>←END\x01").
97
+ gsub("</li></ol>\x01→ol←\x01", '').
98
+ gsub("\x01→/ol←\x01", "</li></ol>←END\x01").
99
+ gsub("</dl>←END\x01<dl>", '').
100
+ gsub("</ul>←END\x01<ul>", '').
101
+ gsub("</ol>←END\x01<ol>", '').
102
+ gsub("←END\x01", '')
93
103
  end
94
104
 
95
105
  def headline(level, label, caption)
@@ -508,7 +518,7 @@ module ReVIEW
508
518
  sepidx = nil
509
519
  rows = []
510
520
  lines.each_with_index do |line, idx|
511
- if /\A[\=\-]{12}/ =~ line
521
+ if /\A[=\-]{12}/ =~ line
512
522
  sepidx ||= idx
513
523
  next
514
524
  end
@@ -942,18 +952,22 @@ module ReVIEW
942
952
  end
943
953
 
944
954
  def note(lines, caption = nil)
955
+ check_nested_minicolumn
945
956
  captionblock('note', lines, caption)
946
957
  end
947
958
 
948
959
  def memo(lines, caption = nil)
960
+ check_nested_minicolumn
949
961
  captionblock('memo', lines, caption)
950
962
  end
951
963
 
952
964
  def tip(lines, caption = nil)
965
+ check_nested_minicolumn
953
966
  captionblock('tip', lines, caption)
954
967
  end
955
968
 
956
969
  def info(lines, caption = nil)
970
+ check_nested_minicolumn
957
971
  captionblock('info', lines, caption)
958
972
  end
959
973
 
@@ -966,6 +980,7 @@ module ReVIEW
966
980
  end
967
981
 
968
982
  def important(lines, caption = nil)
983
+ check_nested_minicolumn
969
984
  captionblock('important', lines, caption)
970
985
  end
971
986
 
@@ -974,10 +989,12 @@ module ReVIEW
974
989
  end
975
990
 
976
991
  def caution(lines, caption = nil)
992
+ check_nested_minicolumn
977
993
  captionblock('caution', lines, caption)
978
994
  end
979
995
 
980
996
  def warning(lines, caption = nil)
997
+ check_nested_minicolumn
981
998
  captionblock('warning', lines, caption)
982
999
  end
983
1000
 
@@ -990,6 +1007,7 @@ module ReVIEW
990
1007
  end
991
1008
 
992
1009
  def notice(lines, caption = nil)
1010
+ check_nested_minicolumn
993
1011
  if caption
994
1012
  captionblock('notice-t', lines, caption, 'notice-title')
995
1013
  else
@@ -1025,6 +1043,33 @@ module ReVIEW
1025
1043
  captionblock('expert', lines, nil)
1026
1044
  end
1027
1045
 
1046
+ CAPTION_TITLES.each do |name|
1047
+ class_eval %Q(
1048
+ def #{name}_begin(caption = nil)
1049
+ check_nested_minicolumn
1050
+ if '#{name}' == 'notice' && caption.present?
1051
+ @doc_status[:minicolumn] = '#{name}-t'
1052
+ print "<#{name}-t>"
1053
+ else
1054
+ @doc_status[:minicolumn] = '#{name}'
1055
+ print "<#{name}>"
1056
+ end
1057
+ if caption.present?
1058
+ puts %Q(<title aid:pstyle='#{name}-title'>\#{compile_inline(caption)}</title>)
1059
+ end
1060
+ end
1061
+
1062
+ def #{name}_end
1063
+ if '#{name}' == 'notice' && @doc_status[:minicolumn] == 'notice-t'
1064
+ print "</#{name}-t>"
1065
+ else
1066
+ print "</#{name}>"
1067
+ end
1068
+ @doc_status[:minicolumn] = nil
1069
+ end
1070
+ ), __FILE__, __LINE__ - 23
1071
+ end
1072
+
1028
1073
  def syntaxblock(type, lines, caption)
1029
1074
  captionstr = nil
1030
1075
  if caption.present?
@@ -15,9 +15,12 @@ require 'review/book'
15
15
  require 'review/yamlloader'
16
16
  require 'review/idgxmlbuilder'
17
17
  require 'review/version'
18
+ require 'review/makerhelper'
18
19
 
19
20
  module ReVIEW
20
21
  class IDGXMLMaker
22
+ include MakerHelper
23
+
21
24
  attr_accessor :config, :basedir
22
25
 
23
26
  def initialize
@@ -74,19 +77,12 @@ module ReVIEW
74
77
  end
75
78
 
76
79
  def execute(*args)
77
- @config = ReVIEW::Configure.values
78
- @config.maker = 'idgxmlmaker'
79
80
  cmd_config, yamlfile = parse_opts(args)
80
81
  error "#{yamlfile} not found." unless File.exist?(yamlfile)
81
82
 
82
- begin
83
- loader = ReVIEW::YAMLLoader.new
84
- @config.deep_merge!(loader.load_file(yamlfile))
85
- rescue => e
86
- error "yaml error #{e.message}"
87
- end
88
- # YAML configs will be overridden by command line options.
89
- @config.deep_merge!(cmd_config)
83
+ @config = ReVIEW::Configure.create(maker: 'idgxmlmaker',
84
+ yamlfile: yamlfile,
85
+ config: cmd_config)
90
86
  I18n.setup(@config['language'])
91
87
  begin
92
88
  generate_idgxml_files(yamlfile)
@@ -102,8 +98,7 @@ module ReVIEW
102
98
  remove_old_files(@path)
103
99
  Dir.mkdir(@path)
104
100
 
105
- @book = ReVIEW::Book.load(@basedir)
106
- @book.config = @config
101
+ @book = ReVIEW::Book::Base.new(@basedir, config: @config)
107
102
  if @table
108
103
  @book.config['tableopt'] = @table
109
104
  end
@@ -155,9 +150,9 @@ module ReVIEW
155
150
  end
156
151
  f.puts '<?xml version="1.0" encoding="UTF-8"?>'
157
152
  f.print '<doc xmlns:aid="http://ns.adobe.com/AdobeInDesign/4.0/"><title aid:pstyle="h1">'
158
- f.print CGI.escapeHTML(title)
153
+ f.print h(title)
159
154
  f.print '</title><?dtp level="1" section="'
160
- f.print CGI.escapeHTML(title)
155
+ f.print h(title)
161
156
  f.puts '"?></doc>'
162
157
  end
163
158
  apply_filter(File.join(basetmpdir, xmlfile))