review 2.5.0 → 3.0.0.preview1

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 (121) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +28 -10
  3. data/.travis.yml +11 -2
  4. data/NEWS.ja.md +89 -17
  5. data/NEWS.md +92 -0
  6. data/README.md +1 -1
  7. data/Rakefile +0 -13
  8. data/bin/review-catalog-converter +83 -37
  9. data/bin/review-check +17 -5
  10. data/bin/review-compile +1 -1
  11. data/bin/review-index +6 -0
  12. data/bin/review-init +3 -155
  13. data/bin/review-preproc +0 -5
  14. data/bin/review-validate +21 -7
  15. data/bin/review-vol +13 -5
  16. data/doc/config.yml.sample +12 -7
  17. data/doc/config.yml.sample-simple +1 -1
  18. data/doc/format.ja.md +39 -3
  19. data/doc/format.md +39 -3
  20. data/doc/format_idg.ja.md +0 -4
  21. data/doc/pdfmaker.ja.md +1 -1
  22. data/doc/pdfmaker.md +1 -1
  23. data/doc/sample.css +7 -0
  24. data/lib/epubmaker/content.rb +31 -12
  25. data/lib/epubmaker/epubcommon.rb +10 -3
  26. data/lib/epubmaker/epubv2.rb +11 -3
  27. data/lib/epubmaker/epubv3.rb +11 -3
  28. data/lib/epubmaker/producer.rb +55 -20
  29. data/lib/review/book/base.rb +63 -48
  30. data/lib/review/book/chapter.rb +19 -7
  31. data/lib/review/book/compilable.rb +5 -20
  32. data/lib/review/book/image_finder.rb +10 -3
  33. data/lib/review/book/index.rb +30 -9
  34. data/lib/review/book/part.rb +9 -6
  35. data/lib/review/book.rb +0 -14
  36. data/lib/review/builder.rb +110 -18
  37. data/lib/review/catalog.rb +24 -4
  38. data/lib/review/compiler.rb +3 -1
  39. data/lib/review/configure.rb +43 -9
  40. data/lib/review/epubmaker/reviewheaderlistener.rb +57 -0
  41. data/lib/review/epubmaker.rb +129 -85
  42. data/lib/review/htmlbuilder.rb +76 -58
  43. data/lib/review/htmlutils.rb +20 -13
  44. data/lib/review/i18n.rb +6 -2
  45. data/lib/review/idgxmlbuilder.rb +52 -41
  46. data/lib/review/init.rb +194 -0
  47. data/lib/review/latexbuilder.rb +118 -34
  48. data/lib/review/latexutils.rb +5 -5
  49. data/lib/review/logger.rb +2 -1
  50. data/lib/review/makerhelper.rb +1 -1
  51. data/lib/review/markdownbuilder.rb +66 -6
  52. data/lib/review/md2inaobuilder.rb +2 -2
  53. data/lib/review/pdfmaker.rb +74 -22
  54. data/lib/review/plaintextbuilder.rb +8 -4
  55. data/lib/review/preprocessor.rb +14 -17
  56. data/lib/review/sec_counter.rb +8 -2
  57. data/lib/review/textmaker.rb +2 -2
  58. data/lib/review/textutils.rb +9 -2
  59. data/lib/review/tocparser.rb +7 -4
  60. data/lib/review/tocprinter.rb +3 -1
  61. data/lib/review/version.rb +1 -1
  62. data/lib/review/webmaker.rb +19 -7
  63. data/lib/review/webtocprinter.rb +8 -4
  64. data/review.gemspec +4 -3
  65. data/templates/latex/config.erb +84 -0
  66. data/templates/latex/layout.tex.erb +76 -361
  67. data/templates/latex/review-jlreq/README.md +22 -0
  68. data/templates/latex/review-jlreq/review-base.sty +178 -0
  69. data/templates/latex/review-jlreq/review-custom.sty +1 -0
  70. data/templates/latex/review-jlreq/review-jlreq.cls +141 -0
  71. data/templates/latex/review-jlreq/review-style.sty +149 -0
  72. data/templates/latex/review-jlreq/reviewmacro.sty +8 -0
  73. data/templates/latex/review-jsbook/jumoline.sty +310 -0
  74. data/templates/latex/review-jsbook/plistings.sty +326 -0
  75. data/templates/latex/review-jsbook/review-base.sty +405 -0
  76. data/templates/latex/review-jsbook/review-custom.sty +1 -0
  77. data/templates/latex/review-jsbook/review-style.sty +38 -0
  78. data/templates/latex/review-jsbook/reviewmacro.sty +8 -0
  79. data/templates/latex-compat2/layout.tex.erb +387 -0
  80. data/test/assets/test_template.tex +105 -235
  81. data/test/assets/test_template_backmatter.tex +133 -14
  82. data/test/book_test_helper.rb +1 -1
  83. data/test/run_test.rb +2 -0
  84. data/test/sample-book/src/Rakefile +11 -6
  85. data/test/sample-book/src/config.yml +2 -2
  86. data/test/sample-book/src/sty/reviewmacro.sty +1 -39
  87. data/test/sample-book/src/style.css +6 -0
  88. data/test/syntax-book/config.yml +1 -1
  89. data/test/test_book.rb +13 -16
  90. data/test/test_book_chapter.rb +4 -10
  91. data/test/test_book_part.rb +4 -3
  92. data/test/test_catalog.rb +15 -4
  93. data/test/test_helper.rb +2 -2
  94. data/test/test_htmlbuilder.rb +78 -10
  95. data/test/test_htmlutils.rb +12 -5
  96. data/test/test_idgxmlbuilder.rb +1 -1
  97. data/test/test_latexbuilder.rb +94 -49
  98. data/test/test_latexbuilder_v2.rb +1077 -0
  99. data/test/test_logger.rb +20 -0
  100. data/test/test_markdownbuilder.rb +10 -0
  101. data/test/test_pdfmaker.rb +6 -7
  102. data/test/test_plaintextbuilder.rb +1 -1
  103. data/test/test_review_ext.rb +0 -1
  104. data/test/test_rstbuilder.rb +1 -1
  105. data/test/test_topbuilder.rb +19 -7
  106. data/test/test_webtocprinter.rb +14 -14
  107. data/{test/sample-book/src/vendor → vendor}/jumoline/README +0 -0
  108. data/{test/sample-book/src/vendor → vendor}/jumoline/jumoline.dtx +0 -0
  109. data/{test/sample-book/src/vendor → vendor}/jumoline/jumoline.ins +0 -0
  110. data/{test/sample-book/src/vendor → vendor}/jumoline/lppl.txt +0 -0
  111. data/vendor/plistings/.gitignore +9 -0
  112. data/vendor/plistings/LICENSE +21 -0
  113. data/vendor/plistings/README.md +18 -0
  114. data/vendor/plistings/plistings.sty +326 -0
  115. data/vendor/plistings/test1.tex +174 -0
  116. data/vendor/plistings/test2.tex +54 -0
  117. metadata +48 -19
  118. data/lib/review/unfold.rb +0 -129
  119. data/test/CHAPS +0 -2
  120. data/test/bib.re +0 -13
  121. data/test/test.re +0 -43
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2010-2017 Kenshi Muto and Masayoshi Takahashi
1
+ # Copyright (c) 2010-2018 Kenshi Muto and Masayoshi Takahashi
2
2
  #
