rouge 3.2.0 → 3.18.0

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 (316) hide show
  1. checksums.yaml +5 -5
  2. data/Gemfile +17 -3
  3. data/bin/rougify +1 -0
  4. data/lib/rouge.rb +67 -43
  5. data/lib/rouge/cli.rb +84 -17
  6. data/lib/rouge/demos/ada +26 -0
  7. data/lib/rouge/demos/apex +9 -0
  8. data/lib/rouge/demos/armasm +12 -0
  9. data/lib/rouge/demos/batchfile +3 -0
  10. data/lib/rouge/demos/bbcbasic +6 -0
  11. data/lib/rouge/demos/bpf +7 -0
  12. data/lib/rouge/demos/brainfuck +5 -0
  13. data/lib/rouge/demos/clean +6 -0
  14. data/lib/rouge/demos/cmhg +8 -0
  15. data/lib/rouge/demos/csvs +8 -0
  16. data/lib/rouge/demos/cuda +11 -0
  17. data/lib/rouge/demos/cypher +5 -0
  18. data/lib/rouge/demos/cython +6 -0
  19. data/lib/rouge/demos/datastudio +21 -0
  20. data/lib/rouge/demos/ecl +18 -0
  21. data/lib/rouge/demos/eex +1 -0
  22. data/lib/rouge/demos/epp +4 -0
  23. data/lib/rouge/demos/escape +3 -0
  24. data/lib/rouge/demos/freefem +16 -0
  25. data/lib/rouge/demos/gdscript +18 -0
  26. data/lib/rouge/demos/ghc-cmm +23 -0
  27. data/lib/rouge/demos/ghc-core +26 -0
  28. data/lib/rouge/demos/haxe +5 -0
  29. data/lib/rouge/demos/hocon +8 -0
  30. data/lib/rouge/demos/hql +5 -0
  31. data/lib/rouge/demos/isbl +4 -0
  32. data/lib/rouge/demos/jsl +3 -0
  33. data/lib/rouge/demos/jsp +29 -0
  34. data/lib/rouge/demos/liquid +0 -1
  35. data/lib/rouge/demos/lustre +6 -0
  36. data/lib/rouge/demos/lutin +18 -0
  37. data/lib/rouge/demos/m68k +16 -0
  38. data/lib/rouge/demos/magik +6 -0
  39. data/lib/rouge/demos/mason +22 -0
  40. data/lib/rouge/demos/mathematica +8 -0
  41. data/lib/rouge/demos/minizinc +23 -0
  42. data/lib/rouge/demos/msgtrans +4 -0
  43. data/lib/rouge/demos/nasm +6 -6
  44. data/lib/rouge/demos/nesasm +11 -0
  45. data/lib/rouge/demos/objective_cpp +17 -0
  46. data/lib/rouge/demos/openedge +4 -0
  47. data/lib/rouge/demos/opentype_feature_file +6 -0
  48. data/lib/rouge/demos/plist +1 -132
  49. data/lib/rouge/demos/powershell +12 -48
  50. data/lib/rouge/demos/q +6 -0
  51. data/lib/rouge/demos/reasonml +12 -0
  52. data/lib/rouge/demos/rego +8 -0
  53. data/lib/rouge/demos/robot_framework +27 -0
  54. data/lib/rouge/demos/sas +13 -0
  55. data/lib/rouge/demos/slice +10 -0
  56. data/lib/rouge/demos/solidity +13 -0
  57. data/lib/rouge/demos/sparql +6 -0
  58. data/lib/rouge/demos/sqf +14 -0
  59. data/lib/rouge/demos/supercollider +11 -0
  60. data/lib/rouge/demos/terraform +0 -15
  61. data/lib/rouge/demos/ttcn3 +6 -0
  62. data/lib/rouge/demos/vcl +12 -0
  63. data/lib/rouge/demos/xojo +14 -0
  64. data/lib/rouge/demos/xpath +2 -0
  65. data/lib/rouge/demos/xquery +22 -0
  66. data/lib/rouge/demos/yang +17 -0
  67. data/lib/rouge/formatter.rb +39 -2
  68. data/lib/rouge/formatters/html.rb +21 -2
  69. data/lib/rouge/formatters/html_inline.rb +1 -0
  70. data/lib/rouge/formatters/html_legacy.rb +1 -0
  71. data/lib/rouge/formatters/html_line_table.rb +53 -0
  72. data/lib/rouge/formatters/html_linewise.rb +7 -11
  73. data/lib/rouge/formatters/html_pygments.rb +2 -0
  74. data/lib/rouge/formatters/html_table.rb +21 -31
  75. data/lib/rouge/formatters/null.rb +1 -0
  76. data/lib/rouge/formatters/terminal256.rb +23 -5
  77. data/lib/rouge/formatters/terminal_truecolor.rb +37 -0
  78. data/lib/rouge/formatters/tex.rb +92 -0
  79. data/lib/rouge/guesser.rb +2 -0
  80. data/lib/rouge/guessers/disambiguation.rb +35 -0
  81. data/lib/rouge/guessers/filename.rb +2 -0
  82. data/lib/rouge/guessers/glob_mapping.rb +3 -1
  83. data/lib/rouge/guessers/mimetype.rb +2 -0
  84. data/lib/rouge/guessers/modeline.rb +3 -1
  85. data/lib/rouge/guessers/source.rb +3 -1
  86. data/lib/rouge/guessers/util.rb +2 -0
  87. data/lib/rouge/lexer.rb +71 -15
  88. data/lib/rouge/lexers/abap.rb +13 -11
  89. data/lib/rouge/lexers/actionscript.rb +35 -34
  90. data/lib/rouge/lexers/ada.rb +162 -0
  91. data/lib/rouge/lexers/apache.rb +13 -15
  92. data/lib/rouge/lexers/apache/keywords.rb +15 -0
  93. data/lib/rouge/lexers/apex.rb +126 -0
  94. data/lib/rouge/lexers/apiblueprint.rb +2 -0
  95. data/lib/rouge/lexers/apple_script.rb +17 -14
  96. data/lib/rouge/lexers/armasm.rb +145 -0
  97. data/lib/rouge/lexers/awk.rb +26 -25
  98. data/lib/rouge/lexers/batchfile.rb +164 -0
  99. data/lib/rouge/lexers/bbcbasic.rb +112 -0
  100. data/lib/rouge/lexers/biml.rb +6 -4
  101. data/lib/rouge/lexers/bpf.rb +118 -0
  102. data/lib/rouge/lexers/brainfuck.rb +53 -0
  103. data/lib/rouge/lexers/bsl.rb +13 -12
  104. data/lib/rouge/lexers/c.rb +35 -57
  105. data/lib/rouge/lexers/ceylon.rb +7 -34
  106. data/lib/rouge/lexers/cfscript.rb +27 -26
  107. data/lib/rouge/lexers/clean.rb +156 -0
  108. data/lib/rouge/lexers/clojure.rb +15 -14
  109. data/lib/rouge/lexers/cmake.rb +16 -14
  110. data/lib/rouge/lexers/cmhg.rb +34 -0
  111. data/lib/rouge/lexers/coffeescript.rb +90 -49
  112. data/lib/rouge/lexers/common_lisp.rb +39 -38
  113. data/lib/rouge/lexers/conf.rb +7 -6
  114. data/lib/rouge/lexers/console.rb +92 -38
  115. data/lib/rouge/lexers/coq.rb +27 -23
  116. data/lib/rouge/lexers/cpp.rb +24 -13
  117. data/lib/rouge/lexers/crystal.rb +71 -70
  118. data/lib/rouge/lexers/csharp.rb +29 -29
  119. data/lib/rouge/lexers/css.rb +24 -23
  120. data/lib/rouge/lexers/csvs.rb +44 -0
  121. data/lib/rouge/lexers/cuda.rb +35 -0
  122. data/lib/rouge/lexers/cypher.rb +108 -0
  123. data/lib/rouge/lexers/cython.rb +151 -0
  124. data/lib/rouge/lexers/d.rb +64 -63
  125. data/lib/rouge/lexers/dart.rb +34 -33
  126. data/lib/rouge/lexers/datastudio.rb +138 -0
  127. data/lib/rouge/lexers/diff.rb +10 -4
  128. data/lib/rouge/lexers/digdag.rb +3 -1
  129. data/lib/rouge/lexers/docker.rb +12 -11
  130. data/lib/rouge/lexers/dot.rb +19 -18
  131. data/lib/rouge/lexers/ecl.rb +175 -0
  132. data/lib/rouge/lexers/eex.rb +52 -0
  133. data/lib/rouge/lexers/eiffel.rb +21 -20
  134. data/lib/rouge/lexers/elixir.rb +52 -36
  135. data/lib/rouge/lexers/elm.rb +30 -29
  136. data/lib/rouge/lexers/epp.rb +51 -0
  137. data/lib/rouge/lexers/erb.rb +5 -4
  138. data/lib/rouge/lexers/erlang.rb +1 -0
  139. data/lib/rouge/lexers/escape.rb +58 -0
  140. data/lib/rouge/lexers/factor.rb +41 -40
  141. data/lib/rouge/lexers/fortran.rb +34 -32
  142. data/lib/rouge/lexers/freefem.rb +240 -0
  143. data/lib/rouge/lexers/fsharp.rb +33 -31
  144. data/lib/rouge/lexers/gdscript.rb +171 -0
  145. data/lib/rouge/lexers/ghc_cmm.rb +340 -0
  146. data/lib/rouge/lexers/ghc_core.rb +151 -0
  147. data/lib/rouge/lexers/gherkin.rb +17 -14
  148. data/lib/rouge/lexers/gherkin/keywords.rb +2 -0
  149. data/lib/rouge/lexers/glsl.rb +2 -5
  150. data/lib/rouge/lexers/go.rb +3 -2
  151. data/lib/rouge/lexers/gradle.rb +1 -0
  152. data/lib/rouge/lexers/graphql.rb +78 -60
  153. data/lib/rouge/lexers/groovy.rb +24 -25
  154. data/lib/rouge/lexers/hack.rb +2 -1
  155. data/lib/rouge/lexers/haml.rb +26 -29
  156. data/lib/rouge/lexers/handlebars.rb +32 -20
  157. data/lib/rouge/lexers/haskell.rb +67 -65
  158. data/lib/rouge/lexers/haxe.rb +246 -0
  159. data/lib/rouge/lexers/hcl.rb +26 -25
  160. data/lib/rouge/lexers/hocon.rb +86 -0
  161. data/lib/rouge/lexers/hql.rb +139 -0
  162. data/lib/rouge/lexers/html.rb +33 -31
  163. data/lib/rouge/lexers/http.rb +10 -9
  164. data/lib/rouge/lexers/hylang.rb +15 -14
  165. data/lib/rouge/lexers/idlang.rb +34 -32
  166. data/lib/rouge/lexers/igorpro.rb +32 -31
  167. data/lib/rouge/lexers/ini.rb +13 -12
  168. data/lib/rouge/lexers/io.rb +10 -9
  169. data/lib/rouge/lexers/irb.rb +6 -5
  170. data/lib/rouge/lexers/isbl.rb +97 -0
  171. data/lib/rouge/lexers/isbl/builtins.rb +17 -0
  172. data/lib/rouge/lexers/java.rb +29 -25
  173. data/lib/rouge/lexers/javascript.rb +58 -61
  174. data/lib/rouge/lexers/jinja.rb +39 -22
  175. data/lib/rouge/lexers/jsl.rb +55 -0
  176. data/lib/rouge/lexers/json.rb +54 -11
  177. data/lib/rouge/lexers/json_doc.rb +8 -5
  178. data/lib/rouge/lexers/jsonnet.rb +19 -18
  179. data/lib/rouge/lexers/jsp.rb +120 -0
  180. data/lib/rouge/lexers/jsx.rb +18 -16
  181. data/lib/rouge/lexers/julia.rb +182 -58
  182. data/lib/rouge/lexers/kotlin.rb +78 -26
  183. data/lib/rouge/lexers/lasso.rb +54 -58
  184. data/lib/rouge/lexers/lasso/keywords.rb +14 -0
  185. data/lib/rouge/lexers/liquid.rb +116 -118
  186. data/lib/rouge/lexers/literate_coffeescript.rb +3 -2
  187. data/lib/rouge/lexers/literate_haskell.rb +6 -5
  188. data/lib/rouge/lexers/llvm.rb +66 -49
  189. data/lib/rouge/lexers/lua.rb +43 -4
  190. data/lib/rouge/lexers/lua/builtins.rb +2 -0
  191. data/lib/rouge/lexers/lustre.rb +79 -0
  192. data/lib/rouge/lexers/lutin.rb +33 -0
  193. data/lib/rouge/lexers/m68k.rb +143 -0
  194. data/lib/rouge/lexers/magik.rb +127 -0
  195. data/lib/rouge/lexers/make.rb +57 -34
  196. data/lib/rouge/lexers/markdown.rb +67 -39
  197. data/lib/rouge/lexers/mason.rb +110 -0
  198. data/lib/rouge/lexers/mathematica.rb +96 -0
  199. data/lib/rouge/lexers/mathematica/builtins.rb +13 -0
  200. data/lib/rouge/lexers/matlab.rb +26 -17
  201. data/lib/rouge/lexers/matlab/builtins.rb +4 -4
  202. data/lib/rouge/lexers/minizinc.rb +87 -0
  203. data/lib/rouge/lexers/moonscript.rb +4 -3
  204. data/lib/rouge/lexers/mosel.rb +64 -63
  205. data/lib/rouge/lexers/msgtrans.rb +26 -0
  206. data/lib/rouge/lexers/mxml.rb +19 -18
  207. data/lib/rouge/lexers/nasm.rb +43 -169
  208. data/lib/rouge/lexers/nesasm.rb +78 -0
  209. data/lib/rouge/lexers/nginx.rb +15 -14
  210. data/lib/rouge/lexers/nim.rb +4 -2
  211. data/lib/rouge/lexers/nix.rb +44 -43
  212. data/lib/rouge/lexers/objective_c.rb +5 -178
  213. data/lib/rouge/lexers/objective_c/common.rb +184 -0
  214. data/lib/rouge/lexers/objective_cpp.rb +31 -0
  215. data/lib/rouge/lexers/ocaml.rb +29 -64
  216. data/lib/rouge/lexers/ocaml/common.rb +53 -0
  217. data/lib/rouge/lexers/openedge.rb +429 -0
  218. data/lib/rouge/lexers/opentype_feature_file.rb +113 -0
  219. data/lib/rouge/lexers/pascal.rb +6 -5
  220. data/lib/rouge/lexers/perl.rb +102 -67
  221. data/lib/rouge/lexers/php.rb +91 -53
  222. data/lib/rouge/lexers/php/builtins.rb +183 -174
  223. data/lib/rouge/lexers/plain_text.rb +2 -1
  224. data/lib/rouge/lexers/plist.rb +16 -14
  225. data/lib/rouge/lexers/pony.rb +21 -20
  226. data/lib/rouge/lexers/powershell.rb +190 -638
  227. data/lib/rouge/lexers/praat.rb +76 -75
  228. data/lib/rouge/lexers/prolog.rb +27 -19
  229. data/lib/rouge/lexers/prometheus.rb +32 -30
  230. data/lib/rouge/lexers/properties.rb +13 -12
  231. data/lib/rouge/lexers/protobuf.rb +23 -22
  232. data/lib/rouge/lexers/puppet.rb +33 -32
  233. data/lib/rouge/lexers/python.rb +124 -99
  234. data/lib/rouge/lexers/q.rb +17 -14
  235. data/lib/rouge/lexers/qml.rb +13 -12
  236. data/lib/rouge/lexers/r.rb +13 -13
  237. data/lib/rouge/lexers/racket.rb +47 -22
  238. data/lib/rouge/lexers/reasonml.rb +65 -0
  239. data/lib/rouge/lexers/rego.rb +45 -0
  240. data/lib/rouge/lexers/robot_framework.rb +249 -0
  241. data/lib/rouge/lexers/ruby.rb +88 -71
  242. data/lib/rouge/lexers/rust.rb +45 -44
  243. data/lib/rouge/lexers/sas.rb +563 -0
  244. data/lib/rouge/lexers/sass.rb +9 -8
  245. data/lib/rouge/lexers/sass/common.rb +41 -40
  246. data/lib/rouge/lexers/scala.rb +67 -40
  247. data/lib/rouge/lexers/scheme.rb +19 -18
  248. data/lib/rouge/lexers/scss.rb +4 -3
  249. data/lib/rouge/lexers/sed.rb +31 -30
  250. data/lib/rouge/lexers/shell.rb +67 -55
  251. data/lib/rouge/lexers/sieve.rb +10 -9
  252. data/lib/rouge/lexers/slice.rb +32 -0
  253. data/lib/rouge/lexers/slim.rb +27 -26
  254. data/lib/rouge/lexers/smalltalk.rb +34 -33
  255. data/lib/rouge/lexers/smarty.rb +20 -19
  256. data/lib/rouge/lexers/sml.rb +68 -67
  257. data/lib/rouge/lexers/solidity.rb +185 -0
  258. data/lib/rouge/lexers/sparql.rb +129 -0
  259. data/lib/rouge/lexers/sqf.rb +109 -0
  260. data/lib/rouge/lexers/sqf/commands.rb +15 -0
  261. data/lib/rouge/lexers/sql.rb +47 -26
  262. data/lib/rouge/lexers/supercollider.rb +116 -0
  263. data/lib/rouge/lexers/swift.rb +49 -44
  264. data/lib/rouge/lexers/tap.rb +22 -20
  265. data/lib/rouge/lexers/tcl.rb +28 -27
  266. data/lib/rouge/lexers/terraform.rb +37 -13
  267. data/lib/rouge/lexers/tex.rb +20 -19
  268. data/lib/rouge/lexers/toml.rb +59 -20
  269. data/lib/rouge/lexers/tsx.rb +1 -0
  270. data/lib/rouge/lexers/ttcn3.rb +119 -0
  271. data/lib/rouge/lexers/tulip.rb +38 -36
  272. data/lib/rouge/lexers/turtle.rb +36 -38
  273. data/lib/rouge/lexers/twig.rb +1 -0
  274. data/lib/rouge/lexers/typescript.rb +12 -0
  275. data/lib/rouge/lexers/typescript/common.rb +1 -0
  276. data/lib/rouge/lexers/vala.rb +19 -18
  277. data/lib/rouge/lexers/varnish.rb +168 -0
  278. data/lib/rouge/lexers/vb.rb +28 -27
  279. data/lib/rouge/lexers/verilog.rb +27 -28
  280. data/lib/rouge/lexers/vhdl.rb +12 -11
  281. data/lib/rouge/lexers/viml.rb +15 -14
  282. data/lib/rouge/lexers/viml/keywords.rb +2 -0
  283. data/lib/rouge/lexers/vue.rb +15 -10
  284. data/lib/rouge/lexers/wollok.rb +27 -26
  285. data/lib/rouge/lexers/xml.rb +18 -21
  286. data/lib/rouge/lexers/xojo.rb +61 -0
  287. data/lib/rouge/lexers/xpath.rb +332 -0
  288. data/lib/rouge/lexers/xquery.rb +145 -0
  289. data/lib/rouge/lexers/yaml.rb +64 -61
  290. data/lib/rouge/lexers/yang.rb +147 -0
  291. data/lib/rouge/plugins/redcarpet.rb +9 -2
  292. data/lib/rouge/regex_lexer.rb +27 -25
  293. data/lib/rouge/template_lexer.rb +1 -0
  294. data/lib/rouge/tex_theme_renderer.rb +132 -0
  295. data/lib/rouge/text_analyzer.rb +1 -0
  296. data/lib/rouge/theme.rb +5 -0
  297. data/lib/rouge/themes/base16.rb +1 -0
  298. data/lib/rouge/themes/bw.rb +41 -0
  299. data/lib/rouge/themes/colorful.rb +1 -0
  300. data/lib/rouge/themes/github.rb +1 -0
  301. data/lib/rouge/themes/gruvbox.rb +1 -0
  302. data/lib/rouge/themes/igor_pro.rb +1 -0
  303. data/lib/rouge/themes/magritte.rb +78 -0
  304. data/lib/rouge/themes/molokai.rb +1 -0
  305. data/lib/rouge/themes/monokai.rb +1 -0
  306. data/lib/rouge/themes/monokai_sublime.rb +4 -1
  307. data/lib/rouge/themes/pastie.rb +2 -1
  308. data/lib/rouge/themes/thankful_eyes.rb +2 -1
  309. data/lib/rouge/themes/tulip.rb +2 -1
  310. data/lib/rouge/token.rb +31 -22
  311. data/lib/rouge/util.rb +3 -2
  312. data/lib/rouge/version.rb +2 -1
  313. data/rouge.gemspec +6 -3
  314. metadata +130 -8
  315. data/lib/rouge/lexers/apache/keywords.yml +0 -764
  316. data/lib/rouge/lexers/lasso/keywords.yml +0 -446
