comparison vendor/gems/coderay-1.0.0/lib/coderay/duo.rb @ 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
comparison
equal deleted inserted replaced
908:c6c2cbd0afee 909:cbb26bc654de
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, :html].highlight 'bla 42'
25 #
26 # with options:
27 # CodeRay::Duo[:ruby, :html, :hint => :debug].highlight '????::??'
28 #
29 # alternative syntax without options:
30 # CodeRay::Duo[:ruby => :statistic].encode 'class << self; end'
31 #
32 # alternative syntax with options:
33 # CodeRay::Duo[{ :ruby => :statistic }, :do => :something].encode 'abc'
34 #
35 # The options are forwarded to scanner and encoder
36 # (see CodeRay.get_scanner_options).
37 def initialize lang = nil, format = nil, options = {}
38 if format.nil? && lang.is_a?(Hash) && lang.size == 1
39 @lang = lang.keys.first
40 @format = lang[@lang]
41 else
42 @lang = lang
43 @format = format
44 end
45 @options = options
46 end
47
48 class << self
49 # To allow calls like Duo[:ruby, :html].highlight.
50 alias [] new
51 end
52
53 # The scanner of the duo. Only created once.
54 def scanner
55 @scanner ||= CodeRay.scanner @lang, CodeRay.get_scanner_options(@options)
56 end
57
58 # The encoder of the duo. Only created once.
59 def encoder
60 @encoder ||= CodeRay.encoder @format, @options
61 end
62
63 # Tokenize and highlight the code using +scanner+ and +encoder+.
64 def encode code, options = {}
65 options = @options.merge options
66 encoder.encode(code, @lang, options)
67 end
68 alias highlight encode
69
70 # Allows to use Duo like a proc object:
71 #
72 # CodeRay::Duo[:python => :yaml].call(code)
73 #
74 # or, in Ruby 1.9 and later:
75 #
76 # CodeRay::Duo[:python => :yaml].(code)
77 alias call encode
78
79 end
80
81 end