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
data/lib/review/ewbbuilder.rb
CHANGED
@@ -27,11 +27,11 @@ module ReVIEW
|
|
27
27
|
puts
|
28
28
|
end
|
29
29
|
|
30
|
-
#
|
31
|
-
#
|
32
|
-
#
|
33
|
-
#
|
34
|
-
#
|
30
|
+
# Compiler.defsyntax(:emlist, :block, 0..1) {|args|
|
31
|
+
# if args[0] and not args[0] == 'noescape'
|
32
|
+
# raise SyntaxError, "unknown //emlist option: #{args[0]}"
|
33
|
+
# end
|
34
|
+
# }
|
35
35
|
|
36
36
|
def emlist(lines, caption = nil)
|
37
37
|
# firstline = f.lineno
|
@@ -49,11 +49,11 @@ module ReVIEW
|
|
49
49
|
puts
|
50
50
|
end
|
51
51
|
|
52
|
-
#
|
53
|
-
#
|
54
|
-
#
|
55
|
-
#
|
56
|
-
#
|
52
|
+
# Compiler.defsyntax(:cmd, :block, 0..1) {|args|
|
53
|
+
# if args[0] and not args[0] == 'noescape'
|
54
|
+
# raise SyntaxError, "unknown //cmd option: #{args[0]}"
|
55
|
+
# end
|
56
|
+
# }
|
57
57
|
|
58
58
|
def cmd(lines, caption = nil)
|
59
59
|
puts
|
@@ -73,11 +73,11 @@ module ReVIEW
|
|
73
73
|
puts
|
74
74
|
end
|
75
75
|
|
76
|
-
#
|
77
|
-
#
|
78
|
-
#
|
79
|
-
#
|
80
|
-
#
|
76
|
+
# Compiler.defsyntax(:list, :block, 0..1) {|args|
|
77
|
+
# if args[0] and not args[0] == 'noescape'
|
78
|
+
# raise SyntaxError, "unknown //list option: #{args[0]}"
|
79
|
+
# end
|
80
|
+
# }
|
81
81
|
|
82
82
|
def list(lines, id, caption)
|
83
83
|
puts
|
@@ -91,7 +91,7 @@ module ReVIEW
|
|
91
91
|
end
|
92
92
|
|
93
93
|
def image_header(file, caption)
|
94
|
-
if /\.png\z/ =~ file and
|
94
|
+
if /\.png\z/ =~ file and !FileTest.exist?('images/' + file)
|
95
95
|
warn "image file not exist: #{file}"
|
96
96
|
end
|
97
97
|
id = file.sub(/\.\w+\z/, '')
|
data/lib/review/htmlbuilder.rb
CHANGED
@@ -32,6 +32,7 @@ module ReVIEW
|
|
32
32
|
def pre_paragraph
|
33
33
|
'<p>'
|
34
34
|
end
|
35
|
+
|
35
36
|
def post_paragraph
|
36
37
|
'</p>'
|
37
38
|
end
|
@@ -44,6 +45,8 @@ module ReVIEW
|
|
44
45
|
@no_error = no_error
|
45
46
|
@noindent = nil
|
46
47
|
@ol_num = nil
|
48
|
+
@error_messages = nil
|
49
|
+
@warning_messages = nil
|
47
50
|
end
|
48
51
|
private :builder_init
|
49
52
|
|
@@ -54,12 +57,13 @@ module ReVIEW
|
|
54
57
|
@column = 0
|
55
58
|
@sec_counter = SecCounter.new(5, @chapter)
|
56
59
|
@nonum_counter = 0
|
60
|
+
@first_line_num = nil
|
57
61
|
@body_ext = nil
|
58
62
|
@toc = nil
|
59
63
|
end
|
60
64
|
private :builder_init_file
|
61
65
|
|
62
|
-
def
|
66
|
+
def layoutfile
|
63
67
|
if @book.config.maker == "webmaker"
|
64
68
|
htmldir = "web/html"
|
65
69
|
localfilename = "layout-web.html.erb"
|
@@ -85,10 +89,11 @@ module ReVIEW
|
|
85
89
|
else
|
86
90
|
layout_file = File.expand_path(htmlfilename, ReVIEW::Template::TEMPLATE_DIR)
|
87
91
|
end
|
92
|
+
layout_file
|
93
|
+
end
|
88
94
|
|
95
|
+
def result
|
89
96
|
# default XHTML header/footer
|
90
|
-
@error_messages = error_messages
|
91
|
-
@warning_messages = warning_messages
|
92
97
|
@title = strip_html(compile_inline(@chapter.title))
|
93
98
|
@body = @output.string
|
94
99
|
@language = @book.config['language']
|
@@ -102,7 +107,7 @@ module ReVIEW
|
|
102
107
|
@toc = ReVIEW::WEBTOCPrinter.book_to_string(@book)
|
103
108
|
end
|
104
109
|
|
105
|
-
tmpl = ReVIEW::Template.load(
|
110
|
+
tmpl = ReVIEW::Template.load(layoutfile)
|
106
111
|
tmpl.result(binding)
|
107
112
|
end
|
108
113
|
|
@@ -132,30 +137,6 @@ module ReVIEW
|
|
132
137
|
end
|
133
138
|
end
|
134
139
|
|
135
|
-
def messages
|
136
|
-
error_messages() + warning_messages()
|
137
|
-
end
|
138
|
-
|
139
|
-
def error_messages
|
140
|
-
return '' if @errors.empty?
|
141
|
-
"<h2>Syntax Errors</h2>\n" +
|
142
|
-
"<ul>\n" +
|
143
|
-
@errors.map {|file, line, msg|
|
144
|
-
"<li>#{escape_html(file)}:#{line}: #{escape_html(msg.to_s)}</li>\n"
|
145
|
-
}.join('') +
|
146
|
-
"</ul>\n"
|
147
|
-
end
|
148
|
-
|
149
|
-
def warning_messages
|
150
|
-
return '' if @warns.empty?
|
151
|
-
"<h2>Warnings</h2>\n" +
|
152
|
-
"<ul>\n" +
|
153
|
-
@warns.map {|file, line, msg|
|
154
|
-
"<li>#{escape_html(file)}:#{line}: #{escape_html(msg)}</li>\n"
|
155
|
-
}.join('') +
|
156
|
-
"</ul>\n"
|
157
|
-
end
|
158
|
-
|
159
140
|
def headline(level, label, caption)
|
160
141
|
prefix, anchor = headline_prefix(level)
|
161
142
|
unless prefix.nil?
|
@@ -241,7 +222,7 @@ module ReVIEW
|
|
241
222
|
puts %Q[<h#{level} id="#{normalize_id(label)}">#{a_id}#{compile_inline(caption)}</h#{level}>]
|
242
223
|
end
|
243
224
|
end
|
244
|
-
#
|
225
|
+
# headline(level, label, caption)
|
245
226
|
end
|
246
227
|
|
247
228
|
def column_end(level)
|
@@ -275,10 +256,6 @@ module ReVIEW
|
|
275
256
|
puts '</div>'
|
276
257
|
end
|
277
258
|
|
278
|
-
def tsize(str)
|
279
|
-
# null
|
280
|
-
end
|
281
|
-
|
282
259
|
def captionblock(type, lines, caption)
|
283
260
|
puts %Q[<div class="#{type}">]
|
284
261
|
unless caption.nil?
|
@@ -354,10 +331,6 @@ module ReVIEW
|
|
354
331
|
puts '<ul>'
|
355
332
|
end
|
356
333
|
|
357
|
-
def ul_item(lines)
|
358
|
-
puts "<li>#{lines.join}</li>"
|
359
|
-
end
|
360
|
-
|
361
334
|
def ul_item_begin(lines)
|
362
335
|
print "<li>#{lines.join}"
|
363
336
|
end
|
@@ -424,7 +397,7 @@ module ReVIEW
|
|
424
397
|
alias_method :lead, :read
|
425
398
|
|
426
399
|
def list(lines, id, caption, lang = nil)
|
427
|
-
puts %Q[<div class="caption-code">]
|
400
|
+
puts %Q[<div id="#{normalize_id(id)}" class="caption-code">]
|
428
401
|
begin
|
429
402
|
list_header id, caption, lang
|
430
403
|
rescue KeyError
|
@@ -447,6 +420,7 @@ module ReVIEW
|
|
447
420
|
class_names = ["list"]
|
448
421
|
lexer = lang || File.extname(id).gsub(/\./, '')
|
449
422
|
class_names.push("language-#{lexer}") unless lexer.blank?
|
423
|
+
class_names.push("highlight") if highlight?
|
450
424
|
print %Q[<pre class="#{class_names.join(" ")}">]
|
451
425
|
body = lines.inject(''){|i, j| i + detab(j) + "\n"}
|
452
426
|
puts highlight(:body => body, :lexer => lexer, :format => 'html')
|
@@ -476,7 +450,7 @@ module ReVIEW
|
|
476
450
|
end
|
477
451
|
|
478
452
|
def listnum(lines, id, caption, lang = nil)
|
479
|
-
puts %Q[<div class="code">]
|
453
|
+
puts %Q[<div id="#{normalize_id(id)}" class="code">]
|
480
454
|
begin
|
481
455
|
list_header id, caption, lang
|
482
456
|
rescue KeyError
|
@@ -490,14 +464,17 @@ module ReVIEW
|
|
490
464
|
if highlight?
|
491
465
|
body = lines.inject(''){|i, j| i + detab(j) + "\n"}
|
492
466
|
lexer = lang
|
493
|
-
|
494
|
-
|
467
|
+
first_line_number = get_line_num
|
468
|
+
puts highlight(:body => body, :lexer => lexer, :format => 'html', :linenum => true,
|
469
|
+
:options => {:linenostart => first_line_number})
|
495
470
|
else
|
496
471
|
class_names = ["list"]
|
497
472
|
class_names.push("language-#{lang}") unless lang.blank?
|
473
|
+
class_names.push("highlight") if highlight?
|
498
474
|
print %Q[<pre class="#{class_names.join(" ")}">]
|
475
|
+
first_line_num = get_line_num
|
499
476
|
lines.each_with_index do |line, i|
|
500
|
-
puts detab((i+
|
477
|
+
puts detab((i+first_line_num).to_s.rjust(2) + ": " + line)
|
501
478
|
end
|
502
479
|
puts '</pre>'
|
503
480
|
end
|
@@ -510,6 +487,7 @@ module ReVIEW
|
|
510
487
|
end
|
511
488
|
class_names = ["emlist"]
|
512
489
|
class_names.push("language-#{lang}") unless lang.blank?
|
490
|
+
class_names.push("highlight") if highlight?
|
513
491
|
print %Q[<pre class="#{class_names.join(" ")}">]
|
514
492
|
body = lines.inject(''){|i, j| i + detab(j) + "\n"}
|
515
493
|
lexer = lang
|
@@ -527,14 +505,17 @@ module ReVIEW
|
|
527
505
|
if highlight?
|
528
506
|
body = lines.inject(''){|i, j| i + detab(j) + "\n"}
|
529
507
|
lexer = lang
|
530
|
-
|
531
|
-
|
508
|
+
first_line_number = get_line_num
|
509
|
+
puts highlight(:body => body, :lexer => lexer, :format => 'html', :linenum => true,
|
510
|
+
:options => {:linenostart => first_line_number})
|
532
511
|
else
|
533
512
|
class_names = ["emlist"]
|
534
513
|
class_names.push("language-#{lang}") unless lang.blank?
|
514
|
+
class_names.push("highlight") if highlight?
|
535
515
|
print %Q[<pre class="#{class_names.join(" ")}">]
|
516
|
+
first_line_num = get_line_num
|
536
517
|
lines.each_with_index do |line, i|
|
537
|
-
puts detab((i+
|
518
|
+
puts detab((i+first_line_num).to_s.rjust(2) + ": " + line)
|
538
519
|
end
|
539
520
|
puts '</pre>'
|
540
521
|
end
|
@@ -751,10 +732,7 @@ module ReVIEW
|
|
751
732
|
lines.unshift comment unless comment.blank?
|
752
733
|
if @book.config["draft"]
|
753
734
|
str = lines.join("<br />")
|
754
|
-
puts %Q(<div class="draft-comment">#{str}</div>)
|
755
|
-
else
|
756
|
-
str = lines.join("\n")
|
757
|
-
puts %Q(<!-- #{escape_comment(str)} -->)
|
735
|
+
puts %Q(<div class="draft-comment">#{escape_html(str)}</div>)
|
758
736
|
end
|
759
737
|
end
|
760
738
|
|
@@ -998,18 +976,24 @@ module ReVIEW
|
|
998
976
|
|
999
977
|
def inline_column_chap(chapter, id)
|
1000
978
|
if @book.config["chapterlink"]
|
1001
|
-
%Q(<a href="\##{column_label(id)}" class="columnref">#{I18n.t("column",
|
979
|
+
%Q(<a href="\##{column_label(id)}" class="columnref">#{I18n.t("column", compile_inline(chapter.column(id).caption))}</a>)
|
1002
980
|
else
|
1003
|
-
I18n.t("column",
|
981
|
+
I18n.t("column", compile_inline(chapter.column(id).caption))
|
1004
982
|
end
|
1005
983
|
end
|
1006
984
|
|
1007
985
|
def inline_list(id)
|
1008
986
|
chapter, id = extract_chapter_id(id)
|
987
|
+
str = nil
|
1009
988
|
if get_chap(chapter).nil?
|
1010
|
-
"#{I18n.t("list")}#{I18n.t("format_number_without_header", [chapter.list(id).number])}"
|
989
|
+
str = "#{I18n.t("list")}#{I18n.t("format_number_without_header", [chapter.list(id).number])}"
|
1011
990
|
else
|
1012
|
-
"#{I18n.t("list")}#{I18n.t("format_number", [get_chap(chapter), chapter.list(id).number])}"
|
991
|
+
str = "#{I18n.t("list")}#{I18n.t("format_number", [get_chap(chapter), chapter.list(id).number])}"
|
992
|
+
end
|
993
|
+
if @book.config["chapterlink"]
|
994
|
+
%Q(<span class="listref"><a href="./#{chapter.id}#{extname}##{id}">#{str}</a></span>)
|
995
|
+
else
|
996
|
+
%Q(<span class="listref">#{str}</span>)
|
1013
997
|
end
|
1014
998
|
rescue KeyError
|
1015
999
|
error "unknown list: #{id}"
|
@@ -1025,9 +1009,9 @@ module ReVIEW
|
|
1025
1009
|
str = "#{I18n.t("table")}#{I18n.t("format_number", [get_chap(chapter), chapter.table(id).number])}"
|
1026
1010
|
end
|
1027
1011
|
if @book.config["chapterlink"]
|
1028
|
-
%Q(<a href="./#{chapter.id}#{extname}##{id}">#{str}</a>)
|
1012
|
+
%Q(<span class="tableref"><a href="./#{chapter.id}#{extname}##{id}">#{str}</a></span>)
|
1029
1013
|
else
|
1030
|
-
str
|
1014
|
+
%Q(<span class="tableref">#{str}</span>)
|
1031
1015
|
end
|
1032
1016
|
rescue KeyError
|
1033
1017
|
error "unknown table: #{id}"
|
@@ -1043,9 +1027,9 @@ module ReVIEW
|
|
1043
1027
|
str = "#{I18n.t("image")}#{I18n.t("format_number", [get_chap(chapter), chapter.image(id).number])}"
|
1044
1028
|
end
|
1045
1029
|
if @book.config["chapterlink"]
|
1046
|
-
%Q(<a href="./#{chapter.id}#{extname}##{normalize_id(id)}">#{str}</a>)
|
1030
|
+
%Q(<span class="imgref"><a href="./#{chapter.id}#{extname}##{normalize_id(id)}">#{str}</a></span>)
|
1047
1031
|
else
|
1048
|
-
str
|
1032
|
+
%Q(<span class="imgref">#{str}</span>)
|
1049
1033
|
end
|
1050
1034
|
rescue KeyError
|
1051
1035
|
error "unknown image: #{id}"
|
@@ -1148,7 +1132,7 @@ module ReVIEW
|
|
1148
1132
|
if @book.config["draft"]
|
1149
1133
|
%Q(<span class="draft-comment">#{escape_html(str)}</span>)
|
1150
1134
|
else
|
1151
|
-
|
1135
|
+
""
|
1152
1136
|
end
|
1153
1137
|
end
|
1154
1138
|
|
data/lib/review/htmltoc.rb
CHANGED
data/lib/review/htmlutils.rb
CHANGED
@@ -28,7 +28,7 @@ module ReVIEW
|
|
28
28
|
alias_method :h, :escape_html
|
29
29
|
|
30
30
|
def unescape_html(str)
|
31
|
-
# FIXME better code
|
31
|
+
# FIXME: better code
|
32
32
|
str.gsub('"', '"').gsub('>', '>').gsub('<', '<').gsub('&', '&')
|
33
33
|
end
|
34
34
|
|
@@ -44,14 +44,25 @@ module ReVIEW
|
|
44
44
|
|
45
45
|
def highlight?
|
46
46
|
@book.config["highlight"] &&
|
47
|
-
@book.config["highlight"]["html"]
|
47
|
+
@book.config["highlight"]["html"]
|
48
48
|
end
|
49
49
|
|
50
50
|
def highlight(ops)
|
51
51
|
if @book.config["pygments"].present?
|
52
52
|
raise ReVIEW::ConfigError, "'pygments:' in config.yml is obsoleted."
|
53
53
|
end
|
54
|
+
return ops[:body].to_s if !highlight?
|
54
55
|
|
56
|
+
if @book.config["highlight"]["html"] == "pygments"
|
57
|
+
highlight_pygments(ops)
|
58
|
+
elsif @book.config["highlight"]["html"] == "rouge"
|
59
|
+
highlight_rouge(ops)
|
60
|
+
else
|
61
|
+
raise ReVIEW::ConfigError, "unknown highlight method #{@book.config["highlight"]["html"]} in config.yml."
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def highlight_pygments(ops)
|
55
66
|
body = ops[:body] || ''
|
56
67
|
if @book.config["highlight"] && @book.config["highlight"]["lang"]
|
57
68
|
lexer = @book.config["highlight"]["lang"] # default setting
|
@@ -61,10 +72,13 @@ module ReVIEW
|
|
61
72
|
lexer = ops[:lexer] if ops[:lexer].present?
|
62
73
|
format = ops[:format] || ''
|
63
74
|
options = {:nowrap => true, :noclasses => true}
|
75
|
+
if ops[:linenum]
|
76
|
+
options[:nowrap] = false
|
77
|
+
options[:linenos] = 'inline'
|
78
|
+
end
|
64
79
|
if ops[:options] && ops[:options].kind_of?(Hash)
|
65
80
|
options.merge!(ops[:options])
|
66
81
|
end
|
67
|
-
return body if !highlight?
|
68
82
|
|
69
83
|
begin
|
70
84
|
require 'pygments'
|
@@ -77,8 +91,40 @@ module ReVIEW
|
|
77
91
|
body
|
78
92
|
end
|
79
93
|
rescue LoadError
|
80
|
-
|
94
|
+
body
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
def highlight_rouge(ops)
|
99
|
+
body = ops[:body] || ''
|
100
|
+
if ops[:lexer].present?
|
101
|
+
lexer = ops[:lexer]
|
102
|
+
elsif @book.config["highlight"] && @book.config["highlight"]["lang"]
|
103
|
+
lexer = @book.config["highlight"]["lang"] # default setting
|
104
|
+
else
|
105
|
+
lexer = 'text'
|
106
|
+
end
|
107
|
+
format = ops[:format] || ''
|
108
|
+
|
109
|
+
first_line_num = 1 ## default
|
110
|
+
if ops[:options] && ops[:options][:linenostart]
|
111
|
+
first_line_num = ops[:options][:linenostart]
|
81
112
|
end
|
113
|
+
|
114
|
+
require 'rouge'
|
115
|
+
lexer = Rouge::Lexer.find(lexer)
|
116
|
+
raise "unknown lexer #{lexer}" unless lexer
|
117
|
+
|
118
|
+
formatter = Rouge::Formatters::HTML.new(:css_class => 'highlight')
|
119
|
+
if ops[:linenum]
|
120
|
+
formatter = Rouge::Formatters::HTMLTable.new(formatter,
|
121
|
+
:table_class => 'highlight rouge-table',
|
122
|
+
:start_line => first_line_num)
|
123
|
+
end
|
124
|
+
raise "unknown formatter #{formatter}" unless formatter
|
125
|
+
|
126
|
+
text = unescape_html(body)
|
127
|
+
formatter.format(lexer.lex(text))
|
82
128
|
end
|
83
129
|
|
84
130
|
def normalize_id(id)
|
data/lib/review/i18n.rb
CHANGED
@@ -154,13 +154,13 @@ module ReVIEW
|
|
154
154
|
frmt.sub!(i, ARABIC_UW[args[idx]])
|
155
155
|
remove_args << idx
|
156
156
|
else
|
157
|
-
#
|
157
|
+
# do nothing
|
158
158
|
end
|
159
159
|
end
|
160
160
|
remove_args.reverse_each do |idx|
|
161
161
|
args.delete_at idx
|
162
162
|
end
|
163
|
-
args_matched = (frmt.count("%")
|
163
|
+
args_matched = (frmt.count("%") <= args.size)
|
164
164
|
frmt.gsub!('##', '%%')
|
165
165
|
args_matched ? (frmt % args) : frmt
|
166
166
|
rescue
|
data/lib/review/idgxmlbuilder.rb
CHANGED
@@ -64,6 +64,7 @@ module ReVIEW
|
|
64
64
|
@column = 0
|
65
65
|
@noindent = nil
|
66
66
|
@ol_num = nil
|
67
|
+
@first_line_num = nil
|
67
68
|
@rootelement = "doc"
|
68
69
|
@secttags = nil
|
69
70
|
@tsize = nil
|
@@ -92,7 +93,7 @@ module ReVIEW
|
|
92
93
|
s += "</sect>" if @section > 0
|
93
94
|
s += "</chapter>" if @chapter.number > 0
|
94
95
|
end
|
95
|
-
|
96
|
+
@output.string + s + "</#{@rootelement}>\n"
|
96
97
|
end
|
97
98
|
|
98
99
|
def warn(msg)
|
@@ -113,30 +114,6 @@ module ReVIEW
|
|
113
114
|
end
|
114
115
|
end
|
115
116
|
|
116
|
-
def messages
|
117
|
-
error_messages() + warning_messages()
|
118
|
-
end
|
119
|
-
|
120
|
-
def error_messages
|
121
|
-
return '' if @errors.empty?
|
122
|
-
"<h2>Syntax Errors</h2>\n" +
|
123
|
-
"<ul>\n" +
|
124
|
-
@errors.map {|file, line, msg|
|
125
|
-
"<li>#{escape_html(file)}:#{line}: #{escape_html(msg.to_s)}</li>\n"
|
126
|
-
}.join('') +
|
127
|
-
"</ul>\n"
|
128
|
-
end
|
129
|
-
|
130
|
-
def warning_messages
|
131
|
-
return '' if @warns.empty?
|
132
|
-
"<h2>Warnings</h2>\n" +
|
133
|
-
"<ul>\n" +
|
134
|
-
@warns.map {|file, line, msg|
|
135
|
-
"<li>#{escape_html(file)}:#{line}: #{escape_html(msg)}</li>\n"
|
136
|
-
}.join('') +
|
137
|
-
"</ul>\n"
|
138
|
-
end
|
139
|
-
|
140
117
|
def headline(level, label, caption)
|
141
118
|
case level
|
142
119
|
when 1
|
@@ -162,7 +139,7 @@ module ReVIEW
|
|
162
139
|
end
|
163
140
|
@section += 1
|
164
141
|
print %Q(<sect id="sect:#{@chapter.number}.#{@section}">) unless @secttags.nil?
|
165
|
-
|
142
|
+
|
166
143
|
@subsection = 0
|
167
144
|
@subsubsection = 0
|
168
145
|
@subsubsubsection = 0
|
@@ -212,10 +189,6 @@ module ReVIEW
|
|
212
189
|
puts "<ul#{level == 1 ? nil : level}>"
|
213
190
|
end
|
214
191
|
|
215
|
-
def ul_item(lines)
|
216
|
-
puts %Q(<li aid:pstyle="ul-item">#{lines.join.chomp}</li>)
|
217
|
-
end
|
218
|
-
|
219
192
|
def ul_item_begin(lines)
|
220
193
|
print %Q(<li aid:pstyle="ul-item">#{lines.join.chomp})
|
221
194
|
end
|
@@ -310,9 +283,9 @@ module ReVIEW
|
|
310
283
|
|
311
284
|
def inline_column_chap(chapter, id)
|
312
285
|
if @book.config["chapterlink"]
|
313
|
-
%Q(<link href="#{column_label(id)}">#{
|
286
|
+
%Q(<link href="#{column_label(id)}">#{I18n.t("column", compile_inline(chapter.column(id).caption))}</link>)
|
314
287
|
else
|
315
|
-
|
288
|
+
I18n.t("column", compile_inline(chapter.column(id).caption))
|
316
289
|
end
|
317
290
|
end
|
318
291
|
|
@@ -362,8 +335,9 @@ module ReVIEW
|
|
362
335
|
|
363
336
|
def emlistnum(lines, caption = nil, lang = nil)
|
364
337
|
_lines = []
|
338
|
+
first_line_num = get_line_num
|
365
339
|
lines.each_with_index do |line, i|
|
366
|
-
_lines << detab("<span type='lineno'>" + (i +
|
340
|
+
_lines << detab("<span type='lineno'>" + (i + first_line_num).to_s.rjust(2) + ": </span>" + line)
|
367
341
|
end
|
368
342
|
quotedlist _lines, 'emlistnum', caption
|
369
343
|
end
|
@@ -371,6 +345,7 @@ module ReVIEW
|
|
371
345
|
def listnum_body(lines, lang)
|
372
346
|
print %Q(<pre>)
|
373
347
|
no = 1
|
348
|
+
first_line_num = get_line_num
|
374
349
|
lines.each_with_index do |line, i|
|
375
350
|
unless @book.config["listinfo"].nil?
|
376
351
|
print "<listinfo line=\"#{no}\""
|
@@ -378,7 +353,7 @@ module ReVIEW
|
|
378
353
|
print " end=\"#{no}\"" if no == lines.size
|
379
354
|
print ">"
|
380
355
|
end
|
381
|
-
print detab("<span type='lineno'>" + (i +
|
356
|
+
print detab("<span type='lineno'>" + (i + first_line_num).to_s.rjust(2) + ": </span>" + line)
|
382
357
|
print "\n"
|
383
358
|
print "</listinfo>" unless @book.config["listinfo"].nil?
|
384
359
|
no += 1
|
@@ -532,7 +507,7 @@ module ReVIEW
|
|
532
507
|
if cellwidth.size < col
|
533
508
|
cw = (tablewidth - totallength) / (col - cellwidth.size)
|
534
509
|
warn "auto cell sizing exceeds limit for table: #{id}" if cw <= 0
|
535
|
-
|
510
|
+
(cellwidth.size..(col - 1)).each do |i|
|
536
511
|
cellwidth[i] = cw
|
537
512
|
end
|
538
513
|
end
|
@@ -589,7 +564,7 @@ module ReVIEW
|
|
589
564
|
|
590
565
|
def table_header(id, caption)
|
591
566
|
if get_chap.nil?
|
592
|
-
|
567
|
+
puts %Q[<caption>#{I18n.t("table")}#{I18n.t("format_number_without_chapter", [@chapter.table(id).number])}#{I18n.t("caption_prefix_idgxml")}#{compile_inline(caption)}</caption>]
|
593
568
|
else
|
594
569
|
puts %Q[<caption>#{I18n.t("table")}#{I18n.t("format_number", [get_chap, @chapter.table(id).number])}#{I18n.t("caption_prefix_idgxml")}#{compile_inline(caption)}</caption>]
|
595
570
|
end
|
@@ -627,8 +602,21 @@ module ReVIEW
|
|
627
602
|
end
|
628
603
|
end
|
629
604
|
|
630
|
-
def comment(
|
631
|
-
|
605
|
+
def comment(lines, comment = nil)
|
606
|
+
if @book.config["draft"]
|
607
|
+
lines ||= []
|
608
|
+
lines.unshift comment unless comment.blank?
|
609
|
+
str = lines.join("\n")
|
610
|
+
print "<msg>#{escape_html(str)}</msg>"
|
611
|
+
end
|
612
|
+
end
|
613
|
+
|
614
|
+
def inline_comment(str)
|
615
|
+
if @book.config["draft"]
|
616
|
+
%Q(<msg>#{escape_html(str)}</msg>)
|
617
|
+
else
|
618
|
+
''
|
619
|
+
end
|
632
620
|
end
|
633
621
|
|
634
622
|
def footnote(id, str)
|
@@ -758,7 +746,7 @@ module ReVIEW
|
|
758
746
|
end
|
759
747
|
|
760
748
|
def inline_labelref(idref)
|
761
|
-
%Q[<ref idref='#{escape_html(idref)}'>「#{I18n.t("label_marker")}#{escape_html(idref)}」</ref>] # FIXME
|
749
|
+
%Q[<ref idref='#{escape_html(idref)}'>「#{I18n.t("label_marker")}#{escape_html(idref)}」</ref>] # FIXME: 節名とタイトルも込みで要出力
|
762
750
|
end
|
763
751
|
|
764
752
|
alias_method :inline_ref, :inline_labelref
|
@@ -785,7 +773,7 @@ module ReVIEW
|
|
785
773
|
end
|
786
774
|
|
787
775
|
def linebreak
|
788
|
-
# FIXME:pが閉じちゃってるので一度戻らないといけないが、難しい…。
|
776
|
+
# FIXME: pが閉じちゃってるので一度戻らないといけないが、難しい…。
|
789
777
|
puts "<br />"
|
790
778
|
end
|
791
779
|
|
@@ -1045,10 +1033,6 @@ module ReVIEW
|
|
1045
1033
|
print "<label id='#{id}' />"
|
1046
1034
|
end
|
1047
1035
|
|
1048
|
-
def tsize(str)
|
1049
|
-
@tsize = str
|
1050
|
-
end
|
1051
|
-
|
1052
1036
|
def dtp(str)
|
1053
1037
|
print %Q(<?dtp #{str} ?>)
|
1054
1038
|
end
|
@@ -1088,14 +1072,13 @@ module ReVIEW
|
|
1088
1072
|
|
1089
1073
|
def inline_chapref(id)
|
1090
1074
|
chs = ["", "「", "」"]
|
1091
|
-
|
1075
|
+
if @book.config["chapref"]
|
1092
1076
|
_chs = @book.config["chapref"].split(",")
|
1093
1077
|
if _chs.size != 3
|
1094
1078
|
error "--chapsplitter must have exactly 3 parameters with comma."
|
1095
1079
|
else
|
1096
1080
|
chs = _chs
|
1097
1081
|
end
|
1098
|
-
else
|
1099
1082
|
end
|
1100
1083
|
s = "#{chs[0]}#{@book.chapter_index.number(id)}#{chs[1]}#{@book.chapter_index.title(id)}#{chs[2]}"
|
1101
1084
|
if @book.config["chapterlink"]
|
@@ -1156,7 +1139,7 @@ module ReVIEW
|
|
1156
1139
|
end
|
1157
1140
|
|
1158
1141
|
def bibpaper_bibpaper(id, caption, lines)
|
1159
|
-
|
1142
|
+
print split_paragraph(lines).join("")
|
1160
1143
|
end
|
1161
1144
|
|
1162
1145
|
def inline_bib(id)
|