review 1.2.0 → 1.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +36 -0
- data/.rubocop.yml +1 -0
- data/ChangeLog +102 -0
- data/README.rdoc +2 -2
- data/bin/review-check +18 -16
- data/bin/review-compile +49 -42
- data/bin/review-epubmaker +23 -993
- data/bin/review-epubmaker-legacy +1024 -0
- data/bin/review-index +17 -15
- data/bin/review-init +39 -9
- data/bin/review-pdfmaker +124 -89
- data/bin/review-preproc +16 -14
- data/bin/review-vol +17 -15
- data/debian/docs +1 -1
- data/doc/catalog.rdoc +34 -0
- data/doc/format.rdoc +16 -2
- data/doc/libepubmaker/{config.yaml → config.yml} +63 -19
- data/doc/quickstart.rdoc +1 -1
- data/doc/{sample.yaml → sample.yml} +0 -0
- data/lib/epubmaker.rb +1 -1
- data/lib/epubmaker/content.rb +9 -1
- data/lib/epubmaker/epubv2.rb +59 -7
- data/lib/epubmaker/epubv3.rb +14 -9
- data/lib/epubmaker/producer.rb +68 -27
- data/lib/epubmaker/resource.rb +3 -1
- data/lib/lineinput.rb +2 -2
- data/lib/review/book/base.rb +125 -24
- data/lib/review/book/chapter.rb +42 -0
- data/lib/review/book/compilable.rb +23 -4
- data/lib/review/book/image_finder.rb +64 -0
- data/lib/review/book/index.rb +64 -50
- data/lib/review/book/page_metric.rb +1 -1
- data/lib/review/builder.rb +19 -12
- data/lib/review/catalog.rb +47 -0
- data/lib/review/compiler.rb +3 -2
- data/lib/review/configure.rb +5 -3
- data/lib/review/epubmaker.rb +130 -46
- data/lib/review/ewbbuilder.rb +27 -31
- data/lib/review/extentions/string.rb +4 -4
- data/lib/review/htmlbuilder.rb +140 -79
- data/lib/review/htmllayout.rb +26 -4
- data/lib/review/htmlutils.rb +20 -1
- data/lib/review/i18n.rb +5 -2
- data/lib/review/{i18n.yaml → i18n.yml} +4 -2
- data/lib/review/idgxmlbuilder.rb +65 -39
- data/lib/review/latexbuilder.rb +72 -24
- data/lib/review/latexutils.rb +3 -1
- data/lib/review/makerhelper.rb +8 -2
- data/lib/review/preprocessor.rb +20 -20
- data/lib/review/review.tex.erb +4 -0
- data/lib/review/sec_counter.rb +9 -11
- data/lib/review/tocparser.rb +2 -2
- data/lib/review/tocprinter.rb +12 -12
- data/lib/review/topbuilder.rb +15 -15
- data/lib/review/version.rb +1 -1
- data/lib/uuid.rb +7 -7
- data/review.gemspec +2 -2
- data/rubocop-todo.yml +443 -0
- data/test/sample-book/src/config.yml +2 -2
- data/test/sample-book/src/{main.css → style.css} +0 -0
- data/test/test_book.rb +46 -48
- data/test/test_book_chapter.rb +25 -13
- data/test/test_builder.rb +3 -3
- data/test/test_catalog.rb +107 -0
- data/test/test_epubmaker.rb +6 -6
- data/test/test_htmlbuilder.rb +160 -39
- data/test/test_htmlutils.rb +22 -0
- data/test/test_i18n.rb +2 -2
- data/test/test_idgxmlbuilder.rb +33 -47
- data/test/test_image_finder.rb +82 -0
- data/test/test_inaobuilder.rb +1 -1
- data/test/test_latexbuilder.rb +35 -39
- data/test/test_lineinput.rb +2 -2
- data/test/test_markdownbuilder.rb +2 -2
- data/test/test_topbuilder.rb +39 -23
- metadata +23 -14
- data/bin/review-epubmaker-ng +0 -23
data/lib/review/book/chapter.rb
CHANGED
@@ -15,6 +15,9 @@ module ReVIEW
|
|
15
15
|
class Chapter
|
16
16
|
include Compilable
|
17
17
|
|
18
|
+
ROMAN = %w[0 I II III IV V VI VII VIII IX X XI XII XIII XIV XV XVI XVII XVIII XIX XX XXI XXII XXIII XXIV XXV XXVI XXVII]
|
19
|
+
ALPHA = %w[0 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z]
|
20
|
+
|
18
21
|
def Chapter.intern_pathes(pathes)
|
19
22
|
books = {}
|
20
23
|
pathes.map {|path|
|
@@ -54,12 +57,51 @@ module ReVIEW
|
|
54
57
|
@numberless_image_index = nil
|
55
58
|
@indepimage_index = nil
|
56
59
|
@headline_index = nil
|
60
|
+
@column_index = nil
|
57
61
|
end
|
58
62
|
|
59
63
|
def inspect
|
60
64
|
"\#<#{self.class} #{@number} #{@path}>"
|
61
65
|
end
|
62
66
|
|
67
|
+
def format_number(heading = true)
|
68
|
+
if on_PREDEF?
|
69
|
+
return "#{@number}"
|
70
|
+
end
|
71
|
+
|
72
|
+
if on_POSTDEF?
|
73
|
+
return "#{@number}" if @number < 1 || @number > 27
|
74
|
+
|
75
|
+
if @book.config["appendix_format"].blank?
|
76
|
+
type = "arabic"
|
77
|
+
else
|
78
|
+
type = @book.config["appendix_format"].downcase.strip
|
79
|
+
end
|
80
|
+
|
81
|
+
appendix = case type
|
82
|
+
when "roman"
|
83
|
+
ROMAN[@number]
|
84
|
+
when "alphabet", "alpha"
|
85
|
+
ALPHA[@number]
|
86
|
+
else
|
87
|
+
# nil, "arabic", etc...
|
88
|
+
"#{@number}"
|
89
|
+
end
|
90
|
+
|
91
|
+
if heading
|
92
|
+
return "#{I18n.t("appendix", appendix)}"
|
93
|
+
else
|
94
|
+
return "#{appendix}"
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
if heading
|
99
|
+
"#{I18n.t("chapter", @number)}"
|
100
|
+
else
|
101
|
+
"#{@number}"
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
63
105
|
def on_CHAPS?
|
64
106
|
on_FILE?(@book.read_CHAPS())
|
65
107
|
end
|
@@ -32,16 +32,19 @@ module ReVIEW
|
|
32
32
|
end
|
33
33
|
|
34
34
|
def name
|
35
|
+
return nil unless @name
|
35
36
|
File.basename(@name, '.*')
|
36
37
|
end
|
37
38
|
|
38
|
-
|
39
|
+
alias_method :id, :name
|
39
40
|
|
40
41
|
def title
|
41
|
-
@title
|
42
|
+
return @title if @title
|
43
|
+
|
44
|
+
@title = ''
|
42
45
|
open {|f|
|
43
46
|
f.each_line {|l|
|
44
|
-
l = convert_inencoding(l,
|
47
|
+
l = convert_inencoding(l, book.config["inencoding"])
|
45
48
|
if l =~ /\A=+/
|
46
49
|
@title = l.sub(/\A=+(\[.+?\])?(\{.+?\})?/, '').strip
|
47
50
|
break
|
@@ -68,7 +71,7 @@ module ReVIEW
|
|
68
71
|
|
69
72
|
def content
|
70
73
|
@content = convert_inencoding(File.read(path()),
|
71
|
-
|
74
|
+
book.config["inencoding"])
|
72
75
|
rescue
|
73
76
|
@content
|
74
77
|
end
|
@@ -157,6 +160,22 @@ module ReVIEW
|
|
157
160
|
def headline_index
|
158
161
|
@headline_index ||= HeadlineIndex.parse(lines(), self)
|
159
162
|
end
|
163
|
+
|
164
|
+
def column(id)
|
165
|
+
column_index()[id]
|
166
|
+
end
|
167
|
+
|
168
|
+
def column_index
|
169
|
+
@column_index ||= ColumnIndex.parse(lines())
|
170
|
+
end
|
171
|
+
|
172
|
+
def next_chapter
|
173
|
+
book.next_chapter(self)
|
174
|
+
end
|
175
|
+
|
176
|
+
def prev_chapter
|
177
|
+
book.prev_chapter(self)
|
178
|
+
end
|
160
179
|
end
|
161
180
|
end
|
162
181
|
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
#
|
2
|
+
# Copyright (c) 2014 Minero Aoki, Kenshi Muto, Masayoshi Takahashi
|
3
|
+
#
|
4
|
+
# This program is free software.
|
5
|
+
# You can distribute or modify this program under the terms of
|
6
|
+
# the GNU LGPL, Lesser General Public License version 2.1.
|
7
|
+
# For details of LGPL, see the file "COPYING".
|
8
|
+
#
|
9
|
+
|
10
|
+
require 'review/extentions'
|
11
|
+
require 'review/exception'
|
12
|
+
|
13
|
+
module ReVIEW
|
14
|
+
module Book
|
15
|
+
class ImageFinder
|
16
|
+
def initialize(basedir, chapid, builder, exts)
|
17
|
+
@basedir = basedir
|
18
|
+
@chapid = chapid
|
19
|
+
@builder = builder
|
20
|
+
@exts = exts
|
21
|
+
@entries = get_entries()
|
22
|
+
end
|
23
|
+
|
24
|
+
def get_entries
|
25
|
+
Dir.glob(File.join(@basedir, "**/*.*"))
|
26
|
+
end
|
27
|
+
|
28
|
+
def find_path(id)
|
29
|
+
targets = target_list(id)
|
30
|
+
targets.each do |target|
|
31
|
+
@exts.each do |ext|
|
32
|
+
if @entries.include?("#{target}#{ext}")
|
33
|
+
return "#{target}#{ext}"
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
nil
|
38
|
+
end
|
39
|
+
|
40
|
+
def target_list(id)
|
41
|
+
[
|
42
|
+
# 1. <basedir>/<builder>/<chapid>/<id>.<ext>
|
43
|
+
"#{@basedir}/#{@builder}/#{@chapid}/#{id}",
|
44
|
+
|
45
|
+
# 2. <basedir>/<builder>/<chapid>-<id>.<ext>
|
46
|
+
"#{@basedir}/#{@builder}/#{@chapid}-#{id}",
|
47
|
+
|
48
|
+
# 3. <basedir>/<builder>/<id>.<ext>
|
49
|
+
"#{@basedir}/#{@builder}/#{id}",
|
50
|
+
|
51
|
+
# 4. <basedir>/<chapid>/<id>.<ext>
|
52
|
+
"#{@basedir}/#{@chapid}/#{id}",
|
53
|
+
|
54
|
+
# 5. <basedir>/<chapid>-<id>.<ext>
|
55
|
+
"#{@basedir}/#{@chapid}-#{id}",
|
56
|
+
|
57
|
+
# 6. <basedir>/<id>.<ext>
|
58
|
+
"#{@basedir}/#{id}"
|
59
|
+
]
|
60
|
+
end
|
61
|
+
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
data/lib/review/book/index.rb
CHANGED
@@ -11,6 +11,7 @@
|
|
11
11
|
|
12
12
|
require 'review/extentions'
|
13
13
|
require 'review/exception'
|
14
|
+
require 'review/book/image_finder'
|
14
15
|
|
15
16
|
module ReVIEW
|
16
17
|
module Book
|
@@ -49,12 +50,13 @@ module ReVIEW
|
|
49
50
|
warn "warning: duplicate ID: #{i.id} (#{i})" unless @index[i.id].nil?
|
50
51
|
@index[i.id] = i
|
51
52
|
end
|
53
|
+
@image_finder = nil
|
52
54
|
end
|
53
55
|
|
54
56
|
def [](id)
|
55
57
|
@index.fetch(id)
|
56
58
|
rescue
|
57
|
-
raise KeyError
|
59
|
+
raise KeyError, "not found key '#{id}' for #{self.class}"
|
58
60
|
end
|
59
61
|
|
60
62
|
def number(id)
|
@@ -78,17 +80,15 @@ module ReVIEW
|
|
78
80
|
|
79
81
|
def number(id)
|
80
82
|
chapter = @index.fetch(id)
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
"#{chapter.number}"
|
85
|
-
elsif chapter.on_POSTDEF?
|
86
|
-
"#{I18n.t("appendix", chapter.number)}"
|
87
|
-
end
|
83
|
+
chapter.format_number
|
84
|
+
rescue # part
|
85
|
+
"#{I18n.t("part", chapter.number)}"
|
88
86
|
end
|
89
87
|
|
90
88
|
def title(id)
|
91
89
|
@index.fetch(id).title
|
90
|
+
rescue # non-file part
|
91
|
+
@index.fetch(id).name
|
92
92
|
end
|
93
93
|
|
94
94
|
def display_string(id)
|
@@ -132,12 +132,11 @@ module ReVIEW
|
|
132
132
|
|
133
133
|
class ImageIndex < Index
|
134
134
|
class Item
|
135
|
-
@@entries = nil
|
136
135
|
|
137
136
|
def initialize(id, number)
|
138
137
|
@id = id
|
139
138
|
@number = number
|
140
|
-
@
|
139
|
+
@path = nil
|
141
140
|
end
|
142
141
|
|
143
142
|
attr_reader :id
|
@@ -145,22 +144,21 @@ module ReVIEW
|
|
145
144
|
attr_writer :index # internal use only
|
146
145
|
|
147
146
|
def bound?
|
148
|
-
|
147
|
+
path
|
149
148
|
end
|
150
149
|
|
151
150
|
def path
|
152
|
-
|
151
|
+
@path ||= @index.find_path(id)
|
153
152
|
end
|
154
153
|
|
155
|
-
def pathes
|
156
|
-
@pathes ||= @index.find_pathes(id)
|
157
|
-
end
|
158
154
|
end
|
159
155
|
|
160
156
|
def ImageIndex.item_type
|
161
157
|
'(image|graph)'
|
162
158
|
end
|
163
159
|
|
160
|
+
attr_reader :image_finder
|
161
|
+
|
164
162
|
def initialize(items, chapid, basedir, types)
|
165
163
|
super items
|
166
164
|
items.each do |i|
|
@@ -170,46 +168,34 @@ module ReVIEW
|
|
170
168
|
@basedir = basedir
|
171
169
|
@types = types
|
172
170
|
|
173
|
-
|
171
|
+
@image_finder = ReVIEW::Book::ImageFinder.new(basedir, chapid,
|
172
|
+
ReVIEW.book.config['builder'], types)
|
174
173
|
end
|
175
174
|
|
176
|
-
def
|
177
|
-
|
175
|
+
def find_path(id)
|
176
|
+
@image_finder.find_path(id)
|
178
177
|
end
|
179
178
|
|
180
|
-
|
181
|
-
def find_pathes(id)
|
182
|
-
pathes = []
|
183
|
-
|
184
|
-
# 1. <basedir>/<builder>/<chapid>/<id>.<ext>
|
185
|
-
target = "#{@basedir}/#{ReVIEW.book.param['builder']}/#{@chapid}/#{id}"
|
186
|
-
@types.each {|ext| pathes.push("#{target}#{ext}") if @@entries.include?("#{target}#{ext}")}
|
187
|
-
|
188
|
-
# 2. <basedir>/<builder>/<chapid>-<id>.<ext>
|
189
|
-
target = "#{@basedir}/#{ReVIEW.book.param['builder']}/#{@chapid}-#{id}"
|
190
|
-
@types.each {|ext| pathes.push("#{target}#{ext}") if @@entries.include?("#{target}#{ext}")}
|
191
|
-
|
192
|
-
# 3. <basedir>/<builder>/<id>.<ext>
|
193
|
-
target = "#{@basedir}/#{ReVIEW.book.param['builder']}/#{id}"
|
194
|
-
@types.each {|ext| pathes.push("#{target}#{ext}") if @@entries.include?("#{target}#{ext}")}
|
195
|
-
|
196
|
-
# 4. <basedir>/<chapid>/<id>.<ext>
|
197
|
-
target = "#{@basedir}/#{@chapid}/#{id}"
|
198
|
-
@types.each {|ext| pathes.push("#{target}#{ext}") if @@entries.include?("#{target}#{ext}")}
|
199
|
-
|
200
|
-
# 5. <basedir>/<chapid>-<id>.<ext>
|
201
|
-
target = "#{@basedir}/#{@chapid}-#{id}"
|
202
|
-
@types.each {|ext| pathes.push("#{target}#{ext}") if @@entries.include?("#{target}#{ext}")}
|
179
|
+
end
|
203
180
|
|
204
|
-
|
205
|
-
|
206
|
-
@
|
181
|
+
class IconIndex < ImageIndex
|
182
|
+
def initialize(items, chapid, basedir, types)
|
183
|
+
@items = items
|
184
|
+
@index = {}
|
185
|
+
items.each do |i|
|
186
|
+
## warn "warning: duplicate ID: #{i.id} (#{i})" unless @index[i.id].nil?
|
187
|
+
@index[i.id] = i
|
188
|
+
end
|
189
|
+
items.each do |i|
|
190
|
+
i.index = self
|
191
|
+
end
|
192
|
+
@chapid = chapid
|
193
|
+
@basedir = basedir
|
194
|
+
@types = types
|
207
195
|
|
208
|
-
|
196
|
+
@image_finder = ImageFinder.new(basedir, chapid, ReVIEW.book.config['builder'], types)
|
209
197
|
end
|
210
|
-
end
|
211
198
|
|
212
|
-
class IconIndex < ImageIndex
|
213
199
|
def IconIndex.parse(src, *args)
|
214
200
|
items = []
|
215
201
|
seq = 1
|
@@ -268,7 +254,7 @@ module ReVIEW
|
|
268
254
|
def initialize(id, number)
|
269
255
|
@id = id
|
270
256
|
@number = ""
|
271
|
-
@
|
257
|
+
@path = nil
|
272
258
|
end
|
273
259
|
end
|
274
260
|
|
@@ -286,7 +272,7 @@ module ReVIEW
|
|
286
272
|
def initialize(id, number)
|
287
273
|
@id = id
|
288
274
|
@number = ""
|
289
|
-
@
|
275
|
+
@path = nil
|
290
276
|
end
|
291
277
|
end
|
292
278
|
|
@@ -300,14 +286,16 @@ module ReVIEW
|
|
300
286
|
end
|
301
287
|
|
302
288
|
class HeadlineIndex < Index
|
289
|
+
HEADLINE_PATTERN = /\A(=+)(?:\[(.+?)\])?(?:\{(.+?)\})?(.*)/
|
303
290
|
Item = Struct.new(:id, :number, :caption)
|
291
|
+
attr_reader :items
|
304
292
|
|
305
293
|
def HeadlineIndex.parse(src, chap)
|
306
294
|
items = []
|
307
295
|
indexs = []
|
308
296
|
headlines = []
|
309
297
|
src.each do |line|
|
310
|
-
if m =
|
298
|
+
if m = HEADLINE_PATTERN.match(line)
|
311
299
|
next if m[2] == 'column'
|
312
300
|
index = m[1].size - 2
|
313
301
|
if index >= 0
|
@@ -341,5 +329,31 @@ module ReVIEW
|
|
341
329
|
return ([@chap.number] + @index.fetch(id).number).join(".")
|
342
330
|
end
|
343
331
|
end
|
332
|
+
|
333
|
+
class ColumnIndex < Index
|
334
|
+
COLUMN_PATTERN = /\A(=+)\[column\](?:\{(.+?)\})?(.*)/
|
335
|
+
Item = Struct.new(:id, :number, :caption)
|
336
|
+
|
337
|
+
def ColumnIndex.parse(src, *args)
|
338
|
+
items = []
|
339
|
+
seq = 1
|
340
|
+
src.each do |line|
|
341
|
+
if m = COLUMN_PATTERN.match(line)
|
342
|
+
level = m[1] ## not use it yet
|
343
|
+
id = m[2]
|
344
|
+
caption = m[3].strip
|
345
|
+
if !id || id == ""
|
346
|
+
id = caption
|
347
|
+
end
|
348
|
+
|
349
|
+
items.push item_class().new(id, seq, caption)
|
350
|
+
seq += 1
|
351
|
+
end
|
352
|
+
end
|
353
|
+
new(items)
|
354
|
+
end
|
355
|
+
|
356
|
+
end
|
357
|
+
|
344
358
|
end
|
345
359
|
end
|
@@ -22,7 +22,7 @@ module ReVIEW
|
|
22
22
|
def PageMetric.b5
|
23
23
|
new(46, 80, 30, 74, 2)
|
24
24
|
end
|
25
|
-
|
25
|
+
|
26
26
|
def initialize(list_lines, list_columns, text_lines, text_columns, page_per_kbyte)
|
27
27
|
@list = MetricData.new(list_lines, list_columns)
|
28
28
|
@text = MetricData.new(text_lines, text_columns)
|
data/lib/review/builder.rb
CHANGED
@@ -30,10 +30,6 @@ module ReVIEW
|
|
30
30
|
|
31
31
|
def initialize(strict = false, *args)
|
32
32
|
@strict = strict
|
33
|
-
@tabwidth = nil
|
34
|
-
if ReVIEW.book.param && ReVIEW.book.param["tabwidth"]
|
35
|
-
@tabwidth = ReVIEW.book.param["tabwidth"]
|
36
|
-
end
|
37
33
|
builder_init(*args)
|
38
34
|
end
|
39
35
|
|
@@ -47,6 +43,10 @@ module ReVIEW
|
|
47
43
|
@location = location
|
48
44
|
@output = StringIO.new
|
49
45
|
@book = ReVIEW.book
|
46
|
+
@tabwidth = nil
|
47
|
+
if @book.config && @book.config["tabwidth"]
|
48
|
+
@tabwidth = @book.config["tabwidth"]
|
49
|
+
end
|
50
50
|
builder_init_file
|
51
51
|
end
|
52
52
|
|
@@ -58,17 +58,17 @@ module ReVIEW
|
|
58
58
|
@output.string
|
59
59
|
end
|
60
60
|
|
61
|
-
|
61
|
+
alias_method :raw_result, :result
|
62
62
|
|
63
63
|
def print(*s)
|
64
64
|
@output.print(*s.map{|i|
|
65
|
-
convert_outencoding(i,
|
65
|
+
convert_outencoding(i, @book.config["outencoding"])
|
66
66
|
})
|
67
67
|
end
|
68
68
|
|
69
69
|
def puts(*s)
|
70
70
|
@output.puts *s.map{|i|
|
71
|
-
convert_outencoding(i,
|
71
|
+
convert_outencoding(i, @book.config["outencoding"])
|
72
72
|
}
|
73
73
|
end
|
74
74
|
|
@@ -257,12 +257,19 @@ module ReVIEW
|
|
257
257
|
end
|
258
258
|
|
259
259
|
def inline_hd(id)
|
260
|
-
m = /\A(
|
260
|
+
m = /\A([^|]+)\|(.+)/.match(id)
|
261
261
|
chapter = @book.chapters.detect{|chap| chap.id == m[1]} if m && m[1]
|
262
262
|
return inline_hd_chap(chapter, m[2]) if chapter
|
263
263
|
return inline_hd_chap(@chapter, id)
|
264
264
|
end
|
265
265
|
|
266
|
+
def inline_column(id)
|
267
|
+
@chapter.column(id).caption
|
268
|
+
rescue
|
269
|
+
error "unknown column: #{id}"
|
270
|
+
nofunc_text("[UnknownColumn:#{id}]")
|
271
|
+
end
|
272
|
+
|
266
273
|
def raw(str)
|
267
274
|
if matched = str.match(/\|(.*?)\|(.*)/)
|
268
275
|
builders = matched[1].split(/,/).map{|i| i.gsub(/\s/, '') }
|
@@ -312,7 +319,7 @@ module ReVIEW
|
|
312
319
|
end
|
313
320
|
|
314
321
|
def get_chap(chapter = @chapter)
|
315
|
-
if
|
322
|
+
if @book.config["secnolevel"] > 0 && !chapter.number.nil? && !chapter.number.to_s.empty?
|
316
323
|
return "#{chapter.number}"
|
317
324
|
end
|
318
325
|
return nil
|
@@ -346,7 +353,7 @@ module ReVIEW
|
|
346
353
|
file = "#{id}.#{image_ext}"
|
347
354
|
file_path = File.join(dir, file)
|
348
355
|
|
349
|
-
line =
|
356
|
+
line = self.unescape(lines.join("\n"))
|
350
357
|
cmds = {
|
351
358
|
:graphviz => "echo '#{line}' | dot -T#{image_ext} -o#{file_path}",
|
352
359
|
:gnuplot => "echo 'set terminal " +
|
@@ -369,12 +376,12 @@ module ReVIEW
|
|
369
376
|
|
370
377
|
def inline_include(file_name)
|
371
378
|
compile_inline convert_inencoding(File.open(file_name).read,
|
372
|
-
|
379
|
+
@book.config["inencoding"])
|
373
380
|
end
|
374
381
|
|
375
382
|
def include(file_name)
|
376
383
|
File.foreach(file_name) do |line|
|
377
|
-
paragraph([convert_inencoding(line,
|
384
|
+
paragraph([convert_inencoding(line, @book.config["inencoding"])])
|
378
385
|
end
|
379
386
|
end
|
380
387
|
|