view vendor/gems/coderay-1.0.0/lib/coderay/scanners/erb.rb @ 1082:997f6d7738f7 bug_531

In repo controller entry action, show the page for the file even if it's binary (so user still has access to history etc links). This makes it possible to use the entry action as the default when a file is clicked on
author Chris Cannam <chris.cannam@soundsoftware.ac.uk>
date Thu, 22 Nov 2012 18:04:17 +0000
parents cbb26bc654de
children
line wrap: on
line source
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