view vendor/gems/coderay-1.0.0/lib/coderay/tokens_proxy.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
  
  # The result of a scan operation is a TokensProxy, but should act like Tokens.
  # 
  # This proxy makes it possible to use the classic CodeRay.scan.encode API
  # while still providing the benefits of direct streaming.
  class TokensProxy
    
    attr_accessor :input, :lang, :options, :block
    
    # Create a new TokensProxy with the arguments of CodeRay.scan.
    def initialize input, lang, options = {}, block = nil
      @input   = input
      @lang    = lang
      @options = options
      @block   = block
    end
    
    # Call CodeRay.encode if +encoder+ is a Symbol;
    # otherwise, convert the receiver to tokens and call encoder.encode_tokens.
    def encode encoder, options = {}
      if encoder.respond_to? :to_sym
        CodeRay.encode(input, lang, encoder, options)
      else
        encoder.encode_tokens tokens, options
      end
    end
    
    # Tries to call encode;
    # delegates to tokens otherwise.
    def method_missing method, *args, &blk
      encode method.to_sym, *args
    rescue PluginHost::PluginNotFound
      tokens.send(method, *args, &blk)
    end
    
    # The (cached) result of the tokenized input; a Tokens instance.
    def tokens
      @tokens ||= scanner.tokenize(input)
    end
    
    # A (cached) scanner instance to use for the scan task.
    def scanner
      @scanner ||= CodeRay.scanner(lang, options, &block)
    end
    
    # Overwrite Struct#each.
    def each *args, &blk
      tokens.each(*args, &blk)
      self
    end
    
  end
  
end