To check out this repository please hg clone the following URL, or open the URL using EasyMercurial or your preferred Mercurial client.

Statistics Download as Zip
| Branch: | Tag: | Revision:

root / vendor / gems / coderay-0.9.7 / lib / coderay / duo.rb @ 442:753f1380d6bc

History | View | Annotate | Download (2.49 KB)

1
module CodeRay
2
  
3
  # = Duo
4
  #
5
  # A Duo is a convenient way to use CodeRay. You just create a Duo,
6
  # giving it a lang (language of the input code) and a format (desired
7
  # output format), and call Duo#highlight with the code.
8
  # 
9
  # Duo makes it easy to re-use both scanner and encoder for a repetitive
10
  # task. It also provides a very easy interface syntax:
11
  # 
12
  #   require 'coderay'
13
  #   CodeRay::Duo[:python, :div].highlight 'import this'
14
  # 
15
  # Until you want to do uncommon things with CodeRay, I recommend to use
16
  # this method, since it takes care of everything.
17
  class Duo
18

    
19
    attr_accessor :lang, :format, :options
20
    
21
    # Create a new Duo, holding a lang and a format to highlight code.
22
    # 
23
    # simple:
24
    #   CodeRay::Duo[:ruby, :page].highlight 'bla 42'
25
    # 
26
    # streaming:
27
    #   CodeRay::Duo[:ruby, :page].highlight 'bar 23', :stream => true
28
    # 
29
    # with options:
30
    #   CodeRay::Duo[:ruby, :html, :hint => :debug].highlight '????::??'
31
    # 
32
    # alternative syntax without options:
33
    #   CodeRay::Duo[:ruby => :statistic].encode 'class << self; end'
34
    # 
35
    # alternative syntax with options:
36
    #   CodeRay::Duo[{ :ruby => :statistic }, :do => :something].encode 'abc'
37
    # 
38
    # The options are forwarded to scanner and encoder
39
    # (see CodeRay.get_scanner_options).
40
    def initialize lang = nil, format = nil, options = {}
41
      if format == nil and lang.is_a? Hash and lang.size == 1
42
        @lang = lang.keys.first
43
        @format = lang[@lang]
44
      else
45
        @lang = lang
46
        @format = format
47
      end
48
      @options = options
49
    end
50

    
51
    class << self
52
      # To allow calls like Duo[:ruby, :html].highlight.
53
      alias [] new
54
    end
55

    
56
    # The scanner of the duo. Only created once.
57
    def scanner
58
      @scanner ||= CodeRay.scanner @lang, CodeRay.get_scanner_options(@options)
59
    end
60
    
61
    # The encoder of the duo. Only created once.
62
    def encoder
63
      @encoder ||= CodeRay.encoder @format, @options
64
    end
65
    
66
    # Tokenize and highlight the code using +scanner+ and +encoder+.
67
    #
68
    # If the :stream option is set, the Duo will go into streaming mode,
69
    # saving memory for the cost of time.
70
    def encode code, options = { :stream => false }
71
      stream = options.delete :stream
72
      options = @options.merge options
73
      if stream
74
        encoder.encode_stream(code, @lang, options)
75
      else
76
        scanner.code = code
77
        encoder.encode_tokens(scanner.tokenize, options)
78
      end
79
    end
80
    alias highlight encode
81

    
82
  end
83

    
84
end
85