-
Notifications
You must be signed in to change notification settings - Fork 143
/
lexer.rb
148 lines (129 loc) Β· 3.36 KB
/
lexer.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
module Pygments
class Lexer < Struct.new(:name, :aliases, :filenames, :mimetypes)
@lexers = []
@index = {}
@name_index = {}
@alias_index = {}
@extname_index = {}
@mimetypes_index = {}
# Internal: Create a new Lexer object
#
# hash - A hash of attributes
#
# Returns a Lexer object
def self.create(hash)
lexer = new(hash[:name], hash[:aliases], hash[:filenames], hash[:mimetypes])
@lexers << lexer
@index[lexer.name.downcase] = @name_index[lexer.name] = lexer
lexer.aliases.each do |name|
@alias_index[name] = lexer
@index[name.downcase] ||= lexer
end
lexer.filenames.each do |filename|
extnames = []
extname = File.extname(filename)
if m = extname.match(/\[(.+)\]/)
m[1].scan(/./).each do |s|
extnames << extname.sub(m[0], s)
end
elsif extname != ""
extnames << extname
end
extnames.each do |extname|
@extname_index[extname] = lexer
@index[extname.downcase.sub(/^\./, "")] ||= lexer
end
end
lexer.mimetypes.each do |type|
@mimetypes_index[type] = lexer
end
lexer
end
# Public: Get all Lexers
#
# Returns an Array of Lexers
def self.all
@lexers
end
# Public: Look up Lexer by name or alias.
#
# name - A String name or alias
#
# Lexer.find('Ruby')
# => #<Lexer name="Ruby">
#
# Returns the Lexer or nil if none was found.
def self.find(name)
@index[name.downcase]
end
# Public: Alias for find.
def self.[](name)
find(name)
end
# Public: Look up Lexer by its proper name.
#
# name - The String name of the Lexer
#
# Examples
#
# Lexer.find_by_name('Ruby')
# # => #<Lexer name="Ruby">
#
# Returns the Lexer or nil if none was found.
def self.find_by_name(name)
@name_index[name]
end
# Public: Look up Lexer by one of its aliases.
#
# name - A String alias of the Lexer
#
# Examples
#
# Lexer.find_by_alias('rb')
# # => #<Lexer name="Ruby">
#
# Returns the Lexer or nil if none was found.
def self.find_by_alias(name)
@alias_index[name]
end
# Public: Look up Lexer by one of it's file extensions.
#
# extname - A String file extension.
#
# Examples
#
# Lexer.find_by_extname('.rb')
# # => #<Lexer name="Ruby">
#
# Returns the Lexer or nil if none was found.
def self.find_by_extname(extname)
@extname_index[extname]
end
# Public: Look up Lexer by one of it's mime types.
#
# type - A mime type String.
#
# Examples
#
# Lexer.find_by_mimetype('application/x-ruby')
# # => #<Lexer name="Ruby">
#
# Returns the Lexer or nil if none was found.
def self.find_by_mimetype(type)
@mimetypes_index[type]
end
# Public: Highlight syntax of text
#
# text - String of code to be highlighted
# options - Hash of options (defaults to {})
#
# Returns html String
def highlight(text, options = {})
options[:lexer] = aliases.first
Pygments.highlight(text, options)
end
alias_method :==, :equal?
alias_method :eql?, :equal?
end
lexers.values.each { |h| Lexer.create(h) }
end