rouge 3.21.0 → 4.1.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (172) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +9 -11
  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/cisco_ios +19 -0
  9. data/lib/rouge/demos/coq +4 -1
  10. data/lib/rouge/demos/csvs +1 -1
  11. data/lib/rouge/demos/dafny +16 -0
  12. data/lib/rouge/demos/datastudio +0 -1
  13. data/lib/rouge/demos/ecl +0 -1
  14. data/lib/rouge/demos/email +11 -0
  15. data/lib/rouge/demos/erlang +1 -1
  16. data/lib/rouge/demos/fluent +13 -0
  17. data/lib/rouge/demos/fsharp +1 -1
  18. data/lib/rouge/demos/glsl +1 -1
  19. data/lib/rouge/demos/haxe +0 -1
  20. data/lib/rouge/demos/idris +13 -0
  21. data/lib/rouge/demos/isabelle +16 -0
  22. data/lib/rouge/demos/j +12 -0
  23. data/lib/rouge/demos/lean +8 -0
  24. data/lib/rouge/demos/meson +10 -0
  25. data/lib/rouge/demos/nesasm +1 -1
  26. data/lib/rouge/demos/nial +35 -0
  27. data/lib/rouge/demos/ocl +4 -0
  28. data/lib/rouge/demos/opentype_feature_file +0 -1
  29. data/lib/rouge/demos/plsql +2 -0
  30. data/lib/rouge/demos/postscript +9 -0
  31. data/lib/rouge/demos/rescript +26 -0
  32. data/lib/rouge/demos/rml +33 -0
  33. data/lib/rouge/demos/smarty +0 -1
  34. data/lib/rouge/demos/stan +13 -0
  35. data/lib/rouge/demos/stata +14 -0
  36. data/lib/rouge/demos/systemd +4 -0
  37. data/lib/rouge/demos/syzlang +15 -0
  38. data/lib/rouge/demos/syzprog +8 -0
  39. data/lib/rouge/formatter.rb +2 -2
  40. data/lib/rouge/formatters/html.rb +12 -11
  41. data/lib/rouge/formatters/html_inline.rb +0 -1
  42. data/lib/rouge/formatters/html_line_highlighter.rb +24 -0
  43. data/lib/rouge/formatters/html_line_table.rb +1 -3
  44. data/lib/rouge/formatters/html_linewise.rb +2 -3
  45. data/lib/rouge/guessers/disambiguation.rb +15 -0
  46. data/lib/rouge/lexer.rb +40 -22
  47. data/lib/rouge/lexers/apache/keywords.rb +1 -1
  48. data/lib/rouge/lexers/apex.rb +9 -7
  49. data/lib/rouge/lexers/apple_script.rb +1 -1
  50. data/lib/rouge/lexers/batchfile.rb +2 -1
  51. data/lib/rouge/lexers/c.rb +12 -2
  52. data/lib/rouge/lexers/ceylon.rb +2 -2
  53. data/lib/rouge/lexers/cisco_ios.rb +83 -0
  54. data/lib/rouge/lexers/cmake.rb +10 -0
  55. data/lib/rouge/lexers/console.rb +1 -1
  56. data/lib/rouge/lexers/coq.rb +132 -68
  57. data/lib/rouge/lexers/cpp.rb +13 -6
  58. data/lib/rouge/lexers/crystal.rb +14 -9
  59. data/lib/rouge/lexers/csharp.rb +13 -12
  60. data/lib/rouge/lexers/cypher.rb +8 -0
  61. data/lib/rouge/lexers/dafny.rb +128 -0
  62. data/lib/rouge/lexers/dart.rb +10 -9
  63. data/lib/rouge/lexers/diff.rb +14 -4
  64. data/lib/rouge/lexers/docker.rb +5 -1
  65. data/lib/rouge/lexers/dot.rb +1 -0
  66. data/lib/rouge/lexers/eex.rb +2 -2
  67. data/lib/rouge/lexers/eiffel.rb +0 -1
  68. data/lib/rouge/lexers/elm.rb +5 -5
  69. data/lib/rouge/lexers/email.rb +39 -0
  70. data/lib/rouge/lexers/factor.rb +2 -2
  71. data/lib/rouge/lexers/fluent.rb +74 -0
  72. data/lib/rouge/lexers/ghc_cmm.rb +1 -1
  73. data/lib/rouge/lexers/ghc_core.rb +3 -2
  74. data/lib/rouge/lexers/gherkin/keywords.rb +5 -5
  75. data/lib/rouge/lexers/graphql.rb +1 -1
  76. data/lib/rouge/lexers/groovy.rb +1 -1
  77. data/lib/rouge/lexers/hack.rb +1 -1
  78. data/lib/rouge/lexers/handlebars.rb +1 -1
  79. data/lib/rouge/lexers/haxe.rb +30 -11
  80. data/lib/rouge/lexers/hcl.rb +4 -2
  81. data/lib/rouge/lexers/http.rb +10 -4
  82. data/lib/rouge/lexers/hylang.rb +0 -1
  83. data/lib/rouge/lexers/idris.rb +210 -0
  84. data/lib/rouge/lexers/irb.rb +7 -1
  85. data/lib/rouge/lexers/isabelle.rb +251 -0
  86. data/lib/rouge/lexers/isbl.rb +2 -2
  87. data/lib/rouge/lexers/j.rb +244 -0
  88. data/lib/rouge/lexers/janet.rb +9 -8
  89. data/lib/rouge/lexers/java.rb +1 -0
  90. data/lib/rouge/lexers/javascript.rb +39 -3
  91. data/lib/rouge/lexers/jinja.rb +10 -10
  92. data/lib/rouge/lexers/jsl.rb +25 -14
  93. data/lib/rouge/lexers/jsonnet.rb +4 -3
  94. data/lib/rouge/lexers/jsp.rb +2 -3
  95. data/lib/rouge/lexers/jsx.rb +1 -2
  96. data/lib/rouge/lexers/kotlin.rb +11 -5
  97. data/lib/rouge/lexers/lasso/keywords.rb +1 -1
  98. data/lib/rouge/lexers/lean.rb +164 -0
  99. data/lib/rouge/lexers/liquid.rb +164 -164
  100. data/lib/rouge/lexers/llvm/keywords.rb +3 -3
  101. data/lib/rouge/lexers/lua/keywords.rb +1 -1
  102. data/lib/rouge/lexers/make.rb +25 -16
  103. data/lib/rouge/lexers/mathematica/keywords.rb +1 -1
  104. data/lib/rouge/lexers/matlab/keywords.rb +1 -1
  105. data/lib/rouge/lexers/matlab.rb +3 -2
  106. data/lib/rouge/lexers/meson.rb +159 -0
  107. data/lib/rouge/lexers/mosel.rb +0 -4
  108. data/lib/rouge/lexers/nial.rb +166 -0
  109. data/lib/rouge/lexers/ocaml/common.rb +1 -1
  110. data/lib/rouge/lexers/ocl.rb +84 -0
  111. data/lib/rouge/lexers/openedge.rb +581 -376
  112. data/lib/rouge/lexers/opentype_feature_file.rb +0 -1
  113. data/lib/rouge/lexers/pascal.rb +2 -1
  114. data/lib/rouge/lexers/perl.rb +6 -4
  115. data/lib/rouge/lexers/php/keywords.rb +1 -1
  116. data/lib/rouge/lexers/php.rb +278 -128
  117. data/lib/rouge/lexers/plsql.rb +578 -0
  118. data/lib/rouge/lexers/postscript.rb +93 -0
  119. data/lib/rouge/lexers/powershell.rb +44 -28
  120. data/lib/rouge/lexers/praat.rb +200 -113
  121. data/lib/rouge/lexers/prometheus.rb +0 -1
  122. data/lib/rouge/lexers/python.rb +28 -9
  123. data/lib/rouge/lexers/q.rb +1 -2
  124. data/lib/rouge/lexers/reasonml.rb +6 -5
  125. data/lib/rouge/lexers/rescript.rb +119 -0
  126. data/lib/rouge/lexers/rml.rb +142 -0
  127. data/lib/rouge/lexers/ruby.rb +3 -2
  128. data/lib/rouge/lexers/rust.rb +91 -24
  129. data/lib/rouge/lexers/shell.rb +6 -2
  130. data/lib/rouge/lexers/smarty.rb +1 -1
  131. data/lib/rouge/lexers/sparql.rb +5 -4
  132. data/lib/rouge/lexers/sqf/keywords.rb +1 -1
  133. data/lib/rouge/lexers/sql.rb +7 -7
  134. data/lib/rouge/lexers/stan.rb +451 -0
  135. data/lib/rouge/lexers/stata.rb +165 -0
  136. data/lib/rouge/lexers/supercollider.rb +0 -1
  137. data/lib/rouge/lexers/swift.rb +32 -16
  138. data/lib/rouge/lexers/systemd.rb +34 -0
  139. data/lib/rouge/lexers/syzlang.rb +317 -0
  140. data/lib/rouge/lexers/syzprog.rb +122 -0
  141. data/lib/rouge/lexers/tap.rb +0 -1
  142. data/lib/rouge/lexers/terraform.rb +0 -8
  143. data/lib/rouge/lexers/toml.rb +20 -13
  144. data/lib/rouge/lexers/tsx.rb +7 -1
  145. data/lib/rouge/lexers/tulip.rb +0 -1
  146. data/lib/rouge/lexers/twig.rb +9 -9
  147. data/lib/rouge/lexers/typescript/common.rb +4 -1
  148. data/lib/rouge/lexers/typescript.rb +2 -2
  149. data/lib/rouge/lexers/vala.rb +1 -1
  150. data/lib/rouge/lexers/velocity.rb +1 -1
  151. data/lib/rouge/lexers/viml/keywords.rb +1 -1
  152. data/lib/rouge/lexers/wollok.rb +6 -3
  153. data/lib/rouge/lexers/xquery.rb +1 -1
  154. data/lib/rouge/lexers/yaml.rb +2 -4
  155. data/lib/rouge/regex_lexer.rb +56 -1
  156. data/lib/rouge/themes/base16.rb +1 -0
  157. data/lib/rouge/themes/bw.rb +1 -0
  158. data/lib/rouge/themes/colorful.rb +1 -0
  159. data/lib/rouge/themes/github.rb +137 -61
  160. data/lib/rouge/themes/gruvbox.rb +2 -0
  161. data/lib/rouge/themes/igor_pro.rb +1 -0
  162. data/lib/rouge/themes/magritte.rb +1 -0
  163. data/lib/rouge/themes/monokai.rb +1 -0
  164. data/lib/rouge/themes/pastie.rb +1 -0
  165. data/lib/rouge/themes/thankful_eyes.rb +1 -0
  166. data/lib/rouge/themes/tulip.rb +1 -0
  167. data/lib/rouge/version.rb +1 -1
  168. data/lib/rouge.rb +4 -5
  169. data/rouge.gemspec +1 -1
  170. metadata +48 -9
  171. data/lib/rouge/demos/solidity +0 -13
  172. data/lib/rouge/lexers/solidity.rb +0 -185