@@ -0,0 +1,113 @@
1
+ # -*- coding: utf-8 -*- #
2
+ # frozen_string_literal: true
3
+
4
+ module Rouge
5
+ module Lexers
6
+ class OpenTypeFeatureFile < RegexLexer
7
+ title "OpenType Feature File"
8
+ desc "Feature specifications for an OpenType font (adobe-type-tools.github.io/afdko)"
9
+ tag 'opentype_feature_file'
10
+ aliases 'fea', 'opentype', 'opentypefeature'
11
+ filenames '*.fea'
12
+
13
+ def self.keywords
14
+ @keywords ||= %w(
15
+ Ascender Attach CapHeight CaretOffset CodePageRange Descender FontRevision FSType
16
+ GlyphClassDef HorizAxis.BaseScriptList HorizAxis.BaseTagList HorizAxis.MinMax
17
+ IgnoreBaseGlyphs IgnoreLigatures IgnoreMarks LigatureCaretByDev LigatureCaretByIndex
18
+ LigatureCaretByPos LineGap MarkAttachClass MarkAttachmentType NULL Panose RightToLeft
19
+ TypoAscender TypoDescender TypoLineGap UnicodeRange UseMarkFilteringSet Vendor
20
+ VertAdvanceY VertAxis.BaseScriptList VertAxis.BaseTagList VertAxis.MinMax VertOriginY
21
+ VertTypoAscender VertTypoDescender VertTypoLineGap WeightClass WidthClass XHeight
22
+
23
+ anchorDef anchor anonymous anon by contour cursive device enumerate enum
24
+ exclude_dflt featureNames feature from ignore include_dflt include languagesystem
25
+ language lookupflag lookup markClass mark nameid name parameters position pos required
26
+ reversesub rsub script sizemenuname substitute subtable sub table useExtension
27
+ valueRecordDef winAscent winDescent
28
+ )
29
+ end
30
+
31
+
32
+ identifier = %r/[a-z_][a-z0-9\/_]*/i
33
+
34
+ state :root do
35
+ rule %r/\s+/m, Text::Whitespace
36
+ rule %r/#.*$/, Comment
37
+
38
+ # feature <tag>
39
+ rule %r/(anonymous|anon|feature|lookup|table)((?:\s)+)/ do
40
+ groups Keyword, Text
41
+ push :featurename
42
+ end
43
+ # } <tag> ;
44
+ rule %r/(\})((?:\s)*)/ do
45
+ groups Punctuation, Text
46
+ push :featurename
47
+ end
48
+ # solve include( ../path)
49
+ rule %r/(include)/i, Keyword, :includepath
50
+
51
+ rule %r/[\-\[\]\/(){},.:;=%*<>']/, Punctuation
52
+
53
+ rule %r/`.*?/, Str::Backtick
54
+ rule %r/\"/, Str, :dqs
55
+
56
+ # classes, start with @<nameOfClass>
57
+ rule %r/@#{identifier}/, Name::Class
58
+
59
+ # using negative lookbehind so we don't match property names
60
+ rule %r/(?<!\.)#{identifier}/ do |m|
61
+ if self.class.keywords.include? m[0]
62
+ token Keyword
63
+ else
64
+ token Name
65
+ end
66
+ end
67
+
68
+ rule identifier, Name
69
+ rule %r/-?\d+/, Num::Integer
70
+ end
71
+
72
+ state :featurename do
73
+ rule identifier, Name::Function, :pop!
74
+ end
75
+
76
+ state :includepath do
77
+ rule %r/\s+/, Text::Whitespace
78
+ rule %r/\)/, Punctuation, :pop!
79
+ rule %r/\(/, Punctuation
80
+ rule %r/[a-z0-9\/_.]*/i, Str
81
+ end
82
+
83
+ state :strings do
84
+ rule %r/(\([a-z0-9_]+\))?[-#0 +]*([0-9]+|[*])?(\.([0-9]+|[*]))?/i, Str
85
+ end
86
+
87
+ state :strings_double do
88
+ rule %r/[^\\"%\n]+/, Str
89
+ mixin :strings
90
+ end
91
+
92
+ state :escape do
93
+ rule %r(\\
94
+ ( [\\abfnrtv"']
95
+ | \n
96
+ | N{[a-zA-z][a-zA-Z ]+[a-zA-Z]}
97
+ | u[a-fA-F0-9]{4}
98
+ | U[a-fA-F0-9]{8}
99
+ | x[a-fA-F0-9]{2}
100
+ | [0-7]{1,3}
101
+ )
102
+ )x, Str::Escape
103
+ end
104
+
105
+ state :dqs do
106
+ rule %r/"/, Str, :pop!
107
+ mixin :escape
108
+ mixin :strings_double
109
+ end
110
+
111
+ end
112
+ end
113
+ end
@@ -1,4 +1,5 @@
1
1
  # -*- coding: utf-8 -*- #
2
+ # frozen_string_literal: true
2
3
 
3
4
  module Rouge
4
5
  module Lexers
@@ -6,7 +7,7 @@ module Rouge
6
7
  tag 'pascal'
7
8
  title "Pascal"
8
9
  desc 'a procedural programming language commonly used as a teaching language.'
9
- filenames '*.pas'
10
+ filenames '*.pas', '*.lpr'
10
11
 
11
12
  mimetypes 'text/x-pascal'
12
13
 
@@ -39,7 +40,7 @@ module Rouge
39
40
 
40
41
  state :whitespace do
41
42
  # Spaces
42
- rule /\s+/m, Text
43
+ rule %r/\s+/m, Text
43
44
  # // Comments
44
45
  rule %r((//).*$\n?), Comment::Single
45
46
  # -- Comments
@@ -56,9 +57,9 @@ module Rouge
56
57
  rule %r{((0(x|X)[0-9a-fA-F]*)|(([0-9]+\.?[0-9]*)|(\.[0-9]+))((e|E)(\+|-)?[0-9]+)?)(L|l|UL|ul|u|U|F|f|ll|LL|ull|ULL)?}, Num
57
58
  rule %r{[~!@#\$%\^&\*\(\)\+`\-={}\[\]:;<>\?,\.\/\|\\]}, Punctuation
