review 2.1.0 → 2.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +5 -0
- data/.rubocop.yml +293 -6
- data/.rubocop_todo.yml +3 -608
- data/.travis.yml +6 -13
- data/README.md +5 -3
- data/Rakefile +6 -6
- data/bin/review-catalog-converter +2 -2
- data/bin/review-check +1 -1
- data/bin/review-compile +1 -2
- data/bin/review-init +6 -3
- data/bin/review-validate +3 -3
- data/bin/review-vol +2 -1
- data/doc/NEWS.ja.md +138 -25
- data/doc/NEWS.md +137 -25
- data/doc/config.yml.sample +2 -2
- data/doc/config.yml.sample-simple +1 -1
- data/doc/format.ja.md +86 -5
- data/doc/format.md +67 -2
- data/doc/makeindex.ja.md +95 -0
- data/doc/makeindex.md +97 -0
- data/doc/sample.css +214 -0
- data/lib/epubmaker.rb +6 -6
- data/lib/epubmaker/epubcommon.rb +19 -47
- data/lib/epubmaker/epubv2.rb +3 -1
- data/lib/epubmaker/epubv3.rb +4 -26
- data/lib/epubmaker/producer.rb +46 -46
- data/lib/epubmaker/zip_exporter.rb +86 -0
- data/lib/review/book/base.rb +13 -15
- data/lib/review/book/chapter.rb +2 -1
- data/lib/review/book/compilable.rb +9 -9
- data/lib/review/book/image_finder.rb +13 -13
- data/lib/review/book/index.rb +2 -2
- data/lib/review/book/volume.rb +2 -2
- data/lib/review/builder.rb +57 -1
- data/lib/review/catalog.rb +2 -2
- data/lib/review/compiler.rb +15 -7
- data/lib/review/configure.rb +11 -0
- data/lib/review/epubmaker.rb +403 -401
- data/lib/review/ewbbuilder.rb +16 -16
- data/lib/review/htmlbuilder.rb +42 -58
- data/lib/review/htmltoc.rb +1 -1
- data/lib/review/htmlutils.rb +50 -4
- data/lib/review/i18n.rb +2 -2
- data/lib/review/idgxmlbuilder.rb +30 -47
- data/lib/review/latexbuilder.rb +86 -41
- data/lib/review/latexutils.rb +19 -19
- data/lib/review/markdownbuilder.rb +16 -4
- data/lib/review/md2inaobuilder.rb +0 -9
- data/lib/review/pdfmaker.rb +91 -48
- data/lib/review/preprocessor.rb +1 -1
- data/lib/review/rstbuilder.rb +763 -0
- data/lib/review/sec_counter.rb +7 -9
- data/lib/review/tocparser.rb +3 -3
- data/lib/review/tocprinter.rb +5 -5
- data/lib/review/topbuilder.rb +48 -56
- data/lib/review/version.rb +1 -1
- data/lib/review/webmaker.rb +6 -7
- data/review.gemspec +1 -0
- data/templates/latex/layout.tex.erb +27 -2
- data/test/assets/test_template.tex +10 -1
- data/test/book_test_helper.rb +1 -2
- data/test/run_test.rb +10 -0
- data/test/sample-book/src/style.css +215 -0
- data/test/sample-book/src/vendor/jumoline/lppl.txt +416 -0
- data/test/test_book.rb +0 -1
- data/test/test_catalog.rb +1 -0
- data/test/test_converter.rb +1 -1
- data/test/test_epub3maker.rb +44 -51
- data/test/test_epubmaker.rb +82 -38
- data/test/test_epubmaker_cmd.rb +1 -1
- data/test/test_extentions_hash.rb +8 -1
- data/test/test_htmlbuilder.rb +411 -18
- data/test/test_i18n.rb +17 -0
- data/test/test_idgxmlbuilder.rb +88 -3
- data/test/test_image_finder.rb +18 -0
- data/test/test_index.rb +2 -0
- data/test/test_latexbuilder.rb +96 -8
- data/test/test_makerhelper.rb +2 -2
- data/test/test_markdownbuilder.rb +22 -1
- data/test/test_md2inaobuilder.rb +0 -5
- data/test/test_pdfmaker.rb +54 -36
- data/test/test_pdfmaker_cmd.rb +1 -1
- data/test/test_rstbuilder.rb +356 -0
- data/test/test_textutils.rb +14 -4
- data/test/test_topbuilder.rb +23 -4
- data/test/test_zip_exporter.rb +113 -0
- metadata +28 -2
@@ -0,0 +1,86 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
#
|
3
|
+
# Copyright (c) 2010-2016 Kenshi Muto and Masayoshi Takahashi
|
4
|
+
#
|
5
|
+
# This program is free software.
|
6
|
+
# You can distribute or modify this program under the terms of
|
7
|
+
# the GNU LGPL, Lesser General Public License version 2.1.
|
8
|
+
# For details of the GNU LGPL, see the file "COPYING".
|
9
|
+
#
|
10
|
+
|
11
|
+
require 'pathname'
|
12
|
+
begin
|
13
|
+
require 'zip'
|
14
|
+
rescue LoadError
|
15
|
+
## I cannot find rubyzip library, so I use external zip command.
|
16
|
+
warn "rubyzip not found, so use external zip command"
|
17
|
+
end
|
18
|
+
|
19
|
+
module EPUBMaker
|
20
|
+
|
21
|
+
##
|
22
|
+
# Export into zip file for EPUB producer.
|
23
|
+
#
|
24
|
+
class ZipExporter
|
25
|
+
|
26
|
+
attr_reader :tmpdir
|
27
|
+
|
28
|
+
def initialize(tmpdir, params)
|
29
|
+
@tmpdir = tmpdir
|
30
|
+
@params = params
|
31
|
+
end
|
32
|
+
|
33
|
+
def export_zip(epubfile)
|
34
|
+
if defined?(Zip)
|
35
|
+
export_zip_rubyzip(epubfile)
|
36
|
+
else
|
37
|
+
export_zip_extcmd(epubfile)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def export_zip_extcmd(epubfile)
|
42
|
+
stage1 = @params["epubmaker"]["zip_stage1"].to_s.split
|
43
|
+
path1 = stage1[0] || "zip"
|
44
|
+
opt1 = stage1[1] || "-0Xq"
|
45
|
+
stage2 = @params["epubmaker"]["zip_stage2"].to_s.split
|
46
|
+
path2 = stage2[0] || "zip"
|
47
|
+
opt2 = stage2[1] || "-Xr9Dq"
|
48
|
+
|
49
|
+
Dir.chdir(tmpdir) do |d|
|
50
|
+
system(path1, opt1, epubfile, "mimetype")
|
51
|
+
addpath = @params["epubmaker"]["zip_addpath"]
|
52
|
+
if addpath
|
53
|
+
system(path2, opt2, epubfile, "META-INF", "OEBPS", addpath)
|
54
|
+
else
|
55
|
+
system(path2, opt2, epubfile, "META-INF", "OEBPS")
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def export_zip_rubyzip(epubfile)
|
61
|
+
Dir.chdir(tmpdir) do |d|
|
62
|
+
Zip::OutputStream.open(epubfile) do |epub|
|
63
|
+
root_pathname = Pathname.new(tmpdir)
|
64
|
+
# relpath = Pathname.new(File.join(tmpdir,'mimetype')).relative_path_from(root_pathname)
|
65
|
+
epub.put_next_entry('mimetype', nil, nil, Zip::Entry::STORED)
|
66
|
+
epub << "application/epub+zip"
|
67
|
+
|
68
|
+
export_zip_rubyzip_addpath(epub, File.join(tmpdir,'META-INF'), root_pathname)
|
69
|
+
export_zip_rubyzip_addpath(epub, File.join(tmpdir,'OEBPS'), root_pathname)
|
70
|
+
if @params["zip_addpath"].present?
|
71
|
+
export_zip_rubyzip_addpath(epub, File.join(tmpdir, @params["zip_addpath"]), root_pathname)
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
def export_zip_rubyzip_addpath(epub, dirname, rootdir)
|
78
|
+
Dir[File.join(dirname,'**','**')].each do |path|
|
79
|
+
next if File.directory?(path)
|
80
|
+
relpath = Pathname.new(path).relative_path_from(rootdir)
|
81
|
+
epub.put_next_entry(relpath)
|
82
|
+
epub << File.binread(path)
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
data/lib/review/book/base.rb
CHANGED
@@ -15,6 +15,9 @@ module ReVIEW
|
|
15
15
|
class Base
|
16
16
|
|
17
17
|
attr_writer :config
|
18
|
+
attr_writer :parts
|
19
|
+
attr_writer :catalog
|
20
|
+
attr_reader :basedir
|
18
21
|
|
19
22
|
def self.load_default
|
20
23
|
warn 'Book::Base.load_default() is obsoleted. Use Book::Base.load().'
|
@@ -51,6 +54,7 @@ module ReVIEW
|
|
51
54
|
@config = ReVIEW::Configure.values
|
52
55
|
@catalog = nil
|
53
56
|
@read_part = nil
|
57
|
+
@warn_old_files = {} # XXX for checking CHAPS, PREDEF, POSTDEF
|
54
58
|
end
|
55
59
|
|
56
60
|
def bib_file
|
@@ -99,10 +103,6 @@ module ReVIEW
|
|
99
103
|
@parts ||= read_parts()
|
100
104
|
end
|
101
105
|
|
102
|
-
def parts=(parts)
|
103
|
-
@parts = parts
|
104
|
-
end
|
105
|
-
|
106
106
|
def parts_in_file
|
107
107
|
parts.find_all{|part|
|
108
108
|
part if part.present? and part.file?
|
@@ -198,10 +198,6 @@ module ReVIEW
|
|
198
198
|
@catalog
|
199
199
|
end
|
200
200
|
|
201
|
-
def catalog=(catalog)
|
202
|
-
@catalog = catalog
|
203
|
-
end
|
204
|
-
|
205
201
|
def read_CHAPS
|
206
202
|
if catalog
|
207
203
|
catalog.chaps
|
@@ -298,10 +294,6 @@ module ReVIEW
|
|
298
294
|
end
|
299
295
|
end
|
300
296
|
|
301
|
-
def basedir
|
302
|
-
@basedir
|
303
|
-
end
|
304
|
-
|
305
297
|
private
|
306
298
|
|
307
299
|
def read_parts
|
@@ -344,9 +336,9 @@ module ReVIEW
|
|
344
336
|
end
|
345
337
|
end
|
346
338
|
|
347
|
-
chap = read_CHAPS()
|
348
|
-
|
349
|
-
|
339
|
+
chap = read_CHAPS().
|
340
|
+
strip.lines.map {|line| line.strip }.join("\n").split(/\n{2,}/).
|
341
|
+
map {|part_chunk|
|
350
342
|
chaps = part_chunk.split.map {|chapid|
|
351
343
|
Chapter.new(self, (num += 1), chapid, "#{@basedir}/#{chapid}")
|
352
344
|
}
|
@@ -396,6 +388,12 @@ module ReVIEW
|
|
396
388
|
end
|
397
389
|
|
398
390
|
def read_FILE(filename)
|
391
|
+
if !@warn_old_files[filename]
|
392
|
+
@warn_old_files[filename] = true
|
393
|
+
if !caller().any?{|item| item =~ %r|/review/test/test_|}
|
394
|
+
warn "!!! #{filename} is obsoleted. please use catalog.yml."
|
395
|
+
end
|
396
|
+
end
|
399
397
|
res = ""
|
400
398
|
File.open("#{@basedir}/#{filename}", 'r:BOM|utf-8') do |f|
|
401
399
|
while line = f.gets
|
data/lib/review/book/chapter.rb
CHANGED
@@ -83,7 +83,7 @@ module ReVIEW
|
|
83
83
|
return "#{@number}" if @number < 1 || @number > 27
|
84
84
|
if @book.config["appendix_format"]
|
85
85
|
raise ReVIEW::ConfigError,
|
86
|
-
|
86
|
+
"'appendix_format:' in config.yml is obsoleted."
|
87
87
|
end
|
88
88
|
|
89
89
|
i18n_appendix = I18n.get("appendix")
|
@@ -121,6 +121,7 @@ module ReVIEW
|
|
121
121
|
end
|
122
122
|
|
123
123
|
private
|
124
|
+
|
124
125
|
def on_FILE?(contents)
|
125
126
|
contents.lines.map(&:strip).include?("#{id()}#{@book.ext()}")
|
126
127
|
end
|
@@ -2,7 +2,7 @@
|
|
2
2
|
# $Id: book.rb 4315 2009-09-02 04:15:24Z kmuto $
|
3
3
|
#
|
4
4
|
# Copyright (c) 2002-2008 Minero Aoki
|
5
|
-
# 2009 Minero Aoki, Kenshi Muto
|
5
|
+
# 2009-2017 Minero Aoki, Kenshi Muto
|
6
6
|
#
|
7
7
|
# This program is free software.
|
8
8
|
# You can distribute or modify this program under the terms of
|
@@ -118,29 +118,29 @@ module ReVIEW
|
|
118
118
|
def numberless_image_index
|
119
119
|
@numberless_image_index ||=
|
120
120
|
NumberlessImageIndex.parse(lines(), id(),
|
121
|
-
|
122
|
-
|
121
|
+
"#{book.basedir}/#{@book.config['imagedir']}",
|
122
|
+
@book.image_types, @book.config['builder'])
|
123
123
|
end
|
124
124
|
|
125
125
|
def image_index
|
126
126
|
@image_index ||= ImageIndex.parse(lines(), id(),
|
127
|
-
|
128
|
-
|
127
|
+
"#{book.basedir}/#{@book.config['imagedir']}",
|
128
|
+
@book.image_types, @book.config['builder'])
|
129
129
|
@image_index
|
130
130
|
end
|
131
131
|
|
132
132
|
def icon_index
|
133
133
|
@icon_index ||= IconIndex.parse(lines(), id(),
|
134
|
-
|
135
|
-
|
134
|
+
"#{book.basedir}/#{@book.config['imagedir']}",
|
135
|
+
@book.image_types, @book.config['builder'])
|
136
136
|
@icon_index
|
137
137
|
end
|
138
138
|
|
139
139
|
def indepimage_index
|
140
140
|
@indepimage_index ||=
|
141
141
|
IndepImageIndex.parse(lines(), id(),
|
142
|
-
|
143
|
-
|
142
|
+
"#{book.basedir}/#{@book.config['imagedir']}",
|
143
|
+
@book.image_types, @book.config['builder'])
|
144
144
|
end
|
145
145
|
|
146
146
|
def bibpaper(id)
|
@@ -22,7 +22,7 @@ module ReVIEW
|
|
22
22
|
end
|
23
23
|
|
24
24
|
def get_entries
|
25
|
-
Dir.glob(File.join(@basedir, "
|
25
|
+
Dir.glob(File.join(@basedir, "**{,/*/**}/*.*")).uniq
|
26
26
|
end
|
27
27
|
|
28
28
|
def add_entry(path)
|
@@ -46,23 +46,23 @@ module ReVIEW
|
|
46
46
|
|
47
47
|
def target_list(id)
|
48
48
|
[
|
49
|
-
|
50
|
-
|
49
|
+
# 1. <basedir>/<builder>/<chapid>/<id>.<ext>
|
50
|
+
"#{@basedir}/#{@builder}/#{@chapid}/#{id}",
|
51
51
|
|
52
|
-
|
53
|
-
|
52
|
+
# 2. <basedir>/<builder>/<chapid>-<id>.<ext>
|
53
|
+
"#{@basedir}/#{@builder}/#{@chapid}-#{id}",
|
54
54
|
|
55
|
-
|
56
|
-
|
55
|
+
# 3. <basedir>/<builder>/<id>.<ext>
|
56
|
+
"#{@basedir}/#{@builder}/#{id}",
|
57
57
|
|
58
|
-
|
59
|
-
|
58
|
+
# 4. <basedir>/<chapid>/<id>.<ext>
|
59
|
+
"#{@basedir}/#{@chapid}/#{id}",
|
60
60
|
|
61
|
-
|
62
|
-
|
61
|
+
# 5. <basedir>/<chapid>-<id>.<ext>
|
62
|
+
"#{@basedir}/#{@chapid}-#{id}",
|
63
63
|
|
64
|
-
|
65
|
-
|
64
|
+
# 6. <basedir>/<id>.<ext>
|
65
|
+
"#{@basedir}/#{id}"
|
66
66
|
]
|
67
67
|
end
|
68
68
|
|
data/lib/review/book/index.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
#
|
3
3
|
# Copyright (c) 2002-2007 Minero Aoki
|
4
|
-
# 2008-
|
4
|
+
# 2008-2017 Minero Aoki, Kenshi Muto
|
5
5
|
#
|
6
6
|
# This program is free software.
|
7
7
|
# You can distribute or modify this program under the terms of
|
@@ -58,7 +58,7 @@ module ReVIEW
|
|
58
58
|
@index.fetch(id)
|
59
59
|
rescue
|
60
60
|
if @index.keys.map{|i| i.split(/\|/).last }.flatten. # unfold all ids
|
61
|
-
|
61
|
+
each_with_object(Hash.new(0)){|i, h| h[i] += 1}. # number of occurrences
|
62
62
|
select{|k, v| k == id && v > 1 }.present? # detect duplicated
|
63
63
|
raise KeyError, "key '#{id}' is ambiguous for #{self.class}"
|
64
64
|
end
|
data/lib/review/book/volume.rb
CHANGED
data/lib/review/builder.rb
CHANGED
@@ -25,6 +25,7 @@ module ReVIEW
|
|
25
25
|
def pre_paragraph
|
26
26
|
nil
|
27
27
|
end
|
28
|
+
|
28
29
|
def post_paragraph
|
29
30
|
nil
|
30
31
|
end
|
@@ -46,6 +47,7 @@ module ReVIEW
|
|
46
47
|
@output = StringIO.new
|
47
48
|
@book = @chapter.book if @chapter.present?
|
48
49
|
@tabwidth = nil
|
50
|
+
@tsize = nil
|
49
51
|
if @book && @book.config && @book.config["tabwidth"]
|
50
52
|
@tabwidth = @book.config["tabwidth"]
|
51
53
|
end
|
@@ -83,6 +85,21 @@ module ReVIEW
|
|
83
85
|
end
|
84
86
|
private :headline_prefix
|
85
87
|
|
88
|
+
## for //firstlinenum[num]
|
89
|
+
def firstlinenum(num)
|
90
|
+
@first_line_num = num.to_i
|
91
|
+
end
|
92
|
+
|
93
|
+
def get_line_num
|
94
|
+
if !@first_line_num
|
95
|
+
return 1
|
96
|
+
end
|
97
|
+
line_num = @first_line_num
|
98
|
+
@first_line_num = nil
|
99
|
+
|
100
|
+
line_num
|
101
|
+
end
|
102
|
+
|
86
103
|
def list(lines, id, caption, lang = nil)
|
87
104
|
begin
|
88
105
|
list_header id, caption, lang
|
@@ -327,6 +344,20 @@ module ReVIEW
|
|
327
344
|
end
|
328
345
|
end
|
329
346
|
|
347
|
+
def embed(lines, arg = nil)
|
348
|
+
if arg
|
349
|
+
builders = arg.gsub(/^\s*\|/, "").gsub(/\|\s*$/, "").gsub(/\s/, "").split(/,/)
|
350
|
+
c = target_name
|
351
|
+
if builders.include?(c)
|
352
|
+
print lines.join()
|
353
|
+
else
|
354
|
+
""
|
355
|
+
end
|
356
|
+
else
|
357
|
+
print lines.join()
|
358
|
+
end
|
359
|
+
end
|
360
|
+
|
330
361
|
def warn(msg)
|
331
362
|
$stderr.puts "#{@location}: warning: #{msg}"
|
332
363
|
end
|
@@ -350,7 +381,7 @@ module ReVIEW
|
|
350
381
|
params.each do |param|
|
351
382
|
if param =~ /\A.+?::/
|
352
383
|
if param =~ /\A#{type}::/
|
353
|
-
|
384
|
+
param.sub!(/\A#{type}::/, '')
|
354
385
|
else
|
355
386
|
next
|
356
387
|
end
|
@@ -435,6 +466,18 @@ module ReVIEW
|
|
435
466
|
def ul_item_end
|
436
467
|
end
|
437
468
|
|
469
|
+
def tsize(str)
|
470
|
+
if matched = str.match(/\A\|(.*?)\|(.*)/)
|
471
|
+
builders = matched[1].split(/,/).map{|i| i.gsub(/\s/, '') }
|
472
|
+
c = self.class.to_s.gsub(/ReVIEW::/, '').gsub(/Builder/, '').downcase
|
473
|
+
if builders.include?(c)
|
474
|
+
@tsize = matched[2]
|
475
|
+
end
|
476
|
+
else
|
477
|
+
@tsize = str
|
478
|
+
end
|
479
|
+
end
|
480
|
+
|
438
481
|
def inline_raw(args)
|
439
482
|
if matched = args.match(/\|(.*?)\|(.*)/)
|
440
483
|
builders = matched[1].split(/,/).map{|i| i.gsub(/\s/, '') }
|
@@ -449,6 +492,19 @@ module ReVIEW
|
|
449
492
|
end
|
450
493
|
end
|
451
494
|
|
495
|
+
def inline_embed(args)
|
496
|
+
if matched = args.match(/\|(.*?)\|(.*)/)
|
497
|
+
builders = matched[1].split(/,/).map{|i| i.gsub(/\s/, '') }
|
498
|
+
if builders.include?(target_name)
|
499
|
+
matched[2]
|
500
|
+
else
|
501
|
+
""
|
502
|
+
end
|
503
|
+
else
|
504
|
+
args
|
505
|
+
end
|
506
|
+
end
|
507
|
+
|
452
508
|
## override TextUtils::detab
|
453
509
|
def detab(str, num = nil)
|
454
510
|
if num
|
data/lib/review/catalog.rb
CHANGED
@@ -35,12 +35,12 @@ module ReVIEW
|
|
35
35
|
if entry.is_a? Hash
|
36
36
|
entry.keys
|
37
37
|
end
|
38
|
-
}.flatten.
|
38
|
+
}.flatten.compact.join("\n")
|
39
39
|
end
|
40
40
|
|
41
41
|
def parts_with_chaps
|
42
42
|
return "" unless @yaml["CHAPS"]
|
43
|
-
@yaml["CHAPS"].flatten.
|
43
|
+
@yaml["CHAPS"].flatten.compact
|
44
44
|
end
|
45
45
|
|
46
46
|
def appendix
|
data/lib/review/compiler.rb
CHANGED
@@ -161,6 +161,7 @@ module ReVIEW
|
|
161
161
|
defblock :tip, 0..1
|
162
162
|
defblock :box, 0..1
|
163
163
|
defblock :comment, 0..1, true
|
164
|
+
defblock :embed, 0..1
|
164
165
|
|
165
166
|
defsingle :footnote, 2
|
166
167
|
defsingle :noindent, 0
|
@@ -175,6 +176,7 @@ module ReVIEW
|
|
175
176
|
defsingle :tsize, 1
|
176
177
|
defsingle :include, 1
|
177
178
|
defsingle :olnum, 1
|
179
|
+
defsingle :firstlinenum, 1
|
178
180
|
|
179
181
|
definline :chapref
|
180
182
|
definline :chap
|
@@ -229,11 +231,12 @@ module ReVIEW
|
|
229
231
|
definline :comment
|
230
232
|
definline :include
|
231
233
|
definline :tcy
|
234
|
+
definline :embed
|
232
235
|
|
233
236
|
private
|
234
237
|
|
235
238
|
def do_compile
|
236
|
-
f = LineInput.new(
|
239
|
+
f = LineInput.new(StringIO.new(@chapter.content))
|
237
240
|
@strategy.bind self, @chapter, Location.new(@chapter.basename, f)
|
238
241
|
tagged_section_init
|
239
242
|
while f.next?
|
@@ -265,7 +268,7 @@ module ReVIEW
|
|
265
268
|
warn "`//' seen but is not valid command: #{line.strip.inspect}"
|
266
269
|
if block_open?(line)
|
267
270
|
warn "skipping block..."
|
268
|
-
read_block(f)
|
271
|
+
read_block(f, false)
|
269
272
|
end
|
270
273
|
else
|
271
274
|
if f.peek.strip.empty?
|
@@ -431,8 +434,9 @@ module ReVIEW
|
|
431
434
|
def read_command(f)
|
432
435
|
line = f.gets
|
433
436
|
name = line.slice(/[a-z]+/).to_sym
|
437
|
+
ignore_inline = (name == :embed)
|
434
438
|
args = parse_args(line.sub(%r<\A//[a-z]+>, '').rstrip.chomp('{'), name)
|
435
|
-
lines = block_open?(line) ? read_block(f) : nil
|
439
|
+
lines = block_open?(line) ? read_block(f, ignore_inline) : nil
|
436
440
|
return name, args, lines
|
437
441
|
end
|
438
442
|
|
@@ -440,12 +444,16 @@ module ReVIEW
|
|
440
444
|
line.rstrip[-1,1] == '{'
|
441
445
|
end
|
442
446
|
|
443
|
-
def read_block(f)
|
447
|
+
def read_block(f, ignore_inline)
|
444
448
|
head = f.lineno
|
445
449
|
buf = []
|
446
450
|
f.until_match(%r<\A//\}>) do |line|
|
447
|
-
|
448
|
-
buf.push
|
451
|
+
if ignore_inline
|
452
|
+
buf.push line
|
453
|
+
else
|
454
|
+
unless line =~ /\A\#@/
|
455
|
+
buf.push text(line.rstrip)
|
456
|
+
end
|
449
457
|
end
|
450
458
|
end
|
451
459
|
unless %r<\A//\}> =~ f.peek
|
@@ -523,7 +531,7 @@ module ReVIEW
|
|
523
531
|
end
|
524
532
|
result = @strategy.nofunc_text(words.shift)
|
525
533
|
until words.empty?
|
526
|
-
result << compile_inline(words.shift.gsub(/\\\}/, '}'))
|
534
|
+
result << compile_inline(words.shift.gsub(/\\\}/, '}').gsub(/\\\\/, '\\'))
|
527
535
|
result << @strategy.nofunc_text(words.shift)
|
528
536
|
end
|
529
537
|
result
|