From 39d8c032821817f4a622ccd88d761f5969c0d3b5 Mon Sep 17 00:00:00 2001 From: makoto kuwata Date: Tue, 22 Feb 2011 22:17:51 +0900 Subject: [enhance] add 'PrefixedLineEnhancer' module and 'PrefixedLineEruby' class --- lib/erubis/engine/enhanced.rb | 5 ++++ lib/erubis/enhancer.rb | 54 +++++++++++++++++++++++++++++++++++++++++++ test/test-enhancers.rb | 49 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 108 insertions(+) diff --git a/lib/erubis/engine/enhanced.rb b/lib/erubis/engine/enhanced.rb index 14dac7f..d306db7 100644 --- a/lib/erubis/engine/enhanced.rb +++ b/lib/erubis/engine/enhanced.rb @@ -103,6 +103,11 @@ module Erubis end + class PrefixedLineEruby < Eruby + include PrefixedLineEnhancer + end + + class HeaderFooterEruby < Eruby include HeaderFooterEnhancer end diff --git a/lib/erubis/enhancer.rb b/lib/erubis/enhancer.rb index b6864eb..75f9219 100644 --- a/lib/erubis/enhancer.rb +++ b/lib/erubis/enhancer.rb @@ -480,6 +480,60 @@ module Erubis end + ## + ## regards lines starting with '^[ \t]*%' as program code + ## + ## in addition you can specify prefix character (default '%') + ## + ## this is language-independent. + ## + module PrefixedLineEnhancer + + def self.desc # :nodoc: + "regard lines matched to '^[ \t]*%' as program code" + end + + def init_generator(properties={}) + super + @prefixchar = properties[:prefixchar] || '%' + @prefixrexp = Regexp.compile("^([ \\t]*)\\#{@prefixchar}(.*?\\r?\\n)") + end + + def add_text(src, text) + pos = 0 + text2 = '' + text.scan(@prefixrexp) do + space = $1 + line = $2 + match = Regexp.last_match + len = match.begin(0) - pos + str = text[pos, len] + pos = match.end(0) + if text2.empty? + text2 = str + else + text2 << str + end + if line[0, 1] == @prefixchar + text2 << space << line + else + super(src, text2) + text2 = '' + add_stmt(src, space + line) + end + end + #rest = pos == 0 ? text : $' # ruby1.8 + rest = pos == 0 ? text : text[pos..-1] # ruby1.9 + unless text2.empty? + text2 << rest if rest + rest = text2 + end + super(src, rest) + end + + end + + ## ## [experimental] allow header and footer in eRuby script ## diff --git a/test/test-enhancers.rb b/test/test-enhancers.rb index cf6dc82..3b46721 100644 --- a/test/test-enhancers.rb +++ b/test/test-enhancers.rb @@ -497,6 +497,55 @@ __END__ % spaced percent +## +- name: prefixedline1 + class: PrefixedLineEruby + options: { :prefixchar: '!' } + input: | + + ! for item in list + + + + + ! end +
<%= item %><%== item %>
+
+        !! doubled characters
+      
+ src: | + _buf = ''; _buf << ' + '; for item in list + _buf << ' + + + + '; end + _buf << '
'; _buf << ( item ).to_s; _buf << ''; _buf << Erubis::XmlHelper.escape_xml( item ); _buf << '
+
+        ! doubled characters
+      
+ '; + _buf.to_s + output: | + + + + + + + + + + + + + +
<aaa>
b&bb&b
"ccc""ccc"
+
+        ! doubled characters
+      
+ ## - name: headerfooter1 class: HeaderFooterEruby -- cgit v1.2.1