diff .svn/pristine/fe/fe0465ebb05e92c484a2edd16cfdf129d7d41205.svn-base @ 909:cbb26bc654de redmine-1.3

Update to Redmine 1.3-stable branch (Redmine SVN rev 8964)
author Chris Cannam
date Fri, 24 Feb 2012 19:09:32 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/.svn/pristine/fe/fe0465ebb05e92c484a2edd16cfdf129d7d41205.svn-base	Fri Feb 24 19:09:32 2012 +0000
@@ -0,0 +1,81 @@
+module CodeRay
+module Scanners
+  
+  load :html
+  load :ruby
+  
+  # Scanner for HTML ERB templates.
+  class ERB < Scanner
+    
+    register_for :erb
+    title 'HTML ERB Template'
+    
+    KINDS_NOT_LOC = HTML::KINDS_NOT_LOC
+    
+    ERB_RUBY_BLOCK = /
+      (<%(?!%)[-=\#]?)
+      ((?>
+        [^\-%]*    # normal*
+        (?>        # special
+          (?: %(?!>) | -(?!%>) )
+          [^\-%]*  # normal*
+        )*
+      ))
+      ((?: -?%> )?)
+    /x  # :nodoc:
+    
+    START_OF_ERB = /
+      <%(?!%)
+    /x  # :nodoc:
+    
+  protected
+    
+    def setup
+      @ruby_scanner = CodeRay.scanner :ruby, :tokens => @tokens, :keep_tokens => true
+      @html_scanner = CodeRay.scanner :html, :tokens => @tokens, :keep_tokens => true, :keep_state => true
+    end
+    
+    def reset_instance
+      super
+      @html_scanner.reset
+    end
+    
+    def scan_tokens encoder, options
+      
+      until eos?
+        
+        if (match = scan_until(/(?=#{START_OF_ERB})/o) || scan_rest) and not match.empty?
+          @html_scanner.tokenize match, :tokens => encoder
+          
+        elsif match = scan(/#{ERB_RUBY_BLOCK}/o)
+          start_tag = self[1]
+          code = self[2]
+          end_tag = self[3]
+          
+          encoder.begin_group :inline
+          encoder.text_token start_tag, :inline_delimiter
+          
+          if start_tag == '<%#'
+            encoder.text_token code, :comment
+          else
+            @ruby_scanner.tokenize code, :tokens => encoder
+          end unless code.empty?
+          
+          encoder.text_token end_tag, :inline_delimiter unless end_tag.empty?
+          encoder.end_group :inline
+          
+        else
+          raise_inspect 'else-case reached!', encoder
+          
+        end
+        
+      end
+      
+      encoder
+      
+    end
+    
+  end
+  
+end
+end