erubis 2.6.6 → 2.7.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGES.txt +79 -3
- data/MIT-LICENSE +1 -1
- data/README.txt +2 -2
- data/benchmark/bench.rb +2 -2
- data/bin/erubis +2 -2
- data/contrib/erubis +293 -155
- data/contrib/inline-require +2 -2
- data/doc-api/classes/Erubis.html +10 -1
- data/doc-api/classes/Erubis/ArrayBufferEnhancer.html +12 -12
- data/doc-api/classes/Erubis/ArrayEnhancer.html +14 -14
- data/doc-api/classes/Erubis/Basic/Converter.html +24 -24
- data/doc-api/classes/Erubis/BiPatternEnhancer.html +12 -12
- data/doc-api/classes/Erubis/CGenerator.html +60 -60
- data/doc-api/classes/Erubis/Context.html +42 -42
- data/doc-api/classes/Erubis/Converter.html +27 -27
- data/doc-api/classes/Erubis/CppGenerator.html +382 -0
- data/doc-api/classes/Erubis/DeleteIndentEnhancer.html +7 -7
- data/doc-api/classes/Erubis/Ecpp.html +126 -0
- data/doc-api/classes/Erubis/Engine.html +36 -36
- data/doc-api/classes/Erubis/ErboutEnhancer.html +14 -14
- data/doc-api/classes/Erubis/EscapeEnhancer.html +6 -6
- data/doc-api/classes/Erubis/EscapedEcpp.html +120 -0
- data/doc-api/classes/Erubis/Evaluator.html +19 -19
- data/doc-api/classes/Erubis/Generator.html +60 -60
- data/doc-api/classes/Erubis/HeaderFooterEnhancer.html +14 -14
- data/doc-api/classes/Erubis/Helpers/RailsFormHelper.html +150 -150
- data/doc-api/classes/Erubis/Helpers/RailsHelper.html +49 -49
- data/doc-api/classes/Erubis/Helpers/RailsHelper/TemplateConverter.html +24 -24
- data/doc-api/classes/Erubis/InterpolationEnhancer.html +38 -39
- data/doc-api/classes/Erubis/JavaGenerator.html +60 -60
- data/doc-api/classes/Erubis/JavascriptGenerator.html +66 -66
- data/doc-api/classes/Erubis/Main.html +22 -22
- data/doc-api/classes/Erubis/NoCodeEnhancer.html +30 -30
- data/doc-api/classes/Erubis/NoTextEnhancer.html +6 -6
- data/doc-api/classes/Erubis/OptimizedEruby.html +6 -6
- data/doc-api/classes/Erubis/OptimizedGenerator.html +72 -72
- data/doc-api/classes/Erubis/OptimizedXmlEruby.html +6 -6
- data/doc-api/classes/Erubis/PI.html +1 -0
- data/doc-api/classes/Erubis/PI/Converter.html +18 -18
- data/doc-api/classes/Erubis/PI/Ec.html +6 -6
- data/doc-api/classes/Erubis/PI/Ecpp.html +166 -0
- data/doc-api/classes/Erubis/PI/Ejava.html +6 -6
- data/doc-api/classes/Erubis/PI/Ejavascript.html +6 -6
- data/doc-api/classes/Erubis/PI/Eperl.html +6 -6
- data/doc-api/classes/Erubis/PI/Ephp.html +6 -6
- data/doc-api/classes/Erubis/PI/Eruby.html +7 -7
- data/doc-api/classes/Erubis/PI/Escheme.html +6 -6
- data/doc-api/classes/Erubis/PI/TinyEruby.html +24 -24
- data/doc-api/classes/Erubis/PercentLineEnhancer.html +18 -34
- data/doc-api/classes/Erubis/PerlGenerator.html +54 -54
- data/doc-api/classes/Erubis/PhpGenerator.html +54 -54
- data/doc-api/classes/Erubis/PrefixedLineEnhancer.html +210 -0
- data/doc-api/classes/Erubis/PrefixedLineEruby.html +120 -0
- data/doc-api/classes/Erubis/PreprocessingEruby.html +12 -12
- data/doc-api/classes/Erubis/PreprocessingHelper.html +22 -22
- data/doc-api/classes/Erubis/PrintEnabledEnhancer.html +20 -20
- data/doc-api/classes/Erubis/PrintOutEnhancer.html +33 -33
- data/doc-api/classes/Erubis/RubyEvaluator.html +18 -18
- data/doc-api/classes/Erubis/RubyGenerator.html +59 -58
- data/doc-api/classes/Erubis/SchemeGenerator.html +60 -60
- data/doc-api/classes/Erubis/SimplifyEnhancer.html +7 -7
- data/doc-api/classes/Erubis/StdoutEnhancer.html +13 -13
- data/doc-api/classes/Erubis/StringBufferEnhancer.html +14 -14
- data/doc-api/classes/Erubis/TinyEruby.html +24 -24
- data/doc-api/classes/Erubis/XmlHelper.html +30 -30
- data/doc-api/classes/Kernel.html +155 -0
- data/doc-api/created.rid +1 -1
- data/doc-api/files/README_txt.html +3 -3
- data/doc-api/files/erubis/context_rb.html +1 -1
- data/doc-api/files/erubis/converter_rb.html +3 -3
- data/doc-api/files/erubis/engine/ec_rb.html +1 -1
- data/doc-api/files/erubis/engine/ecpp_rb.html +115 -0
- data/doc-api/files/erubis/engine/ejava_rb.html +2 -2
- data/doc-api/files/erubis/engine/ejavascript_rb.html +2 -2
- data/doc-api/files/erubis/engine/enhanced_rb.html +2 -2
- data/doc-api/files/erubis/engine/eperl_rb.html +1 -1
- data/doc-api/files/erubis/engine/ephp_rb.html +1 -1
- data/doc-api/files/erubis/engine/eruby_rb.html +2 -2
- data/doc-api/files/erubis/engine/escheme_rb.html +1 -1
- data/doc-api/files/erubis/engine/optimized_rb.html +1 -1
- data/doc-api/files/erubis/engine_rb.html +2 -2
- data/doc-api/files/erubis/enhancer_rb.html +2 -2
- data/doc-api/files/erubis/error_rb.html +1 -1
- data/doc-api/files/erubis/evaluator_rb.html +1 -1
- data/doc-api/files/erubis/generator_rb.html +3 -3
- data/doc-api/files/erubis/helper_rb.html +1 -1
- data/doc-api/files/erubis/helpers/rails_form_helper_rb.html +1 -1
- data/doc-api/files/erubis/helpers/rails_helper_rb.html +1 -1
- data/doc-api/files/erubis/local-setting_rb.html +1 -1
- data/doc-api/files/erubis/main_rb.html +4 -2
- data/doc-api/files/erubis/preprocessing_rb.html +1 -1
- data/doc-api/files/erubis/tiny_rb.html +1 -1
- data/doc-api/files/erubis/util_rb.html +107 -0
- data/doc-api/files/erubis_rb.html +2 -2
- data/doc-api/fr_class_index.html +7 -0
- data/doc-api/fr_file_index.html +2 -0
- data/doc-api/fr_method_index.html +237 -223
- data/doc/docstyle.css +25 -4
- data/doc/users-guide.html +286 -21
- data/examples/basic/Makefile +7 -2
- data/examples/basic/example.ecpp +33 -0
- data/lib/erubis.rb +4 -3
- data/lib/erubis/context.rb +2 -2
- data/lib/erubis/converter.rb +3 -3
- data/lib/erubis/engine.rb +8 -8
- data/lib/erubis/engine/ec.rb +2 -2
- data/lib/erubis/engine/ecpp.rb +113 -0
- data/lib/erubis/engine/ejava.rb +9 -9
- data/lib/erubis/engine/ejavascript.rb +9 -9
- data/lib/erubis/engine/enhanced.rb +7 -2
- data/lib/erubis/engine/eperl.rb +2 -2
- data/lib/erubis/engine/ephp.rb +2 -2
- data/lib/erubis/engine/eruby.rb +8 -7
- data/lib/erubis/engine/escheme.rb +2 -2
- data/lib/erubis/engine/optimized.rb +2 -2
- data/lib/erubis/enhancer.rb +70 -27
- data/lib/erubis/error.rb +2 -2
- data/lib/erubis/evaluator.rb +2 -2
- data/lib/erubis/generator.rb +3 -3
- data/lib/erubis/helper.rb +2 -2
- data/lib/erubis/helpers/rails_form_helper.rb +2 -2
- data/lib/erubis/helpers/rails_helper.rb +2 -2
- data/lib/erubis/local-setting.rb +2 -2
- data/lib/erubis/main.rb +31 -4
- data/lib/erubis/preprocessing.rb +2 -2
- data/lib/erubis/tiny.rb +2 -2
- data/lib/erubis/util.rb +22 -0
- data/test/assert-text-equal.rb +2 -2
- data/test/data/users-guide/bufvar-example.rb +10 -0
- data/test/data/users-guide/bufvar-example.result +17 -0
- data/test/data/users-guide/example.ecpp +30 -0
- data/test/data/users-guide/example_c.result +22 -19
- data/test/data/users-guide/fasteruby-example.rb +8 -0
- data/test/data/users-guide/fasteruby-example.result +18 -0
- data/test/data/users-guide/percentline-example.rhtml +3 -1
- data/test/data/users-guide/percentline_example.result +5 -3
- data/test/data/users-guide/prefixedline-example.rb +9 -0
- data/test/data/users-guide/prefixedline-example.rhtml +6 -0
- data/test/data/users-guide/prefixedline_example.result +9 -0
- data/test/test-engines.rb +58 -2
- data/test/test-enhancers.rb +51 -2
- data/test/test-erubis.rb +14 -10
- data/test/test-index-cgi.rb +191 -0
- data/test/test-main.rb +35 -4
- data/test/test-users-guide.rb +18 -2
- data/test/test.rb +18 -2
- data/test/testutil.rb +22 -7
- metadata +30 -24
data/lib/erubis/enhancer.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
##
|
2
|
-
## $Release: 2.
|
3
|
-
## copyright(c) 2006-
|
2
|
+
## $Release: 2.7.0 $
|
3
|
+
## copyright(c) 2006-2011 kuwata-lab.com all rights reserved.
|
4
4
|
##
|
5
5
|
|
6
6
|
|
@@ -67,7 +67,7 @@ module Erubis
|
|
67
67
|
end
|
68
68
|
|
69
69
|
def add_preamble(src)
|
70
|
-
src << "
|
70
|
+
src << "#{@bufvar} = $stdout;"
|
71
71
|
end
|
72
72
|
|
73
73
|
def add_postamble(src)
|
@@ -92,15 +92,15 @@ module Erubis
|
|
92
92
|
end
|
93
93
|
|
94
94
|
def add_text(src, text)
|
95
|
-
src << " print '
|
95
|
+
src << " print '#{escape_text(text)}';" unless text.empty?
|
96
96
|
end
|
97
97
|
|
98
98
|
def add_expr_literal(src, code)
|
99
|
-
src <<
|
99
|
+
src << " print((#{code}).to_s);"
|
100
100
|
end
|
101
101
|
|
102
102
|
def add_expr_escaped(src, code)
|
103
|
-
src <<
|
103
|
+
src << " print #{escaped_expr(code)};"
|
104
104
|
end
|
105
105
|
|
106
106
|
def add_postamble(src)
|
@@ -162,12 +162,12 @@ module Erubis
|
|
162
162
|
end
|
163
163
|
|
164
164
|
def add_preamble(src)
|
165
|
-
src << "
|
165
|
+
src << "#{@bufvar} = [];"
|
166
166
|
end
|
167
167
|
|
168
168
|
def add_postamble(src)
|
169
169
|
src << "\n" unless src[-1] == ?\n
|
170
|
-
src << "
|
170
|
+
src << "#{@bufvar}\n"
|
171
171
|
end
|
172
172
|
|
173
173
|
end
|
@@ -208,12 +208,12 @@ module Erubis
|
|
208
208
|
end
|
209
209
|
|
210
210
|
def add_preamble(src)
|
211
|
-
src << "
|
211
|
+
src << "#{@bufvar} = '';"
|
212
212
|
end
|
213
213
|
|
214
214
|
def add_postamble(src)
|
215
215
|
src << "\n" unless src[-1] == ?\n
|
216
|
-
src << "
|
216
|
+
src << "#{@bufvar}.to_s\n"
|
217
217
|
end
|
218
218
|
|
219
219
|
end
|
@@ -231,12 +231,12 @@ module Erubis
|
|
231
231
|
end
|
232
232
|
|
233
233
|
def add_preamble(src)
|
234
|
-
src << "
|
234
|
+
src << "#{@bufvar} = StringIO.new;"
|
235
235
|
end
|
236
236
|
|
237
237
|
def add_postamble(src)
|
238
238
|
src << "\n" unless src[-1] == ?\n
|
239
|
-
src << "
|
239
|
+
src << "#{@bufvar}.string\n"
|
240
240
|
end
|
241
241
|
|
242
242
|
end
|
@@ -254,12 +254,12 @@ module Erubis
|
|
254
254
|
end
|
255
255
|
|
256
256
|
def add_preamble(src)
|
257
|
-
src << "_erbout =
|
257
|
+
src << "_erbout = #{@bufvar} = '';"
|
258
258
|
end
|
259
259
|
|
260
260
|
def add_postamble(src)
|
261
261
|
src << "\n" unless src[-1] == ?\n
|
262
|
-
src << "
|
262
|
+
src << "#{@bufvar}.to_s\n"
|
263
263
|
end
|
264
264
|
|
265
265
|
end
|
@@ -434,23 +434,34 @@ module Erubis
|
|
434
434
|
|
435
435
|
|
436
436
|
##
|
437
|
-
## regards lines starting with '
|
437
|
+
## regards lines starting with '^[ \t]*%' as program code
|
438
438
|
##
|
439
|
-
##
|
439
|
+
## in addition you can specify prefix character (default '%')
|
440
440
|
##
|
441
441
|
## this is language-independent.
|
442
442
|
##
|
443
|
-
module
|
443
|
+
module PrefixedLineEnhancer
|
444
444
|
|
445
445
|
def self.desc # :nodoc:
|
446
|
-
"regard lines
|
446
|
+
"regard lines matched to '^[ \t]*%' as program code"
|
447
|
+
end
|
448
|
+
|
449
|
+
def init_generator(properties={})
|
450
|
+
super
|
451
|
+
@prefixchar = properties[:prefixchar]
|
447
452
|
end
|
448
453
|
|
449
454
|
def add_text(src, text)
|
455
|
+
unless @prefixrexp
|
456
|
+
@prefixchar ||= '%'
|
457
|
+
@prefixrexp = Regexp.compile("^([ \\t]*)\\#{@prefixchar}(.*?\\r?\\n)")
|
458
|
+
end
|
450
459
|
pos = 0
|
451
460
|
text2 = ''
|
452
|
-
text.scan(
|
453
|
-
|
461
|
+
text.scan(@prefixrexp) do
|
462
|
+
space = $1
|
463
|
+
line = $2
|
464
|
+
space, line = '', $1 unless $2
|
454
465
|
match = Regexp.last_match
|
455
466
|
len = match.begin(0) - pos
|
456
467
|
str = text[pos, len]
|
@@ -460,12 +471,12 @@ module Erubis
|
|
460
471
|
else
|
461
472
|
text2 << str
|
462
473
|
end
|
463
|
-
if line[0] ==
|
464
|
-
text2 << line
|
474
|
+
if line[0, 1] == @prefixchar
|
475
|
+
text2 << space << line
|
465
476
|
else
|
466
477
|
super(src, text2)
|
467
478
|
text2 = ''
|
468
|
-
add_stmt(src, line)
|
479
|
+
add_stmt(src, space + line)
|
469
480
|
end
|
470
481
|
end
|
471
482
|
#rest = pos == 0 ? text : $' # ruby1.8
|
@@ -480,6 +491,39 @@ module Erubis
|
|
480
491
|
end
|
481
492
|
|
482
493
|
|
494
|
+
##
|
495
|
+
## regards lines starting with '%' as program code
|
496
|
+
##
|
497
|
+
## this is for compatibility to eruby and ERB.
|
498
|
+
##
|
499
|
+
## this is language-independent.
|
500
|
+
##
|
501
|
+
module PercentLineEnhancer
|
502
|
+
include PrefixedLineEnhancer
|
503
|
+
|
504
|
+
def self.desc # :nodoc:
|
505
|
+
"regard lines starting with '%' as program code"
|
506
|
+
end
|
507
|
+
|
508
|
+
#--
|
509
|
+
#def init_generator(properties={})
|
510
|
+
# super
|
511
|
+
# @prefixchar = '%'
|
512
|
+
# @prefixrexp = /^\%(.*?\r?\n)/
|
513
|
+
#end
|
514
|
+
#++
|
515
|
+
|
516
|
+
def add_text(src, text)
|
517
|
+
unless @prefixrexp
|
518
|
+
@prefixchar = '%'
|
519
|
+
@prefixrexp = /^\%(.*?\r?\n)/
|
520
|
+
end
|
521
|
+
super(src, text)
|
522
|
+
end
|
523
|
+
|
524
|
+
end
|
525
|
+
|
526
|
+
|
483
527
|
##
|
484
528
|
## [experimental] allow header and footer in eRuby script
|
485
529
|
##
|
@@ -654,16 +698,15 @@ module Erubis
|
|
654
698
|
#src << " _buf << %Q`" << text << "`;"
|
655
699
|
if text[-1] == ?\n
|
656
700
|
text[-1] = "\\n"
|
657
|
-
src << "
|
701
|
+
src << " #{@bufvar} << %Q`#{text}`\n"
|
658
702
|
else
|
659
|
-
src << "
|
703
|
+
src << " #{@bufvar} << %Q`#{text}`;"
|
660
704
|
end
|
661
705
|
end
|
662
706
|
|
663
707
|
def _add_text_to_str(str, text)
|
664
708
|
return if !text || text.empty?
|
665
|
-
text.gsub
|
666
|
-
str << text
|
709
|
+
str << text.gsub(/[`\#\\]/, '\\\\\&')
|
667
710
|
end
|
668
711
|
|
669
712
|
def add_expr_escaped(str, code)
|
data/lib/erubis/error.rb
CHANGED
data/lib/erubis/evaluator.rb
CHANGED
data/lib/erubis/generator.rb
CHANGED
data/lib/erubis/helper.rb
CHANGED
data/lib/erubis/local-setting.rb
CHANGED
data/lib/erubis/main.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
###
|
2
|
-
### $Release: 2.
|
3
|
-
### copyright(c) 2006-
|
2
|
+
### $Release: 2.7.0 $
|
3
|
+
### copyright(c) 2006-2011 kuwata-lab.com all rights reserved.
|
4
4
|
###
|
5
5
|
|
6
6
|
require 'yaml'
|
@@ -11,6 +11,7 @@ require 'erubis/engine/optimized'
|
|
11
11
|
require 'erubis/engine/eruby'
|
12
12
|
require 'erubis/engine/ephp'
|
13
13
|
require 'erubis/engine/ec'
|
14
|
+
require 'erubis/engine/ecpp'
|
14
15
|
require 'erubis/engine/ejava'
|
15
16
|
require 'erubis/engine/escheme'
|
16
17
|
require 'erubis/engine/eperl'
|
@@ -231,7 +232,7 @@ module Erubis
|
|
231
232
|
buf << " -z : syntax checking"
|
232
233
|
buf << " -e : escape (equal to '--E Escape')"
|
233
234
|
buf << " -p pattern : embedded pattern (default '<% %>')"
|
234
|
-
buf << " -l lang : convert but no execute (ruby/php/c/java/scheme/perl/js)"
|
235
|
+
buf << " -l lang : convert but no execute (ruby/php/c/cpp/java/scheme/perl/js)"
|
235
236
|
buf << " -E e1,e2,... : enhancer names (Escape, PercentLine, BiPattern, ...)"
|
236
237
|
buf << " -I path : library include path"
|
237
238
|
buf << " -K kanji : kanji code (euc/sjis/utf8) (default none)"
|
@@ -269,7 +270,7 @@ module Erubis
|
|
269
270
|
list << ['(common)', common_props]
|
270
271
|
list << ['(basic)', basic_props - common_props]
|
271
272
|
list << ['(pi)', pi_props - common_props]
|
272
|
-
%w[ruby php c java scheme perl javascript].each do |lang|
|
273
|
+
%w[ruby php c cpp java scheme perl javascript].each do |lang|
|
273
274
|
klass = Erubis.const_get("E#{lang}")
|
274
275
|
list << [lang, collect_supported_properties(klass) - basic_props]
|
275
276
|
end
|
@@ -484,6 +485,32 @@ module Erubis
|
|
484
485
|
return "#{filename}:#{linenum}: #{message}"
|
485
486
|
end
|
486
487
|
|
488
|
+
if defined?(RUBY_ENGINE) && RUBY_ENGINE == "rbx"
|
489
|
+
def check_syntax(filename, src)
|
490
|
+
require 'compiler'
|
491
|
+
verbose = $VERBOSE
|
492
|
+
msg = nil
|
493
|
+
begin
|
494
|
+
$VERBOSE = true
|
495
|
+
Rubinius::Compiler.compile_string(src, filename)
|
496
|
+
rescue SyntaxError => ex
|
497
|
+
ex_linenum = ex.line
|
498
|
+
linenum = 0
|
499
|
+
srcline = src.each_line do |line|
|
500
|
+
linenum += 1
|
501
|
+
break line if linenum == ex_linenum
|
502
|
+
end
|
503
|
+
msg = "#{ex.message}\n"
|
504
|
+
msg << srcline
|
505
|
+
msg << "\n" unless srcline =~ /\n\z/
|
506
|
+
msg << (" " * (ex.column-1)) << "^\n"
|
507
|
+
ensure
|
508
|
+
$VERBOSE = verbose
|
509
|
+
end
|
510
|
+
return msg
|
511
|
+
end
|
512
|
+
end
|
513
|
+
|
487
514
|
end
|
488
515
|
|
489
516
|
end
|
data/lib/erubis/preprocessing.rb
CHANGED
data/lib/erubis/tiny.rb
CHANGED
data/lib/erubis/util.rb
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
##
|
2
|
+
## $Release: 2.7.0 $
|
3
|
+
## copyright(c) 2006-2011 kuwata-lab.com all rights reserved.
|
4
|
+
##
|
5
|
+
|
6
|
+
module Kernel
|
7
|
+
|
8
|
+
##
|
9
|
+
## raise NotImplementedError
|
10
|
+
##
|
11
|
+
def not_implemented #:doc:
|
12
|
+
backtrace = caller()
|
13
|
+
method_name = (backtrace.shift =~ /`(\w+)'$/) && $1
|
14
|
+
mesg = "class #{self.class.name} must implement abstract method '#{method_name}()'."
|
15
|
+
#mesg = "#{self.class.name}##{method_name}() is not implemented."
|
16
|
+
err = NotImplementedError.new mesg
|
17
|
+
err.set_backtrace backtrace
|
18
|
+
raise err
|
19
|
+
end
|
20
|
+
private :not_implemented
|
21
|
+
|
22
|
+
end
|
data/test/assert-text-equal.rb
CHANGED
@@ -0,0 +1,10 @@
|
|
1
|
+
require 'erubis'
|
2
|
+
input = File.read('example.eruby')
|
3
|
+
|
4
|
+
puts "----- default -----"
|
5
|
+
eruby = Erubis::FastEruby.new(input)
|
6
|
+
puts eruby.src
|
7
|
+
|
8
|
+
puts "----- with :bufvar option -----"
|
9
|
+
eruby = Erubis::FastEruby.new(input, :bufvar=>'@_out_buf')
|
10
|
+
print eruby.src
|
@@ -0,0 +1,17 @@
|
|
1
|
+
$ ruby bufvar-example.rb
|
2
|
+
----- default -----
|
3
|
+
_buf = ''; _buf << %Q`<div>\n`
|
4
|
+
for item in list
|
5
|
+
_buf << %Q` <p>#{ item }</p>
|
6
|
+
<p>#{Erubis::XmlHelper.escape_xml( item )}</p>\n`
|
7
|
+
end
|
8
|
+
_buf << %Q`</div>\n`
|
9
|
+
_buf.to_s
|
10
|
+
----- with :bufvar option -----
|
11
|
+
@_out_buf = ''; @_out_buf << %Q`<div>\n`
|
12
|
+
for item in list
|
13
|
+
@_out_buf << %Q` <p>#{ item }</p>
|
14
|
+
<p>#{Erubis::XmlHelper.escape_xml( item )}</p>\n`
|
15
|
+
end
|
16
|
+
@_out_buf << %Q`</div>\n`
|
17
|
+
@_out_buf.to_s
|