3
3
  # This program is free software.
4
4
  # You can distribute or modify this program under the terms of
@@ -10,6 +10,7 @@ require 'yaml'
10
10
  require 'fileutils'
11
11
  require 'erb'
12
12
  require 'tmpdir'
13
+ require 'open3'
13
14
 
14
15
  require 'review/i18n'
15
16
  require 'review/book'
@@ -35,8 +36,20 @@ module ReVIEW
35
36
  @input_files = Hash.new { |h, key| h[key] = '' }
36
37
  end
37
38
 
39
+ def system_with_info(*args)
40
+ @logger.info args.join(' ')
41
+ out, status = Open3.capture2e(*args)
42
+ unless status.success?
43
+ @logger.error "execution error\n\nError log:\n" + out
44
+ end
45
+ end
46
+
38
47
  def system_or_raise(*args)
39
- Kernel.system(*args) or raise("failed to run command: #{args.join(' ')}")
48
+ @logger.info args.join(' ')
49
+ out, status = Open3.capture2e(*args)
50
+ unless status.success?
51
+ error "failed to run command: #{args.join(' ')}\n\nError log:\n" + out
52
+ end
40
53
  end
41
54
 
42
55
  def error(msg)
@@ -59,7 +72,9 @@ module ReVIEW
59
72
  def build_path
60
73
  if @config['debug']
61
74
  path = "#{@config['bookname']}-pdf"
62
- FileUtils.rm_rf(path, secure: true) if File.exist?(path)
75
+ if File.exist?(path)
76
+ FileUtils.rm_rf(path, secure: true)
77
+ end
63
78
  Dir.mkdir(path)
64
79
  path
65
80
  else
@@ -71,7 +86,7 @@ module ReVIEW
71
86
  return unless @compile_errors
72
87
 
73
88
  if ignore_errors
74
- $stderr.puts 'compile error, but try to generate PDF file'
89
+ @logger.info 'compile error, but try to generate PDF file'
75
90
  else
76
91
  error 'compile error, No PDF file output.'
77
92
  end
@@ -203,7 +218,9 @@ module ReVIEW
203
218
  end
204
219
 
205
220
  call_hook('hook_beforemakeindex')
206
- system_or_raise("#{makeindex_command} #{makeindex_options} book") if @config['pdfmaker']['makeindex'] && File.exist?('book.idx')
221
+ if @config['pdfmaker']['makeindex'] && File.exist?('book.idx')
222
+ system_or_raise("#{makeindex_command} #{makeindex_options} book")
223
+ end
207
224
  call_hook('hook_aftermakeindex')
208
225
 
209
226
  system_or_raise("#{texcommand} #{texoptions} book.tex")
