rouge 3.21.0 → 3.30.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (143) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +6 -1
  3. data/lib/rouge/cli.rb +55 -22
  4. data/lib/rouge/demos/brainfuck +1 -1
  5. data/lib/rouge/demos/brightscript +1 -1
  6. data/lib/rouge/demos/bsl +1 -1
  7. data/lib/rouge/demos/cfscript +1 -1
  8. data/lib/rouge/demos/coq +1 -1
  9. data/lib/rouge/demos/csvs +1 -1
  10. data/lib/rouge/demos/dafny +16 -0
  11. data/lib/rouge/demos/datastudio +0 -1
  12. data/lib/rouge/demos/ecl +0 -1
  13. data/lib/rouge/demos/email +11 -0
  14. data/lib/rouge/demos/erlang +1 -1
  15. data/lib/rouge/demos/fluent +13 -0
  16. data/lib/rouge/demos/fsharp +1 -1
  17. data/lib/rouge/demos/glsl +1 -1
  18. data/lib/rouge/demos/haxe +0 -1
  19. data/lib/rouge/demos/idris +13 -0
  20. data/lib/rouge/demos/isabelle +16 -0
  21. data/lib/rouge/demos/j +12 -0
  22. data/lib/rouge/demos/lean +8 -0
  23. data/lib/rouge/demos/meson +10 -0
  24. data/lib/rouge/demos/nesasm +1 -1
  25. data/lib/rouge/demos/nial +35 -0
  26. data/lib/rouge/demos/ocl +4 -0
  27. data/lib/rouge/demos/opentype_feature_file +0 -1
  28. data/lib/rouge/demos/plsql +2 -0
  29. data/lib/rouge/demos/postscript +9 -0
  30. data/lib/rouge/demos/rescript +26 -0
  31. data/lib/rouge/demos/smarty +0 -1
  32. data/lib/rouge/demos/stan +13 -0
  33. data/lib/rouge/demos/stata +14 -0
  34. data/lib/rouge/demos/systemd +4 -0
  35. data/lib/rouge/demos/syzlang +15 -0
  36. data/lib/rouge/demos/syzprog +8 -0
  37. data/lib/rouge/formatter.rb +2 -2
  38. data/lib/rouge/formatters/html_inline.rb +0 -1
  39. data/lib/rouge/formatters/html_line_highlighter.rb +24 -0
  40. data/lib/rouge/formatters/html_line_table.rb +1 -3
  41. data/lib/rouge/formatters/html_linewise.rb +2 -3
  42. data/lib/rouge/guessers/disambiguation.rb +7 -0
  43. data/lib/rouge/lexer.rb +40 -22
  44. data/lib/rouge/lexers/apache/keywords.rb +1 -1
  45. data/lib/rouge/lexers/apex.rb +9 -7
  46. data/lib/rouge/lexers/apple_script.rb +1 -1
  47. data/lib/rouge/lexers/batchfile.rb +2 -1
  48. data/lib/rouge/lexers/c.rb +12 -2
  49. data/lib/rouge/lexers/ceylon.rb +2 -2
  50. data/lib/rouge/lexers/cmake.rb +10 -0
  51. data/lib/rouge/lexers/console.rb +1 -1
  52. data/lib/rouge/lexers/cpp.rb +9 -6
  53. data/lib/rouge/lexers/crystal.rb +14 -9
  54. data/lib/rouge/lexers/cypher.rb +8 -0
  55. data/lib/rouge/lexers/dafny.rb +128 -0
  56. data/lib/rouge/lexers/dart.rb +10 -9
  57. data/lib/rouge/lexers/docker.rb +5 -1
  58. data/lib/rouge/lexers/eex.rb +2 -2
  59. data/lib/rouge/lexers/eiffel.rb +0 -1
  60. data/lib/rouge/lexers/elm.rb +5 -5
  61. data/lib/rouge/lexers/email.rb +39 -0
  62. data/lib/rouge/lexers/factor.rb +2 -2
  63. data/lib/rouge/lexers/fluent.rb +74 -0
  64. data/lib/rouge/lexers/ghc_core.rb +3 -2
  65. data/lib/rouge/lexers/gherkin/keywords.rb +1 -1
  66. data/lib/rouge/lexers/graphql.rb +1 -1
  67. data/lib/rouge/lexers/groovy.rb +1 -1
  68. data/lib/rouge/lexers/hack.rb +1 -1
  69. data/lib/rouge/lexers/handlebars.rb +1 -1
  70. data/lib/rouge/lexers/hcl.rb +1 -0
  71. data/lib/rouge/lexers/http.rb +8 -2
  72. data/lib/rouge/lexers/hylang.rb +0 -1
  73. data/lib/rouge/lexers/idris.rb +210 -0
  74. data/lib/rouge/lexers/isabelle.rb +251 -0
  75. data/lib/rouge/lexers/isbl.rb +2 -2
  76. data/lib/rouge/lexers/j.rb +244 -0
  77. data/lib/rouge/lexers/janet.rb +9 -8
  78. data/lib/rouge/lexers/javascript.rb +9 -3
  79. data/lib/rouge/lexers/jsl.rb +25 -14
  80. data/lib/rouge/lexers/jsonnet.rb +4 -3
  81. data/lib/rouge/lexers/jsp.rb +2 -3
  82. data/lib/rouge/lexers/jsx.rb +1 -2
  83. data/lib/rouge/lexers/kotlin.rb +11 -5
  84. data/lib/rouge/lexers/lasso/keywords.rb +1 -1
  85. data/lib/rouge/lexers/lean.rb +164 -0
  86. data/lib/rouge/lexers/llvm/keywords.rb +1 -1
  87. data/lib/rouge/lexers/lua/keywords.rb +1 -1
  88. data/lib/rouge/lexers/mathematica/keywords.rb +1 -1
  89. data/lib/rouge/lexers/matlab/keywords.rb +1 -1
  90. data/lib/rouge/lexers/matlab.rb +3 -2
  91. data/lib/rouge/lexers/meson.rb +159 -0
  92. data/lib/rouge/lexers/nial.rb +166 -0
  93. data/lib/rouge/lexers/ocaml/common.rb +1 -1
  94. data/lib/rouge/lexers/ocl.rb +84 -0
  95. data/lib/rouge/lexers/opentype_feature_file.rb +0 -1
  96. data/lib/rouge/lexers/pascal.rb +2 -1
  97. data/lib/rouge/lexers/perl.rb +6 -4
  98. data/lib/rouge/lexers/php/keywords.rb +1 -1
  99. data/lib/rouge/lexers/php.rb +276 -128
  100. data/lib/rouge/lexers/plsql.rb +578 -0
  101. data/lib/rouge/lexers/postscript.rb +93 -0
  102. data/lib/rouge/lexers/powershell.rb +39 -29
  103. data/lib/rouge/lexers/prometheus.rb +0 -1
  104. data/lib/rouge/lexers/python.rb +4 -2
  105. data/lib/rouge/lexers/q.rb +1 -2
  106. data/lib/rouge/lexers/reasonml.rb +6 -5
  107. data/lib/rouge/lexers/rescript.rb +119 -0
  108. data/lib/rouge/lexers/ruby.rb +1 -1
  109. data/lib/rouge/lexers/rust.rb +84 -18
  110. data/lib/rouge/lexers/smarty.rb +1 -1
  111. data/lib/rouge/lexers/sparql.rb +5 -4
  112. data/lib/rouge/lexers/sqf/keywords.rb +1 -1
  113. data/lib/rouge/lexers/sql.rb +7 -7
  114. data/lib/rouge/lexers/stan.rb +451 -0
  115. data/lib/rouge/lexers/stata.rb +165 -0
  116. data/lib/rouge/lexers/supercollider.rb +0 -1
  117. data/lib/rouge/lexers/swift.rb +3 -3
  118. data/lib/rouge/lexers/systemd.rb +34 -0
  119. data/lib/rouge/lexers/syzlang.rb +317 -0
  120. data/lib/rouge/lexers/syzprog.rb +122 -0
  121. data/lib/rouge/lexers/tap.rb +0 -1
  122. data/lib/rouge/lexers/toml.rb +16 -9
  123. data/lib/rouge/lexers/tsx.rb +0 -1
  124. data/lib/rouge/lexers/tulip.rb +0 -1
  125. data/lib/rouge/lexers/velocity.rb +1 -1
  126. data/lib/rouge/lexers/viml/keywords.rb +1 -1
  127. data/lib/rouge/lexers/wollok.rb +0 -1
  128. data/lib/rouge/lexers/yaml.rb +1 -1
  129. data/lib/rouge/regex_lexer.rb +56 -1
  130. data/lib/rouge/themes/base16.rb +1 -0
  131. data/lib/rouge/themes/bw.rb +1 -0
  132. data/lib/rouge/themes/colorful.rb +1 -0
  133. data/lib/rouge/themes/github.rb +1 -0
  134. data/lib/rouge/themes/gruvbox.rb +2 -0
  135. data/lib/rouge/themes/igor_pro.rb +1 -0
  136. data/lib/rouge/themes/magritte.rb +1 -0
  137. data/lib/rouge/themes/monokai.rb +1 -0
  138. data/lib/rouge/themes/pastie.rb +1 -0
  139. data/lib/rouge/themes/thankful_eyes.rb +1 -0
  140. data/lib/rouge/themes/tulip.rb +1 -0
  141. data/lib/rouge/version.rb +1 -1
  142. data/lib/rouge.rb +1 -0
  143. metadata +43 -6