58
59
  rule %r{'([^']|'')*'}, Str
59
- rule /(true|false|nil)\b/i, Name::Builtin
60
- rule /\b(#{keywords.join('|')})\b/i, Keyword
61
- rule /\b(#{keywords_type.join('|')})\b/i, Keyword::Type
60
+ rule %r/(true|false|nil)\b/i, Name::Builtin
61
+ rule %r/\b(#{keywords.join('|')})\b/i, Keyword
62
+ rule %r/\b(#{keywords_type.join('|')})\b/i, Keyword::Type
62
63
  rule id, Name
63
64
  end
64
65
  end
@@ -1,4 +1,5 @@
1
1
  # -*- coding: utf-8 -*- #
2
+ # frozen_string_literal: true
2
3
 
3
4
  module Rouge
4
5
  module Lexers
@@ -64,113 +65,136 @@ module Rouge
64
65
  end
65
66
 
66
67
  state :root do
67
- rule /#.*?$/, Comment::Single
68
- rule /^=[a-zA-Z0-9]+\s+.*?\n=cut/m, Comment::Multiline
69
- rule /(?:#{keywords.join('|')})\b/, Keyword
68
+ rule %r/#.*?$/, Comment::Single
69
+ rule %r/^=[a-zA-Z0-9]+\s+.*?\n=cut/m, Comment::Multiline
70
+ rule %r/(?:#{keywords.join('|')})\b/, Keyword
70
71
 
71
- rule /(format)(\s+)([a-zA-Z0-9_]+)(\s*)(=)(\s*\n)/ do
72
+ rule %r/(format)(\s+)([a-zA-Z0-9_]+)(\s*)(=)(\s*\n)/ do
72
73
  groups Keyword, Text, Name, Text, Punctuation, Text
73
74
 
74
75
  push :format
75
76
  end
76
77
 
77
- rule /(?:eq|lt|gt|le|ge|ne|not|and|or|cmp)\b/, Operator::Word
78
+ rule %r/(?:eq|lt|gt|le|ge|ne|not|and|or|cmp)\b/, Operator::Word
78
79
 
79
- # common delimiters
80
- rule %r(s/(\\\\|\\/|[^/])*/(\\\\|\\/|[^/])*/[egimosx]*), re_tok
81
- rule %r(s!(\\\\|\\!|[^!])*!(\\\\|\\!|[^!])*![egimosx]*), re_tok
82
- rule %r(s\\(\\\\|[^\\])*\\(\\\\|[^\\])*\\[egimosx]*), re_tok
83
- rule %r(s@(\\\\|\\@|[^@])*@(\\\\|\\@|[^@])*@[egimosx]*), re_tok
84
- rule %r(s%(\\\\|\\%|[^%])*%(\\\\|\\%|[^%])*%[egimosx]*), re_tok
80
+ # substitution/transliteration: balanced delimiters
81
+ rule %r((?:s|tr|y){(\\\\|\\}|[^}])*}\s*), re_tok, :balanced_regex
82
+ rule %r((?:s|tr|y)<(\\\\|\\>|[^>])*>\s*), re_tok, :balanced_regex
83
+ rule %r((?:s|tr|y)\[(\\\\|\\\]|[^\]])*\]\s*), re_tok, :balanced_regex
84
+ rule %r[(?:s|tr|y)\((\\\\|\\\)|[^\)])*\)\s*], re_tok, :balanced_regex
85
85
 