@@ -218,6 +235,7 @@ module ReVIEW
218
235
 
219
236
  def generate_pdf(yamlfile)
220
237
  remove_old_file
238
+ erb_config
221
239
  @path = build_path
222
240
  begin
223
241
  @compile_errors = nil
@@ -230,10 +248,16 @@ module ReVIEW
230
248
 
231
249
  check_compile_status(@config['ignore-errors'])
232
250
 
251
+ # for backward compatibility
252
+ @config['usepackage'] = ''
253
+ @config['usepackage'] = "\\usepackage{#{@config['texstyle']}}" if @config['texstyle']
254
+
233
255
  copy_images(@config['imagedir'], File.join(@path, @config['imagedir']))
234
256
  copy_sty(File.join(Dir.pwd, 'sty'), @path)
235
257
  copy_sty(File.join(Dir.pwd, 'sty'), @path, 'fd')
236
258
  copy_sty(File.join(Dir.pwd, 'sty'), @path, 'cls')
259
+ copy_sty(File.join(Dir.pwd, 'sty'), @path, 'erb')
260
+ copy_sty(File.join(Dir.pwd, 'sty'), @path, 'tex')
237
261
  copy_sty(Dir.pwd, @path, 'tex')
238
262
 
239
263
  build_pdf
@@ -245,7 +269,7 @@ module ReVIEW
245
269
  end
246
270
 
247
271
  def output_chaps(filename, _yamlfile)
248
- $stderr.puts "compiling #{filename}.tex"
272
+ @logger.info "compiling #{filename}.tex"
249
273
  begin
250
274
  @converter.convert(filename + '.re', File.join(@path, filename + '.tex'))
251
275
  rescue => e
@@ -262,13 +286,13 @@ module ReVIEW
262
286
  Dir.mkdir(to)
263
287
  ReVIEW::MakerHelper.copy_images_to_dir(from, to)
264
288
  Dir.chdir(to) do
265
- images = Dir.glob('**/*').find_all { |f| File.file?(f) and f =~ /\.(jpg|jpeg|png|pdf|ai|eps|tif)\z/ }
289
+ images = Dir.glob('**/*').find_all { |f| File.file?(f) and f =~ /\.(jpg|jpeg|png|pdf|ai|eps|tif)\z/i }
266
290
  break if images.empty?
267
291
  if @config['pdfmaker']['bbox']
268
- system('extractbb', '-B', @config['pdfmaker']['bbox'], *images)
292
+ system_with_info('extractbb', '-B', @config['pdfmaker']['bbox'], *images)
269
293
  system_or_raise('ebb', '-B', @config['pdfmaker']['bbox'], *images) unless system('extractbb', '-B', @config['pdfmaker']['bbox'], '-m', *images)
270
294
  else
271
- system('extractbb', *images)
295
+ system_with_info('extractbb', *images)
272
296
  system_or_raise('ebb', *images) unless system('extractbb', '-m', *images)
273
297
  end
274
298
  end
@@ -276,7 +300,9 @@ module ReVIEW
276
300
 
277
301
  def make_custom_page(file)
278
302
  file_sty = file.to_s.sub(/\.[^.]+\Z/, '.tex')
279
- return File.read(file_sty) if File.exist?(file_sty)
303
+ if File.exist?(file_sty)
304
+ return File.read(file_sty)
305
+ end
280
306
  nil
281
307
  end
282
308
 
@@ -350,21 +376,28 @@ module ReVIEW
350
376
  d.strftime(ReVIEW::I18n.t('date_format'))
351
377
  end
352
378
 
353
- def template_content
379
+ def erb_config
380
+ @texcompiler = File.basename(@config['texcommand'], '.*')
354
381
  dclass = @config['texdocumentclass'] || []
355
382
  @documentclass = dclass[0] || 'jsbook'
356
383
  @documentclassoption = dclass[1] || 'uplatex,oneside'
384
+ if @config['dvicommand'] =~ /dvipdfmx/ && @documentclassoption !~ /dvipdfmx/
385
+ @documentclassoption = "dvipdfmx,#{@documentclassoption}".sub(/,\Z/, '')
386
+ end
357
387
 
358
388
  @okuduke = make_colophon
359
389
  @authors = make_authors
360
390
 
361
- @custom_titlepage = make_custom_page(@config['cover']) || make_custom_page(@config['coverfile'])
391
+ @custom_coverpage = make_custom_page(@config['cover']) || make_custom_page(@config['coverfile'])
392
+ @custom_titlepage = make_custom_page(@config['titlefile'])
362
393
  @custom_originaltitlepage = make_custom_page(@config['originaltitlefile'])
363
394
  @custom_creditpage = make_custom_page(@config['creditfile'])
364
395
 
365
396
  @custom_profilepage = make_custom_page(@config['profile'])
366
397
  @custom_advfilepage = make_custom_page(@config['advfile'])
