rouge 3.13.0 → 3.18.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (92) hide show
  1. checksums.yaml +4 -4
  2. data/lib/rouge.rb +65 -50
  3. data/lib/rouge/cli.rb +18 -1
  4. data/lib/rouge/demos/cypher +5 -0
  5. data/lib/rouge/demos/datastudio +21 -0
  6. data/lib/rouge/demos/ecl +18 -0
  7. data/lib/rouge/demos/freefem +16 -0
  8. data/lib/rouge/demos/ghc-cmm +23 -0
  9. data/lib/rouge/demos/ghc-core +26 -0
  10. data/lib/rouge/demos/isbl +4 -0
  11. data/lib/rouge/demos/nasm +6 -6
  12. data/lib/rouge/demos/nesasm +11 -0
  13. data/lib/rouge/demos/objective_cpp +17 -0
  14. data/lib/rouge/demos/rego +8 -0
  15. data/lib/rouge/demos/slice +10 -0
  16. data/lib/rouge/demos/solidity +13 -0
  17. data/lib/rouge/demos/vcl +12 -0
  18. data/lib/rouge/demos/yang +17 -0
  19. data/lib/rouge/formatters/terminal256.rb +22 -6
  20. data/lib/rouge/formatters/terminal_truecolor.rb +37 -0
  21. data/lib/rouge/lexer.rb +5 -3
  22. data/lib/rouge/lexers/apache.rb +4 -8
  23. data/lib/rouge/lexers/apache/keywords.rb +15 -0
  24. data/lib/rouge/lexers/cmake.rb +1 -0
  25. data/lib/rouge/lexers/coffeescript.rb +47 -15
  26. data/lib/rouge/lexers/console.rb +88 -35
  27. data/lib/rouge/lexers/cpp.rb +12 -5
  28. data/lib/rouge/lexers/cypher.rb +108 -0
  29. data/lib/rouge/lexers/d.rb +4 -4
  30. data/lib/rouge/lexers/datastudio.rb +138 -0
  31. data/lib/rouge/lexers/dot.rb +2 -2
  32. data/lib/rouge/lexers/ecl.rb +175 -0
  33. data/lib/rouge/lexers/freefem.rb +240 -0
  34. data/lib/rouge/lexers/fsharp.rb +1 -0
  35. data/lib/rouge/lexers/ghc_cmm.rb +340 -0
  36. data/lib/rouge/lexers/ghc_core.rb +151 -0
  37. data/lib/rouge/lexers/gherkin.rb +1 -1
  38. data/lib/rouge/lexers/io.rb +2 -2
  39. data/lib/rouge/lexers/isbl.rb +97 -0
  40. data/lib/rouge/lexers/isbl/builtins.rb +17 -0
  41. data/lib/rouge/lexers/java.rb +4 -5
  42. data/lib/rouge/lexers/jinja.rb +5 -3
  43. data/lib/rouge/lexers/json.rb +3 -0
  44. data/lib/rouge/lexers/json_doc.rb +5 -3
  45. data/lib/rouge/lexers/kotlin.rb +4 -0
  46. data/lib/rouge/lexers/lasso.rb +4 -9
  47. data/lib/rouge/lexers/lasso/keywords.rb +14 -0
  48. data/lib/rouge/lexers/liquid.rb +1 -1
  49. data/lib/rouge/lexers/llvm.rb +55 -46
  50. data/lib/rouge/lexers/lua.rb +40 -2
  51. data/lib/rouge/lexers/m68k.rb +2 -2
  52. data/lib/rouge/lexers/magik.rb +1 -1
  53. data/lib/rouge/lexers/markdown.rb +9 -5
  54. data/lib/rouge/lexers/mathematica.rb +1 -1
  55. data/lib/rouge/lexers/matlab.rb +3 -4
  56. data/lib/rouge/lexers/matlab/builtins.rb +11 -0
  57. data/lib/rouge/lexers/nasm.rb +42 -168
  58. data/lib/rouge/lexers/nesasm.rb +78 -0
  59. data/lib/rouge/lexers/nginx.rb +1 -1
  60. data/lib/rouge/lexers/objective_c.rb +3 -172
  61. data/lib/rouge/lexers/objective_c/common.rb +184 -0
  62. data/lib/rouge/lexers/objective_cpp.rb +31 -0
  63. data/lib/rouge/lexers/pascal.rb +1 -1
  64. data/lib/rouge/lexers/php.rb +47 -32
  65. data/lib/rouge/lexers/pony.rb +1 -1
  66. data/lib/rouge/lexers/powershell.rb +5 -0
  67. data/lib/rouge/lexers/protobuf.rb +1 -1
  68. data/lib/rouge/lexers/python.rb +68 -58
  69. data/lib/rouge/lexers/racket.rb +24 -1
  70. data/lib/rouge/lexers/rego.rb +45 -0
  71. data/lib/rouge/lexers/ruby.rb +16 -3
  72. data/lib/rouge/lexers/rust.rb +3 -11
  73. data/lib/rouge/lexers/scala.rb +4 -4
  74. data/lib/rouge/lexers/shell.rb +1 -1
  75. data/lib/rouge/lexers/sieve.rb +1 -1
  76. data/lib/rouge/lexers/slice.rb +32 -0
  77. data/lib/rouge/lexers/solidity.rb +185 -0
  78. data/lib/rouge/lexers/sqf.rb +2 -2
  79. data/lib/rouge/lexers/swift.rb +2 -1
  80. data/lib/rouge/lexers/terraform.rb +15 -0
  81. data/lib/rouge/lexers/toml.rb +39 -1
  82. data/lib/rouge/lexers/typescript.rb +11 -0
  83. data/lib/rouge/lexers/varnish.rb +168 -0
  84. data/lib/rouge/lexers/verilog.rb +1 -1
  85. data/lib/rouge/lexers/viml.rb +1 -1
  86. data/lib/rouge/lexers/vue.rb +4 -1
  87. data/lib/rouge/lexers/yang.rb +147 -0
  88. data/lib/rouge/version.rb +1 -1
  89. metadata +37 -6
  90. data/lib/rouge/lexers/apache/keywords.yml +0 -764
  91. data/lib/rouge/lexers/lasso/keywords.yml +0 -446
  92. data/lib/rouge/lexers/matlab/builtins.yml +0 -3515
@@ -0,0 +1,184 @@
1
+ # -*- coding: utf-8 -*- #
2
+ # frozen_string_literal: true
3
+
4
+ module Rouge
5
+ module Lexers
6
+ module ObjectiveCCommon
7
+ id = /[a-z$_][a-z0-9$_]*/i
8
+
9
+ def at_keywords
10
+ @at_keywords ||= %w(
11
+ selector private protected public encode synchronized try
12
+ throw catch finally end property synthesize dynamic optional
13
+ interface implementation import autoreleasepool
14
+ )
15
+ end
16
+
17
+ def at_builtins
18
+ @at_builtins ||= %w(true false YES NO)
19
+ end
20
+
21
+ def builtins
22
+ @builtins ||= %w(YES NO nil)
23
+ end
24
+
25
+ def self.extended(base)
26
+ base.prepend :statements do
27
+ rule %r/@"/, base::Str, :string
28
+ rule %r/@'(\\[0-7]{1,3}|\\x[a-fA-F0-9]{1,2}|\\.|[^\\'\n]')/,
29
+ base::Str::Char
30
+ rule %r/@(\d+[.]\d*|[.]\d+|\d+)e[+-]?\d+l?/i,
31
+ base::Num::Float
32
+ rule %r/@(\d+[.]\d*|[.]\d+|\d+f)f?/i, base::Num::Float
33
+ rule %r/@0x\h+[lL]?/, base::Num::Hex
34
+ rule %r/@0[0-7]+l?/i, base::Num::Oct
35
+ rule %r/@\d+l?/, base::Num::Integer
36
+ rule %r/\bin\b/, base::Keyword
37
+
38
+ rule %r/@(?:interface|implementation)\b/, base::Keyword, :objc_classname
39
+ rule %r/@(?:class|protocol)\b/, base::Keyword, :forward_classname
40
+
41
+ rule %r/@([[:alnum:]]+)/ do |m|
42
+ if base.at_keywords.include? m[1]
43
+ token base::Keyword
44
+ elsif base.at_builtins.include? m[1]
45
+ token base::Name::Builtin
46
+ else
47
+ token base::Error
48
+ end
49
+ end
50
+
51
+ rule %r/[?]/, base::Punctuation, :ternary
52
+ rule %r/\[/, base::Punctuation, :message
53
+ rule %r/@\[/, base::Punctuation, :array_literal
54
+ rule %r/@\{/, base::Punctuation, :dictionary_literal
55
+ end
56
+
57
+ id = /[a-z$_][a-z0-9$_]*/i
58
+
59
+ base.state :ternary do
60
+ rule %r/:/, base::Punctuation, :pop!
61
+ mixin :statements
62
+ end
63
+
64
+ base.state :message_shared do
65
+ rule %r/\]/, base::Punctuation, :pop!
66
+ rule %r/\{/, base::Punctuation, :pop!
67
+ rule %r/;/, base::Error
68
+
69
+ mixin :statements
70
+ end
71
+
72
+ base.state :message do
73
+ rule %r/(#{id})(\s*)(:)/ do
74
+ groups(base::Name::Function, base::Text, base::Punctuation)
75
+ goto :message_with_args
76
+ end
77
+
78
+ rule %r/(#{id})(\s*)(\])/ do
79
+ groups(base::Name::Function, base::Text, base::Punctuation)
80
+ pop!
81
+ end
82
+
83
+ mixin :message_shared
84
+ end
85
+
86
+ base.state :message_with_args do
87
+ rule %r/\{/, base::Punctuation, :function
88
+ rule %r/(#{id})(\s*)(:)/ do
89
+ groups(base::Name::Function, base::Text, base::Punctuation)
90
+ pop!
91
+ end
92
+
93
+ mixin :message_shared
94
+ end
95
+
96
+ base.state :array_literal do
97
+ rule %r/]/, base::Punctuation, :pop!
98
+ rule %r/,/, base::Punctuation
99
+ mixin :statements
100
+ end
101
+
102
+ base.state :dictionary_literal do
103
+ rule %r/}/, base::Punctuation, :pop!
104
+ rule %r/,/, base::Punctuation
105
+ mixin :statements
106
+ end
107
+
108
+ base.state :objc_classname do
109
+ mixin :whitespace
110
+
111
+ rule %r/(#{id})(\s*)(:)(\s*)(#{id})/ do
112
+ groups(base::Name::Class, base::Text,
113
+ base::Punctuation, base::Text,
114
+ base::Name::Class)
115
+ pop!
116
+ end
117
+
118
+ rule %r/(#{id})(\s*)([(])(\s*)(#{id})(\s*)([)])/ do
119
+ groups(base::Name::Class, base::Text,
120
+ base::Punctuation, base::Text,
121
+ base::Name::Label, base::Text,
122
+ base::Punctuation)
123
+ pop!
124
+ end
125
+
126
+ rule id, base::Name::Class, :pop!
127
+ end
128
+
129
+ base.state :forward_classname do
130
+ mixin :whitespace
131
+
132
+ rule %r/(#{id})(\s*)(,)(\s*)/ do
133
+ groups(base::Name::Class, base::Text, base::Punctuation, base::Text)
134
+ push
135
+ end
136
+
137
+ rule %r/(#{id})(\s*)(;?)/ do
138
+ groups(base::Name::Class, base::Text, base::Punctuation)
139
+ pop!
140
+ end
141
+ end
142
+
143
+ base.prepend :root do
144
+ rule %r(
145
+ ([-+])(\s*)
146
+ ([(].*?[)])?(\s*)
147
+ (?=#{id}:?)
148
+ )ix do |m|
149
+ token base::Keyword, m[1]
150
+ token base::Text, m[2]
151
+ recurse(m[3]) if m[3]
152
+ token base::Text, m[4]
153
+ push :method_definition
154
+ end
155
+ end
156
+
157
+ base.state :method_definition do
158
+ rule %r/,/, base::Punctuation
159
+ rule %r/[.][.][.]/, base::Punctuation
160
+ rule %r/([(].*?[)])(#{id})/ do |m|
161
+ recurse m[1]; token base::Name::Variable, m[2]
162
+ end
163
+
164
+ rule %r/(#{id})(\s*)(:)/m do
165
+ groups(base::Name::Function, base::Text, base::Punctuation)
166
+ end
167
+
168
+ rule %r/;/, base::Punctuation, :pop!
169
+
170
+ rule %r/{/ do
171
+ token base::Punctuation
172
+ goto :function
173
+ end
174
+
175
+ mixin :inline_whitespace
176
+ rule %r(//.*?\n), base::Comment::Single
177
+ rule %r/\s+/m, base::Text
178
+
179
+ rule(//) { pop! }
180
+ end
181
+ end
182
+ end
183
+ end
184
+ end
@@ -0,0 +1,31 @@
1
+ # -*- coding: utf-8 -*- #
2
+ # frozen_string_literal: true
3
+
4
+ module Rouge
5
+ module Lexers
6
+ load_lexer 'cpp.rb'
7
+ load_lexer 'objective_c/common.rb'
8
+
9
+ class ObjectiveCpp < Cpp
10
+ extend ObjectiveCCommon
11
+
12
+ tag 'objective_cpp'
13
+ title "Objective-C++"
14
+ desc 'an extension of C++ uncommonly used to write Apple software'
15
+ aliases 'objcpp', 'obj-cpp', 'obj_cpp', 'objectivecpp',
16
+ 'objc++', 'obj-c++', 'obj_c++', 'objectivec++'
17
+ filenames '*.mm', '*.h'
18
+
19
+ mimetypes 'text/x-objective-c++', 'application/x-objective-c++'
20
+
21
+ prepend :statements do
22
+ rule %r/(\.)(class)/ do
23
+ groups(Operator, Name::Builtin::Pseudo)
24
+ end
25
+ rule %r/(@selector)(\()(class)(\))/ do
26
+ groups(Keyword, Punctuation, Name::Builtin::Pseudo, Punctuation)
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -7,7 +7,7 @@ module Rouge
7
7
  tag 'pascal'
8
8
  title "Pascal"
9
9
  desc 'a procedural programming language commonly used as a teaching language.'
10
- filenames '*.pas'
10
+ filenames '*.pas', '*.lpr'
11
11
 
12
12
  mimetypes 'text/x-pascal'
13
13
 
@@ -29,7 +29,7 @@ module Rouge
29
29
  end
30
30
 
31
31
  def self.builtins
32
- load File.join(__dir__, 'php/builtins.rb')
32
+ load File.join(Lexers::BASE_DIR, 'php/builtins.rb')
33
33
  self.builtins
34
34
  end
35
35
 
@@ -63,16 +63,23 @@ module Rouge
63
63
  end
64
64
 
65
65
  def self.keywords
66
+ # (echo parent ; echo self ; sed -nE 's/<ST_IN_SCRIPTING>"((__)?[[:alpha:]_]+(__)?)".*/\1/p' zend_language_scanner.l | tr '[A-Z]' '[a-z]') | sort -u | grep -Fwv -e isset -e unset -e empty -e const -e use -e function -e namespace
67
+ # - isset, unset and empty are actually keywords (directly handled by PHP's lexer but let's pretend these are functions, you use them like so)
68
+ # - self and parent are kind of keywords, they are not handled by PHP's lexer
69
+ # - use, const, namespace and function are handled by specific rules to highlight what's next to the keyword
70
+ # - class is also listed here, in addition to the rule below, to handle anonymous classes
66
71
  @keywords ||= Set.new %w(
67
- and E_PARSE old_function E_ERROR or as E_WARNING parent eval
68
- PHP_OS break exit case extends PHP_VERSION cfunction FALSE
69
- print for require continue foreach require_once declare return
70
- default static do switch die stdClass echo else TRUE elseif
71
- var empty if xor enddeclare include virtual endfor include_once
72
- while endforeach global __FILE__ endif list __LINE__ endswitch
73
- new __sleep endwhile not array __wakeup E_ALL NULL final
74
- php_user_filter interface implements public private protected
75
- abstract clone try catch finally throw this use namespace yield
72
+ old_function cfunction
73
+ __class__ __dir__ __file__ __function__ __halt_compiler
74
+ __line__ __method__ __namespace__ __trait__ abstract and
75
+ array as break callable case catch class clone continue
76
+ declare default die do echo else elseif enddeclare
77
+ endfor endforeach endif endswitch endwhile eval exit
78
+ extends final finally fn for foreach global goto if
79
+ implements include include_once instanceof insteadof
80
+ interface list new or parent print private protected
81
+ public require require_once return self static switch
82
+ throw trait try var while xor yield
76
83
  )
77
84
  end
78
85
 
@@ -85,49 +92,51 @@ module Rouge
85
92
  state :root do
86
93
  # some extremely rough heuristics to decide whether to start inline or not
87
94
  rule(/\s*(?=<)/m) { delegate parent; push :template }
88
- rule(/[^$]+(?=<\?(php|=))/) { delegate parent; push :template }
95
+ rule(/[^$]+(?=<\?(php|=))/i) { delegate parent; push :template }
89
96
 
90
97
  rule(//) { push :template; push :php }
91
98
  end
92
99
 
93
100
  state :template do
94
- rule %r/<\?(php|=)?/, Comment::Preproc, :php
101
+ rule %r/<\?(php|=)?/i, Comment::Preproc, :php
95
102
  rule(/.*?(?=<\?)|.*/m) { delegate parent }
96
103
  end
97
104
 
98
105
  state :php do
99
106
  rule %r/\?>/, Comment::Preproc, :pop!
100
107
  # heredocs
101
- rule %r/<<<('?)(#{id})\1\n.*?\n\s*\2;?/im, Str::Heredoc
108
+ rule %r/<<<(["']?)(#{id})\1\n.*?\n\s*\2;?/im, Str::Heredoc
102
109
  rule %r/\s+/, Text
103
110
  rule %r/#.*?$/, Comment::Single
104
111
  rule %r(//.*?$), Comment::Single
105
112
  rule %r(/\*\*(?!/).*?\*/)m, Comment::Doc
106
113
  rule %r(/\*.*?\*/)m, Comment::Multiline
107
-
114
+
108
115
  rule %r/(->|::)(\s*)(#{id})/ do
109
116
  groups Operator, Text, Name::Attribute
110
117
  end
111
118
 
112
- rule %r/[~!%^&*+=\|:.<>\/?@-]+/, Operator
119
+ rule %r/(void|\??(int|float|bool|string|iterable|self|callable))\b/i, Keyword::Type
120
+ rule %r/[~!%^&*+=\|:.<>\/@-]+/, Operator
121
+ rule %r/\?/, Operator
113
122
  rule %r/[\[\]{}();,]/, Punctuation
114
- rule %r/(class|interface|trait)(\s+)(#{nsid})/ do
123
+ rule %r/(class|interface|trait)(\s+)(#{nsid})/i do
115
124
  groups Keyword::Declaration, Text, Name::Class
116
125
  end
117
- rule %r/(use)(\s+)(function|const|)(\s*)(#{nsid})/ do
126
+ rule %r/(use)(\s+)(function|const|)(\s*)(#{nsid})/i do
118
127
  groups Keyword::Namespace, Text, Keyword::Namespace, Text, Name::Namespace
119
128
  push :use
120
129
  end
121
- rule %r/(namespace)(\s+)(#{nsid})/ do
130
+ rule %r/(namespace)(\s+)(#{nsid})/i do
122
131
  groups Keyword::Namespace, Text, Name::Namespace
123
132
  end
124
133
  # anonymous functions
125
- rule %r/(function)(\s*)(?=\()/ do
134
+ rule %r/(function)(\s*)(?=\()/i do
126
135
  groups Keyword, Text
127
136
  end
128
137
 
129
138
  # named functions
130
- rule %r/(function)(\s+)(&?)(\s*)/ do
139
+ rule %r/(function)(\s+)(&?)(\s*)/i do
131
140
  groups Keyword, Text, Operator, Text
132
141
  push :funcname
133
142
  end
@@ -136,13 +145,18 @@ module Rouge
136
145
  groups Keyword, Text, Name::Constant
137
146
  end
138
147
 
139
- rule %r/(true|false|null)\b/, Keyword::Constant
148
+ rule %r/stdClass\b/i, Name::Class
149
+ rule %r/(true|false|null)\b/i, Keyword::Constant
150
+ rule %r/(E|PHP)(_[[:upper:]]+)+\b/, Keyword::Constant
140
151
  rule %r/\$\{\$+#{id}\}/i, Name::Variable
141
152
  rule %r/\$+#{id}/i, Name::Variable
153
+ rule %r/(yield)([ \n\r\t]+)(from)/i do
154
+ groups Keyword, Text, Keyword
155
+ end
142
156
 
143
157
  # may be intercepted for builtin highlighting
144
158
  rule %r/\\?#{nsid}/i do |m|
145
- name = m[0]
159
+ name = m[0].downcase
146
160
 
147
161
  if self.class.keywords.include? name
148
162
  token Keyword
@@ -153,30 +167,30 @@ module Rouge
153
167
  end
154
168
  end
155
169
 
156
- rule %r/(\d+\.\d*|\d*\.\d+)(e[+-]?\d+)?/i, Num::Float
157
- rule %r/\d+e[+-]?\d+/i, Num::Float
158
- rule %r/0[0-7]+/, Num::Oct
159
- rule %r/0x[a-f0-9]+/i, Num::Hex
160
- rule %r/\d+/, Num::Integer
170
+ rule %r/(\d[_\d]*)?\.(\d[_\d]*)?(e[+-]?\d[_\d]*)?/i, Num::Float
171
+ rule %r/0[0-7][0-7_]*/, Num::Oct
172
+ rule %r/0b[01][01_]*/i, Num::Bin
173
+ rule %r/0x[a-f0-9][a-f0-9_]*/i, Num::Hex
174
+ rule %r/\d[_\d]*/, Num::Integer
161
175
  rule %r/'([^'\\]*(?:\\.[^'\\]*)*)'/, Str::Single
162
176
  rule %r/`([^`\\]*(?:\\.[^`\\]*)*)`/, Str::Backtick
163
177
  rule %r/"/, Str::Double, :string
164
178
  end
165
-
179
+
166
180
  state :use do
167
- rule %r/(\s+)(as)(\s+)(#{id})/ do
181
+ rule %r/(\s+)(as)(\s+)(#{id})/i do
168
182
  groups Text, Keyword, Text, Name
169
183
  :pop!
170
184
  end
171
185
  rule %r/\\\{/, Operator, :uselist
172
186
  rule %r/;/, Punctuation, :pop!
173
187
  end
174
-
188
+
175
189
  state :uselist do
176
190
  rule %r/\s+/, Text
177
191
  rule %r/,/, Operator
178
192
  rule %r/\}/, Operator, :pop!
179
- rule %r/(as)(\s+)(#{id})/ do
193
+ rule %r/(as)(\s+)(#{id})/i do
180
194
  groups Keyword, Text, Name
181
195
  end
182
196
  rule %r/#{id}/, Name::Namespace
@@ -189,7 +203,8 @@ module Rouge
189
203
  state :string do
190
204
  rule %r/"/, Str::Double, :pop!
191
205
  rule %r/[^\\{$"]+/, Str::Double
192
- rule %r/\\([nrt\"$\\]|[0-7]{1,3}|x[0-9A-Fa-f]{1,2})/,
206
+ rule %r/\\u\{[0-9a-fA-F]+\}/, Str::Escape
207
+ rule %r/\\([efrntv\"$\\]|[0-7]{1,3}|[xX][0-9a-fA-F]{1,2})/,
193
208
  Str::Escape
194
209
  rule %r/\$#{id}(\[\S+\]|->#{id})?/, Name::Variable
195
210
 
@@ -46,7 +46,7 @@ module Rouge
46
46
  state :root do
47
47
  mixin :whitespace
48
48
  rule %r/"""/, Str::Doc, :docstring
49
- rule %r{//(.*?)\n}, Comment::Single
49
+ rule %r{//.*}, Comment::Single
50
50
  rule %r{/(\\\n)?[*](.|\n)*?[*](\\\n)?/}, Comment::Multiline
51
51
  rule %r/"/, Str, :string
52
52
  rule %r([~!%^&*+=\|?:<>/-]), Operator
@@ -201,6 +201,11 @@ module Rouge
201
201
  rule %r/(?:#{KEYWORDS})\b(?![-.])/i, Keyword::Reserved
202
202
 
203
203
  rule %r/-{1,2}\w+/, Name::Tag
204
+
205
+ rule %r/(\.)?([-\w]+)(\[)/ do |m|
206
+ groups Operator, Name::Function, Punctuation
207
+ push :bracket
208
+ end
204
209
 
205
210
  rule %r/([\/\\~\w][-.:\/\\~\w]*)(\n)?/ do |m|
206
211
  groups Name::Function, Text::Whitespace
@@ -17,7 +17,7 @@ module Rouge
17
17
  state :root do
18
18
  rule %r/[\s]+/, Text
19
19
  rule %r/[,;{}\[\]()]/, Punctuation
20
- rule %r/\/(\\\n)?\/(\n|(.|\n)*?[^\\]\n)/, Comment::Single
20
+ rule %r/\/(\\\n)?\/($|(.|\n)*?[^\\]$)/, Comment::Single
21
21
  rule %r/\/(\\\n)?\*(.|\n)*?\*(\\\n)?\//, Comment::Multiline
22
22
  rule kw, Keyword
23
23
  rule datatype, Keyword::Type
@@ -8,7 +8,8 @@ module Rouge
8
8
  desc "The Python programming language (python.org)"
9
9
  tag 'python'
10
10
  aliases 'py'
11
- filenames '*.py', '*.pyw', '*.sc', 'SConstruct', 'SConscript', '*.tac'
11
+ filenames '*.py', '*.pyw', '*.sc', 'SConstruct', 'SConscript', '*.tac',
12
+ '*.bzl', 'BUCK', 'BUILD', 'BUILD.bazel', 'WORKSPACE'
12
13
  mimetypes 'text/x-python', 'application/x-python'
13
14
 
14
15
  def self.detect?(text)
@@ -68,6 +69,11 @@ module Rouge
68
69
 
69
70
  identifier = /[a-z_][a-z0-9_]*/i
70
71
  dotted_identifier = /[a-z_.][a-z0-9_.]*/i
72
+
73
+ def current_string
74
+ @string_register ||= StringRegister.new
75
+ end
76
+
71
77
  state :root do
72
78
  rule %r/\n+/m, Text
73
79
  rule %r/^(:)(\s*)([ru]{,2}""".*?""")/mi do
@@ -76,14 +82,13 @@ module Rouge
76
82
 
77
83
  rule %r/[^\S\n]+/, Text
78
84
  rule %r(#(.*)?\n?), Comment::Single
79
- rule %r/[\[\]{}:(),;]/, Punctuation
85
+ rule %r/[\[\]{}:(),;.]/, Punctuation
80
86
  rule %r/\\\n/, Text
81
87
  rule %r/\\/, Text
82
88
 
83
89
  rule %r/(in|is|and|or|not)\b/, Operator::Word
84
90
  rule %r/(<<|>>|\/\/|\*\*)=?/, Operator
85
91
  rule %r/[-~+\/*%=<>&^|@]=?|!=/, Operator
86
- rule %r/\.(?![0-9])/, Operator # so it doesn't match float literals
87
92
 
88
93
  rule %r/(from)((?:\\\s|\s)+)(#{dotted_identifier})((?:\\\s|\s)+)(import)/ do
89
94
  groups Keyword::Namespace,
@@ -109,14 +114,11 @@ module Rouge
109
114
 
110
115
  # TODO: not in python 3
111
116
  rule %r/`.*?`/, Str::Backtick
112
- rule %r/(?:r|ur|ru)"""/i, Str, :raw_tdqs
113
- rule %r/(?:r|ur|ru)'''/i, Str, :raw_tsqs
114
- rule %r/(?:r|ur|ru)"/i, Str, :raw_dqs
115
- rule %r/(?:r|ur|ru)'/i, Str, :raw_sqs
116
- rule %r/u?"""/i, Str, :tdqs
117
- rule %r/u?'''/i, Str, :tsqs
118
- rule %r/u?"/i, Str, :dqs
119
- rule %r/u?'/i, Str, :sqs
117
+ rule %r/([rfbu]{0,2})('''|"""|['"])/i do |m|
118
+ token Str
119
+ current_string.register type: m[1].downcase, delim: m[2]
120
+ push :generic_string
121
+ end
120
122
 
121
123
  rule %r/@#{dotted_identifier}/i, Name::Decorator
122
124
 
@@ -172,26 +174,39 @@ module Rouge
172
174
  mixin :raise
173
175
  end
174
176
 
175
- state :strings do
176
- rule %r/%(\([a-z0-9_]+\))?[-#0 +]*([0-9]+|[*])?(\.([0-9]+|[*]))?/i, Str::Interpol
177
- end
177
+ state :generic_string do
178
+ rule %r/[^'"\\{]+/, Str
179
+ rule %r/{{/, Str
178
180
 
179
- state :strings_double do
180
- rule %r/[^\\"%\n]+/, Str
181
- mixin :strings
182
- end
181
+ rule %r/'''|"""|['"]/ do |m|
182
+ token Str
183
+ if current_string.delim? m[0]
184
+ current_string.remove
185
+ pop!
186
+ end
187
+ end
183
188
 
184
- state :strings_single do
185
- rule %r/[^\\'%\n]+/, Str
186
- mixin :strings
187
- end
189
+ rule %r/\\/ do |m|
190
+ if current_string.type? "r"
191
+ token Str
192
+ else
193
+ token Str::Interpol
194
+ end
195
+ push :generic_escape
196
+ end
188
197
 
189
- state :nl do
190
- rule %r/\n/, Str
198
+ rule %r/{/ do |m|
199
+ if current_string.type? "f"
200
+ token Str::Interpol
201
+ push :generic_interpol
202
+ else
203
+ token Str
204
+ end
205
+ end
191
206
  end
192
207
 
193
- state :escape do
194
- rule %r(\\
208
+ state :generic_escape do
209
+ rule %r(
195
210
  ( [\\abfnrtv"']
196
211
  | \n
197
212
  | N{[a-zA-Z][a-zA-Z ]+[a-zA-Z]}
@@ -200,48 +215,43 @@ module Rouge
200
215
  | x[a-fA-F0-9]{2}
201
216
  | [0-7]{1,3}
202
217
  )
203
- )x, Str::Escape
204
- end
205
-
206
- state :raw_escape do
207
- rule %r/\\./, Str
218
+ )x do
219
+ if current_string.type? "r"
220
+ token Str
221
+ else
222
+ token Str::Escape
223
+ end
224
+ pop!
225
+ end
208
226
  end
209
227
 
210
- state :dqs do
211
- rule %r/"/, Str, :pop!
212
- mixin :escape
213
- mixin :strings_double
228
+ state :generic_interpol do
229
+ rule %r/[^{}]+/ do |m|
230
+ recurse m[0]
231
+ end
232
+ rule %r/{/, Str::Interpol, :generic_interpol
233
+ rule %r/}/, Str::Interpol, :pop!
214
234
  end
215
235
 
216
- state :sqs do
217
- rule %r/'/, Str, :pop!
218
- mixin :escape
219
- mixin :strings_single
220
- end
236
+ class StringRegister < Array
237
+ def delim?(delim)
238
+ self.last[1] == delim
239
+ end
221
240
 
222
- state :tdqs do
223
- rule %r/"""/, Str, :pop!
224
- rule %r/"/, Str
225
- mixin :escape
226
- mixin :strings_double
227
- mixin :nl
228
- end
241
+ def register(type: "u", delim: "'")
242
+ self.push [type, delim]
243
+ end
229
244
 
230
- state :tsqs do
231
- rule %r/'''/, Str, :pop!
232
- rule %r/'/, Str
233
- mixin :escape
234
- mixin :strings_single
235
- mixin :nl
236
- end
245
+ def remove
246
+ self.pop
247
+ end
237
248
 
238
- %w(tdqs tsqs dqs sqs).each do |qtype|
239
- state :"raw_#{qtype}" do
240
- mixin :raw_escape
241
- mixin :"#{qtype}"
249
+ def type?(type)
250
+ self.last[0].include? type
242
251
  end
243
252
  end
244
253
 
254
+ private_constant :StringRegister
245
255
  end
246
256
  end
247
257
  end