gitlab-rouge 1.9.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/Gemfile +23 -0
- data/LICENSE +186 -0
- data/bin/rougify +16 -0
- data/gitlab-rouge.gemspec +17 -0
- data/lib/rouge.rb +57 -0
- data/lib/rouge/cli.rb +363 -0
- data/lib/rouge/demos/apache +21 -0
- data/lib/rouge/demos/applescript +2 -0
- data/lib/rouge/demos/c +8 -0
- data/lib/rouge/demos/clojure +5 -0
- data/lib/rouge/demos/coffeescript +5 -0
- data/lib/rouge/demos/common_lisp +1 -0
- data/lib/rouge/demos/conf +4 -0
- data/lib/rouge/demos/cpp +8 -0
- data/lib/rouge/demos/csharp +5 -0
- data/lib/rouge/demos/css +4 -0
- data/lib/rouge/demos/dart +6 -0
- data/lib/rouge/demos/diff +7 -0
- data/lib/rouge/demos/elixir +1 -0
- data/lib/rouge/demos/erb +1 -0
- data/lib/rouge/demos/erlang +7 -0
- data/lib/rouge/demos/factor +5 -0
- data/lib/rouge/demos/gherkin +17 -0
- data/lib/rouge/demos/glsl +14 -0
- data/lib/rouge/demos/go +7 -0
- data/lib/rouge/demos/groovy +9 -0
- data/lib/rouge/demos/haml +5 -0
- data/lib/rouge/demos/handlebars +7 -0
- data/lib/rouge/demos/haskell +6 -0
- data/lib/rouge/demos/html +8 -0
- data/lib/rouge/demos/http +14 -0
- data/lib/rouge/demos/ini +4 -0
- data/lib/rouge/demos/io +11 -0
- data/lib/rouge/demos/java +5 -0
- data/lib/rouge/demos/javascript +1 -0
- data/lib/rouge/demos/json +1 -0
- data/lib/rouge/demos/json-doc +1 -0
- data/lib/rouge/demos/liquid +11 -0
- data/lib/rouge/demos/literate_coffeescript +3 -0
- data/lib/rouge/demos/literate_haskell +7 -0
- data/lib/rouge/demos/llvm +20 -0
- data/lib/rouge/demos/lua +12 -0
- data/lib/rouge/demos/make +6 -0
- data/lib/rouge/demos/markdown +4 -0
- data/lib/rouge/demos/matlab +6 -0
- data/lib/rouge/demos/moonscript +16 -0
- data/lib/rouge/demos/nginx +5 -0
- data/lib/rouge/demos/nim +27 -0
- data/lib/rouge/demos/objective_c +14 -0
- data/lib/rouge/demos/ocaml +12 -0
- data/lib/rouge/demos/perl +5 -0
- data/lib/rouge/demos/php +3 -0
- data/lib/rouge/demos/plaintext +1 -0
- data/lib/rouge/demos/powershell +49 -0
- data/lib/rouge/demos/prolog +9 -0
- data/lib/rouge/demos/properties +7 -0
- data/lib/rouge/demos/puppet +6 -0
- data/lib/rouge/demos/python +6 -0
- data/lib/rouge/demos/qml +9 -0
- data/lib/rouge/demos/r +8 -0
- data/lib/rouge/demos/racket +24 -0
- data/lib/rouge/demos/ruby +9 -0
- data/lib/rouge/demos/rust +12 -0
- data/lib/rouge/demos/sass +3 -0
- data/lib/rouge/demos/scala +3 -0
- data/lib/rouge/demos/scheme +4 -0
- data/lib/rouge/demos/scss +5 -0
- data/lib/rouge/demos/sed +4 -0
- data/lib/rouge/demos/shell +2 -0
- data/lib/rouge/demos/slim +17 -0
- data/lib/rouge/demos/smalltalk +6 -0
- data/lib/rouge/demos/sml +4 -0
- data/lib/rouge/demos/sql +1 -0
- data/lib/rouge/demos/swift +5 -0
- data/lib/rouge/demos/tcl +1 -0
- data/lib/rouge/demos/tex +1 -0
- data/lib/rouge/demos/toml +9 -0
- data/lib/rouge/demos/tulip +14 -0
- data/lib/rouge/demos/vb +4 -0
- data/lib/rouge/demos/viml +5 -0
- data/lib/rouge/demos/xml +2 -0
- data/lib/rouge/demos/yaml +4 -0
- data/lib/rouge/formatter.rb +50 -0
- data/lib/rouge/formatters/html.rb +117 -0
- data/lib/rouge/formatters/null.rb +19 -0
- data/lib/rouge/formatters/terminal256.rb +176 -0
- data/lib/rouge/lexer.rb +443 -0
- data/lib/rouge/lexers/apache.rb +68 -0
- data/lib/rouge/lexers/apache/keywords.yml +453 -0
- data/lib/rouge/lexers/apple_script.rb +367 -0
- data/lib/rouge/lexers/c.rb +212 -0
- data/lib/rouge/lexers/clojure.rb +112 -0
- data/lib/rouge/lexers/coffeescript.rb +174 -0
- data/lib/rouge/lexers/common_lisp.rb +345 -0
- data/lib/rouge/lexers/conf.rb +24 -0
- data/lib/rouge/lexers/cpp.rb +66 -0
- data/lib/rouge/lexers/csharp.rb +88 -0
- data/lib/rouge/lexers/css.rb +271 -0
- data/lib/rouge/lexers/dart.rb +104 -0
- data/lib/rouge/lexers/diff.rb +31 -0
- data/lib/rouge/lexers/elixir.rb +108 -0
- data/lib/rouge/lexers/erb.rb +56 -0
- data/lib/rouge/lexers/erlang.rb +118 -0
- data/lib/rouge/lexers/factor.rb +302 -0
- data/lib/rouge/lexers/gherkin.rb +137 -0
- data/lib/rouge/lexers/gherkin/keywords.rb +14 -0
- data/lib/rouge/lexers/glsl.rb +135 -0
- data/lib/rouge/lexers/go.rb +178 -0
- data/lib/rouge/lexers/groovy.rb +104 -0
- data/lib/rouge/lexers/haml.rb +228 -0
- data/lib/rouge/lexers/handlebars.rb +79 -0
- data/lib/rouge/lexers/haskell.rb +183 -0
- data/lib/rouge/lexers/html.rb +94 -0
- data/lib/rouge/lexers/http.rb +80 -0
- data/lib/rouge/lexers/ini.rb +57 -0
- data/lib/rouge/lexers/io.rb +68 -0
- data/lib/rouge/lexers/java.rb +76 -0
- data/lib/rouge/lexers/javascript.rb +297 -0
- data/lib/rouge/lexers/liquid.rb +287 -0
- data/lib/rouge/lexers/literate_coffeescript.rb +33 -0
- data/lib/rouge/lexers/literate_haskell.rb +36 -0
- data/lib/rouge/lexers/llvm.rb +84 -0
- data/lib/rouge/lexers/lua.rb +122 -0
- data/lib/rouge/lexers/lua/builtins.rb +22 -0
- data/lib/rouge/lexers/make.rb +116 -0
- data/lib/rouge/lexers/markdown.rb +154 -0
- data/lib/rouge/lexers/matlab.rb +74 -0
- data/lib/rouge/lexers/matlab/builtins.rb +11 -0
- data/lib/rouge/lexers/moonscript.rb +110 -0
- data/lib/rouge/lexers/nginx.rb +71 -0
- data/lib/rouge/lexers/nim.rb +152 -0
- data/lib/rouge/lexers/objective_c.rb +197 -0
- data/lib/rouge/lexers/ocaml.rb +111 -0
- data/lib/rouge/lexers/perl.rb +197 -0
- data/lib/rouge/lexers/php.rb +173 -0
- data/lib/rouge/lexers/php/builtins.rb +204 -0
- data/lib/rouge/lexers/plain_text.rb +25 -0
- data/lib/rouge/lexers/powershell.rb +96 -0
- data/lib/rouge/lexers/prolog.rb +64 -0
- data/lib/rouge/lexers/properties.rb +55 -0
- data/lib/rouge/lexers/puppet.rb +128 -0
- data/lib/rouge/lexers/python.rb +228 -0
- data/lib/rouge/lexers/qml.rb +72 -0
- data/lib/rouge/lexers/r.rb +56 -0
- data/lib/rouge/lexers/racket.rb +542 -0
- data/lib/rouge/lexers/ruby.rb +415 -0
- data/lib/rouge/lexers/rust.rb +191 -0
- data/lib/rouge/lexers/sass.rb +74 -0
- data/lib/rouge/lexers/sass/common.rb +180 -0
- data/lib/rouge/lexers/scala.rb +142 -0
- data/lib/rouge/lexers/scheme.rb +112 -0
- data/lib/rouge/lexers/scss.rb +34 -0
- data/lib/rouge/lexers/sed.rb +170 -0
- data/lib/rouge/lexers/shell.rb +152 -0
- data/lib/rouge/lexers/slim.rb +228 -0
- data/lib/rouge/lexers/smalltalk.rb +116 -0
- data/lib/rouge/lexers/sml.rb +347 -0
- data/lib/rouge/lexers/sql.rb +140 -0
- data/lib/rouge/lexers/swift.rb +144 -0
- data/lib/rouge/lexers/tcl.rb +192 -0
- data/lib/rouge/lexers/tex.rb +72 -0
- data/lib/rouge/lexers/toml.rb +71 -0
- data/lib/rouge/lexers/tulip.rb +75 -0
- data/lib/rouge/lexers/vb.rb +164 -0
- data/lib/rouge/lexers/viml.rb +101 -0
- data/lib/rouge/lexers/viml/keywords.rb +12 -0
- data/lib/rouge/lexers/xml.rb +59 -0
- data/lib/rouge/lexers/yaml.rb +364 -0
- data/lib/rouge/plugins/redcarpet.rb +30 -0
- data/lib/rouge/regex_lexer.rb +439 -0
- data/lib/rouge/template_lexer.rb +22 -0
- data/lib/rouge/text_analyzer.rb +48 -0
- data/lib/rouge/theme.rb +195 -0
- data/lib/rouge/themes/base16.rb +130 -0
- data/lib/rouge/themes/colorful.rb +67 -0
- data/lib/rouge/themes/github.rb +71 -0
- data/lib/rouge/themes/molokai.rb +82 -0
- data/lib/rouge/themes/monokai.rb +92 -0
- data/lib/rouge/themes/monokai_sublime.rb +90 -0
- data/lib/rouge/themes/thankful_eyes.rb +71 -0
- data/lib/rouge/token.rb +182 -0
- data/lib/rouge/util.rb +101 -0
- data/lib/rouge/version.rb +7 -0
- metadata +231 -0
@@ -0,0 +1,104 @@
|
|
1
|
+
# -*- coding: utf-8 -*- #
|
2
|
+
|
3
|
+
module Rouge
|
4
|
+
module Lexers
|
5
|
+
class Groovy < RegexLexer
|
6
|
+
title "Groovy"
|
7
|
+
desc 'The Groovy programming language (groovy.codehaus.org)'
|
8
|
+
tag 'groovy'
|
9
|
+
filenames '*.groovy'
|
10
|
+
mimetypes 'text/x-groovy'
|
11
|
+
|
12
|
+
ws = %r((?:\s|//.*?\n|/[*].*?[*]/)+)
|
13
|
+
|
14
|
+
def self.keywords
|
15
|
+
@keywords ||= Set.new %w(
|
16
|
+
assert break case catch continue default do else finally for
|
17
|
+
if goto instanceof new return switch this throw try while in as
|
18
|
+
)
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.declarations
|
22
|
+
@declarations ||= Set.new %w(
|
23
|
+
abstract const enum extends final implements native private
|
24
|
+
protected public static strictfp super synchronized throws
|
25
|
+
transient volatile
|
26
|
+
)
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.types
|
30
|
+
@types ||= Set.new %w(
|
31
|
+
def boolean byte char double float int long short void
|
32
|
+
)
|
33
|
+
end
|
34
|
+
|
35
|
+
def self.constants
|
36
|
+
@constants ||= Set.new %w(true false null)
|
37
|
+
end
|
38
|
+
|
39
|
+
state :root do
|
40
|
+
rule %r(^
|
41
|
+
(\s*(?:\w[\w\d.\[\]]*\s+)+?) # return arguments
|
42
|
+
(\w[\w\d]*) # method name
|
43
|
+
(\s*) (\() # signature start
|
44
|
+
)x do |m|
|
45
|
+
delegate self.clone, m[1]
|
46
|
+
token Name::Function, m[2]
|
47
|
+
token Text, m[3]
|
48
|
+
token Operator, m[4]
|
49
|
+
end
|
50
|
+
|
51
|
+
# whitespace
|
52
|
+
rule /[^\S\n]+/, Text
|
53
|
+
rule %r(//.*?$), Comment::Single
|
54
|
+
rule %r(/[*].*?[*]/)m, Comment::Multiline
|
55
|
+
rule /@\w[\w\d.]*/, Name::Decorator
|
56
|
+
rule /(class|interface)\b/, Keyword::Declaration, :class
|
57
|
+
rule /package\b/, Keyword::Namespace, :import
|
58
|
+
rule /import\b/, Keyword::Namespace, :import
|
59
|
+
|
60
|
+
rule /"(\\\\|\\"|[^"])*"/, Str::Double
|
61
|
+
rule /'(\\\\|\\'|[^'])*'/, Str::Single
|
62
|
+
rule %r(\$/((?!/\$).)*/\$), Str
|
63
|
+
rule %r(/(\\\\|\\"|[^/])*/), Str
|
64
|
+
rule /'\\.'|'[^\\]'|'\\u[0-9a-f]{4}'/, Str::Char
|
65
|
+
rule /(\.)([a-zA-Z_][a-zA-Z0-9_]*)/ do
|
66
|
+
groups Operator, Name::Attribute
|
67
|
+
end
|
68
|
+
|
69
|
+
rule /[a-zA-Z_][a-zA-Z0-9_]*:/, Name::Label
|
70
|
+
rule /[a-zA-Z_\$][a-zA-Z0-9_]*/ do |m|
|
71
|
+
if self.class.keywords.include? m[0]
|
72
|
+
token Keyword
|
73
|
+
elsif self.class.declarations.include? m[0]
|
74
|
+
token Keyword::Declaration
|
75
|
+
elsif self.class.types.include? m[0]
|
76
|
+
token Keyword::Type
|
77
|
+
elsif self.class.constants.include? m[0]
|
78
|
+
token Keyword::Constant
|
79
|
+
else
|
80
|
+
token Name
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
rule %r([~^*!%&\[\](){}<>\|+=:;,./?-]), Operator
|
85
|
+
|
86
|
+
# numbers
|
87
|
+
rule /\d+\.\d+([eE]\d+)?[fd]?/, Num::Float
|
88
|
+
rule /0x[0-9a-f]+/, Num::Hex
|
89
|
+
rule /[0-9]+L?/, Num::Integer
|
90
|
+
rule /\n/, Text
|
91
|
+
end
|
92
|
+
|
93
|
+
state :class do
|
94
|
+
rule /\s+/, Text
|
95
|
+
rule /\w[\w\d]*/, Name::Class, :pop!
|
96
|
+
end
|
97
|
+
|
98
|
+
state :import do
|
99
|
+
rule /\s+/, Text
|
100
|
+
rule /[\w\d.]+[*]?/, Name::Namespace, :pop!
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
@@ -0,0 +1,228 @@
|
|
1
|
+
# -*- coding: utf-8 -*- #
|
2
|
+
|
3
|
+
module Rouge
|
4
|
+
module Lexers
|
5
|
+
# A lexer for the Haml templating system for Ruby.
|
6
|
+
# @see http://haml.info
|
7
|
+
class Haml < RegexLexer
|
8
|
+
include Indentation
|
9
|
+
|
10
|
+
title "Haml"
|
11
|
+
desc "The Haml templating system for Ruby (haml.info)"
|
12
|
+
|
13
|
+
tag 'haml'
|
14
|
+
aliases 'HAML'
|
15
|
+
|
16
|
+
filenames '*.haml'
|
17
|
+
mimetypes 'text/x-haml'
|
18
|
+
|
19
|
+
def self.analyze_text(text)
|
20
|
+
return 0.1 if text.start_with? '!!!'
|
21
|
+
end
|
22
|
+
|
23
|
+
# @option opts :filters
|
24
|
+
# A hash of filter name to lexer of how various filters should be
|
25
|
+
# highlighted. By default, :javascript, :css, :ruby, and :erb
|
26
|
+
# are supported.
|
27
|
+
def initialize(opts={})
|
28
|
+
(opts.delete(:filters) || {}).each do |name, lexer|
|
29
|
+
unless lexer.respond_to? :lex
|
30
|
+
lexer = Lexer.find(lexer) or raise "unknown lexer: #{lexer}"
|
31
|
+
lexer = lexer.new(options)
|
32
|
+
end
|
33
|
+
|
34
|
+
self.filters[name.to_s] = lexer
|
35
|
+
end
|
36
|
+
|
37
|
+
super(opts)
|
38
|
+
end
|
39
|
+
|
40
|
+
def ruby
|
41
|
+
@ruby ||= Ruby.new(options)
|
42
|
+
end
|
43
|
+
|
44
|
+
def html
|
45
|
+
@html ||= HTML.new(options)
|
46
|
+
end
|
47
|
+
|
48
|
+
def filters
|
49
|
+
@filters ||= {
|
50
|
+
'javascript' => Javascript.new(options),
|
51
|
+
'css' => CSS.new(options),
|
52
|
+
'ruby' => ruby,
|
53
|
+
'erb' => ERB.new(options),
|
54
|
+
'markdown' => Markdown.new(options),
|
55
|
+
# TODO
|
56
|
+
# 'sass' => Sass.new(options),
|
57
|
+
# 'textile' => Textile.new(options),
|
58
|
+
# 'maruku' => Maruku.new(options),
|
59
|
+
}
|
60
|
+
end
|
61
|
+
|
62
|
+
start { ruby.reset!; html.reset! }
|
63
|
+
|
64
|
+
identifier = /[\w:-]+/
|
65
|
+
ruby_var = /[a-z]\w*/
|
66
|
+
|
67
|
+
# Haml can include " |\n" anywhere,
|
68
|
+
# which is ignored and used to wrap long lines.
|
69
|
+
# To accomodate this, use this custom faux dot instead.
|
70
|
+
dot = /[ ]\|\n(?=.*[ ]\|)|./
|
71
|
+
|
72
|
+
# In certain places, a comma at the end of the line
|
73
|
+
# allows line wrapping as well.
|
74
|
+
comma_dot = /,\s*\n|#{dot}/
|
75
|
+
|
76
|
+
state :root do
|
77
|
+
rule /\s*\n/, Text
|
78
|
+
rule(/\s*/) { |m| token Text; indentation(m[0]) }
|
79
|
+
end
|
80
|
+
|
81
|
+
state :content do
|
82
|
+
mixin :css
|
83
|
+
rule(/%#{identifier}/) { token Name::Tag; goto :tag }
|
84
|
+
rule /!!!#{dot}*\n/, Name::Namespace, :pop!
|
85
|
+
rule %r(
|
86
|
+
(/) (\[#{dot}*?\]) (#{dot}*\n)
|
87
|
+
)x do
|
88
|
+
groups Comment, Comment::Special, Comment
|
89
|
+
pop!
|
90
|
+
end
|
91
|
+
|
92
|
+
rule %r(/#{dot}*\n) do
|
93
|
+
token Comment
|
94
|
+
pop!
|
95
|
+
starts_block :html_comment_block
|
96
|
+
end
|
97
|
+
|
98
|
+
rule /-##{dot}*\n/ do
|
99
|
+
token Comment
|
100
|
+
pop!
|
101
|
+
starts_block :haml_comment_block
|
102
|
+
end
|
103
|
+
|
104
|
+
rule /-/ do
|
105
|
+
token Punctuation
|
106
|
+
reset_stack
|
107
|
+
push :ruby_line
|
108
|
+
end
|
109
|
+
|
110
|
+
# filters
|
111
|
+
rule /:(#{dot}*)\n/ do |m|
|
112
|
+
token Name::Decorator
|
113
|
+
pop!
|
114
|
+
starts_block :filter_block
|
115
|
+
|
116
|
+
filter_name = m[1].strip
|
117
|
+
|
118
|
+
@filter_lexer = self.filters[filter_name]
|
119
|
+
@filter_lexer.reset! unless @filter_lexer.nil?
|
120
|
+
|
121
|
+
puts " haml: filter #{filter_name.inspect} #{@filter_lexer.inspect}" if @debug
|
122
|
+
end
|
123
|
+
|
124
|
+
mixin :eval_or_plain
|
125
|
+
end
|
126
|
+
|
127
|
+
state :css do
|
128
|
+
rule(/\.#{identifier}/) { token Name::Class; goto :tag }
|
129
|
+
rule(/##{identifier}/) { token Name::Function; goto :tag }
|
130
|
+
end
|
131
|
+
|
132
|
+
state :tag do
|
133
|
+
mixin :css
|
134
|
+
rule(/\{#{comma_dot}*?\}/) { delegate ruby }
|
135
|
+
rule(/\[#{dot}*?\]/) { delegate ruby }
|
136
|
+
rule /\(/, Punctuation, :html_attributes
|
137
|
+
rule /\s*\n/, Text, :pop!
|
138
|
+
|
139
|
+
# whitespace chompers
|
140
|
+
rule /[<>]{1,2}(?=[ \t=])/, Punctuation
|
141
|
+
|
142
|
+
mixin :eval_or_plain
|
143
|
+
end
|
144
|
+
|
145
|
+
state :plain do
|
146
|
+
rule(/([^#\n]|#[^{\n]|(\\\\)*\\#\{)+/) { delegate html }
|
147
|
+
mixin :interpolation
|
148
|
+
rule(/\n/) { token Text; reset_stack }
|
149
|
+
end
|
150
|
+
|
151
|
+
state :eval_or_plain do
|
152
|
+
rule /[&!]?==/, Punctuation, :plain
|
153
|
+
rule /[&!]?[=!]/ do
|
154
|
+
token Punctuation
|
155
|
+
reset_stack
|
156
|
+
push :ruby_line
|
157
|
+
end
|
158
|
+
|
159
|
+
rule(//) { push :plain }
|
160
|
+
end
|
161
|
+
|
162
|
+
state :ruby_line do
|
163
|
+
rule /\n/, Text, :pop!
|
164
|
+
rule(/,[ \t]*\n/) { delegate ruby }
|
165
|
+
rule /[ ]\|[ \t]*\n/, Str::Escape
|
166
|
+
rule(/.*?(?=(,$| \|)?[ \t]*$)/) { delegate ruby }
|
167
|
+
end
|
168
|
+
|
169
|
+
state :html_attributes do
|
170
|
+
rule /\s+/, Text
|
171
|
+
rule /#{identifier}\s*=/, Name::Attribute, :html_attribute_value
|
172
|
+
rule identifier, Name::Attribute
|
173
|
+
rule /\)/, Text, :pop!
|
174
|
+
end
|
175
|
+
|
176
|
+
state :html_attribute_value do
|
177
|
+
rule /\s+/, Text
|
178
|
+
rule ruby_var, Name::Variable, :pop!
|
179
|
+
rule /@#{ruby_var}/, Name::Variable::Instance, :pop!
|
180
|
+
rule /\$#{ruby_var}/, Name::Variable::Global, :pop!
|
181
|
+
rule /'(\\\\|\\'|[^'\n])*'/, Str, :pop!
|
182
|
+
rule /"(\\\\|\\"|[^"\n])*"/, Str, :pop!
|
183
|
+
end
|
184
|
+
|
185
|
+
state :html_comment_block do
|
186
|
+
rule /#{dot}+/, Comment
|
187
|
+
mixin :indented_block
|
188
|
+
end
|
189
|
+
|
190
|
+
state :haml_comment_block do
|
191
|
+
rule /#{dot}+/, Comment::Preproc
|
192
|
+
mixin :indented_block
|
193
|
+
end
|
194
|
+
|
195
|
+
state :filter_block do
|
196
|
+
rule /([^#\n]|#[^{\n]|(\\\\)*\\#\{)+/ do
|
197
|
+
if @filter_lexer
|
198
|
+
delegate @filter_lexer
|
199
|
+
else
|
200
|
+
token Name::Decorator
|
201
|
+
end
|
202
|
+
end
|
203
|
+
|
204
|
+
mixin :interpolation
|
205
|
+
mixin :indented_block
|
206
|
+
end
|
207
|
+
|
208
|
+
state :interpolation do
|
209
|
+
rule /#[{]/, Str::Interpol, :ruby
|
210
|
+
end
|
211
|
+
|
212
|
+
state :ruby do
|
213
|
+
rule /[}]/, Str::Interpol, :pop!
|
214
|
+
mixin :ruby_inner
|
215
|
+
end
|
216
|
+
|
217
|
+
state :ruby_inner do
|
218
|
+
rule(/[{]/) { delegate ruby; push :ruby_inner }
|
219
|
+
rule(/[}]/) { delegate ruby; pop! }
|
220
|
+
rule(/[^{}]+/) { delegate ruby }
|
221
|
+
end
|
222
|
+
|
223
|
+
state :indented_block do
|
224
|
+
rule(/\n/) { token Text; reset_stack }
|
225
|
+
end
|
226
|
+
end
|
227
|
+
end
|
228
|
+
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
# -*- coding: utf-8 -*- #
|
2
|
+
|
3
|
+
module Rouge
|
4
|
+
module Lexers
|
5
|
+
class Handlebars < TemplateLexer
|
6
|
+
title "Handlebars"
|
7
|
+
desc 'the Handlebars and Mustache templating languages'
|
8
|
+
tag 'handlebars'
|
9
|
+
aliases 'hbs', 'mustache'
|
10
|
+
filenames '*.handlebars', '*.hbs', '*.mustache'
|
11
|
+
mimetypes 'text/x-handlebars', 'text/x-mustache'
|
12
|
+
|
13
|
+
id = %r([\w$-]+)
|
14
|
+
|
15
|
+
state :root do
|
16
|
+
# escaped slashes
|
17
|
+
rule(/\\{+/) { delegate parent }
|
18
|
+
|
19
|
+
# block comments
|
20
|
+
rule /{{!--/, Comment, :comment
|
21
|
+
rule /{{!.*?}}/, Comment
|
22
|
+
|
23
|
+
rule /{{{?/ do
|
24
|
+
token Keyword
|
25
|
+
push :stache
|
26
|
+
push :open_sym
|
27
|
+
end
|
28
|
+
|
29
|
+
rule(/(.+?)(?=\\|{{)/m) { delegate parent }
|
30
|
+
|
31
|
+
# if we get here, there's no more mustache tags, so we eat
|
32
|
+
# the rest of the doc
|
33
|
+
rule(/.+/m) { delegate parent }
|
34
|
+
end
|
35
|
+
|
36
|
+
state :comment do
|
37
|
+
rule(/{{/) { token Comment; push }
|
38
|
+
rule(/}}/) { token Comment; pop! }
|
39
|
+
rule(/[^{}]+/m) { token Comment }
|
40
|
+
rule(/[{}]/) { token Comment }
|
41
|
+
end
|
42
|
+
|
43
|
+
state :stache do
|
44
|
+
rule /}}}?/, Keyword, :pop!
|
45
|
+
rule /\s+/m, Text
|
46
|
+
rule /[=]/, Operator
|
47
|
+
rule /[\[\]]/, Punctuation
|
48
|
+
rule /[.](?=[}\s])/, Name::Variable
|
49
|
+
rule /[.][.]/, Name::Variable
|
50
|
+
rule %r([/.]), Punctuation
|
51
|
+
rule /"(\\.|.)*?"/, Str::Double
|
52
|
+
rule /'(\\.|.)*?'/, Str::Single
|
53
|
+
rule /\d+(?=}\s)/, Num
|
54
|
+
rule /(true|false)(?=[}\s])/, Keyword::Constant
|
55
|
+
rule /else(?=[}\s])/, Keyword
|
56
|
+
rule /this(?=[}\s])/, Name::Builtin::Pseudo
|
57
|
+
rule /@#{id}/, Name::Attribute
|
58
|
+
rule id, Name::Variable
|
59
|
+
end
|
60
|
+
|
61
|
+
state :open_sym do
|
62
|
+
rule %r([#/]) do
|
63
|
+
token Keyword
|
64
|
+
goto :block_name
|
65
|
+
end
|
66
|
+
|
67
|
+
rule /[>^&]/, Keyword
|
68
|
+
|
69
|
+
rule(//) { pop! }
|
70
|
+
end
|
71
|
+
|
72
|
+
state :block_name do
|
73
|
+
rule /if(?=[}\s])/, Keyword
|
74
|
+
rule id, Name::Namespace, :pop!
|
75
|
+
rule(//) { pop! }
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
@@ -0,0 +1,183 @@
|
|
1
|
+
# -*- coding: utf-8 -*- #
|
2
|
+
|
3
|
+
module Rouge
|
4
|
+
module Lexers
|
5
|
+
class Haskell < RegexLexer
|
6
|
+
title "Haskell"
|
7
|
+
desc "The Haskell programming language (haskell.org)"
|
8
|
+
|
9
|
+
tag 'haskell'
|
10
|
+
aliases 'hs'
|
11
|
+
filenames '*.hs'
|
12
|
+
mimetypes 'text/x-haskell'
|
13
|
+
|
14
|
+
def self.analyze_text(text)
|
15
|
+
return 1 if text.shebang?('runhaskell')
|
16
|
+
end
|
17
|
+
|
18
|
+
reserved = %w(
|
19
|
+
_ case class data default deriving do else if in
|
20
|
+
infix[lr]? instance let newtype of then type where
|
21
|
+
)
|
22
|
+
|
23
|
+
ascii = %w(
|
24
|
+
NUL SOH [SE]TX EOT ENQ ACK BEL BS HT LF VT FF CR S[OI] DLE
|
25
|
+
DC[1-4] NAK SYN ETB CAN EM SUB ESC [FGRU]S SP DEL
|
26
|
+
)
|
27
|
+
|
28
|
+
state :basic do
|
29
|
+
rule /\s+/m, Text
|
30
|
+
rule /{-#/, Comment::Preproc, :comment_preproc
|
31
|
+
rule /{-/, Comment::Multiline, :comment
|
32
|
+
rule /^--\s+\|.*?$/, Comment::Doc
|
33
|
+
# this is complicated in order to support custom symbols
|
34
|
+
# like -->
|
35
|
+
rule /--(?![!#\$\%&*+.\/<=>?@\^\|_~]).*?$/, Comment::Single
|
36
|
+
end
|
37
|
+
|
38
|
+
# nested commenting
|
39
|
+
state :comment do
|
40
|
+
rule /-}/, Comment::Multiline, :pop!
|
41
|
+
rule /{-/, Comment::Multiline, :comment
|
42
|
+
rule /[^-{}]+/, Comment::Multiline
|
43
|
+
rule /[-{}]/, Comment::Multiline
|
44
|
+
end
|
45
|
+
|
46
|
+
state :comment_preproc do
|
47
|
+
rule /-}/, Comment::Preproc, :pop!
|
48
|
+
rule /{-/, Comment::Preproc, :comment
|
49
|
+
rule /[^-{}]+/, Comment::Preproc
|
50
|
+
rule /[-{}]/, Comment::Preproc
|
51
|
+
end
|
52
|
+
|
53
|
+
state :root do
|
54
|
+
mixin :basic
|
55
|
+
|
56
|
+
rule /\bimport\b/, Keyword::Reserved, :import
|
57
|
+
rule /\bmodule\b/, Keyword::Reserved, :module
|
58
|
+
rule /\berror\b/, Name::Exception
|
59
|
+
rule /\b(?:#{reserved.join('|')})\b/, Keyword::Reserved
|
60
|
+
# not sure why, but ^ doesn't work here
|
61
|
+
# rule /^[_a-z][\w']*/, Name::Function
|
62
|
+
rule /[_a-z][\w']*/, Name
|
63
|
+
rule /[A-Z][\w']*/, Keyword::Type
|
64
|
+
|
65
|
+
# lambda operator
|
66
|
+
rule %r(\\(?![:!#\$\%&*+.\\/<=>?@^\|~-]+)), Name::Function
|
67
|
+
# special operators
|
68
|
+
rule %r((<-|::|->|=>|=)(?![:!#\$\%&*+.\\/<=>?@^\|~-]+)), Operator
|
69
|
+
# constructor/type operators
|
70
|
+
rule %r(:[:!#\$\%&*+.\\/<=>?@^\|~-]*), Operator
|
71
|
+
# other operators
|
72
|
+
rule %r([:!#\$\%&*+.\\/<=>?@^\|~-]+), Operator
|
73
|
+
|
74
|
+
rule /\d+e[+-]?\d+/i, Num::Float
|
75
|
+
rule /\d+\.\d+(e[+-]?\d+)?/i, Num::Float
|
76
|
+
rule /0o[0-7]+/i, Num::Oct
|
77
|
+
rule /0x[\da-f]+/i, Num::Hex
|
78
|
+
rule /\d+/, Num::Integer
|
79
|
+
|
80
|
+
rule /'/, Str::Char, :character
|
81
|
+
rule /"/, Str, :string
|
82
|
+
|
83
|
+
rule /\[\s*\]/, Keyword::Type
|
84
|
+
rule /\(\s*\)/, Name::Builtin
|
85
|
+
rule /[\[\](),;`{}]/, Punctuation
|
86
|
+
end
|
87
|
+
|
88
|
+
state :import do
|
89
|
+
rule /\s+/, Text
|
90
|
+
rule /"/, Str, :string
|
91
|
+
rule /\bqualified\b/, Keyword
|
92
|
+
# import X as Y
|
93
|
+
rule /([A-Z][\w.]*)(\s+)(as)(\s+)([A-Z][a-zA-Z0-9_.]*)/ do
|
94
|
+
groups(
|
95
|
+
Name::Namespace, # X
|
96
|
+
Text, Keyword, # as
|
97
|
+
Text, Name # Y
|
98
|
+
)
|
99
|
+
pop!
|
100
|
+
end
|
101
|
+
|
102
|
+
# import X hiding (functions)
|
103
|
+
rule /([A-Z][\w.]*)(\s+)(hiding)(\s+)(\()/ do
|
104
|
+
groups(
|
105
|
+
Name::Namespace, # X
|
106
|
+
Text, Keyword, # hiding
|
107
|
+
Text, Punctuation # (
|
108
|
+
)
|
109
|
+
goto :funclist
|
110
|
+
end
|
111
|
+
|
112
|
+
# import X (functions)
|
113
|
+
rule /([A-Z][\w.]*)(\s+)(\()/ do
|
114
|
+
groups(
|
115
|
+
Name::Namespace, # X
|
116
|
+
Text,
|
117
|
+
Punctuation # (
|
118
|
+
)
|
119
|
+
goto :funclist
|
120
|
+
end
|
121
|
+
|
122
|
+
rule /[\w.]+/, Name::Namespace, :pop!
|
123
|
+
end
|
124
|
+
|
125
|
+
state :module do
|
126
|
+
rule /\s+/, Text
|
127
|
+
# module Foo (functions)
|
128
|
+
rule /([A-Z][\w.]*)(\s+)(\()/ do
|
129
|
+
groups Name::Namespace, Text, Punctuation
|
130
|
+
push :funclist
|
131
|
+
end
|
132
|
+
|
133
|
+
rule /\bwhere\b/, Keyword::Reserved, :pop!
|
134
|
+
|
135
|
+
rule /[A-Z][a-zA-Z0-9_.]*/, Name::Namespace, :pop!
|
136
|
+
end
|
137
|
+
|
138
|
+
state :funclist do
|
139
|
+
mixin :basic
|
140
|
+
rule /[A-Z]\w*/, Keyword::Type
|
141
|
+
rule /(_[\w\']+|[a-z][\w\']*)/, Name::Function
|
142
|
+
rule /,/, Punctuation
|
143
|
+
rule /[:!#\$\%&*+.\\\/<=>?@^\|~-]+/, Operator
|
144
|
+
rule /\(/, Punctuation, :funclist
|
145
|
+
rule /\)/, Punctuation, :pop!
|
146
|
+
end
|
147
|
+
|
148
|
+
state :character do
|
149
|
+
rule /\\/ do
|
150
|
+
token Str::Escape
|
151
|
+
push :character_end
|
152
|
+
push :escape
|
153
|
+
end
|
154
|
+
|
155
|
+
rule /./ do
|
156
|
+
token Str::Char
|
157
|
+
goto :character_end
|
158
|
+
end
|
159
|
+
end
|
160
|
+
|
161
|
+
state :character_end do
|
162
|
+
rule /'/, Str::Char, :pop!
|
163
|
+
rule /./, Error, :pop!
|
164
|
+
end
|
165
|
+
|
166
|
+
state :string do
|
167
|
+
rule /"/, Str, :pop!
|
168
|
+
rule /\\/, Str::Escape, :escape
|
169
|
+
rule /[^\\"]+/, Str
|
170
|
+
end
|
171
|
+
|
172
|
+
state :escape do
|
173
|
+
rule /[abfnrtv"'&\\]/, Str::Escape, :pop!
|
174
|
+
rule /\^[\]\[A-Z@\^_]/, Str::Escape, :pop!
|
175
|
+
rule /#{ascii.join('|')}/, Str::Escape, :pop!
|
176
|
+
rule /o[0-7]+/i, Str::Escape, :pop!
|
177
|
+
rule /x[\da-f]/i, Str::Escape, :pop!
|
178
|
+
rule /\d+/, Str::Escape, :pop!
|
179
|
+
rule /\s+\\/, Str::Escape, :pop!
|
180
|
+
end
|
181
|
+
end
|
182
|
+
end
|
183
|
+
end
|