367
- @custom_colophonpage = make_custom_page(@config['colophon']) if @config['colophon'] && @config['colophon'].is_a?(String)
398
+ if @config['colophon'] && @config['colophon'].is_a?(String)
399
+ @custom_colophonpage = make_custom_page(@config['colophon'])
400
+ end
368
401
  @custom_backcoverpage = make_custom_page(@config['backcover'])
369
402
 
370
403
  if @config['pubhistory']
@@ -390,17 +423,31 @@ module ReVIEW
390
423
  @locale_latex['postchaptername'] = chapter_tuple[1]
391
424
  @locale_latex['preappendixname'] = appendix_tuple[0]
392
425
  @locale_latex['postappendixname'] = appendix_tuple[1]
426
+ end
393
427
 
394
- template = File.expand_path('./latex/layout.tex.erb', ReVIEW::Template::TEMPLATE_DIR)
395
- layout_file = File.join(@basedir, 'layouts', 'layout.tex.erb')
396
- template = layout_file if File.exist?(layout_file)
397
-
428
+ def erb_content(file)
398
429
  @texcompiler = File.basename(@config['texcommand'], '.*')
399
-
400
- erb = ReVIEW::Template.load(template, '-')
430
+ erb = ReVIEW::Template.load(file, '-')
431
+ @logger.debug "erb processes #{File.basename(file)}" if @config['debug']
401
432
  erb.result(binding)
402
433
  end
403
434
 
435
+ def latex_config
436
+ erb_content(File.expand_path('./latex/config.erb', ReVIEW::Template::TEMPLATE_DIR))
437
+ end
438
+
439
+ def template_content
440
+ template = File.expand_path('./latex/layout.tex.erb', ReVIEW::Template::TEMPLATE_DIR)
441
+ if @config.check_version('2', exception: false)
442
+ template = File.expand_path('./latex-compat2/layout.tex.erb', ReVIEW::Template::TEMPLATE_DIR)
443
+ end
444
+ layout_file = File.join(@basedir, 'layouts', 'layout.tex.erb')
445
+ if File.exist?(layout_file)
446
+ template = layout_file
447
+ end
448
+ erb_content(template)
449
+ end
450
+
404
451
  def copy_sty(dirname, copybase, extname = 'sty')
405
452
  unless File.directory?(dirname)
406
453
  warn "No such directory - #{dirname}"
@@ -408,9 +455,14 @@ module ReVIEW
408
455
  end
409
456
 
410
457
  Dir.open(dirname) do |dir|
411
- dir.each do |fname|
412
- if File.extname(fname).downcase == '.' + extname
413
- FileUtils.mkdir_p(copybase)
458
+ dir.sort.each do |fname|
459
+ next unless File.extname(fname).downcase == '.' + extname
460
+ FileUtils.mkdir_p(copybase) unless Dir.exist?(copybase)
461
+ if extname == 'erb'
462
+ File.open(File.join(copybase, fname.sub(/\.erb\Z/, '')), 'w') do |f|
463
+ f.print erb_content(File.join(dirname, fname))
464
+ end
465
+ else
414
466
  FileUtils.cp File.join(dirname, fname), copybase
415
467
  end
416
468
  end
@@ -260,7 +260,7 @@ module ReVIEW
260
260
  rows = adjust_n_cols(rows)
261
261
 
262
262
  begin
263
- table_header id, caption if caption.present?
263
+ table_header(id, caption) if caption.present?
264
264
  rescue KeyError
265
265
  error "no such table: #{id}"
266
266
  end
@@ -298,7 +298,7 @@ module ReVIEW
298
298
 
299
299
  def imgtable(_lines, id, caption = nil, _metric = nil)
300
300
  blank
301
- table_header id, caption if caption.present?
301
+ table_header(id, caption) if caption.present?
302
302
  blank
303
303
  end
304
304
 
@@ -390,7 +390,9 @@ module ReVIEW
390
390
  def inline_hd_chap(chap, id)
391
391
  if chap.number
392
392
  n = chap.headline_index.number(id)
393
- return I18n.t('chapter_quote', "#{n} #{compile_inline(chap.headline(id).caption)}") if @book.config['secnolevel'] >= n.split('.').size
393
+ if @book.config['secnolevel'] >= n.split('.').size
394
+ return I18n.t('chapter_quote', "#{n} #{compile_inline(chap.headline(id).caption)}")
395
+ end
394
396
  end
395
397
  I18n.t('chapter_quote', compile_inline(chap.headline(id).caption))
396
398
  rescue KeyError
@@ -624,7 +626,9 @@ module ReVIEW
624
626
  chs = ['', '「', '」']
625
627
  if @book.config['chapref']
626
628
  chs2 = @book.config['chapref'].split(',')
627
- error '--chapsplitter must have exactly 3 parameters with comma.' if chs2.size != 3
629
+ if chs2.size != 3
630
+ error '--chapsplitter must have exactly 3 parameters with comma.'
631
+ end
628
632
  chs = chs2
629
633
  end
630
634
  "#{chs[0]}#{@book.chapter_index.number(id)}#{chs[1]}#{@book.chapter_index.title(id)}#{chs[2]}"