86
- # balanced delimiters
87
- rule %r(s{(\\\\|\\}|[^}])*}\s*), re_tok, :balanced_regex
88
- rule %r(s<(\\\\|\\>|[^>])*>\s*), re_tok, :balanced_regex
89
- rule %r(s\[(\\\\|\\\]|[^\]])*\]\s*), re_tok, :balanced_regex
90
- rule %r[s\((\\\\|\\\)|[^\)])*\)\s*], re_tok, :balanced_regex
86
+ # substitution/transliteration: arbitrary non-whitespace delimiters
87
+ rule %r((?:s|tr|y)\s*([^\w\s])((\\\\|\\\1)|[^\1])*?\1((\\\\|\\\1)|[^\1])*?\1[msixpodualngcr]*)m, re_tok
88
+ rule %r((?:s|tr|y)\s+(\w)((\\\\|\\\1)|[^\1])*?\1((\\\\|\\\1)|[^\1])*?\1[msixpodualngcr]*)m, re_tok
91
89
 
92
- rule %r(m?/(\\\\|\\/|[^/\n])*/[gcimosx]*), re_tok
90
+ # matches: common case, m-optional
91
+ rule %r(m?/(\\\\|\\/|[^/\n])*/[msixpodualngc]*), re_tok
93
92
  rule %r(m(?=[/!\\{<\[\(@%\$])), re_tok, :balanced_regex
94
- rule %r(((?<==~)|(?<=\())\s*/(\\\\|\\/|[^/])*/[gcimosx]*),
93
+
94
+ # arbitrary non-whitespace delimiters
95
+ rule %r(m\s*([^\w\s])((\\\\|\\\1)|[^\1])*?\1[msixpodualngc]*)m, re_tok
96
+ rule %r(m\s+(\w)((\\\\|\\\1)|[^\1])*?\1[msixpodualngc]*)m, re_tok
97
+
98
+ rule %r(((?<==~)|(?<=\())\s*/(\\\\|\\/|[^/])*/[msixpodualngc]*),
95
99
  re_tok, :balanced_regex
96
100
 
97
- rule /\s+/, Text
98
- rule /(?:#{builtins.join('|')})\b/, Name::Builtin
99
- rule /((__(DATA|DIE|WARN)__)|(STD(IN|OUT|ERR)))\b/,
101
+ rule %r/\s+/, Text
102
+ rule %r/(?:#{builtins.join('|')})\b/, Name::Builtin
103
+ rule %r/((__(DIE|WARN)__)|(DATA|STD(IN|OUT|ERR)))\b/,
100
104
  Name::Builtin::Pseudo
101
105
 
102
- rule /<<([\'"]?)([a-zA-Z_][a-zA-Z0-9_]*)\1;?\n.*?\n\2\n/m, Str
106
+ rule %r/<<([\'"]?)([a-zA-Z_][a-zA-Z0-9_]*)\1;?\n.*?\n\2\n/m, Str
103
107
 
104
- rule /__END__\b/, Comment::Preproc, :end_part
105
- rule /\$\^[ADEFHILMOPSTWX]/, Name::Variable::Global
106
- rule /\$[\\"'\[\]&`+*.,;=%~?@$!<>(^\|\/-](?!\w)/, Name::Variable::Global
107
- rule /[-+\/*%=<>&^\|!\\~]=?/, Operator
108
- rule /[$@%#]+/, Name::Variable, :varname
108
+ rule %r/(__(END|DATA)__)\b/, Comment::Preproc, :end_part
109
+ rule %r/\$\^[ADEFHILMOPSTWX]/, Name::Variable::Global
110
+ rule %r/\$[\\"'\[\]&`+*.,;=%~?@$!<>(^\|\/-](?!\w)/, Name::Variable::Global
111
+ rule %r/[-+\/*%=<>&^\|!\\~]=?/, Operator
112
+ rule %r/[$@%#]+/, Name::Variable, :varname
109
113
 
110
- rule /0_?[0-7]+(_[0-7]+)*/, Num::Oct
111
- rule /0x[0-9A-Fa-f]+(_[0-9A-Fa-f]+)*/, Num::Hex
112
- rule /0b[01]+(_[01]+)*/, Num::Bin
113
- rule /(\d*(_\d*)*\.\d+(_\d*)*|\d+(_\d*)*\.\d+(_\d*)*)(e[+-]?\d+)?/i,
114
+ rule %r/0_?[0-7]+(_[0-7]+)*/, Num::Oct
115
+ rule %r/0x[0-9A-Fa-f]+(_[0-9A-Fa-f]+)*/, Num::Hex
116
+ rule %r/0b[01]+(_[01]+)*/, Num::Bin
117
+ rule %r/(\d*(_\d*)*\.\d+(_\d*)*|\d+(_\d*)*\.\d+(_\d*)*)(e[+-]?\d+)?/i,
114
118
  Num::Float
115
- rule /\d+(_\d*)*e[+-]?\d+(_\d*)*/i, Num::Float
116
- rule /\d+(_\d+)*/, Num::Integer
117
-
118
- rule /'(\\\\|\\'|[^'])*'/, Str
119
- rule /"(\\\\|\\"|[^"])*"/, Str
120
- rule /`(\\\\|\\`|[^`])*`/, Str::Backtick
121
- rule /<([^\s>]+)>/, re_tok
122
- rule /(q|qq|qw|qr|qx)\{/, Str::Other, :cb_string
123
- rule /(q|qq|qw|qr|qx)\(/, Str::Other, :rb_string
124
- rule /(q|qq|qw|qr|qx)\[/, Str::Other, :sb_string
125
- rule /(q|qq|qw|qr|qx)</, Str::Other, :lt_string
126
- rule /(q|qq|qw|qr|qx)([^a-zA-Z0-9])(.|\n)*?\2/, Str::Other
127
-
128
- rule /package\s+/, Keyword, :modulename
129
- rule /sub\s+/, Keyword, :funcname
130
- rule /\[\]|\*\*|::|<<|>>|>=|<=|<=>|={3}|!=|=~|!~|&&?|\|\||\.{1,3}/,
119
+ rule %r/\d+(_\d*)*e[+-]?\d+(_\d*)*/i, Num::Float
120
+ rule %r/\d+(_\d+)*/, Num::Integer
121
+
122
+ rule %r/'/, Punctuation, :sq
123
+ rule %r/"/, Punctuation, :dq
124
+ rule %r/`/, Punctuation, :bq
125
+ rule %r/<([^\s>]+)>/, re_tok
126
+ rule %r/(q|qq|qw|qr|qx)\{/, Str::Other, :cb_string
127
+ rule %r/(q|qq|qw|qr|qx)\(/, Str::Other, :rb_string
128
+ rule %r/(q|qq|qw|qr|qx)\[/, Str::Other, :sb_string
129
+ rule %r/(q|qq|qw|qr|qx)</, Str::Other, :lt_string
130
+ rule %r/(q|qq|qw|qr|qx)(\W)(.|\n)*?\2/, Str::Other
131
+
132
+ rule %r/package\s+/, Keyword, :modulename
133
+ rule %r/sub\s+/, Keyword, :funcname
134
+ rule %r/\[\]|\*\*|::|<<|>>|>=|<=|<=>|={3}|!=|=~|!~|&&?|\|\||\.{1,3}/,
131
135
  Operator
132
- rule /[()\[\]:;,<>\/?{}]/, Punctuation
136
+ rule %r/[()\[\]:;,<>\/?{}]/, Punctuation
133
137
  rule(/(?=\w)/) { push :name }
134
138
  end
135
139
 
136
140
  state :format do
137
- rule /\.\n/, Str::Interpol, :pop!
138
- rule /.*?\n/, Str::Interpol
141
+ rule %r/\.\n/, Str::Interpol, :pop!
142
+ rule %r/.*?\n/, Str::Interpol
139
143
  end
140
144
 
141
145
  state :name_common do
142
- rule /\w+::/, Name::Namespace
143
- rule /[\w:]+/, Name::Variable, :pop!
146
+ rule %r/\w+::/, Name::Namespace
147
+ rule %r/[\w:]+/, Name::Variable, :pop!
144
148
  end
145
149
 
146
150
  state :varname do
147
- rule /\s+/, Text
148
- rule /\{/, Punctuation, :pop! # hash syntax
149
- rule /\)|,/, Punctuation, :pop! # arg specifier
151
+ rule %r/\s+/, Text
152
+ rule %r/\{/, Punctuation, :pop! # hash syntax
153
+ rule %r/\)|,/, Punctuation, :pop! # arg specifier
150
154
  mixin :name_common
151
155
  end
152
156
 
153
157
  state :name do
154
158
  mixin :name_common
155
- rule /[A-Z_]+(?=[^a-zA-Z0-9_])/, Name::Constant, :pop!
159
+ rule %r/[A-Z_]+(?=[^a-zA-Z0-9_])/, Name::Constant, :pop!
156
160
  rule(/(?=\W)/) { pop! }
157
161
  end
158
162
 
159
163
  state :modulename do
160
- rule /[a-z_]\w*/i, Name::Namespace, :pop!
164
+ rule %r/[a-z_]\w*/i, Name::Namespace, :pop!
161
165
  end
162
166
 
163
167
  state :funcname do
164
- rule /[a-zA-Z_]\w*[!?]?/, Name::Function
165
- rule /\s+/, Text
168
+ rule %r/[a-zA-Z_]\w*[!?]?/, Name::Function
169
+ rule %r/\s+/, Text
166
170
 
167
171
  # argument declaration
168
- rule /(\([$@%]*\))(\s*)/ do
172
+ rule %r/(\([$@%]*\))(\s*)/ do
169
173
  groups Punctuation, Text
170
174
  end
171
175
 
172
- rule /.*?{/, Punctuation, :pop!
173
- rule /;/, Punctuation, :pop!
176
+ rule %r/.*?{/, Punctuation, :pop!
177
+ rule %r/;/, Punctuation, :pop!
178
+ end
179
+
180
+ state :sq do
181
+ rule %r/\\[']/, Str::Escape
182
+ rule %r/[^\\']+/, Str::Single
183
+ rule %r/'/, Punctuation, :pop!
184
+ end
185
+
186
+ state :dq do
187
+ mixin :string_intp
188
+ rule %r/\\[\\tnr"]/, Str::Escape
189
+ rule %r/[^\\"]+?/, Str::Double
190
+ rule %r/"/, Punctuation, :pop!
191
+ end
192
+
193
+ state :bq do
194
+ mixin :string_intp
195
+ rule %r/\\[\\tnr`]/, Str::Escape
196
+ rule %r/[^\\`]+?/, Str::Backtick
197
+ rule %r/`/, Punctuation, :pop!
174
198
  end
175
199
 
176
200
  [[:cb, '\{', '\}'],
@@ -179,17 +203,28 @@ module Rouge
179
203
  [:lt, '<', '>']].each do |name, open, close|
180
204
  tok = Str::Other
181
205
  state :"#{name}_string" do
182
- rule /\\[#{open}#{close}\\]/, tok
183
- rule /\\/, tok
206
+ rule %r/\\[#{open}#{close}\\]/, tok
207
+ rule %r/\\/, tok
184
208
  rule(/#{open}/) { token tok; push }
185
- rule /#{close}/, tok, :pop!
186
- rule /[^#{open}#{close}\\]+/, tok
209
+ rule %r/#{close}/, tok, :pop!
210
+ rule %r/[^#{open}#{close}\\]+/, tok
187
211
  end
188
212
  end
189
213
 
214
+ state :in_interp do
215
+ rule %r/}/, Str::Interpol, :pop!
216
+ rule %r/\s+/, Text
217
+ rule %r/[a-z_]\w*/i, Str::Interpol
218
+ end
219
+
220
+ state :string_intp do
221
+ rule %r/[$@][{]/, Str::Interpol, :in_interp
222
+ rule %r/[$@][a-z_]\w*/i, Str::Interpol
223
+ end
224
+
190
225
  state :end_part do
191
226
  # eat the rest of the stream
192
- rule /.+/m, Comment::Preproc, :pop!
227
+ rule %r/.+/m, Comment::Preproc, :pop!
193
228
  end
194
229
  end
195
230
  end
@@ -1,4 +1,5 @@
1
1
  # -*- coding: utf-8 -*- #
2
+ # frozen_string_literal: true
2
3
 
3
4
  module Rouge
4
5
  module Lexers
@@ -28,7 +29,7 @@ module Rouge
28
29
  end
29
30
 
30
31
  def self.builtins
31
- load Pathname.new(__FILE__).dirname.join('php/builtins.rb')
32
+ load File.join(Lexers::BASE_DIR, 'php/builtins.rb')
32
33
  self.builtins
33
34
  end
34
35
 
@@ -62,16 +63,23 @@ module Rouge
62
63
  end
63
64
 
64
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
65
71
  @keywords ||= Set.new %w(
66
- and E_PARSE old_function E_ERROR or as E_WARNING parent eval
67
- PHP_OS break exit case extends PHP_VERSION cfunction FALSE
68
- print for require continue foreach require_once declare return
69
- default static do switch die stdClass echo else TRUE elseif
70
- var empty if xor enddeclare include virtual endfor include_once
71
- while endforeach global __FILE__ endif list __LINE__ endswitch
72
- new __sleep endwhile not array __wakeup E_ALL NULL final
73
- php_user_filter interface implements public private protected
74
- abstract clone try catch 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
75
83
  )
76
84
  end
77
85
 
@@ -84,56 +92,71 @@ module Rouge
84
92
  state :root do
85
93
  # some extremely rough heuristics to decide whether to start inline or not
86
94
  rule(/\s*(?=<)/m) { delegate parent; push :template }
87
- rule(/[^$]+(?=<\?(php|=))/) { delegate parent; push :template }
95
+ rule(/[^$]+(?=<\?(php|=))/i) { delegate parent; push :template }
88
96
 
89
97
  rule(//) { push :template; push :php }
90
98
  end
91
99
 
92
100
  state :template do
93
- rule /<\?(php|=)?/, Comment::Preproc, :php
101
+ rule %r/<\?(php|=)?/i, Comment::Preproc, :php
94
102
  rule(/.*?(?=<\?)|.*/m) { delegate parent }
95
103
  end
96
104
 
97
105
  state :php do
98
- rule /\?>/, Comment::Preproc, :pop!
106
+ rule %r/\?>/, Comment::Preproc, :pop!
99
107
  # heredocs
100
- rule /<<<('?)(#{id})\1\n.*?\n\2;?\n/im, Str::Heredoc
101
- rule /\s+/, Text
102
- rule /#.*?$/, Comment::Single
108
+ rule %r/<<<(["']?)(#{id})\1\n.*?\n\s*\2;?/im, Str::Heredoc
109
+ rule %r/\s+/, Text
110
+ rule %r/#.*?$/, Comment::Single
103
111
  rule %r(//.*?$), Comment::Single
104
- # empty comment, otherwise seen as the start of a docstring
105
- rule %r(/\*\*/), Comment::Multiline
106
- rule %r(/\*\*.*?\*/)m, Str::Doc
112
+ rule %r(/\*\*(?!/).*?\*/)m, Comment::Doc
107
113
  rule %r(/\*.*?\*/)m, Comment::Multiline
108
- rule /(->|::)(\s*)(#{id})/ do
114
+
115
+ rule %r/(->|::)(\s*)(#{id})/ do
109
116
  groups Operator, Text, Name::Attribute
110
117
  end
111
118
 
112
- rule /[~!%^&*+=\|:.<>\/?@-]+/, Operator
113
- rule /[\[\]{}();,]/, Punctuation
114
- rule /class\b/, Keyword, :classname
119
+ rule %r/(void|\??(int|float|bool|string|iterable|self|callable))\b/i, Keyword::Type
120
+ rule %r/[~!%^&*+=\|:.<>\/@-]+/, Operator
121
+ rule %r/\?/, Operator
122
+ rule %r/[\[\]{}();,]/, Punctuation
123
+ rule %r/(class|interface|trait)(\s+)(#{nsid})/i do
124
+ groups Keyword::Declaration, Text, Name::Class
125
+ end
126
+ rule %r/(use)(\s+)(function|const|)(\s*)(#{nsid})/i do
127
+ groups Keyword::Namespace, Text, Keyword::Namespace, Text, Name::Namespace
128
+ push :use
129
+ end
130
+ rule %r/(namespace)(\s+)(#{nsid})/i do
131
+ groups Keyword::Namespace, Text, Name::Namespace
132
+ end
115
133
  # anonymous functions
116
- rule /(function)(\s*)(?=\()/ do
134
+ rule %r/(function)(\s*)(?=\()/i do
117
135
  groups Keyword, Text
118
136
  end
119
137
 
120
138
  # named functions
121
- rule /(function)(\s+)(&?)(\s*)/ do
139
+ rule %r/(function)(\s+)(&?)(\s*)/i do
122
140
  groups Keyword, Text, Operator, Text
123
141
  push :funcname
124
142
  end
125
143
 
126
- rule /(const)(\s+)(#{id})/i do
144
+ rule %r/(const)(\s+)(#{id})/i do
127
145
  groups Keyword, Text, Name::Constant
128
146
  end
129
147
 
130
- rule /(true|false|null)\b/, Keyword::Constant
131
- rule /\$\{\$+#{id}\}/i, Name::Variable
132
- rule /\$+#{id}/i, Name::Variable
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
151
+ rule %r/\$\{\$+#{id}\}/i, Name::Variable
152
+ rule %r/\$+#{id}/i, Name::Variable
153
+ rule %r/(yield)([ \n\r\t]+)(from)/i do
154
+ groups Keyword, Text, Keyword
155
+ end
133
156
 
134
157
  # may be intercepted for builtin highlighting
135
- rule /\\?#{nsid}/i do |m|
136
- name = m[0]
158
+ rule %r/\\?#{nsid}/i do |m|
159
+ name = m[0].downcase
137
160
 
138
161
  if self.class.keywords.include? name
139
162
  token Keyword
@@ -144,48 +167,63 @@ module Rouge
144
167
  end
145
168
  end
146
169
 
147
- rule /(\d+\.\d*|\d*\.\d+)(e[+-]?\d+)?/i, Num::Float
148
- rule /\d+e[+-]?\d+/i, Num::Float
149
- rule /0[0-7]+/, Num::Oct
150
- rule /0x[a-f0-9]+/i, Num::Hex
151
- rule /\d+/, Num::Integer
152
- rule /'([^'\\]*(?:\\.[^'\\]*)*)'/, Str::Single
153
- rule /`([^`\\]*(?:\\.[^`\\]*)*)`/, Str::Backtick
154
- rule /"/, Str::Double, :string
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
175
+ rule %r/'([^'\\]*(?:\\.[^'\\]*)*)'/, Str::Single
176
+ rule %r/`([^`\\]*(?:\\.[^`\\]*)*)`/, Str::Backtick
177
+ rule %r/"/, Str::Double, :string
155
178
  end
156
179
 
157
- state :classname do
158
- rule /\s+/, Text
159
- rule /#{nsid}/, Name::Class, :pop!
180
+ state :use do
181
+ rule %r/(\s+)(as)(\s+)(#{id})/i do
182
+ groups Text, Keyword, Text, Name
183
+ :pop!
184
+ end
185
+ rule %r/\\\{/, Operator, :uselist
186
+ rule %r/;/, Punctuation, :pop!
187
+ end
188
+
189
+ state :uselist do
190
+ rule %r/\s+/, Text
191
+ rule %r/,/, Operator
192
+ rule %r/\}/, Operator, :pop!
193
+ rule %r/(as)(\s+)(#{id})/i do
194
+ groups Keyword, Text, Name
195
+ end
196
+ rule %r/#{id}/, Name::Namespace
160
197
  end
161
198
 
162
199
  state :funcname do
163
- rule /#{id}/, Name::Function, :pop!
200
+ rule %r/#{id}/, Name::Function, :pop!
164
201
  end
165
202
 
166
203
  state :string do
167
- rule /"/, Str::Double, :pop!
168
- rule /[^\\{$"]+/, Str::Double
169
- rule /\\([nrt\"$\\]|[0-7]{1,3}|x[0-9A-Fa-f]{1,2})/,
204
+ rule %r/"/, Str::Double, :pop!
205
+ rule %r/[^\\{$"]+/, Str::Double
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})/,
170
208
  Str::Escape
171
- rule /\$#{id}(\[\S+\]|->#{id})?/, Name::Variable
209
+ rule %r/\$#{id}(\[\S+\]|->#{id})?/, Name::Variable
172
210
 
173
- rule /\{\$\{/, Str::Interpol, :interp_double
174
- rule /\{(?=\$)/, Str::Interpol, :interp_single
175
- rule /(\{)(\S+)(\})/ do
211
+ rule %r/\{\$\{/, Str::Interpol, :interp_double
212
+ rule %r/\{(?=\$)/, Str::Interpol, :interp_single
213
+ rule %r/(\{)(\S+)(\})/ do
176
214
  groups Str::Interpol, Name::Variable, Str::Interpol
177
215
  end
178
216
 
179
- rule /[${\\]+/, Str::Double
217
+ rule %r/[${\\]+/, Str::Double
180
218
  end
181
219
 
182
220
  state :interp_double do
183
- rule /\}\}/, Str::Interpol, :pop!
221
+ rule %r/\}\}/, Str::Interpol, :pop!
184
222
  mixin :php
185
223
  end
186
224
 
187
225
  state :interp_single do
188
- rule /\}/, Str::Interpol, :pop!
226
+ rule %r/\}/, Str::Interpol, :pop!
189
227
  mixin :php
190
228
  end
191
229
  end