@@ -41,7 +41,7 @@ module Rouge
41
41
 
42
42
  state :dotted do
43
43
  mixin :whitespace
44
- rule %r/[a-zа-яё_0-9]*/i do |m|
44
+ rule %r/[a-zа-яё_0-9]+/i do |m|
45
45
  name = m[0]
46
46
  if self.class.constants.include? name.downcase
47
47
  token Name::Builtin
@@ -56,7 +56,7 @@ module Rouge
56
56
 
57
57
  state :type do
58
58
  mixin :whitespace
59
- rule %r/[a-zа-яё_0-9]*/i do |m|
59
+ rule %r/[a-zа-яё_0-9]+/i do |m|
60
60
  name = m[0]
61
61
  if self.class.interfaces.include? name.downcase
62
62
  token Keyword::Type
@@ -0,0 +1,244 @@
1
+ # -*- coding: utf-8 -*- #
2
+ # frozen_string_literal: true
3
+
4
+ module Rouge
5
+ module Lexers
6
+ class J < RegexLexer
7
+ title 'J'
8
+ desc "The J programming language (jsoftware.com)"
9
+ tag 'j'
10
+ filenames '*.ijs', '*.ijt'
11
+
12
+ # For J-specific terms we use, see:
13
+ # https://code.jsoftware.com/wiki/Vocabulary/AET
14
+ # https://code.jsoftware.com/wiki/Vocabulary/Glossary
15
+
16
+ # https://code.jsoftware.com/wiki/Vocabulary/PartsOfSpeech
17
+ def self.token_map
18
+ @token_map ||= {
19
+ noun: Keyword::Constant,
20
+ verb: Name::Function,
21
+ modifier: Operator,
22
+ name: Name,
23
+ param: Name::Builtin::Pseudo,
24
+ other: Punctuation,
25
+ nil => Error,
26
+ }
27
+ end
28
+
29
+ # https://code.jsoftware.com/wiki/NuVoc
30
+ def self.inflection_list
31
+ @inflection_list ||= ['', '.', ':', '..', '.:', ':.', '::']
32
+ end
33
+
34
+ def self.primitive_table
35
+ @primitive_table ||= Hash.new([:name]).tap do |h|
36
+ {
37
+ '()' => [:other],
38
+ '=' => [:verb, :other, :other],
39
+ '<>+-*%$|,#' => [:verb, :verb, :verb],
40
+ '^' => [:verb, :verb, :modifier],
41
+ '~"' => [:modifier, :verb, :verb],
42
+ '.:@' => [:modifier, :modifier, :modifier],
43
+ ';' => [:verb, :modifier, :verb],
44
+ '!' => [:verb, :modifier, :modifier],
45
+ '/\\' => [:modifier, :modifier, :verb],
46
+ '[' => [:verb, nil, :verb],
47
+ ']' => [:verb],
48
+ '{' => [:verb, :verb, :verb, nil, nil, nil, :verb],
49
+ '}' => [:modifier, :verb, :verb, nil, nil, nil, :modifier],
50
+ '`' => [:modifier, nil, :modifier],
51
+ '&' => [:modifier, :modifier, :modifier, nil, :modifier],
52
+ '?' => [:verb, :verb],
53
+ 'a' => [:name, :noun, :noun],
54
+ 'ACeEIjorv' => [:name, :verb],
55
+ 'bdfHMT' => [:name, :modifier],
56
+ 'Dt' => [:name, :modifier, :modifier],
57
+ 'F' => [:name, :modifier, :modifier, :modifier, :modifier,
58
+ :modifier, :modifier],
59
+ 'iu' => [:name, :verb, :verb],
60
+ 'L' => [:name, :verb, :modifier],
61
+ 'mny' => [:param],
62
+ 'p' => [:name, :verb, :verb, :verb],
63
+ 'qsZ' => [:name, nil, :verb],
64
+ 'S' => [:name, nil, :modifier],
65
+ 'u' => [:param, :verb, :verb],
66
+ 'v' => [:param, :verb],
67
+ 'x' => [:param, nil, :verb],
68
+ }.each {|k, v| k.each_char {|c| h[c] = v } }
69
+ end
70
+ end
71
+
72
+ def self.primitive(char, inflection)
73
+ i = inflection_list.index(inflection) or return Error
74
+ token_map[primitive_table[char][i]]
75
+ end
76
+
77
+ def self.control_words
78
+ @control_words ||= Set.new %w(
79
+ assert break case catch catchd catcht continue do else elseif end
80
+ fcase for if return select throw try while whilst
81
+ )
82
+ end
83
+
84
+ def self.control_words_id
85
+ @control_words_id ||= Set.new %w(for goto label)
86
+ end
87
+
88
+ state :expr do
89
+ rule %r/\s+/, Text
90
+
91
+ rule %r'([!-&(-/:-@\[-^`{-~]|[A-Za-z]\b)([.:]*)' do |m|
92
+ token J.primitive(m[1], m[2])
93
+ end
94
+
95
+ rule %r/(?:\d|_\d?):([.:]*)/ do |m|
96
+ token m[1].empty? ? J.token_map[:verb] : Error
97
+ end
98
+
99
+ rule %r/[\d_][\w.]*([.:]*)/ do |m|
100
+ token m[1].empty? ? Num : Error
101
+ end
102
+
103
+ rule %r/'/, Str::Single, :str
104
+
105
+ rule %r/NB\.(?![.:]).*/, Comment::Single
106
+
107
+ rule %r/([A-Za-z]\w*)([.:]*)/ do |m|
108
+ if m[2] == '.'
109
+ word, sep, id = m[1].partition '_'
110
+ list = if sep.empty?
111
+ J.control_words
112
+ elsif not id.empty?
113
+ J.control_words_id
114
+ end
115
+ if list and list.include? word
116
+ token Keyword, word + sep
117
+ token((word == 'for' ? Name : Name::Label), id)
118
+ token Keyword, m[2]
119
+ else
120
+ token Error
121
+ end
122
+ else
123
+ token m[2].empty? ? Name : Error
124
+ end
125
+ end
126
+ end
127
+
128
+ state :str do
129
+ rule %r/''/, Str::Escape
130
+ rule %r/[^'\n]+/, Str::Single
131
+ rule %r/'|$/, Str::Single, :pop!
132
+ end
133
+
134
+ start do
135
+ @note_next = false
136
+ end
137
+
138
+ state :root do
139
+ rule %r/\n/ do
140
+ token Text
141
+ if @note_next
142
+ push :note
143
+ @note_next = false
144
+ end
145
+ end
146
+
147
+ # https://code.jsoftware.com/wiki/Vocabulary/com
148
+ # https://code.jsoftware.com/wiki/Vocabulary/NounExplicitDefinition
149
+ rule %r/
150
+ ([0-4]|13|adverb|conjunction|dyad|monad|noun|verb)([\ \t]+)
151
+ (def(?:ine)?\b|:)(?![.:])([\ \t]*)
152
+ /x do |m|
153
+ groups Keyword::Pseudo, Text, Keyword::Pseudo, Text
154
+ @def_body = (m[1] == '0' || m[1] == 'noun') ? :noun : :code
155
+ if m[3] == 'define'
156
+ # stack: [:root]
157
+ # or [:root, ..., :def_next]
158
+ pop! if stack.size > 1
159
+ push @def_body
160
+ push :def_next # [:root, ..., @def_body, :def_next]
161
+ else
162
+ push :expl_def
163
+ end
164
+ end
165
+
166
+ rule %r/^([ \t]*)(Note\b(?![.:]))([ \t\r]*)(?!=[.:]|$)/ do
167
+ groups Text, Name, Text
168
+ @note_next = true
169
+ end
170
+
171
+ rule %r/[mnuvxy]\b(?![.:])/, Name
172
+ mixin :expr
173
+ end
174
+
175
+ state :def_next do
176
+ rule %r/\n/, Text, :pop!
177
+ mixin :root
178
+ end
179
+
180
+ state :expl_def do
181
+ rule %r/0\b(?![.:])/ do
182
+ token Keyword::Pseudo
183
+ # stack: [:root, :expl_def]
184
+ # or [:root, ..., :def_next, :expl_def]
185
+ pop! if stack.size > 2
186
+ goto @def_body
187
+ push :def_next # [:root, ..., @def_body, :def_next]
188
+ end
189
+ rule %r/'/ do
190
+ if @def_body == :noun
191
+ token Str::Single
192
+ goto :str
193
+ else
194
+ token Punctuation
195
+ goto :q_expr
196
+ end
197
+ end
198
+ rule(//) { pop! }
199
+ end
200
+
201
+ # `q_expr` lexes the content of a string literal which is a part of an
202
+ # explicit definition.
203
+ # e.g. dyad def 'x + y'
204
+ state :q_expr do
205
+ rule %r/''/, Str::Single, :q_str
206
+ rule %r/'|$/, Punctuation, :pop!
207
+ rule %r/NB\.(?![.:])([^'\n]|'')*/, Comment::Single
208
+ mixin :expr
209
+ end
210
+
211
+ state :q_str do
212
+ rule %r/''''/, Str::Escape
213
+ rule %r/[^'\n]+/, Str::Single
214
+ rule %r/''/, Str::Single, :pop!
215
+ rule(/'|$/) { token Punctuation; pop! 2 }
216
+ end
217
+
218
+ state :note do
219
+ mixin :delimiter
220
+ rule %r/.+\n?/, Comment::Multiline
221
+ end
222
+
223
+ state :noun do
224
+ mixin :delimiter
225
+ rule %r/.+\n?/, Str::Heredoc
226
+ end
227
+
228
+ state :code do
229
+ mixin :delimiter
230
+ rule %r/^([ \t]*)(:)([ \t\r]*)$/ do
231
+ groups Text, Punctuation, Text
232
+ end
233
+ mixin :expr
234
+ end
235
+
236
+ state :delimiter do
237
+ rule %r/^([ \t]*)(\))([ \t\r]*$\n?)/ do
238
+ groups Text, Punctuation, Text
239
+ pop!
240
+ end
241
+ end
242
+ end
243
+ end
244
+ end
@@ -114,7 +114,7 @@ module Rouge
114
114
  end
115
115
  end
116
116
 
117
- punctuation = %r/[_!@$%^&*+=~<>.?\/-]/o
117
+ punctuation = %r/[_!$%^&*+=~<>.?\/-]/o
118
118
  symbol = %r/([[:alpha:]]|#{punctuation})([[:word:]]|#{punctuation}|:)*/o
119
119
 
120
120
  state :root do
@@ -143,20 +143,19 @@ module Rouge
143
143
 
144
144
  rule %r/\(/, Punctuation, :function
145
145
 
146
- rule %r/(')([\(\[])/ do
146
+ rule %r/(')(@?[(\[{])/ do
147
147
  groups Operator, Punctuation
148
148
  push :quote
149
149
  end
150
150
 
151
- rule %r/(~)([\(\[])/ do
151
+ rule %r/(~)(@?[(\[{])/ do
152
152
  groups Operator, Punctuation
153
153
  push :quasiquote
154
154
  end
155
155
 
156
156
  rule %r/[\#~,';\|]/, Operator
157
157
 
158
- rule %r/@?[({\[]/, Punctuation, :push
159
- rule %r/[)}\]]/, Punctuation, :pop!
158
+ rule %r/@?[(){}\[\]]/, Punctuation
160
159
 
161
160
  rule symbol, Name
162
161
  end
@@ -169,6 +168,8 @@ module Rouge
169
168
  end
170
169
 
171
170
  state :function do
171
+ rule %r/[\)]/, Punctuation, :pop!
172
+
172
173
  rule symbol do |m|
173
174
  case m[0]
174
175
  when "quote"
@@ -187,8 +188,9 @@ module Rouge
187
188
  end
188
189
 
189
190
  state :quote do
190
- rule %r/[\(\[]/, Punctuation, :push
191
- rule symbol, Str::Symbol
191
+ rule %r/[(\[{]/, Punctuation, :push
192
+ rule %r/[)\]}]/, Punctuation, :pop!
193
+ rule symbol, Str::Escape
192
194
  mixin :root
193
195
  end
194
196
 
@@ -199,7 +201,6 @@ module Rouge
199
201
  end
200
202
  rule %r/(\()(\s*)(unquote)(\s+)(\()/ do
201
203
  groups Punctuation, Text, Keyword, Text, Punctuation
202
- push :root
203
204
  push :function
204
205
  end
205
206
 
@@ -149,7 +149,7 @@ module Rouge
149
149
  rule %r/\A\s*#!.*?\n/m, Comment::Preproc, :statement
150
150
  rule %r((?<=\n)(?=\s|/|<!--)), Text, :expr_start
151
151
  mixin :comments_and_whitespace
152
- rule %r(\+\+ | -- | ~ | && | \|\| | \\(?=\n) | << | >>>? | ===
152
+ rule %r(\+\+ | -- | ~ | \?\?=? | && | \|\| | \\(?=\n) | << | >>>? | ===
153
153
  | !== )x,
154
154
  Operator, :expr_start
155
155
  rule %r([-<>+*%&|\^/!=]=?), Operator, :expr_start
@@ -162,6 +162,10 @@ module Rouge
162
162
  push :template_string
163
163
  end
164
164
 
165
+ # special case for the safe navigation operator ?.
166
+ # so that we don't start detecting a ternary expr
167
+ rule %r/[?][.]/, Punctuation
168
+
165
169
  rule %r/[?]/ do
166
170
  token Punctuation
167
171
  push :ternary
@@ -265,9 +269,11 @@ module Rouge
265
269
 
266
270
  # template strings
267
271
  state :template_string do
268
- rule %r/\${/, Punctuation, :template_string_expr
272
+ rule %r/[$]{/, Punctuation, :template_string_expr
269
273
  rule %r/`/, Str::Double, :pop!
270
- rule %r/(\\\\|\\[\$`]|[^\$`]|\$(?!{))*/, Str::Double
274
+ rule %r/\\[$`]/, Str::Escape
275
+ rule %r/[^$`\\]+/, Str::Double
276
+ rule %r/[\\$]/, Str::Double
271
277
  end
272
278
 
273
279
  state :template_string_expr do
@@ -14,41 +14,52 @@ module Rouge
14
14
  rule %r/\s+/m, Text::Whitespace
15
15
 
16
16
  rule %r(//.*?$), Comment::Single
17
- rule %r(/\*.*?\*/)m, Comment::Multiline
17
+ rule %r'/[*].*?', Comment::Multiline, :comment # multiline block comment
18
18
 
19
19
  # messages
20
- rule %r/(<<)(.*?)(\(|;)/ do |m|
21
- groups Operator, Name::Function, Punctuation
22
- end
20
+ rule %r/<</, Operator, :message
23
21
 
24
22
  # covers built-in and custom functions
25
- rule %r/([a-z_][\w\s'%.\\]*)(\()/i do |m|
26
- groups Keyword, Punctuation
23
+ rule %r/(::|:)?([a-z_][\w\s'%.\\]*)(\()/i do |m|
24
+ groups Punctuation, Keyword, Punctuation
27
25
  end
28
26
 
29
- rule %r/\b[+-]?(?:[0-9]+(?:\.[0-9]+)?|\.[0-9]+|\.)(?:e[+-]?[0-9]+)?i?\b/i, Num
30
-
31
27
  rule %r/\d{2}(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\d{2}(\d{2})?(:\d{2}:\d{2}(:\d{2}(\.\d*)?)?)?/i, Literal::Date
32
28
 
33
- rule %r/::[a-z_][\w\s'%.\\]*/i, Name::Variable
34
- rule %r/:\w+/, Name
35
- rule %r/[a-z_][\w\s'%.\\]*/i, Name::Variable
36
- rule %r/"(?:\\!"|[^"])*?"n/m, Name::Variable
29
+ rule %r/-?(?:[0-9]+(?:[.][0-9]+)?|[.][0-9]*)(?:e[+-]?[0-9]+)?i?/i, Num
30
+
31
+ rule %r/(::|:)?([a-z_][\w\s'%.\\]*|"(?:\\!"|[^"])*?"n)/i do |m|
32
+ groups Punctuation, Name::Variable
33
+ end
37
34
 
38
35
  rule %r/(")(\\\[)(.*?)(\]\\)(")/m do
39
36
  groups Str::Double, Str::Escape, Str::Double, Str::Escape, Str::Double # escaped string
40
37
  end
41
38
  rule %r/"/, Str::Double, :dq
42
39
 
43
- rule %r/[-+*\/!%&<>\|=:]/, Operator
40
+ rule %r/[-+*\/!%&<>\|=:`^]/, Operator
44
41
  rule %r/[\[\](){},;]/, Punctuation
45
42
  end
46
43
 
44
+ state :message do
45
+ rule %r/\s+/m, Text::Whitespace
46
+ rule %r/[a-z_][\w\s'%.\\]*/i, Name::Function
47
+ rule %r/[(),;]/, Punctuation, :pop!
48
+ rule %r/[&|!=<>]/, Operator, :pop!
49
+ end
50
+
47
51
  state :dq do
48
52
  rule %r/\\![btrnNf0\\"]/, Str::Escape
49
53
  rule %r/\\/, Str::Double
50
54
  rule %r/"/, Str::Double, :pop!
51
- rule %r/[^\\"]*/m, Str::Double
55
+ rule %r/[^\\"]+/m, Str::Double
56
+ end
57
+
58
+ state :comment do
59
+ rule %r'/[*]', Comment::Multiline, :comment
60
+ rule %r'[*]/', Comment::Multiline, :pop!
61
+ rule %r'[^/*]+', Comment::Multiline
62
+ rule %r'[/*]', Comment::Multiline
52
63
  end
53
64
  end
54
65
  end
@@ -126,6 +126,7 @@ module Rouge
126
126
 
127
127
  state :string do
128
128
  rule %r/\\([\\\/bfnrt]|(u[0-9a-fA-F]{4}))/, Str::Escape
129
+ rule %r/\\./, Str::Escape
129
130
  end
130
131
 
131
132
  state :string_double do
@@ -137,15 +138,15 @@ module Rouge
137
138
 
138
139
  state :string_single do
139
140
  mixin :string
140
- rule %r/\\'/, Str::Escape
141
141
  rule %r/'/, Str, :pop!
142
142
  rule %r/[^\\']+/, Str
143
143
  end
144
144
 
145
145
  state :string_block do
146
146
  mixin :string
147
- rule %r/\|\|\|/, Str, :pop!
148
- rule %r/.*/, Str
147
+ rule %r/[|][|][|]/, Str, :pop!
148
+ rule %r/[^|\\]+/, Str
149
+ rule %r/[|]/, Str
149
150
  end
150
151
  end
151
152
  end
@@ -112,9 +112,8 @@ module Rouge
112
112
 
113
113
  state :jsp_interp_literal_start do
114
114
  rule %r/'/, Literal, :pop!
115
- rule %r/[^']*/, Literal
115
+ rule %r/[^']+/, Literal
116
116
  end
117
-
118
117
  end
119
118
  end
120
- end
119
+ end
@@ -57,7 +57,7 @@ module Rouge
57
57
  push :interpol
58
58
  push :expr_start
59
59
  end
60
- rule %r/\w+/, Name::Attribute
60
+ rule %r/\w[\w-]*/, Name::Attribute
61
61
  rule %r/=/, Punctuation
62
62
  rule %r/(["']).*?(\1)/, Str
63
63
  end
@@ -89,4 +89,3 @@ module Rouge
89
89
  end
90
90
  end
91
91
  end
92
-
@@ -53,7 +53,7 @@ module Rouge
53
53
  groups Keyword::Declaration, Text
54
54
  push :property
55
55
  end
56
- rule %r'(return|continue|break|this|super)(@#{name})?' do
56
+ rule %r'(return|continue|break|this|super)(@#{name})?\b' do
57
57
  groups Keyword, Name::Decorator
58
58
  end
59
59
  rule %r'\bfun\b', Keyword
@@ -65,6 +65,9 @@ module Rouge
65
65
  rule %r'/[*].*[*]/', Comment::Multiline # single line block comment
66
66
  rule %r'/[*].*', Comment::Multiline, :comment # multiline block comment
67
67
  rule %r'\n', Text
68
+ rule %r'(::)(class)' do
69
+ groups Operator, Keyword
70
+ end
68
71
  rule %r'::|!!|\?[:.]', Operator
69
72
  rule %r"(\.\.)", Operator
70
73
  # Number literals
@@ -113,12 +116,14 @@ module Rouge
113
116
  rule class_name, Name::Class
114
117
  rule %r'(<)', Punctuation, :generic_parameters
115
118
  rule %r'(reified|out|in)', Keyword
116
- rule %r'([,:])', Punctuation
119
+ rule %r'([,:.?])', Punctuation
117
120
  rule %r'(\s+)', Text
118
121
  rule %r'(>)', Punctuation, :pop!
119
122
  end
120
123
 
121
124
  state :property do
125
+ rule %r'(<)', Punctuation, :generic_parameters
126
+ rule %r'(\s+)', Text
122
127
  rule name, Name::Property, :pop!
123
128
  end
124
129
 
@@ -130,9 +135,10 @@ module Rouge
130
135
  end
131
136
 
132
137
  state :comment do
133
- rule %r'\s*/[*].*', Comment::Multiline, :comment
134
- rule %r'.*[*]/', Comment::Multiline, :pop!
135
- rule %r'.*', Comment::Multiline
138
+ rule %r'/[*]', Comment::Multiline, :comment
139
+ rule %r'[*]/', Comment::Multiline, :pop!
140
+ rule %r'[^/*]+', Comment::Multiline
141
+ rule %r'[/*]', Comment::Multiline
136
142
  end
137
143
  end
138
144
  end
@@ -17,4 +17,4 @@ module Rouge
17
17
  end
18
18
  end
19
19
  end
20
- end
20
+ end
@@ -0,0 +1,164 @@
1
+ # -*- coding: utf-8 -*- #
2
+ # frozen_string_literal: true
3
+
4
+ # NOTE: This is for Lean 3 (community fork).
5
+ module Rouge
6
+ module Lexers
7
+ class Lean < RegexLexer
8
+ title 'Lean'
9
+ desc 'The Lean programming language (leanprover.github.io)'
10
+ tag 'lean'
11
+ aliases 'lean'
12
+ filenames '*.lean'
13
+
14
+ def self.keywords
15
+ @keywords ||= Set.new %w(
16
+ abbreviation
17
+ add_rewrite
18
+ alias
19
+ assume
20
+ axiom
21
+ begin
22
+ by
23
+ calc
24
+ calc_refl
25
+ calc_subst
26
+ calc_trans
27
+ #check
28
+ coercion
29
+ conjecture
30
+ constant
31
+ constants
32
+ context
33
+ corollary
34
+ def
35
+ definition
36
+ end
37
+ #eval
38
+ example
39
+ export
40
+ expose
41
+ exposing
42
+ exit
43
+ extends
44
+ from
45
+ fun
46
+ have
47
+ help
48
+ hiding
49
+ hott
50
+ hypothesis
51
+ import
52
+ include
53
+ including
54
+ inductive
55
+ infix
56
+ infixl
57
+ infixr
58
+ inline
59
+ instance
60
+ irreducible
61
+ lemma
62
+ match
63
+ namespace
64
+ notation
65
+ opaque
66
+ opaque_hint
67
+ open
68
+ options
69
+ parameter
70
+ parameters
71
+ postfix
72
+ precedence
73
+ prefix
74
+ #print
75
+ private
76
+ protected
77
+ #reduce
78
+ reducible
79
+ renaming
80
+ repeat
81
+ section
82
+ set_option
83
+ show
84
+ tactic_hint
85
+ theorem
86
+ universe
87
+ universes
88
+ using
89
+ variable
90
+ variables
91
+ with
92
+ )
93
+ end
94
+
95
+ def self.types
96
+ @types ||= %w(
97
+ Sort
98
+ Prop
99
+ Type
100
+ )
101
+ end
102
+
103
+ def self.operators
104
+ @operators ||= %w(
105
+ != # & && \* \+ - / @ ! ` -\. ->
106
+ \. \.\. \.\.\. :: :> ; ;; <
107
+ <- = == > _ \| \|\| ~ => <= >=
108
+ /\ \/ ∀ Π λ ↔ ∧ ∨ ≠ ≤ ≥ ⊎
109
+ ¬ ⁻¹ ⬝ ▸ → ∃ ℕ ℤ ≈ × ⌞ ⌟ ≡ ⟨ ⟩
110
+ )
111
+ end
112
+
113
+ state :root do
114
+ # comments starting after some space
115
+ rule %r/\s*--+\s+.*?$/, Comment::Doc
116
+
117
+ rule %r/"/, Str, :string
118
+ rule %r/\d+/, Num::Integer
119
+
120
+ # special commands or keywords
121
+ rule(/#?\w+/) do |m|
122
+ match = m[0]
123
+ if self.class.keywords.include?(match)
124
+ token Keyword
125
+ elsif self.class.types.include?(match)
126
+ token Keyword::Type
127
+ else
128
+ token Name
129
+ end
130
+ end
131
+
132
+ # special unicode keywords
133
+ rule %r/[λ]/, Keyword
134
+
135
+ # ----------------
136
+ # operators rules
137
+ # ----------------
138
+
139
+ rule %r/\:=?/, Text
140
+ rule %r/\.[0-9]*/, Operator
141
+
142
+ rule %r(#{Lean.operators.join('|')}), Operator
143
+
144
+ # unmatched symbols
145
+ rule %r/[\s\(\),\[\]αβ‹›]+/, Text
146
+
147
+ # show missing matches
148
+ rule %r/./, Error
149
+
150
+ end
151
+
152
+ state :string do
153
+ rule %r/"/, Str, :pop!
154
+ rule %r/\\/, Str::Escape, :escape
155
+ rule %r/[^\\"]+/, Str
156
+ end
157
+
158
+ state :escape do
159
+ rule %r/[nrt"'\\]/, Str::Escape, :pop!
160
+ rule %r/x[\da-f]+/i, Str::Escape, :pop!
161
+ end
162
+ end
163
+ end
164
+ end