@@ -43,12 +43,6 @@ module ReVIEW
43
43
  class Preprocessor
44
44
  include ErrorUtils
45
45
 
46
- def self.strip(f)
47
- buf = ''
48
- Strip.new(f).each { |line| buf << line.rstrip << "\n" }
49
- buf
50
- end
51
-
52
46
  class Strip
53
47
  def initialize(f)
54
48
  @f = f
@@ -69,12 +63,6 @@ module ReVIEW
69
63
  end
70
64
  nil
71
65
  end
72
-
73
- def each
74
- @f.each do |line|
75
- yield line unless /\A\#@/ =~ line
76
- end
77
- end
78
66
  end
79
67
 
80
68
  def initialize(repo, param)
@@ -118,8 +106,11 @@ module ReVIEW
118
106
  when /\A\#@mapfile/
119
107
  direc = parse_directive(line, 1, 'eval')
120
108
  path = expand(direc.arg)
121
- ent = @repository.fetch_file(path)
122
- ent = evaluate(path, ent) if direc['eval']
109
+ if direc['eval']
110
+ ent = evaluate(path, ent)
111
+ else
112
+ ent = @repository.fetch_file(path)
113
+ end
123
114
  replace_block(f, line, ent, false) # FIXME: turn off lineno: tmp
124
115
 
125
116
  when /\A\#@map(?:range)?/
@@ -155,7 +146,9 @@ module ReVIEW
155
146
  def replace_block(f, directive_line, newlines, with_lineno)
156
147
  @f.print directive_line
157
148
  newlines.each do |line|
158
- print_number line.number if with_lineno
149
+ if with_lineno
150
+ print_number line.number
151
+ end
159
152
  @f.print line.string
160
153
  end
161
154
  skip_list f
@@ -404,7 +397,9 @@ module ReVIEW
404
397
  case direction
405
398
  when 'begin'
406
399
  key = "#{type}/#{spec}"
407
- error "begin x2: #{key}" if curr[key]
400
+ if curr[key]
401
+ error "begin x2: #{key}"
402
+ end
408
403
  (repo[type] ||= {})[spec] = curr[key] = []
409
404
  when 'end'
410
405
  curr.delete("#{type}/#{spec}") or
@@ -417,7 +412,9 @@ module ReVIEW
417
412
  type = check_type($1)
418
413
  spec = check_spec($2)
419
414
  key = "#{type}/#{spec}"
420
- error "begin x2: #{key}" if curr[key]
415
+ if curr[key]
416
+ error "begin x2: #{key}"
417
+ end
421
418
  (repo[type] ||= {})[spec] = curr[key] = []
422
419
  opened.push [type, spec]
423
420
 
@@ -22,12 +22,18 @@ module ReVIEW
22
22
  def inc(level)
23
23
  n = level - 2
24
24
  @counter[n] += 1 if n >= 0
25
- (n + 1..@counter.size).each { |i| @counter[i] = 0 } if @counter.size > n
25
+ if @counter.size > n
26
+ (n + 1..@counter.size).each do |i|
27
+ @counter[i] = 0
28
+ end
29
+ end
26
30
  end
27
31
 
28
32
  def anchor(level)
29
33
  str = @chapter.format_number(false)
30
- 0.upto(level - 2) { |i| str << "-#{@counter[i]}" }
34
+ 0.upto(level - 2) do |i|
35
+ str << "-#{@counter[i]}"
36
+ end
31
37
  str
32
38
  end
33
39
 
@@ -127,7 +127,7 @@ module ReVIEW
127
127
  end
128
128
 
129
129
  def build_part(part, basetmpdir, textfile)
130
- File.open("#{basetmpdir}/#{textfile}", 'w') do |f|
130
+ File.open(File.join(basetmpdir, textfile), 'w') do |f|
131
131
  f.print '■H1■' unless @plaintext
132
132
  f.print ReVIEW::I18n.t('part', part.number)
133
133
  f.print " #{part.name.strip}" if part.name.strip.present?
@@ -143,7 +143,7 @@ module ReVIEW
143
143
  else
144
144
  filename = Pathname.new(chap.path).relative_path_from(base_path).to_s
145
145
  end
146
- id = filename.sub(/\.re\Z/, '')
146
+ id = File.basename(filename).sub(/\.re\Z/, '')
147
147
 
148
148
  textfile = "#{id}.txt"
149
149
 
@@ -26,15 +26,22 @@ module ReVIEW
26
26
  end
27
27
  end
28
28
 
29
- blocked_lines.map! { |i| [pre] + i + [post] } if pre && post
29
+ if pre && post
30
+ blocked_lines.map! { |i| [pre] + i + [post] }
31
+ end
30
32
  blocked_lines.map(&:join)
31
33
  end
32
34
 
33
35
  private
34
36
 
37
+ # remove elements at the back of `lines` if element is empty string
38
+ # (`lines` should be Array of String.)
39
+ #
35
40
  def trim_lines(lines)
36
41
  new_lines = lines.dup
