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,61 @@
1
+ # -*- coding: utf-8 -*- #
2
+ # frozen_string_literal: true
3
+
4
+ module Rouge
5
+ module Lexers
6
+ class Xojo < RegexLexer
7
+ title "Xojo"
8
+ desc "Xojo"
9
+ tag 'xojo'
10
+ aliases 'realbasic'
11
+ filenames '*.xojo_code', '*.xojo_window', '*.xojo_toolbar', '*.xojo_menu', '*.xojo_image', '*.rbbas', '*.rbfrm', '*.rbmnu', '*.rbres', '*.rbtbar'
12
+
13
+ keywords = %w(
14
+ addhandler aggregates array asc assigns attributes begin break
15
+ byref byval call case catch class const continue char ctype declare
16
+ delegate dim do downto each else elseif end enum event exception
17
+ exit extends false finally for function global goto if
18
+ implements inherits interface lib loop mod module
19
+ new next nil object of optional paramarray
20
+ private property protected public raise raiseevent rect redim
21
+ removehandler return select shared soft static step sub super
22
+ then to true try until using uend uhile
23
+ )
24
+
25
+ keywords_type = %w(
26
+ boolean cfstringref cgfloat cstring curency date double int8 int16
27
+ int32 int64 integer ostype pstring ptr short single
28
+ single string structure variant uinteger uint8 uint16 uint32 uint64
29
+ ushort windowptr wstring
30
+ )
31
+
32
+ operator_words = %w(
33
+ addressof weakaddressof and as in is isa mod not or xor
34
+ )
35
+
36
+ state :root do
37
+ rule %r/\s+/, Text::Whitespace
38
+
39
+ rule %r/rem\b.*?$/i, Comment::Single
40
+ rule %r([//'].*$), Comment::Single
41
+ rule %r/\#tag Note.*?\#tag EndNote/mi, Comment::Preproc
42
+ rule %r/\s*[#].*$/x, Comment::Preproc
43
+
44
+ rule %r/".*?"/, Literal::String::Double
45
+ rule %r/[(){}!#,:]/, Punctuation
46
+
47
+ rule %r/\b(?:#{keywords.join('|')})\b/i, Keyword
48
+ rule %r/\b(?:#{keywords_type.join('|')})\b/i, Keyword::Declaration
49
+
50
+ rule %r/\b(?:#{operator_words.join('|')})\b/i, Operator
51
+ rule %r/[+-]?(\d+\.\d*|\d*\.\d+)/i, Literal::Number::Float
52
+ rule %r/[+-]?\d+/, Literal::Number::Integer
53
+ rule %r/&[CH][0-9a-f]+/i, Literal::Number::Hex
54
+ rule %r/&O[0-7]+/i, Literal::Number::Oct
55
+
56
+ rule %r/\b[\w\.]+\b/i, Text
57
+ rule(%r(<=|>=|<>|[=><\+\-\*\/\\]), Operator)
58
+ end
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,332 @@
1
+ # -*- coding: utf-8 -*- #
2
+ # frozen_string_literal: true
3
+
4
+ module Rouge
5
+ module Lexers
6
+ class XPath < RegexLexer
7
+ title 'XPath'
8
+ desc 'XML Path Language (XPath) 3.1'
9
+ tag 'xpath'
10
+ filenames '*.xpath'
11
+
12
+ # Terminal literals:
13
+ # https://www.w3.org/TR/xpath-31/#terminal-symbols
14
+ def self.digits
15
+ @digits ||= %r/[0-9]+/
16
+ end
17
+
18
+ def self.decimalLiteral
19
+ @decimalLiteral ||= %r/\.#{digits}|#{digits}\.[0-9]*/
20
+ end
21
+
22
+ def self.doubleLiteral
23
+ @doubleLiteral ||= %r/(\.#{digits})|#{digits}(\.[0-9]*)?[eE][+-]?#{digits}/
24
+ end
25
+
26
+ def self.stringLiteral
27
+ @stringLiteral ||= %r/("(("")|[^"])*")|('(('')|[^'])*')/
28
+ end
29
+
30
+ def self.ncName
31
+ @ncName ||= %r/[a-z_][a-z_\-.0-9]*/i
32
+ end
33
+
34
+ def self.qName
35
+ @qName ||= %r/(?:#{ncName})(?::#{ncName})?/
36
+ end
37
+
38
+ def self.uriQName
39
+ @uriQName ||= %r/Q\{[^{}]*\}#{ncName}/
40
+ end
41
+
42
+ def self.eqName
43
+ @eqName ||= %r/(?:#{uriQName}|#{qName})/
44
+ end
45
+
46
+ def self.commentStart
47
+ @commentStart ||= %r/\(:/
48
+ end
49
+
50
+ def self.openParen
51
+ @openParen ||= %r/\((?!:)/
52
+ end
53
+
54
+ # Terminal symbols:
55
+ # https://www.w3.org/TR/xpath-30/#id-terminal-delimitation
56
+ def self.kindTest
57
+ @kindTest ||= Regexp.union %w(
58
+ element attribute schema-element schema-attribute
59
+ comment text node document-node namespace-node
60
+ )
61
+ end
62
+
63
+ def self.kindTestForPI
64
+ @kindTestForPI ||= Regexp.union %w(processing-instruction)
65
+ end
66
+
67
+ def self.axes
68
+ @axes ||= Regexp.union %w(
69
+ child descendant attribute self descendant-or-self
70
+ following-sibling following namespace
71
+ parent ancestor preceding-sibling preceding ancestor-or-self
72
+ )
73
+ end
74
+
75
+ def self.operators
76
+ @operators ||= Regexp.union %w(, => = := : >= >> > <= << < - * != + // / || |)
77
+ end
78
+
79
+ def self.keywords
80
+ @keywords ||= Regexp.union %w(let for some every if then else return in satisfies)
81
+ end
82
+
83
+ def self.word_operators
84
+ @word_operators ||= Regexp.union %w(
85
+ and or eq ge gt le lt ne is
86
+ div mod idiv
87
+ intersect except union
88
+ to
89
+ )
90
+ end
91
+
92
+ def self.constructorTypes
93
+ @constructorTypes ||= Regexp.union %w(function array map empty-sequence)
94
+ end
95
+
96
+ # Mixin states:
97
+
98
+ state :commentsAndWhitespace do
99
+ rule XPath.commentStart, Comment, :comment
100
+ rule %r/\s+/m, Text::Whitespace
101
+ end
102
+
103
+ # Lexical states:
104
+ # https://www.w3.org/TR/xquery-xpath-parsing/#XPath-lexical-states
105
+ # https://lists.w3.org/Archives/Public/public-qt-comments/2004Aug/0127.html
106
+ # https://www.w3.org/TR/xpath-30/#id-revision-log
107
+ # https://www.w3.org/TR/xpath-31/#id-revision-log
108
+
109
+ state :root do
110
+ mixin :commentsAndWhitespace
111
+
112
+ # Literals
113
+ rule XPath.doubleLiteral, Num::Float
114
+ rule XPath.decimalLiteral, Num::Float
115
+ rule XPath.digits, Num
116
+ rule XPath.stringLiteral, Literal::String
117
+
118
+ # Variables
119
+ rule %r/\$/, Name::Variable, :varname
120
+
121
+ # Operators
122
+ rule XPath.operators, Operator
123
+ rule %r/#{XPath.word_operators}\b/, Operator::Word
124
+ rule %r/#{XPath.keywords}\b/, Keyword
125
+ rule %r/[?,{}()\[\]]/, Punctuation
126
+
127
+ # Functions
128
+ rule %r/(function)(\s*)(#{XPath.openParen})/ do # function declaration
129
+ groups Keyword, Text::Whitespace, Punctuation
130
+ end
131
+ rule %r/(map|array|empty-sequence)/, Keyword # constructors
132
+ rule %r/(#{XPath.kindTest})(\s*)(#{XPath.openParen})/ do # kindtest
133
+ groups Keyword, Text::Whitespace, Punctuation
134
+ push :kindtest
135
+ end
136
+ rule %r/(#{XPath.kindTestForPI})(\s*)(#{XPath.openParen})/ do # processing instruction kindtest
137
+ groups Keyword, Text::Whitespace, Punctuation
138
+ push :kindtestforpi
139
+ end
140
+ rule %r/(#{XPath.eqName})(\s*)(#{XPath.openParen})/ do # function call
141
+ groups Name::Function, Text::Whitespace, Punctuation
142
+ end
143
+ rule %r/(#{XPath.eqName})(\s*)(#)(\s*)(\d+)/ do # namedFunctionRef
144
+ groups Name::Function, Text::Whitespace, Name::Function, Text::Whitespace, Name::Function
145
+ end
146
+
147
+ # Type commands
148
+ rule %r/(cast|castable)(\s+)(as)/ do
149
+ groups Keyword, Text::Whitespace, Keyword
150
+ push :singletype
151
+ end
152
+ rule %r/(treat)(\s+)(as)/ do
153
+ groups Keyword, Text::Whitespace, Keyword
154
+ push :itemtype
155
+ end
156
+ rule %r/(instance)(\s+)(of)/ do
157
+ groups Keyword, Text::Whitespace, Keyword
158
+ push :itemtype
159
+ end
160
+ rule %r/(as)\b/ do
161
+ token Keyword
162
+ push :itemtype
163
+ end
164
+
165
+ # Paths
166
+ rule %r/(#{XPath.ncName})(\s*)(:)(\s*)(\*)/ do
167
+ groups Name::Tag, Text::Whitespace, Punctuation, Text::Whitespace, Operator
168
+ end
169
+ rule %r/(\*)(\s*)(:)(\s*)(#{XPath.ncName})/ do
170
+ groups Operator, Text::Whitespace, Punctuation, Text::Whitespace, Name::Tag
171
+ end
172
+ rule %r/(#{XPath.axes})(\s*)(::)/ do
173
+ groups Keyword, Text::Whitespace, Operator
174
+ end
175
+ rule %r/\.\.|\.|\*/, Operator
176
+ rule %r/@/, Name::Attribute, :attrname
177
+ rule XPath.eqName, Name::Tag
178
+ end
179
+
180
+ state :singletype do
181
+ mixin :commentsAndWhitespace
182
+
183
+ # Type name
184
+ rule XPath.eqName do
185
+ token Keyword::Type
186
+ pop!
187
+ end
188
+ end
189
+
190
+ state :itemtype do
191
+ mixin :commentsAndWhitespace
192
+
193
+ # Type tests
194
+ rule %r/(#{XPath.kindTest})(\s*)(#{XPath.openParen})/ do
195
+ groups Keyword::Type, Text::Whitespace, Punctuation
196
+ # go to kindtest then occurrenceindicator
197
+ goto :occurrenceindicator
198
+ push :kindtest
199
+ end
200
+ rule %r/(#{XPath.kindTestForPI})(\s*)(#{XPath.openParen})/ do
201
+ groups Keyword::Type, Text::Whitespace, Punctuation
202
+ # go to kindtestforpi then occurrenceindicator
203
+ goto :occurrenceindicator
204
+ push :kindtestforpi
205
+ end
206
+ rule %r/(item)(\s*)(#{XPath.openParen})(\s*)(\))/ do
207
+ groups Keyword::Type, Text::Whitespace, Punctuation, Text::Whitespace, Punctuation
208
+ goto :occurrenceindicator
209
+ end
210
+ rule %r/(#{XPath.constructorTypes})(\s*)(#{XPath.openParen})/ do
211
+ groups Keyword::Type, Text::Whitespace, Punctuation
212
+ end
213
+
214
+ # Type commands
215
+ rule %r/(cast|castable)(\s+)(as)/ do
216
+ groups Keyword, Text::Whitespace, Keyword
217
+ goto :singletype
218
+ end
219
+ rule %r/(treat)(\s+)(as)/ do
220
+ groups Keyword, Text::Whitespace, Keyword
221
+ goto :itemtype
222
+ end
223
+ rule %r/(instance)(\s+)(of)/ do
224
+ groups Keyword, Text::Whitespace, Keyword
225
+ goto :itemtype
226
+ end
227
+ rule %r/(as)\b/, Keyword
228
+
229
+ # Operators
230
+ rule XPath.operators do
231
+ token Operator
232
+ pop!
233
+ end
234
+ rule %r/#{XPath.word_operators}\b/ do
235
+ token Operator::Word
236
+ pop!
237
+ end
238
+ rule %r/#{XPath.keywords}\b/ do
239
+ token Keyword
240
+ pop!
241
+ end
242
+ rule %r/[\[),]/ do
243
+ token Punctuation
244
+ pop!
245
+ end
246
+
247
+ # Other types (e.g. xs:double)
248
+ rule XPath.eqName do
249
+ token Keyword::Type
250
+ goto :occurrenceindicator
251
+ end
252
+ end
253
+
254
+ # For pseudo-parameters for the KindTest productions
255
+ state :kindtest do
256
+ mixin :commentsAndWhitespace
257
+
258
+ # Pseudo-parameters:
259
+ rule %r/[?*]/, Operator
260
+ rule %r/,/, Punctuation
261
+ rule %r/(element|schema-element)(\s*)(#{XPath.openParen})/ do
262
+ groups Keyword::Type, Text::Whitespace, Punctuation
263
+ push :kindtest
264
+ end
265
+ rule XPath.eqName, Name::Tag
266
+
267
+ # End of pseudo-parameters
268
+ rule %r/\)/, Punctuation, :pop!
269
+ end
270
+
271
+ # Similar to :kindtest, but recognizes NCNames instead of EQNames
272
+ state :kindtestforpi do
273
+ mixin :commentsAndWhitespace
274
+
275
+ # Pseudo-parameters
276
+ rule XPath.ncName, Name
277
+ rule XPath.stringLiteral, Literal::String
278
+
279
+ # End of pseudo-parameters
280
+ rule %r/\)/, Punctuation, :pop!
281
+ end
282
+
283
+ state :occurrenceindicator do
284
+ mixin :commentsAndWhitespace
285
+
286
+ # Occurrence indicator
287
+ rule %r/[?*+]/ do
288
+ token Operator
289
+ pop!
290
+ end
291
+
292
+ # Otherwise, lex it in root state:
293
+ rule %r/(?![?*+])/ do
294
+ pop!
295
+ end
296
+ end
297
+
298
+ state :varname do
299
+ mixin :commentsAndWhitespace
300
+
301
+ # Function call
302
+ rule %r/(#{XPath.eqName})(\s*)(#{XPath.openParen})/ do
303
+ groups Name::Variable, Text::Whitespace, Punctuation
304
+ pop!
305
+ end
306
+
307
+ # Variable name
308
+ rule XPath.eqName, Name::Variable, :pop!
309
+ end
310
+
311
+ state :attrname do
312
+ mixin :commentsAndWhitespace
313
+
314
+ # Attribute name
315
+ rule XPath.eqName, Name::Attribute, :pop!
316
+ rule %r/\*/, Operator, :pop!
317
+ end
318
+
319
+ state :comment do
320
+ # Comment end
321
+ rule %r/:\)/, Comment, :pop!
322
+
323
+ # Nested comment
324
+ rule XPath.commentStart, Comment, :comment
325
+
326
+ # Comment contents
327
+ rule %r/[^:(]+/m, Comment
328
+ rule %r/[:(]/, Comment
329
+ end
330
+ end
331
+ end
332
+ end
@@ -0,0 +1,145 @@
1
+ # -*- coding: utf-8 -*- #
2
+ # frozen_string_literal: true
3
+
4
+ module Rouge
5
+ module Lexers
6
+ load_lexer 'xpath.rb'
7
+ class XQuery < XPath
8
+ title 'XQuery'
9
+ desc 'XQuery 3.1: An XML Query Language'
10
+ tag 'xquery'
11
+ filenames '*.xquery', '*.xq'
12
+ mimetypes 'application/xquery'
13
+
14
+ def self.keywords
15
+ @keywords ||= Regexp.union super, Regexp.union(%w(
16
+ xquery encoding version declare module
17
+ namespace copy-namespaces boundary-space construction
18
+ default collation base-uri preserve strip
19
+ ordering ordered unordered order empty greatest least
20
+ preserve no-preserve inherit no-inherit
21
+ decimal-format decimal-separator grouping-separator
22
+ infinity minus-sign NaN percent per-mille
23
+ zero-digit digit pattern-separator exponent-separator
24
+ import schema at element option
25
+ function external context item
26
+ typeswitch switch case
27
+ try catch
28
+ validate lax strict type
29
+ document element attribute text comment processing-instruction
30
+ for let where order group by return
31
+ allowing tumbling stable sliding window
32
+ start end only when previous next count collation
33
+ ascending descending
34
+ ))
35
+ end
36
+
37
+ # Mixin states:
38
+
39
+ state :tags do
40
+ rule %r/<#{XPath.qName}/, Name::Tag, :start_tag
41
+ rule %r/<!--/, Comment, :xml_comment
42
+ rule %r/<\?.*?\?>/, Comment::Preproc
43
+ rule %r/<!\[CDATA\[.*?\]\]>/, Comment::Preproc
44
+ rule %r/&\S*?;/, Name::Entity
45
+ end
46
+
47
+ # Lexical states:
48
+
49
+ prepend :root do
50
+ mixin :tags
51
+
52
+ rule %r/\{/, Punctuation
53
+ rule %r/\}`?/ do
54
+ token Punctuation
55
+ if stack.length > 1
56
+ pop!
57
+ end
58
+ end
59
+
60
+ rule %r/(namespace)(\s+)(#{XPath.ncName})/ do
61
+ groups Keyword, Text::Whitespace, Name::Namespace
62
+ end
63
+
64
+ rule %r/(#{XQuery.keywords})\b/, Keyword
65
+ rule %r/;/, Punctuation
66
+ rule %r/%/, Keyword::Declaration, :annotation
67
+
68
+ rule %r/(\(#)(\s*)(#{XPath.eqName})/ do
69
+ groups Comment::Preproc, Text::Whitespace, Name::Tag
70
+ push :pragma
71
+ end
72
+
73
+ rule %r/``\[/, Str, :str_constructor
74
+ end
75
+
76
+ state :annotation do
77
+ mixin :commentsAndWhitespace
78
+ rule XPath.eqName, Keyword::Declaration, :pop!
79
+ end
80
+
81
+ state :pragma do
82
+ mixin :commentsAndWhitespace
83
+ rule %r/#\)/, Comment::Preproc, :pop!
84
+ rule %r/./, Comment::Preproc
85
+ end
86
+
87
+ # https://www.w3.org/TR/xquery-31/#id-string-constructors
88
+ state :str_constructor do
89
+ rule %r/`\{/, Punctuation, :root
90
+ rule %r/\]``/, Str, :pop!
91
+ rule %r/[^`\]]+/m, Str
92
+ rule %r/[`\]]/, Str
93
+ end
94
+
95
+ state :xml_comment do
96
+ rule %r/[^-]+/m, Comment
97
+ rule %r/-->/, Comment, :pop!
98
+ rule %r/-/, Comment
99
+ end
100
+
101
+ state :start_tag do
102
+ rule %r/\s+/m, Text::Whitespace
103
+ rule %r/([\w.:-]+\s*=)(")/m do
104
+ groups Name::Attribute, Str
105
+ push :quot_attr
106
+ end
107
+ rule %r/([\w.:-]+\s*=)(')/m do
108
+ groups Name::Attribute, Str
109
+ push :apos_attr
110
+ end
111
+ rule %r/>/, Name::Tag, :tag_content
112
+ rule %r(/>), Name::Tag, :pop!
113
+ end
114
+
115
+ state :quot_attr do
116
+ rule %r/"/, Str, :pop!
117
+ rule %r/\{\{/, Str
118
+ rule %r/\{/, Punctuation, :root
119
+ rule %r/[^"{>]+/m, Str
120
+ end
121
+
122
+ state :apos_attr do
123
+ rule %r/'/, Str, :pop!
124
+ rule %r/\{\{/, Str
125
+ rule %r/\{/, Punctuation, :root
126
+ rule %r/[^'{>]+/m, Str
127
+ end
128
+
129
+ state :tag_content do
130
+ rule %r/\s+/m, Text::Whitespace
131
+ mixin :tags
132
+
133
+ rule %r/(\{\{|\}\})/, Text
134
+ rule %r/\{/, Punctuation, :root
135
+
136
+ rule %r/[^{}<&]/, Text
137
+
138
+ rule %r(</#{XPath.qName}(\s*)>) do
139
+ token Name::Tag
140
+ pop! 2 # pop self and tag_start
141
+ end
142
+ end
143
+ end
144
+ end
145
+ end