review 2.5.0 → 3.0.0.preview1

Sign up to get free protection for your applications and to get access to all the features.
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