summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormakoto kuwata <kwa@kuwata-lab.com>2011-02-22 22:17:51 +0900
committermakoto kuwata <kwa@kuwata-lab.com>2011-02-22 22:17:51 +0900
commit39d8c032821817f4a622ccd88d761f5969c0d3b5 (patch)
treebc248d45aae3ce45e21496f086a35f410e35320e
parentd735e2255ce102719cff1530fb6c138a76c62e4e (diff)
downloaderubis-39d8c032821817f4a622ccd88d761f5969c0d3b5.tar.gz
[enhance] add 'PrefixedLineEnhancer' module and 'PrefixedLineEruby' class
-rw-r--r--lib/erubis/engine/enhanced.rb5
-rw-r--r--lib/erubis/enhancer.rb54
-rw-r--r--test/test-enhancers.rb49
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>&lt;aaa&gt;</td>
+ </tr>
+ <tr>
+ <td>b&b</td>
+ <td>b&amp;b</td>
+ </tr>
+ <tr>
+ <td>"ccc"</td>
+ <td>&quot;ccc&quot;</td>
+ </tr>
+ </table>
+ <pre>
+ ! doubled characters
+ </pre>
+
+##
- name: headerfooter1
class: HeaderFooterEruby
options: