diff options
-rw-r--r-- | lib/erubis/engine/enhanced.rb | 5 | ||||
-rw-r--r-- | lib/erubis/enhancer.rb | 54 | ||||
-rw-r--r-- | test/test-enhancers.rb | 49 |
3 files changed, 108 insertions, 0 deletions
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 @@ -481,6 +481,60 @@ module Erubis ## + ## 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 ## ## ex. 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 @@ -498,6 +498,55 @@ __END__ </pre> ## +- name: prefixedline1 + class: PrefixedLineEruby + options: { :prefixchar: '!' } + input: | + <table> + ! for item in list + <tr> + <td><%= item %></td> + <td><%== item %></td> + </tr> + ! end + </table> + <pre> + !! doubled characters + </pre> + src: | + _buf = ''; _buf << '<table> + '; for item in list + _buf << ' <tr> + <td>'; _buf << ( item ).to_s; _buf << '</td> + <td>'; _buf << Erubis::XmlHelper.escape_xml( item ); _buf << '</td> + </tr> + '; end + _buf << '</table> + <pre> + ! doubled characters + </pre> + '; + _buf.to_s + output: | + <table> + <tr> + <td><aaa></td> + <td><aaa></td> + </tr> + <tr> + <td>b&b</td> + <td>b&b</td> + </tr> + <tr> + <td>"ccc"</td> + <td>"ccc"</td> + </tr> + </table> + <pre> + ! doubled characters + </pre> + +## - name: headerfooter1 class: HeaderFooterEruby options: |