@@ -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
 
@@ -53,6 +53,7 @@ module Rouge
53
53
  rule %r/(?:true|false|null)\b/, Keyword::Constant
54
54
  rule %r/(?:class|interface)\b/, Keyword::Declaration, :class
55
55
  rule %r/(?:import|package)\b/, Keyword::Namespace, :import
56
+ rule %r/"""\s*\n.*?(?<!\\)"""/m, Str::Heredoc
56
57
  rule %r/"(\\\\|\\"|[^"])*"/, Str
57
58
  rule %r/'(?:\\.|[^\\]|\\u[0-9a-f]{4})'/, Str::Char
58
59
  rule %r/(\.)(#{id})/ do
@@ -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
@@ -173,6 +177,28 @@ module Rouge
173
177
  push :expr_start
174
178
  end
175
179
 
180
+ rule %r/(class)((?:\s|\\\s)+)/ do
181
+ groups Keyword::Declaration, Text
182
+ push :classname
183
+ end
184
+
185
+ rule %r/([\p{Nl}$_]*\p{Lu}[\p{Word}]*)[ \t]*(?=(\(.*\)))/m, Name::Class
186
+
187
+ rule %r/(function)((?:\s|\\\s)+)(#{id})/ do
188
+ groups Keyword::Declaration, Text, Name::Function
189
+ end
190
+
191
+ rule %r/function(?=(\(.*\)))/, Keyword::Declaration # For anonymous functions
192
+
193
+ rule %r/(#{id})[ \t]*(?=(\(.*\)))/m do |m|
194
+ if self.class.keywords.include? m[1]
195
+ # "if" in "if (...)" or "switch" in "switch (...)" are recognized as keywords.
196
+ token Keyword
197
+ else
198
+ token Name::Function
199
+ end
200
+ end
201
+
176
202
  rule %r/[{}]/, Punctuation, :statement
177
203
 
178
204
  rule id do |m|
@@ -216,6 +242,14 @@ module Rouge
216
242
  rule %r/'/, Str::Delimiter, :pop!
217
243
  end
218
244
 
245
+ state :classname do
246
+ rule %r/(#{id})((?:\s|\\\s)+)(extends)((?:\s|\\\s)+)/ do
247
+ groups Name::Class, Text, Keyword::Declaration, Text
248
+ end
249
+
250
+ rule id, Name::Class, :pop!
251
+ end
252
+
219
253
  # braced parts that aren't object literals
220
254
  state :statement do
221
255
  rule %r/case\b/ do
@@ -265,9 +299,11 @@ module Rouge
265
299
 
266
300
  # template strings
267
301
  state :template_string do
268
- rule %r/\${/, Punctuation, :template_string_expr
302
+ rule %r/[$]{/, Punctuation, :template_string_expr
269
303
  rule %r/`/, Str::Double, :pop!
270
- rule %r/(\\\\|\\[\$`]|[^\$`]|\$(?!{))*/, Str::Double
304
+ rule %r/\\[$`\\]/, Str::Escape
305
+ rule %r/[^$`\\]+/, Str::Double
306
+ rule %r/[\\$]/, Str::Double
271
307
  end
272
308
 
273
309
  state :template_string_expr do
@@ -14,25 +14,25 @@ module Rouge
14
14
  'text/html+django', 'text/html+jinja'
15
15
 
16
16
  def self.keywords
17
- @@keywords ||= %w(as context do else extends from ignore missing
18
- import include reversed recursive scoped
19
- autoescape endautoescape block endblock call endcall
20
- filter endfilter for endfor if endif macro endmacro
21
- set endset trans endtrans with endwith without)
17
+ @keywords ||= %w(as context do else extends from ignore missing
18
+ import include reversed recursive scoped
19
+ autoescape endautoescape block endblock call endcall
20
+ filter endfilter for endfor if endif macro endmacro
21
+ set endset trans endtrans with endwith without)
22
22
  end
23
23
 
24
24
  def self.tests
25
- @@tests ||= %w(callable defined divisibleby equalto escaped even iterable
26
- lower mapping none number odd sameas sequence string
27
- undefined upper)
25
+ @tests ||= %w(callable defined divisibleby equalto escaped even iterable
26
+ lower mapping none number odd sameas sequence string
27
+ undefined upper)
28
28
  end
29
29
 
30
30
  def self.pseudo_keywords
31
- @@pseudo_keywords ||= %w(true false none True False None)
31
+ @pseudo_keywords ||= %w(true false none True False None)
32
32
  end
33
33
 
34
34
  def self.word_operators
35
- @@word_operators ||= %w(is in and or not)
35
+ @word_operators ||= %w(is in and or not)
36
36
  end
37
37
 
38
38
  state :root 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