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.
Files changed (185) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +23 -0
  3. data/LICENSE +186 -0
  4. data/bin/rougify +16 -0
  5. data/gitlab-rouge.gemspec +17 -0
  6. data/lib/rouge.rb +57 -0
  7. data/lib/rouge/cli.rb +363 -0
  8. data/lib/rouge/demos/apache +21 -0
  9. data/lib/rouge/demos/applescript +2 -0
  10. data/lib/rouge/demos/c +8 -0
  11. data/lib/rouge/demos/clojure +5 -0
  12. data/lib/rouge/demos/coffeescript +5 -0
  13. data/lib/rouge/demos/common_lisp +1 -0
  14. data/lib/rouge/demos/conf +4 -0
  15. data/lib/rouge/demos/cpp +8 -0
  16. data/lib/rouge/demos/csharp +5 -0
  17. data/lib/rouge/demos/css +4 -0
  18. data/lib/rouge/demos/dart +6 -0
  19. data/lib/rouge/demos/diff +7 -0
  20. data/lib/rouge/demos/elixir +1 -0
  21. data/lib/rouge/demos/erb +1 -0
  22. data/lib/rouge/demos/erlang +7 -0
  23. data/lib/rouge/demos/factor +5 -0
  24. data/lib/rouge/demos/gherkin +17 -0
  25. data/lib/rouge/demos/glsl +14 -0
  26. data/lib/rouge/demos/go +7 -0
  27. data/lib/rouge/demos/groovy +9 -0
  28. data/lib/rouge/demos/haml +5 -0
  29. data/lib/rouge/demos/handlebars +7 -0
  30. data/lib/rouge/demos/haskell +6 -0
  31. data/lib/rouge/demos/html +8 -0
  32. data/lib/rouge/demos/http +14 -0
  33. data/lib/rouge/demos/ini +4 -0
  34. data/lib/rouge/demos/io +11 -0
  35. data/lib/rouge/demos/java +5 -0
  36. data/lib/rouge/demos/javascript +1 -0
  37. data/lib/rouge/demos/json +1 -0
  38. data/lib/rouge/demos/json-doc +1 -0
  39. data/lib/rouge/demos/liquid +11 -0
  40. data/lib/rouge/demos/literate_coffeescript +3 -0
  41. data/lib/rouge/demos/literate_haskell +7 -0
  42. data/lib/rouge/demos/llvm +20 -0
  43. data/lib/rouge/demos/lua +12 -0
  44. data/lib/rouge/demos/make +6 -0
  45. data/lib/rouge/demos/markdown +4 -0
  46. data/lib/rouge/demos/matlab +6 -0
  47. data/lib/rouge/demos/moonscript +16 -0
  48. data/lib/rouge/demos/nginx +5 -0
  49. data/lib/rouge/demos/nim +27 -0
  50. data/lib/rouge/demos/objective_c +14 -0
  51. data/lib/rouge/demos/ocaml +12 -0
  52. data/lib/rouge/demos/perl +5 -0
  53. data/lib/rouge/demos/php +3 -0
  54. data/lib/rouge/demos/plaintext +1 -0
  55. data/lib/rouge/demos/powershell +49 -0
  56. data/lib/rouge/demos/prolog +9 -0
  57. data/lib/rouge/demos/properties +7 -0
  58. data/lib/rouge/demos/puppet +6 -0
  59. data/lib/rouge/demos/python +6 -0
  60. data/lib/rouge/demos/qml +9 -0
  61. data/lib/rouge/demos/r +8 -0
  62. data/lib/rouge/demos/racket +24 -0
  63. data/lib/rouge/demos/ruby +9 -0
  64. data/lib/rouge/demos/rust +12 -0
  65. data/lib/rouge/demos/sass +3 -0
  66. data/lib/rouge/demos/scala +3 -0
  67. data/lib/rouge/demos/scheme +4 -0
  68. data/lib/rouge/demos/scss +5 -0
  69. data/lib/rouge/demos/sed +4 -0
  70. data/lib/rouge/demos/shell +2 -0
  71. data/lib/rouge/demos/slim +17 -0
  72. data/lib/rouge/demos/smalltalk +6 -0
  73. data/lib/rouge/demos/sml +4 -0
  74. data/lib/rouge/demos/sql +1 -0
  75. data/lib/rouge/demos/swift +5 -0
  76. data/lib/rouge/demos/tcl +1 -0
  77. data/lib/rouge/demos/tex +1 -0
  78. data/lib/rouge/demos/toml +9 -0
  79. data/lib/rouge/demos/tulip +14 -0
  80. data/lib/rouge/demos/vb +4 -0
  81. data/lib/rouge/demos/viml +5 -0
  82. data/lib/rouge/demos/xml +2 -0
  83. data/lib/rouge/demos/yaml +4 -0
  84. data/lib/rouge/formatter.rb +50 -0
  85. data/lib/rouge/formatters/html.rb +117 -0
  86. data/lib/rouge/formatters/null.rb +19 -0
  87. data/lib/rouge/formatters/terminal256.rb +176 -0
  88. data/lib/rouge/lexer.rb +443 -0
  89. data/lib/rouge/lexers/apache.rb +68 -0
  90. data/lib/rouge/lexers/apache/keywords.yml +453 -0
  91. data/lib/rouge/lexers/apple_script.rb +367 -0
  92. data/lib/rouge/lexers/c.rb +212 -0
  93. data/lib/rouge/lexers/clojure.rb +112 -0
  94. data/lib/rouge/lexers/coffeescript.rb +174 -0
  95. data/lib/rouge/lexers/common_lisp.rb +345 -0
  96. data/lib/rouge/lexers/conf.rb +24 -0
  97. data/lib/rouge/lexers/cpp.rb +66 -0
  98. data/lib/rouge/lexers/csharp.rb +88 -0
  99. data/lib/rouge/lexers/css.rb +271 -0
  100. data/lib/rouge/lexers/dart.rb +104 -0
  101. data/lib/rouge/lexers/diff.rb +31 -0
  102. data/lib/rouge/lexers/elixir.rb +108 -0
  103. data/lib/rouge/lexers/erb.rb +56 -0
  104. data/lib/rouge/lexers/erlang.rb +118 -0
  105. data/lib/rouge/lexers/factor.rb +302 -0
  106. data/lib/rouge/lexers/gherkin.rb +137 -0
  107. data/lib/rouge/lexers/gherkin/keywords.rb +14 -0
  108. data/lib/rouge/lexers/glsl.rb +135 -0
  109. data/lib/rouge/lexers/go.rb +178 -0
  110. data/lib/rouge/lexers/groovy.rb +104 -0
  111. data/lib/rouge/lexers/haml.rb +228 -0
  112. data/lib/rouge/lexers/handlebars.rb +79 -0
  113. data/lib/rouge/lexers/haskell.rb +183 -0
  114. data/lib/rouge/lexers/html.rb +94 -0
  115. data/lib/rouge/lexers/http.rb +80 -0
  116. data/lib/rouge/lexers/ini.rb +57 -0
  117. data/lib/rouge/lexers/io.rb +68 -0
  118. data/lib/rouge/lexers/java.rb +76 -0
  119. data/lib/rouge/lexers/javascript.rb +297 -0
  120. data/lib/rouge/lexers/liquid.rb +287 -0
  121. data/lib/rouge/lexers/literate_coffeescript.rb +33 -0
  122. data/lib/rouge/lexers/literate_haskell.rb +36 -0
  123. data/lib/rouge/lexers/llvm.rb +84 -0
  124. data/lib/rouge/lexers/lua.rb +122 -0
  125. data/lib/rouge/lexers/lua/builtins.rb +22 -0
  126. data/lib/rouge/lexers/make.rb +116 -0
  127. data/lib/rouge/lexers/markdown.rb +154 -0
  128. data/lib/rouge/lexers/matlab.rb +74 -0
  129. data/lib/rouge/lexers/matlab/builtins.rb +11 -0
  130. data/lib/rouge/lexers/moonscript.rb +110 -0
  131. data/lib/rouge/lexers/nginx.rb +71 -0
  132. data/lib/rouge/lexers/nim.rb +152 -0
  133. data/lib/rouge/lexers/objective_c.rb +197 -0
  134. data/lib/rouge/lexers/ocaml.rb +111 -0
  135. data/lib/rouge/lexers/perl.rb +197 -0
  136. data/lib/rouge/lexers/php.rb +173 -0
  137. data/lib/rouge/lexers/php/builtins.rb +204 -0
  138. data/lib/rouge/lexers/plain_text.rb +25 -0
  139. data/lib/rouge/lexers/powershell.rb +96 -0
  140. data/lib/rouge/lexers/prolog.rb +64 -0
  141. data/lib/rouge/lexers/properties.rb +55 -0
  142. data/lib/rouge/lexers/puppet.rb +128 -0
  143. data/lib/rouge/lexers/python.rb +228 -0
  144. data/lib/rouge/lexers/qml.rb +72 -0
  145. data/lib/rouge/lexers/r.rb +56 -0
  146. data/lib/rouge/lexers/racket.rb +542 -0
  147. data/lib/rouge/lexers/ruby.rb +415 -0
  148. data/lib/rouge/lexers/rust.rb +191 -0
  149. data/lib/rouge/lexers/sass.rb +74 -0
  150. data/lib/rouge/lexers/sass/common.rb +180 -0
  151. data/lib/rouge/lexers/scala.rb +142 -0
  152. data/lib/rouge/lexers/scheme.rb +112 -0
  153. data/lib/rouge/lexers/scss.rb +34 -0
  154. data/lib/rouge/lexers/sed.rb +170 -0
  155. data/lib/rouge/lexers/shell.rb +152 -0
  156. data/lib/rouge/lexers/slim.rb +228 -0
  157. data/lib/rouge/lexers/smalltalk.rb +116 -0
  158. data/lib/rouge/lexers/sml.rb +347 -0
  159. data/lib/rouge/lexers/sql.rb +140 -0
  160. data/lib/rouge/lexers/swift.rb +144 -0
  161. data/lib/rouge/lexers/tcl.rb +192 -0
  162. data/lib/rouge/lexers/tex.rb +72 -0
  163. data/lib/rouge/lexers/toml.rb +71 -0
  164. data/lib/rouge/lexers/tulip.rb +75 -0
  165. data/lib/rouge/lexers/vb.rb +164 -0
  166. data/lib/rouge/lexers/viml.rb +101 -0
  167. data/lib/rouge/lexers/viml/keywords.rb +12 -0
  168. data/lib/rouge/lexers/xml.rb +59 -0
  169. data/lib/rouge/lexers/yaml.rb +364 -0
  170. data/lib/rouge/plugins/redcarpet.rb +30 -0
  171. data/lib/rouge/regex_lexer.rb +439 -0
  172. data/lib/rouge/template_lexer.rb +22 -0
  173. data/lib/rouge/text_analyzer.rb +48 -0
  174. data/lib/rouge/theme.rb +195 -0
  175. data/lib/rouge/themes/base16.rb +130 -0
  176. data/lib/rouge/themes/colorful.rb +67 -0
  177. data/lib/rouge/themes/github.rb +71 -0
  178. data/lib/rouge/themes/molokai.rb +82 -0
  179. data/lib/rouge/themes/monokai.rb +92 -0
  180. data/lib/rouge/themes/monokai_sublime.rb +90 -0
  181. data/lib/rouge/themes/thankful_eyes.rb +71 -0
  182. data/lib/rouge/token.rb +182 -0
  183. data/lib/rouge/util.rb +101 -0
  184. data/lib/rouge/version.rb +7 -0
  185. 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