37
- new_lines.pop while new_lines[-1] && new_lines[-1].strip.empty?
42
+ while new_lines[-1] && new_lines[-1].strip.empty?
43
+ new_lines.pop
44
+ end
38
45
  new_lines
39
46
  end
40
47
  end
@@ -15,8 +15,7 @@ require 'review/textbuilder'
15
15
  module ReVIEW
16
16
  class TOCParser
17
17
  def self.parse(chap)
18
- f = StringIO.new(chap.content, 'r:BOM|utf-8')
19
- stream = Preprocessor::Strip.new(f)
18
+ stream = StringIO.new(chap.content, 'r:BOM|utf-8')
20
19
  new.parse(stream, chap).map do |root|
21
20
  root.number = chap.number
22
21
  root
@@ -43,7 +42,9 @@ module ReVIEW
43
42
  next
44
43
  when /\A(={2,})[\[\s\{]/
45
44
  lev = $1.size
46
- error! filename, f.lineno, "section level too deep: #{lev}" if lev > 5
45
+ if lev > 5
46
+ error! filename, f.lineno, "section level too deep: #{lev}"
47
+ end
47
48
  label = get_label(line)
48
49
  if node_stack.empty?
49
50
  # missing chapter label
@@ -65,7 +66,9 @@ module ReVIEW
65
66
  roots.push new_chapter
66
67
 
67
68
  when %r{\A//\w+(?:\[.*?\])*\{\s*\z}
68
- error! filename, f.lineno, 'list found before section label' if node_stack.empty?
69
+ if node_stack.empty?
70
+ error! filename, f.lineno, 'list found before section label'
71
+ end
69
72
  node_stack.last.add_child(list = List.new)
70
73
  beg = f.lineno
71
74
  list.add line
@@ -89,7 +89,9 @@ module ReVIEW
89
89
  end
90
90
 
91
91
  def print_part(part)
92
- @out.puts li(part.title) if part.number
92
+ if part.number
93
+ @out.puts li(part.title)
94
+ end
93
95
  super
94
96
  end
95
97
 
@@ -1,3 +1,3 @@
1
1
  module ReVIEW
2
- VERSION = '2.5.0'.freeze
2
+ VERSION = '3.0.0.preview1'.freeze
3
3
  end
@@ -1,3 +1,5 @@
1
+ # Copyright (c) 2016-2018 Masayoshi Takahashi, Masanori Kado, Kenshi Muto
2
+ #
1
3
  # This program is free software.
2
4
  # You can distribute or modify this program under the terms of
3
5
  # the GNU LGPL, Lesser General Public License version 2.1.
@@ -47,7 +49,7 @@ module ReVIEW
47
49
  cmd_config = {}
48
50
  opts = OptionParser.new
49
51
 
50
- opts.banner = 'Usage: review-webmaker configfile'
52
+ opts.banner = 'Usage: review-webmaker [option] configfile'
51
53
  opts.version = ReVIEW::VERSION
52
54
  opts.on('--help', 'Prints this message and quit.') do
53
55
  puts opts.help
@@ -70,7 +72,9 @@ module ReVIEW
70
72
 
71
73
  def remove_old_files(path)
72
74
  math_dir = "./#{@config['imagedir']}/_review_math"
73
- FileUtils.rm_rf(math_dir) if @config['imgmath'] && Dir.exist?(math_dir)
75
+ if @config['imgmath'] && Dir.exist?(math_dir)
76
+ FileUtils.rm_rf(math_dir)
77
+ end
74
78
  FileUtils.rm_rf(path)
75
79
  end
76
80
 
@@ -170,7 +174,7 @@ module ReVIEW
170
174
  else
171
175
  filename = Pathname.new(chap.path).relative_path_from(base_path).to_s
172
176
  end
173
- id = filename.sub(/\.re\Z/, '')
177
+ id = File.basename(filename).sub(/\.re\Z/, '')
174
178
 
175
179
  htmlfile = "#{id}.#{@config['htmlext']}"
176
180
 
@@ -195,7 +199,7 @@ module ReVIEW
195
199
 
196
200
  def copy_resources(resdir, destdir, allow_exts = nil)
197
201
  return nil if !resdir || !File.exist?(resdir)
198
- allow_exts = @config['image_ext'] if allow_exts.nil?
202
+ allow_exts ||= @config['image_ext']
199
203
  FileUtils.mkdir_p(destdir)
200
204
  recursive_copy_files(resdir, destdir, allow_exts)
201
205
  end
@@ -215,7 +219,11 @@ module ReVIEW
215
219
  end
216
220
 
217
221
  def copy_stylesheet(basetmpdir)
218
- @config['stylesheet'].each { |sfile| FileUtils.cp(sfile, basetmpdir) } if @config['stylesheet'].size > 0
222
+ if @config['stylesheet'].size > 0
223
+ @config['stylesheet'].each do |sfile|
224
+ FileUtils.cp(sfile, basetmpdir)
225
+ end
226
+ end
219
227
  end
220
228
 
221
229
  def copy_frontmatter(basetmpdir)
@@ -260,8 +268,12 @@ module ReVIEW
260
268
  @body = ''
261
269
  @body << %Q(<div class="titlepage">)
262
270
  @body << %Q(<h1 class="tp-title">#{CGI.escapeHTML(@config.name_of('booktitle'))}</h1>)
263
- @body << %Q(<h2 class="tp-author">#{join_with_separator(@config.names_of('aut'), ReVIEW::I18n.t('names_splitter'))}</h2>) if @config['aut']
264
- @body << %Q(<h3 class="tp-publisher">#{join_with_separator(@config.names_of('pbl'), ReVIEW::I18n.t('names_splitter'))}</h3>) if @config['pbl']
271
+ if @config['aut']
272
+ @body << %Q(<h2 class="tp-author">#{join_with_separator(@config.names_of('aut'), ReVIEW::I18n.t('names_splitter'))}</h2>)
273
+ end
274
+ if @config['pbl']
275
+ @body << %Q(<h3 class="tp-publisher">#{join_with_separator(@config.names_of('pbl'), ReVIEW::I18n.t('names_splitter'))}</h3>)
276
+ end
265
277
  @body << '</div>'
266
278
 
267
279
  @language = @config['language']
@@ -25,20 +25,24 @@ module ReVIEW
25
25
  if part.number
26
26
  if part.file?
27
27
  ext = part.book.config['htmlext'] || 'html'
28
- path = part.path.sub(/\.re/, '.' + ext)
28
+ path = File.basename(part.path.sub(/\.re/, '.' + ext))
29
29
  @out.puts %Q(<li><a href="#{path}">#{h(I18n.t('part_short', part.number) + ' ' + part.title)}</a>\n<ul>\n)
30
30
  else
31
31
  @out.puts %Q(<li>#{h(I18n.t('part_short', part.number) + ' ' + part.title)}\n<ul>\n)
32
32
  end
33
33
  end
34
- part.each_chapter { |chap| print_chapter(chap) }
35
- @out.puts "</ul>\n</li>\n" if part.number
34
+ part.each_chapter do |chap|
35
+ print_chapter(chap)
36
+ end
37
+ if part.number
38
+ @out.puts "</ul>\n</li>\n"
39
+ end
36
40
  end
37
41
 
38
42
  def print_chapter(chap)
39
43
  chap_node = TOCParser.chapter_node(chap)
40
44
  ext = chap.book.config['htmlext'] || 'html'
41
- path = chap.path.sub(/\.re/, '.' + ext)
45
+ path = File.basename(chap.path.sub(/\.re/, '.' + ext))
42
46
  label = if chap_node.number && chap.on_chaps?
43
47
  "#{I18n.t('chapter_short', chap.number)} #{chap.title}"
44
48
  else
data/review.gemspec CHANGED
@@ -1,4 +1,4 @@
1
- $LOAD_PATH.push File.expand_path('../lib', __FILE__)
1
+ $LOAD_PATH.push File.expand_path('lib', __dir__)
2
2
  require 'review/version'
3
3
 
4
4
  Gem::Specification.new do |gem|
@@ -12,7 +12,7 @@ Gem::Specification.new do |gem|
12
12
  gem.summary = 'Re:VIEW: a easy-to-use digital publishing system'
13
13
  gem.description = 'Re:VIEW is a digital publishing system for books and ebooks. It supports InDesign, EPUB and LaTeX.'
14
14
  gem.required_rubygems_version = Gem::Requirement.new('>= 0') if gem.respond_to? :required_rubygems_version=
15
- gem.date = '2018-03-01'
15
+ gem.date = '2018-06-30'
16
16
 
17
17
  gem.files = `git ls-files`.split("\n")
18
18
  gem.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
@@ -25,6 +25,7 @@ Gem::Specification.new do |gem|
25
25
  gem.add_dependency('rubyzip')
26
26
  gem.add_development_dependency('pygments.rb')
27
27
  gem.add_development_dependency('rake')
28
- gem.add_development_dependency('rubocop', '~> 0.52.0')
28
+ gem.add_development_dependency('rubocop', '~> 0.57.2')
29
+ gem.add_development_dependency('simplecov')
29
30
  gem.add_development_dependency('test-unit')
30
31
  end
@@ -0,0 +1,84 @@
1
+ \makeatletter
2
+ \def\review@texcompiler{<%= @texcompiler %>}
3
+ \def\review@documentclass{<%= @documentclass %>}
4
+ \def\review@booktitlename{<%= escape_latex(@config.name_of('booktitle')) %>}
5
+ <%- if @config['subtitle'] -%>
6
+ \def\review@subtitlename{<%= escape_latex(@config.name_of('subtitle')) %>}
7
+ <%- end -%>
8
+ \def\review@autnames{<%= escape_latex(@config.names_of('aut').join(I18n.t('names_splitter'))) %>}
9
+ \def\review@titlepageauthors{<%= @authors %>}
10
+ \def\review@date{<%= escape_latex(@config['date'].to_s) %>}
11
+ <%- if @config['highlight'] && @config['highlight']['latex'] -%>
12
+ \def\review@highlightlatex{<%= @config['highlight']['latex'] %>}
13
+ <%- end -%>
14
+ \def\review@language{<%= @config['language'] %>}
15
+ \def\review@intn@list{<%= escape_latex(I18n.t('list')) %>}
16
+ \def\review@intn@columnhead{<%= escape_latex(I18n.t('column_head')) %>}
17
+ \def\review@intn@image{<%= escape_latex(I18n.t('image')) %>}
18
+ \def\review@intn@table{<%= escape_latex(I18n.t('table')) %>}
19
+ \def\review@intn@columnname{<%= escape_latex(I18n.t('columnname')) %>}
20
+ \def\review@intn@memohead{<%= escape_latex(I18n.t('memo_head')) %>}
21
+ \def\review@intn@edition{<%= escape_latex(I18n.t('edition')) %>}
22
+ \def\review@intn@publishedby{<%= escape_latex(I18n.t('published_by', @config.names_of('pbl').join(I18n.t('names_splitter'))))%>}
23
+ \def\review@intn@captionprefix{<%= escape_latex(I18n.t('caption_prefix')) %>}
24
+ \def\review@toctitle{<%= escape_latex(@config['toctitle'].present? ? @config['toctitle'] : I18n.t('toctitle')) %>}
25
+ \def\review@prepartname{<%= escape_latex(@locale_latex['prepartname']) %>}
26
+ \def\review@postpartname{<%= escape_latex(@locale_latex['postpartname']) %>}
27
+ \def\review@prechaptername{<%= escape_latex(@locale_latex['prechaptername']) %>}
28
+ \def\review@postchaptername{<%= escape_latex(@locale_latex['postchaptername']) %>}
29
+ \def\review@figurename{<%= escape_latex(I18n.t('image')) %>}
30
+ \def\review@tablename{<%= escape_latex(I18n.t('table')) %>}
31
+ \def\review@appendixname{<%= escape_latex(@locale_latex['preappendixname']) %>}
32
+ <%- if @config['toc'] -%>
33
+ \def\review@toc{true}
34
+ \def\review@tocdepth{<%= @config['toclevel'] - 1 %>}
35
+ <%- end -%>
36
+ <%- if @config['makeindex'] -%>
37
+ \def\review@makeindex{true}
38
+ <%- end -%>
39
+ <%- if @config['cover'] -%>
40
+ \def\review@coverfile{<%= File.read(@config['cover']) %>}
41
+ <%- elsif @config['coverimage'] -%>
42
+ \def\review@coverimage{./<%= @config['imagedir'] %>/<%= @config['coverimage'] %>}
43
+ \def\review@coverimageoption{<%= @coverimageoption%>}
44
+ <%- end -%>
45
+ <%- if @config['titlepage'] -%>
46
+ \def\review@titlepage{true}
47
+ <%- if @config['titlefile'] -%>
48
+ \def\review@titlefile{<%= File.read(@config['titlefile']) %>}
49
+ <%- end -%>
50
+ <%- end -%>
51
+ <%- if @custom_originaltitlepage -%>
52
+ \def\revieworiginaltitlepagecont{<%= @custom_originaltitlepage %>}
53
+ <%- end -%>
54
+ <%- if @custom_creditpage -%>
55
+ \def\reviewcreditfilecont{<%= @custom_creditpage %>}
56
+ <%- end -%>
57
+ <%- if @custom_profilepage -%>
58
+ \def\reviewprofilepagecont{<%= @custom_profilepage %>}
59
+ <%- end -%>
60
+ <%- if @custom_advfilepage -%>
61
+ \def\reviewadvfilepagecont{<%= @custom_advfilepage %>}
62
+ <%- end -%>
63
+ <%- if @custom_backcoverpage -%>
64
+ \def\reviewbackcovercont{<%= @custom_backcoverpage %>}
65
+ <%- end -%>
66
+
67
+ <%- if @config['colophon'] && @config['colophon'] -%>
68
+ \def\review@colophon{true}
69
+ <%- if @custom_colophonpage -%>
70
+ \def\review@colophonfile{<%= @custom_colophonpage %>}
71
+ <%- end -%>
72
+ <%- end -%>
73
+ \def\review@pubhistories{<%= @config['pubhistory'].to_s.gsub(/\n/){"\n\n\\noindent\n"} %>}
74
+ \def\review@colophonnames{<%= @okuduke %>}
75
+ <%- if @config['rights'] -%>
76
+ \def\review@rights{<%= @config.names_of('rights').map{|s| escape_latex(s)}.join('\\' + '\\') %>}
77
+ <%- end -%>
78
+
79
+ \def\reviewprefacefiles{<%= @input_files['PREDEF'] %>}
80
+ \def\reviewchapterfiles{<%= @input_files['CHAPS'] %>}
81
+ \def\reviewappendixfiles{<%= @input_files['APPENDIX'] %>}
82
+ \def\reviewpostdeffiles{<%= @input_files['POSTDEF'] %>}
83
+
84
+ \makeatother