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
@@ -18,7 +18,9 @@ module EPUBMaker
18
18
  def initialize(producer)
19
19
  super
20
20
  @opf_prefix = {}
21
- @producer.config['opf_prefix'].each { |k, v| @opf_prefix[k] = v } if @producer.config['opf_prefix'].present?
21
+ if @producer.config['opf_prefix'].present?
22
+ @producer.config['opf_prefix'].each { |k, v| @opf_prefix[k] = v }
23
+ end
22
24
  end
23
25
 
24
26
  # Return opf file content.
@@ -124,7 +126,11 @@ module EPUBMaker
124
126
  end
125
127
 
126
128
  ## add custom <meta> element
127
- @producer.config['opf_meta'].each { |k, v| s << %Q( <meta property="#{k}">#{CGI.escapeHTML(v)}</meta>\n) } if @producer.config['opf_meta'].present?
129
+ if @producer.config['opf_meta'].present?
130
+ @producer.config['opf_meta'].each do |k, v|
131
+ s << %Q( <meta property="#{k}">#{CGI.escapeHTML(v)}</meta>\n)
132
+ end
133
+ end
128
134
 
129
135
  s
130
136
  end
@@ -178,7 +184,9 @@ EOT
178
184
  @producer.contents.each do |item|
179
185
  next if item.media !~ /xhtml\+xml/ # skip non XHTML
180
186
  if toc.nil? && item.chaptype != 'pre'
181
- s << %Q( <itemref idref="#{@producer.config['bookname']}-toc.#{@producer.config['htmlext']}" />\n) if @producer.config['toc']
187
+ if @producer.config['toc']
188
+ s << %Q( <itemref idref="#{@producer.config['bookname']}-toc.#{@producer.config['htmlext']}" />\n)
189
+ end
182
190
  toc = true
183
191
  end
184
192
  s << %Q( <itemref idref="#{item.id}"/>\n)
@@ -29,14 +29,18 @@ module EPUBMaker
29
29
 
30
30
  # Take YAML +file+ and return parameter hash.
31
31
  def self.load(file)
32
- raise "Can't open #{file}." if file.nil? || !File.exist?(file)
32
+ if file.nil? || !File.exist?(file)
33
+ raise "Can't open #{file}."
34
+ end
33
35
  loader = ReVIEW::YAMLLoader.new
34
36
  loader.load_file(file)
35
37
  end
36
38
 
37
39
  # Take YAML +file+ and update parameter hash.
38
40
  def load(file)
39
- raise "Can't open #{file}." if file.nil? || !File.exist?(file)
41
+ if file.nil? || !File.exist?(file)
42
+ raise "Can't open #{file}."
43
+ end
40
44
  loader = ReVIEW::YAMLLoader.new
41
45
  merge_config(@config.deep_merge(loader.load_file(file)))
42
46
  end
@@ -79,33 +83,43 @@ module EPUBMaker
79
83
  raise "Invalid EPUB version (#{@config['epubversion']}.)"
80
84
  end
81
85
  end
82
- ReVIEW::I18n.locale = config['language'] if config['language']
86
+ if config['language']
87
+ ReVIEW::I18n.locale = config['language']
88
+ end
83
89
  support_legacy_maker
84
90
  end
85
91
 
86
92
  # Write mimetype file to IO object +wobj+.
87
93
  def mimetype(wobj)
88
94
  s = @epub.mimetype
89
- wobj.print s if !s.nil? && !wobj.nil?
95
+ if !s.nil? && !wobj.nil?
96
+ wobj.print s
97
+ end
90
98
  end
91
99
 
92
100
  # Write opf file to IO object +wobj+.
93
101
  def opf(wobj)
94
102
  s = @epub.opf
95
- wobj.puts s if !s.nil? && !wobj.nil?
103
+ if !s.nil? && !wobj.nil?
104
+ wobj.puts s
105
+ end
96
106
  end
97
107
 
98
108
  # Write ncx file to IO object +wobj+. +indentarray+ defines prefix
99
109
  # string for each level.
100
110
  def ncx(wobj, indentarray = [])
101
111
  s = @epub.ncx(indentarray)
102
- wobj.puts s if !s.nil? && !wobj.nil?
112
+ if !s.nil? && !wobj.nil?
113
+ wobj.puts s
114
+ end
103
115
  end
104
116
 
105
117
  # Write container file to IO object +wobj+.
106
118
  def container(wobj)
107
119
  s = @epub.container
108
- wobj.puts s if !s.nil? && !wobj.nil?
120
+ if !s.nil? && !wobj.nil?
121
+ wobj.puts s
122
+ end
109
123
  end
110
124
 
111
125
  # Write cover file to IO object +wobj+.
@@ -114,32 +128,40 @@ module EPUBMaker
114
128
  def cover(wobj)
115
129
  type = @config['epubversion'] >= 3 ? 'cover' : nil
116
130
  s = @epub.cover(type)
117
- wobj.puts s if !s.nil? && !wobj.nil?
131
+ if !s.nil? && !wobj.nil?
132
+ wobj.puts s
133
+ end
118
134
  end
119
135
 
120
136
  # Write title file (copying) to IO object +wobj+.
121
137
  def titlepage(wobj)
122
138
  s = @epub.titlepage
123
- wobj.puts s if !s.nil? && !wobj.nil?
139
+ if !s.nil? && !wobj.nil?
140
+ wobj.puts s
141
+ end
124
142
  end
125
143
 
126
144
  # Write colophon file to IO object +wobj+.
127
145
  def colophon(wobj)
128
146
  s = @epub.colophon
129
- wobj.puts s if !s.nil? && !wobj.nil?
147
+ if !s.nil? && !wobj.nil?
148
+ wobj.puts s
149
+ end
130
150
  end
131
151
 
132
152
  # Write own toc file to IO object +wobj+.
133
153
  def mytoc(wobj)
134
154
  s = @epub.mytoc
135
- wobj.puts s if !s.nil? && !wobj.nil?
155
+ if !s.nil? && !wobj.nil?
156
+ wobj.puts s
157
+ end
136
158
  end
137
159
 
138
160
  # Add informations of figure files in +path+ to contents array.
139
161
  # +base+ defines a string to remove from path name.
140
162
  def import_imageinfo(path, base = nil, allow_exts = nil)
141
163
  return nil unless File.exist?(path)
142
- allow_exts = @config['image_ext'] if allow_exts.nil?
164
+ allow_exts ||= @config['image_ext']
143
165
  Dir.foreach(path) do |f|
144
166
  next if f.start_with?('.')
145
167
  if f =~ /\.(#{allow_exts.join('|')})\Z/i
@@ -150,7 +172,9 @@ module EPUBMaker
150
172
  @contents.push(EPUBMaker::Content.new('file' => "#{path.sub(base + '/', '')}/#{f}"))
151
173
  end
152
174
  end
153
- import_imageinfo("#{path}/#{f}", base) if FileTest.directory?("#{path}/#{f}")
175
+ if FileTest.directory?("#{path}/#{f}")
176
+ import_imageinfo("#{path}/#{f}", base)
177
+ end
154
178
  end
155
179
  end
156
180
 
@@ -161,10 +185,12 @@ module EPUBMaker
161
185
  # +tmpdir+ defines temporary directory.
162
186
  def produce(epubfile, basedir = nil, tmpdir = nil)
163
187
  current = Dir.pwd
164
- basedir = current if basedir.nil?
188
+ basedir ||= current
165
189
 
166
190
  new_tmpdir = tmpdir.nil? ? Dir.mktmpdir : tmpdir
167
- epubfile = "#{current}/#{epubfile}" if epubfile !~ %r{\A/}
191
+ if epubfile !~ %r{\A/}
192
+ epubfile = "#{current}/#{epubfile}"
193
+ end
168
194
 
169
195
  # FIXME: error check
170
196
  File.unlink(epubfile) if File.exist?(epubfile)
@@ -188,8 +214,12 @@ module EPUBMaker
188
214
  def isbn_hyphen
189
215
  str = @config['isbn'].to_s
190
216
 
191
- return "#{str[0..0]}-#{str[1..5]}-#{str[6..8]}-#{str[9..9]}" if str =~ /\A\d{10}\Z/
192
- return "#{str[0..2]}-#{str[3..3]}-#{str[4..8]}-#{str[9..11]}-#{str[12..12]}" if str =~ /\A\d{13}\Z/
217
+ if str =~ /\A\d{10}\Z/
218
+ return "#{str[0..0]}-#{str[1..5]}-#{str[6..8]}-#{str[9..9]}"
219
+ end
220
+ if str =~ /\A\d{13}\Z/
221
+ return "#{str[0..2]}-#{str[3..3]}-#{str[4..8]}-#{str[9..11]}-#{str[12..12]}"
222
+ end
193
223
  nil
194
224
  end
195
225
 
@@ -197,7 +227,7 @@ module EPUBMaker
197
227
 
198
228
  # Complement parameters.
199
229
  def complement
200
- @config['htmlext'] = 'html' if @config['htmlext'].nil?
230
+ @config['htmlext'] ||= 'html'
201
231
  defaults = ReVIEW::Configure.new.merge(
202
232
  'language' => 'ja',
203
233
  'date' => Time.now.strftime('%Y-%m-%d'),
@@ -237,6 +267,7 @@ module EPUBMaker
237
267
  'cover_linear' => nil
238
268
  },
239
269
  'externallink' => true,
270
+ 'contentdir' => '.',
240
271
  'imagedir' => 'images',
241
272
  'fontdir' => 'fonts',
242
273
  'image_ext' => %w[png gif jpg jpeg svg ttf woff otf],
@@ -274,7 +305,9 @@ module EPUBMaker
274
305
  @config.delete(k)
275
306
  end
276
307
 
277
- @config['htmlversion'] = 5 if @config['epubversion'] >= 3
308
+ if @config['epubversion'] >= 3
309
+ @config['htmlversion'] = 5
310
+ end
278
311
 
279
312
  @config.maker = 'epubmaker'
280
313
  @config['cover'] = "#{@config['bookname']}.#{@config['htmlext']}" unless @config['cover']
@@ -290,7 +323,9 @@ module EPUBMaker
290
323
  ill lyr mdc mus nrt oth pht pbl prt red rev spn ths trc trl
291
324
  stylesheet rights].each do |item|
292
325
  next unless @config[item]
293
- @config[item] = [@config[item]] if @config[item].is_a?(String)
326
+ if @config[item].is_a?(String)
327
+ @config[item] = [@config[item]]
328
+ end
294
329
  end
295
330
  # optional
296
331
  # type, format, identifier, source, relation, coverpage, aut
@@ -1,5 +1,5 @@
1
1
  #
2
- # Copyright (c) 2009-2017 Minero Aoki, Kenshi Muto
2
+ # Copyright (c) 2009-2018 Minero Aoki, Kenshi Muto
3
3
  # 2002-2008 Minero Aoki
4
4
  #
5
5
  # This program is free software.
@@ -13,47 +13,36 @@ require 'review/catalog'
13
13
  module ReVIEW
14
14
  module Book
15
15
  class Base
16
- attr_writer :config
16
+ attr_accessor :config
17
17
  attr_writer :parts
18
18
  attr_writer :catalog
19
19
  attr_reader :basedir
20
20
 
21
- def self.load_default
22
- ReVIEW.logger.warn 'Book::Base.load_default() is obsoleted. Use Book::Base.load().'
23
- load
24
- end
25
-
26
21
  def self.load(dir = '.')
27
- update_rubyenv dir
28
22
  new(dir)
29
23
  end
30
24
 
31
- @basedir_seen = {}
32
-
33
- def self.update_rubyenv(dir)
34
- return if @basedir_seen.key?(dir)
35
- if File.file?(File.join(dir, 'review-ext.rb'))
36
- if ENV['REVIEW_SAFE_MODE'].to_i & 2 > 0
37
- ReVIEW.logger.warn 'review-ext.rb is prohibited in safe mode. ignored.'
38
- else
39
- Kernel.load File.expand_path(File.join(dir, 'review-ext.rb'))
40
- end
41
- end
42
- @basedir_seen[dir] = true
43
- end
44
-
45
- def self.clear_rubyenv
46
- @basedir_seen = {}
47
- end
48
-
49
- def initialize(basedir)
25
+ def initialize(basedir = '.')
50
26
  @basedir = basedir
27
+ @logger = ReVIEW.logger
51
28
  @parts = nil
52
29
  @chapter_index = nil
53
30
  @config = ReVIEW::Configure.values
54
31
  @catalog = nil
55
32
  @read_part = nil
56
33
  @warn_old_files = {} # XXX for checking CHAPS, PREDEF, POSTDEF
34
+ @basedir_seen = {}
35
+ update_rubyenv
36
+ end
37
+
38
+ def update_rubyenv
39
+ if File.file?(File.join(@basedir, 'review-ext.rb'))
40
+ if ENV['REVIEW_SAFE_MODE'].to_i & 2 > 0
41
+ @logger.warn 'review-ext.rb is prohibited in safe mode. ignored.'
42
+ else
43
+ Kernel.load(File.expand_path(File.join(@basedir, 'review-ext.rb')))
44
+ end
45
+ end
57
46
  end
58
47
 
59
48
  def bib_file
@@ -68,8 +57,8 @@ module ReVIEW
68
57
  config['ext']
69
58
  end
70
59
 
71
- def image_dir
72
- config['image_dir']
60
+ def imagedir
61
+ File.join(@basedir, config['imagedir'])
73
62
  end
74
63
 
75
64
  def image_types
@@ -80,6 +69,14 @@ module ReVIEW
80
69
  config['image_types'] = types
81
70
  end
82
71
 
72
+ def contentdir
73
+ if !config['contentdir'].present? || config['contentdir'] == '.'
74
+ @basedir
75
+ else
76
+ File.join(@basedir, config['contentdir'])
77
+ end
78
+ end
79
+
83
80
  def page_metric
84
81
  if config['page_metric'].respond_to?(:downcase) && config['page_metric'].upcase =~ /\A[A-Z0-9_]+\Z/
85
82
  ReVIEW::Book::PageMetric.const_get(config['page_metric'].upcase)
@@ -103,7 +100,10 @@ module ReVIEW
103
100
  end
104
101
 
105
102
  def parts_in_file
106
- parts.find_all { |part| part if part.present? and part.file? }
103
+ # TODO: should be `parts.find_all{|part| part.present? and part.file?}` ?
104
+ parts.find_all do |part|
105
+ part if part.present? and part.file?
106
+ end
107
107
  end
108
108
 
109
109
  def part(n)
@@ -139,7 +139,12 @@ module ReVIEW
139
139
  return @chapter_index if @chapter_index
140
140
 
141
141
  contents = chapters
142
- parts.each { |prt| contents << prt if prt.id.present? }
142
+ # TODO: contents += parts.find_all { |prt| prt.id.present? }
143
+ parts.each do |prt|
144
+ if prt.id.present?
145
+ contents << prt
146
+ end
147
+ end
143
148
  @chapter_index = ChapterIndex.new(contents)
144
149
  end
145
150
 
@@ -151,7 +156,9 @@ module ReVIEW
151
156
  finded = false
152
157
  each_chapter do |c|
153
158
  return c if finded
154
- finded = true if c == chapter
159
+ if c == chapter
160
+ finded = true
161
+ end
155
162
  end
156
163
  nil # not found
157
164
  end
@@ -160,7 +167,9 @@ module ReVIEW
160
167
  finded = false
161
168
  each_chapter_r do |c|
162
169
  return c if finded
163
- finded = true if c == chapter
170
+ if c == chapter
171
+ finded = true
172
+ end
164
173
  end
165
174
  nil # not found
166
175
  end
@@ -171,10 +180,6 @@ module ReVIEW
171
180
  vol
172
181
  end
173
182
 
174
- def config
175
- @config ||= Configure.values
176
- end
177
-
178
183
  def load_config(filename)
179
184
  new_conf = YAML.load_file(filename)
180
185
  @config.merge!(new_conf)
@@ -184,9 +189,11 @@ module ReVIEW
184
189
  return @catalog if @catalog.present?
185
190
 
186
191
  catalogfile_path = filename_join(@basedir, config['catalogfile'])
187
- @catalog = File.open(catalogfile_path, 'r:BOM|utf-8') { |f| Catalog.new(f) } if File.file? catalogfile_path
192
+ if File.file? catalogfile_path
193
+ @catalog = File.open(catalogfile_path, 'r:BOM|utf-8') { |f| Catalog.new(f) }
194
+ end
188
195
  if @catalog
189
- @catalog.validate!(basedir)
196
+ @catalog.validate!(@config, basedir)
190
197
  end
191
198
  @catalog
192
199
  end
@@ -256,7 +263,9 @@ module ReVIEW
256
263
 
257
264
  begin
258
265
  predef_file = filename_join(@basedir, config['predef_file'])
259
- mkpart_from_namelistfile(predef_file) if File.file?(predef_file)
266
+ if File.file?(predef_file)
267
+ mkpart_from_namelistfile(predef_file)
268
+ end
260
269
  rescue FileNotFound => err
261
270
  raise FileNotFound, "preface #{err.message}"
262
271
  end
@@ -271,14 +280,18 @@ module ReVIEW
271
280
 
272
281
  begin
273
282
  postdef_file = filename_join(@basedir, config['postdef_file'])
274
- mkpart_from_namelistfile(postdef_file) if File.file?(postdef_file)
283
+ if File.file?(postdef_file)
284
+ mkpart_from_namelistfile(postdef_file)
285
+ end
275
286
  rescue FileNotFound => err
276
287
  raise FileNotFound, "postscript #{err.message}"
277
288
  end
278
289
  end
279
290
 
280
291
  def postscripts
281
- mkpart_from_namelist(catalog.postdef.split("\n")) if catalog
292
+ if catalog
293
+ mkpart_from_namelist(catalog.postdef.split("\n"))
294
+ end
282
295
  end
283
296
 
284
297
  private
@@ -308,12 +321,12 @@ module ReVIEW
308
321
  return catalog.parts_with_chaps.map do |entry|
309
322
  if entry.is_a?(Hash)
310
323
  chaps = entry.values.first.map do |chap|
311
- chap = Chapter.new(self, num += 1, chap, File.join(@basedir, chap))
324
+ chap = Chapter.new(self, num += 1, chap, File.join(contentdir, chap))
312
325
  chap
313
326
  end
314
327
  Part.new(self, part += 1, chaps, read_part.split("\n")[part - 1])
315
328
  else
316
- chap = Chapter.new(self, num += 1, entry, File.join(@basedir, entry))
329
+ chap = Chapter.new(self, num += 1, entry, File.join(contentdir, entry))
317
330
  if chap.number
318
331
  num = chap.number
319
332
  else
@@ -327,7 +340,7 @@ module ReVIEW
327
340
  chap = read_chaps.
328
341
  strip.lines.map(&:strip).join("\n").split(/\n{2,}/).
329
342
  map do |part_chunk|
330
- chaps = part_chunk.split.map { |chapid| Chapter.new(self, num += 1, chapid, File.join(@basedir, chapid)) }
343
+ chaps = part_chunk.split.map { |chapid| Chapter.new(self, num += 1, chapid, File.join(contentdir, chapid)) }
331
344
  if part_exist? && read_part.split("\n").size > part
332
345
  Part.new(self, part += 1, chaps, read_part.split("\n")[part - 1])
333
346
  else
@@ -359,14 +372,14 @@ module ReVIEW
359
372
 
360
373
  def mkchap(name, number = nil)
361
374
  name += ext if File.extname(name).empty?
362
- path = File.join(@basedir, name)
375
+ path = File.join(contentdir, name)
363
376
  raise FileNotFound, "file not exist: #{path}" unless File.file?(path)
364
377
  Chapter.new(self, number, name, path)
365
378
  end
366
379
 
367
380
  def mkchap_ifexist(name, idx = nil)
368
381
  name += ext if File.extname(name).empty?
369
- path = File.join(@basedir, name)
382
+ path = File.join(contentdir, name)
370
383
  if File.file?(path)
371
384
  idx += 1 if idx
372
385
  Chapter.new(self, idx, name, path)
@@ -376,7 +389,9 @@ module ReVIEW
376
389
  def read_file(filename)
377
390
  unless @warn_old_files[filename]
378
391
  @warn_old_files[filename] = true
379
- ReVIEW.logger.warn "!!! #{filename} is obsoleted. please use catalog.yml." if caller.none? { |item| item =~ %r{/review/test/test_} }
392
+ if caller.none? { |item| item =~ %r{/review/test/test_} }
393
+ @logger.warn "!!! #{filename} is obsoleted. please use catalog.yml."
394
+ end
380
395
  end
381
396
  res = ''
382
397
  File.open(filename_join(@basedir, filename), 'r:BOM|utf-8') do |f|
@@ -51,7 +51,7 @@ module ReVIEW
51
51
  end
52
52
 
53
53
  def find_first_header_option
54
- f = LineInput.new(Preprocessor::Strip.new(StringIO.new(@content)))
54
+ f = LineInput.new(StringIO.new(@content))
55
55
  while f.next?
56
56
  case f.peek
57
57
  when /\A=+[\[\s\{]/
@@ -59,7 +59,9 @@ module ReVIEW
59
59
  return m[2] # tag
60
60
  when %r{/\A//[a-z]+/}
61
61
  line = f.gets
62
- f.until_match(%r{\A//\}}) if line.rstrip[-1, 1] == '{'
62
+ if line.rstrip[-1, 1] == '{'
63
+ f.until_match(%r{\A//\}})
64
+ end
63
65
  end
64
66
  f.gets
65
67
  end
@@ -72,18 +74,28 @@ module ReVIEW
72
74
 
73
75
  def format_number(heading = true)
74
76
  return '' unless @number
75
- return @number.to_s if on_predef?
77
+ if on_predef?
78
+ return @number.to_s
79
+ end
76
80
 
77
81
  if on_appendix?
78
- return @number.to_s if @number < 1 || @number > 27
79
- raise ReVIEW::ConfigError, %Q('appendix_format:' in config.yml is obsoleted.) if @book.config['appendix_format']
82
+ # XXX: should be extracted with magic number
83
+ if @number < 1 || @number > 27
84
+ return @number.to_s
85
+ end
86
+ if @book.config['appendix_format']
87
+ raise ReVIEW::ConfigError, %Q('appendix_format:' in config.yml is obsoleted.)
88
+ end
80
89
 
81
90
  i18n_appendix = I18n.get('appendix')
82
91
  fmt = i18n_appendix.scan(/%\w{1,3}/).first || '%s'
83
92
  I18n.update('appendix_without_heading' => fmt)
84
93
 
85
- return I18n.t('appendix', @number) if heading
86
- return I18n.t('appendix_without_heading', @number)
94
+ if heading
95
+ return I18n.t('appendix', @number)
96
+ else
97
+ return I18n.t('appendix_without_heading', @number)
98
+ end
87
99
  end
88
100
 
89
101
  if heading
@@ -14,10 +14,7 @@ module ReVIEW
14
14
  include TextUtils
15
15
  attr_reader :book
16
16
  attr_reader :path
17
-
18
- def env
19
- @book
20
- end
17
+ attr_accessor :content
21
18
 
22
19
  def dirname
23
20
  return nil unless @path
@@ -62,18 +59,6 @@ module ReVIEW
62
59
  @volume
63
60
  end
64
61
 
65
- # deprecated; use content()
66
- def open(&_block)
67
- return (block_given? ? yield(@io) : @io) if @io
68
- StringIO.new(content)
69
- end
70
-
71
- attr_writer :content
72
-
73
- def content
74
- @content
75
- end
76
-
77
62
  def lines
78
63
  # FIXME: we cannot duplicate Enumerator on ruby 1.9 HEAD
79
64
  (@lines ||= content.lines.to_a).dup
@@ -116,20 +101,20 @@ module ReVIEW
116
101
  def numberless_image_index
117
102
  @numberless_image_index ||=
118
103
  NumberlessImageIndex.parse(lines, id,
119
- "#{book.basedir}/#{@book.config['imagedir']}",
104
+ @book.imagedir,
120
105
  @book.image_types, @book.config['builder'])
121
106
  end
122
107
 
123
108
  def image_index
124
109
  @image_index ||= ImageIndex.parse(lines, id,
125
- "#{book.basedir}/#{@book.config['imagedir']}",
110
+ @book.imagedir,
126
111
  @book.image_types, @book.config['builder'])
127
112
  @image_index
128
113
  end
129
114
 
130
115
  def icon_index
131
116
  @icon_index ||= IconIndex.parse(lines, id,
132
- "#{book.basedir}/#{@book.config['imagedir']}",
117
+ @book.imagedir,
133
118
  @book.image_types, @book.config['builder'])
134
119
  @icon_index
135
120
  end
@@ -137,7 +122,7 @@ module ReVIEW
137
122
  def indepimage_index
138
123
  @indepimage_index ||=
139
124
  IndepImageIndex.parse(lines, id,
140
- "#{book.basedir}/#{@book.config['imagedir']}",
125
+ @book.imagedir,
141
126
  @book.image_types, @book.config['builder'])
142
127
  end
143
128
 
@@ -1,5 +1,5 @@
1
1
  #
2
- # Copyright (c) 2014-2017 Minero Aoki, Kenshi Muto, Masayoshi Takahashi
2
+ # Copyright (c) 2014-2018 Minero Aoki, Kenshi Muto, Masayoshi Takahashi
3
3
  #
4
4
  # This program is free software.
5
5
  # You can distribute or modify this program under the terms of
@@ -22,7 +22,7 @@ module ReVIEW
22
22
  end
23
23
 
24
24
  def dir_entries
25
- Dir.glob(File.join(@basedir, '**{,/*/**}/*.*')).uniq
25
+ Dir.glob(File.join(@basedir, '**{,/*/**}/*.*')).uniq.sort
26
26
  end
27
27
 
28
28
  def add_entry(path)
@@ -33,7 +33,14 @@ module ReVIEW
33
33
  def find_path(id)
34
34
  targets = target_list(id)
35
35
  targets.each do |target|
36
- @exts.each { |ext| return "#{target}#{ext}" if @entries.include?("#{target}#{ext}") }
36
+ @exts.each do |ext|
37
+ @entries.find do |entry|
38
+ downname = entry.sub(/\.[^.]+$/, File.extname(entry).downcase)
39
+ if downname == "#{target}#{ext}"
40
+ return entry
41
+ end
42
+ end
43
+ end
37
44
  end
38
45
  nil
39
46
  end