pygments.rb 1.2.1 → 2.2.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 (386) hide show
  1. checksums.yaml +5 -5
  2. data/.github/dependabot.yml +13 -0
  3. data/.github/workflows/ci.yml +40 -0
  4. data/.github/workflows/release.yml +24 -0
  5. data/.gitignore +4 -6
  6. data/.rubocop.yml +16 -0
  7. data/CHANGELOG.adoc +137 -0
  8. data/Gemfile +3 -1
  9. data/LICENSE +1 -1
  10. data/README.adoc +159 -0
  11. data/Rakefile +8 -32
  12. data/bench.rb +14 -8
  13. data/lib/pygments.rb +16 -14
  14. data/lib/pygments/lexer.rb +87 -65
  15. data/lib/pygments/mentos.py +23 -110
  16. data/lib/pygments/popen.rb +188 -284
  17. data/lib/pygments/version.rb +2 -2
  18. data/pygments.rb.gemspec +20 -13
  19. data/test/test_pygments.rb +50 -110
  20. data/vendor/pygments-main/{AUTHORS → Pygments-2.8.1.dist-info/AUTHORS} +26 -3
  21. data/vendor/pygments-main/Pygments-2.8.1.dist-info/INSTALLER +1 -0
  22. data/vendor/pygments-main/{LICENSE → Pygments-2.8.1.dist-info/LICENSE} +1 -1
  23. data/vendor/pygments-main/Pygments-2.8.1.dist-info/METADATA +48 -0
  24. data/vendor/pygments-main/Pygments-2.8.1.dist-info/RECORD +494 -0
  25. data/vendor/pygments-main/Pygments-2.8.1.dist-info/REQUESTED +0 -0
  26. data/vendor/pygments-main/Pygments-2.8.1.dist-info/WHEEL +5 -0
  27. data/vendor/pygments-main/Pygments-2.8.1.dist-info/entry_points.txt +3 -0
  28. data/vendor/pygments-main/Pygments-2.8.1.dist-info/top_level.txt +1 -0
  29. data/vendor/pygments-main/bin/pygmentize +8 -0
  30. data/vendor/pygments-main/pygments/__init__.py +6 -12
  31. data/vendor/pygments-main/pygments/__main__.py +17 -0
  32. data/vendor/pygments-main/pygments/cmdline.py +213 -184
  33. data/vendor/pygments-main/pygments/console.py +6 -10
  34. data/vendor/pygments-main/pygments/filter.py +4 -7
  35. data/vendor/pygments-main/pygments/filters/__init__.py +609 -22
  36. data/vendor/pygments-main/pygments/formatter.py +4 -5
  37. data/vendor/pygments-main/pygments/formatters/__init__.py +10 -10
  38. data/vendor/pygments-main/pygments/formatters/_mapping.py +1 -4
  39. data/vendor/pygments-main/pygments/formatters/bbcode.py +1 -2
  40. data/vendor/pygments-main/pygments/formatters/html.py +242 -139
  41. data/vendor/pygments-main/pygments/formatters/img.py +91 -50
  42. data/vendor/pygments-main/pygments/formatters/irc.py +39 -40
  43. data/vendor/pygments-main/pygments/formatters/latex.py +62 -33
  44. data/vendor/pygments-main/pygments/formatters/other.py +18 -17
  45. data/vendor/pygments-main/pygments/formatters/rtf.py +29 -30
  46. data/vendor/pygments-main/pygments/formatters/svg.py +40 -5
  47. data/vendor/pygments-main/pygments/formatters/terminal.py +25 -32
  48. data/vendor/pygments-main/pygments/formatters/terminal256.py +45 -14
  49. data/vendor/pygments-main/pygments/lexer.py +47 -44
  50. data/vendor/pygments-main/pygments/lexers/__init__.py +341 -0
  51. data/vendor/pygments-main/pygments/lexers/_asy_builtins.py +1644 -0
  52. data/vendor/pygments-main/pygments/lexers/_cl_builtins.py +231 -0
  53. data/vendor/pygments-main/pygments/lexers/_cocoa_builtins.py +75 -0
  54. data/vendor/pygments-main/pygments/lexers/_csound_builtins.py +1724 -0
  55. data/vendor/pygments-main/pygments/lexers/_lasso_builtins.py +5326 -0
  56. data/vendor/pygments-main/pygments/lexers/_lua_builtins.py +292 -0
  57. data/vendor/pygments-main/pygments/lexers/_mapping.py +554 -0
  58. data/vendor/pygments-main/pygments/lexers/_mql_builtins.py +1171 -0
  59. data/vendor/pygments-main/pygments/lexers/_mysql_builtins.py +1281 -0
  60. data/vendor/pygments-main/pygments/lexers/_openedge_builtins.py +2600 -0
  61. data/vendor/pygments-main/pygments/lexers/_php_builtins.py +4752 -0
  62. data/vendor/pygments-main/pygments/lexers/_postgres_builtins.py +677 -0
  63. data/vendor/pygments-main/pygments/lexers/_scilab_builtins.py +3093 -0
  64. data/vendor/pygments-main/pygments/lexers/_sourcemod_builtins.py +1160 -0
  65. data/vendor/pygments-main/pygments/lexers/_stan_builtins.py +557 -0
  66. data/vendor/pygments-main/pygments/lexers/_stata_builtins.py +457 -0
  67. data/vendor/pygments-main/pygments/lexers/_tsql_builtins.py +1003 -0
  68. data/vendor/pygments-main/pygments/lexers/_usd_builtins.py +112 -0
  69. data/vendor/pygments-main/pygments/lexers/_vbscript_builtins.py +279 -0
  70. data/vendor/pygments-main/pygments/lexers/_vim_builtins.py +1938 -0
  71. data/vendor/pygments-main/pygments/lexers/actionscript.py +244 -0
  72. data/vendor/pygments-main/pygments/lexers/agile.py +23 -0
  73. data/vendor/pygments-main/pygments/lexers/algebra.py +239 -0
  74. data/vendor/pygments-main/pygments/lexers/ambient.py +75 -0
  75. data/vendor/pygments-main/pygments/lexers/amdgpu.py +48 -0
  76. data/vendor/pygments-main/pygments/lexers/ampl.py +86 -0
  77. data/vendor/pygments-main/pygments/lexers/apl.py +100 -0
  78. data/vendor/pygments-main/pygments/lexers/archetype.py +317 -0
  79. data/vendor/pygments-main/pygments/lexers/arrow.py +116 -0
  80. data/vendor/pygments-main/pygments/lexers/asm.py +1004 -0
  81. data/vendor/pygments-main/pygments/lexers/automation.py +379 -0
  82. data/vendor/pygments-main/pygments/lexers/bare.py +103 -0
  83. data/vendor/pygments-main/pygments/lexers/basic.py +661 -0
  84. data/vendor/pygments-main/pygments/lexers/bibtex.py +159 -0
  85. data/vendor/pygments-main/pygments/lexers/boa.py +101 -0
  86. data/vendor/pygments-main/pygments/lexers/business.py +626 -0
  87. data/vendor/pygments-main/pygments/lexers/c_cpp.py +342 -0
  88. data/vendor/pygments-main/pygments/lexers/c_like.py +565 -0
  89. data/vendor/pygments-main/pygments/lexers/capnproto.py +77 -0
  90. data/vendor/pygments-main/pygments/lexers/cddl.py +190 -0
  91. data/vendor/pygments-main/pygments/lexers/chapel.py +111 -0
  92. data/vendor/pygments-main/pygments/lexers/clean.py +178 -0
  93. data/vendor/pygments-main/pygments/lexers/compiled.py +33 -0
  94. data/vendor/pygments-main/pygments/lexers/configs.py +985 -0
  95. data/vendor/pygments-main/pygments/lexers/console.py +113 -0
  96. data/vendor/pygments-main/pygments/lexers/crystal.py +366 -0
  97. data/vendor/pygments-main/pygments/lexers/csound.py +466 -0
  98. data/vendor/pygments-main/pygments/lexers/css.py +694 -0
  99. data/vendor/pygments-main/pygments/lexers/d.py +255 -0
  100. data/vendor/pygments-main/pygments/lexers/dalvik.py +124 -0
  101. data/vendor/pygments-main/pygments/lexers/data.py +697 -0
  102. data/vendor/pygments-main/pygments/lexers/devicetree.py +108 -0
  103. data/vendor/pygments-main/pygments/lexers/diff.py +164 -0
  104. data/vendor/pygments-main/pygments/lexers/dotnet.py +706 -0
  105. data/vendor/pygments-main/pygments/lexers/dsls.py +959 -0
  106. data/vendor/pygments-main/pygments/lexers/dylan.py +286 -0
  107. data/vendor/pygments-main/pygments/lexers/ecl.py +137 -0
  108. data/vendor/pygments-main/pygments/lexers/eiffel.py +64 -0
  109. data/vendor/pygments-main/pygments/lexers/elm.py +120 -0
  110. data/vendor/pygments-main/pygments/lexers/email.py +150 -0
  111. data/vendor/pygments-main/pygments/lexers/erlang.py +529 -0
  112. data/vendor/pygments-main/pygments/lexers/esoteric.py +303 -0
  113. data/vendor/pygments-main/pygments/lexers/ezhil.py +76 -0
  114. data/vendor/pygments-main/pygments/lexers/factor.py +343 -0
  115. data/vendor/pygments-main/pygments/lexers/fantom.py +249 -0
  116. data/vendor/pygments-main/pygments/lexers/felix.py +272 -0
  117. data/vendor/pygments-main/pygments/lexers/floscript.py +82 -0
  118. data/vendor/pygments-main/pygments/lexers/forth.py +177 -0
  119. data/vendor/pygments-main/pygments/lexers/fortran.py +208 -0
  120. data/vendor/pygments-main/pygments/lexers/foxpro.py +427 -0
  121. data/vendor/pygments-main/pygments/lexers/freefem.py +897 -0
  122. data/vendor/pygments-main/pygments/lexers/functional.py +20 -0
  123. data/vendor/pygments-main/pygments/lexers/futhark.py +110 -0
  124. data/vendor/pygments-main/pygments/lexers/gdscript.py +345 -0
  125. data/vendor/pygments-main/pygments/lexers/go.py +100 -0
  126. data/vendor/pygments-main/pygments/lexers/grammar_notation.py +269 -0
  127. data/vendor/pygments-main/pygments/lexers/graph.py +84 -0
  128. data/vendor/pygments-main/pygments/lexers/graphics.py +799 -0
  129. data/vendor/pygments-main/pygments/lexers/graphviz.py +57 -0
  130. data/vendor/pygments-main/pygments/lexers/haskell.py +869 -0
  131. data/vendor/pygments-main/pygments/lexers/haxe.py +935 -0
  132. data/vendor/pygments-main/pygments/lexers/hdl.py +468 -0
  133. data/vendor/pygments-main/pygments/lexers/hexdump.py +102 -0
  134. data/vendor/pygments-main/pygments/lexers/html.py +613 -0
  135. data/vendor/pygments-main/pygments/lexers/idl.py +280 -0
  136. data/vendor/pygments-main/pygments/lexers/igor.py +419 -0
  137. data/vendor/pygments-main/pygments/lexers/inferno.py +95 -0
  138. data/vendor/pygments-main/pygments/lexers/installers.py +321 -0
  139. data/vendor/pygments-main/pygments/lexers/int_fiction.py +1367 -0
  140. data/vendor/pygments-main/pygments/lexers/iolang.py +62 -0
  141. data/vendor/pygments-main/pygments/lexers/j.py +145 -0
  142. data/vendor/pygments-main/pygments/lexers/javascript.py +1536 -0
  143. data/vendor/pygments-main/pygments/lexers/julia.py +330 -0
  144. data/vendor/pygments-main/pygments/lexers/jvm.py +1739 -0
  145. data/vendor/pygments-main/pygments/lexers/lisp.py +2698 -0
  146. data/vendor/pygments-main/pygments/lexers/make.py +205 -0
  147. data/vendor/pygments-main/pygments/lexers/markup.py +762 -0
  148. data/vendor/pygments-main/pygments/lexers/math.py +20 -0
  149. data/vendor/pygments-main/pygments/lexers/matlab.py +3280 -0
  150. data/vendor/pygments-main/pygments/lexers/mime.py +225 -0
  151. data/vendor/pygments-main/pygments/lexers/ml.py +957 -0
  152. data/vendor/pygments-main/pygments/lexers/modeling.py +365 -0
  153. data/vendor/pygments-main/pygments/lexers/modula2.py +1579 -0
  154. data/vendor/pygments-main/pygments/lexers/monte.py +203 -0
  155. data/vendor/pygments-main/pygments/lexers/mosel.py +447 -0
  156. data/vendor/pygments-main/pygments/lexers/ncl.py +893 -0
  157. data/vendor/pygments-main/pygments/lexers/nimrod.py +158 -0
  158. data/vendor/pygments-main/pygments/lexers/nit.py +63 -0
  159. data/vendor/pygments-main/pygments/lexers/nix.py +135 -0
  160. data/vendor/pygments-main/pygments/lexers/oberon.py +120 -0
  161. data/vendor/pygments-main/pygments/lexers/objective.py +503 -0
  162. data/vendor/pygments-main/pygments/lexers/ooc.py +84 -0
  163. data/vendor/pygments-main/pygments/lexers/other.py +40 -0
  164. data/vendor/pygments-main/pygments/lexers/parasail.py +78 -0
  165. data/vendor/pygments-main/pygments/lexers/parsers.py +799 -0
  166. data/vendor/pygments-main/pygments/lexers/pascal.py +643 -0
  167. data/vendor/pygments-main/pygments/lexers/pawn.py +202 -0
  168. data/vendor/pygments-main/pygments/lexers/perl.py +731 -0
  169. data/vendor/pygments-main/pygments/lexers/php.py +320 -0
  170. data/vendor/pygments-main/pygments/lexers/pointless.py +70 -0
  171. data/vendor/pygments-main/pygments/lexers/pony.py +93 -0
  172. data/vendor/pygments-main/pygments/lexers/praat.py +301 -0
  173. data/vendor/pygments-main/pygments/lexers/prolog.py +305 -0
  174. data/vendor/pygments-main/pygments/lexers/promql.py +182 -0
  175. data/vendor/pygments-main/pygments/lexers/python.py +1158 -0
  176. data/vendor/pygments-main/pygments/lexers/qvt.py +151 -0
  177. data/vendor/pygments-main/pygments/lexers/r.py +190 -0
  178. data/vendor/pygments-main/pygments/lexers/rdf.py +462 -0
  179. data/vendor/pygments-main/pygments/lexers/rebol.py +430 -0
  180. data/vendor/pygments-main/pygments/lexers/resource.py +84 -0
  181. data/vendor/pygments-main/pygments/lexers/ride.py +138 -0
  182. data/vendor/pygments-main/pygments/lexers/rnc.py +66 -0
  183. data/vendor/pygments-main/pygments/lexers/roboconf.py +81 -0
  184. data/vendor/pygments-main/pygments/lexers/robotframework.py +551 -0
  185. data/vendor/pygments-main/pygments/lexers/ruby.py +523 -0
  186. data/vendor/pygments-main/pygments/lexers/rust.py +223 -0
  187. data/vendor/pygments-main/pygments/lexers/sas.py +227 -0
  188. data/vendor/pygments-main/pygments/lexers/scdoc.py +82 -0
  189. data/vendor/pygments-main/pygments/lexers/scripting.py +1283 -0
  190. data/vendor/pygments-main/pygments/lexers/sgf.py +60 -0
  191. data/vendor/pygments-main/pygments/lexers/shell.py +909 -0
  192. data/vendor/pygments-main/pygments/lexers/sieve.py +68 -0
  193. data/vendor/pygments-main/pygments/lexers/slash.py +184 -0
  194. data/vendor/pygments-main/pygments/lexers/smalltalk.py +194 -0
  195. data/vendor/pygments-main/pygments/lexers/smv.py +78 -0
  196. data/vendor/pygments-main/pygments/lexers/snobol.py +82 -0
  197. data/vendor/pygments-main/pygments/lexers/solidity.py +91 -0
  198. data/vendor/pygments-main/pygments/lexers/special.py +106 -0
  199. data/vendor/pygments-main/pygments/lexers/sql.py +832 -0
  200. data/vendor/pygments-main/pygments/lexers/stata.py +170 -0
  201. data/vendor/pygments-main/pygments/lexers/supercollider.py +94 -0
  202. data/vendor/pygments-main/pygments/lexers/tcl.py +144 -0
  203. data/vendor/pygments-main/pygments/lexers/templates.py +2263 -0
  204. data/vendor/pygments-main/pygments/lexers/teraterm.py +334 -0
  205. data/vendor/pygments-main/pygments/lexers/testing.py +206 -0
  206. data/vendor/pygments-main/pygments/lexers/text.py +25 -0
  207. data/vendor/pygments-main/pygments/lexers/textedit.py +168 -0
  208. data/vendor/pygments-main/pygments/lexers/textfmts.py +429 -0
  209. data/vendor/pygments-main/pygments/lexers/theorem.py +476 -0
  210. data/vendor/pygments-main/pygments/lexers/tnt.py +262 -0
  211. data/vendor/pygments-main/pygments/lexers/trafficscript.py +53 -0
  212. data/vendor/pygments-main/pygments/lexers/typoscript.py +218 -0
  213. data/vendor/pygments-main/pygments/lexers/unicon.py +411 -0
  214. data/vendor/pygments-main/pygments/lexers/urbi.py +145 -0
  215. data/vendor/pygments-main/pygments/lexers/usd.py +89 -0
  216. data/vendor/pygments-main/pygments/lexers/varnish.py +189 -0
  217. data/vendor/pygments-main/pygments/lexers/verification.py +113 -0
  218. data/vendor/pygments-main/pygments/lexers/web.py +23 -0
  219. data/vendor/pygments-main/pygments/lexers/webidl.py +298 -0
  220. data/vendor/pygments-main/pygments/lexers/webmisc.py +991 -0
  221. data/vendor/pygments-main/pygments/lexers/whiley.py +115 -0
  222. data/vendor/pygments-main/pygments/lexers/x10.py +68 -0
  223. data/vendor/pygments-main/pygments/lexers/xorg.py +36 -0
  224. data/vendor/pygments-main/pygments/lexers/yang.py +103 -0
  225. data/vendor/pygments-main/pygments/lexers/zig.py +123 -0
  226. data/vendor/pygments-main/pygments/modeline.py +1 -2
  227. data/vendor/pygments-main/pygments/plugin.py +4 -3
  228. data/vendor/pygments-main/pygments/regexopt.py +1 -2
  229. data/vendor/pygments-main/pygments/scanner.py +2 -3
  230. data/vendor/pygments-main/pygments/sphinxext.py +2 -5
  231. data/vendor/pygments-main/pygments/style.py +61 -25
  232. data/vendor/pygments-main/pygments/styles/__init__.py +12 -5
  233. data/vendor/pygments-main/pygments/styles/abap.py +1 -2
  234. data/vendor/pygments-main/pygments/styles/algol.py +1 -2
  235. data/vendor/pygments-main/pygments/styles/algol_nu.py +1 -2
  236. data/vendor/pygments-main/pygments/styles/arduino.py +2 -3
  237. data/vendor/pygments-main/pygments/styles/autumn.py +1 -2
  238. data/vendor/pygments-main/pygments/styles/borland.py +1 -2
  239. data/vendor/pygments-main/pygments/styles/bw.py +1 -2
  240. data/vendor/pygments-main/pygments/styles/colorful.py +1 -2
  241. data/vendor/pygments-main/pygments/styles/default.py +1 -2
  242. data/vendor/pygments-main/pygments/styles/emacs.py +1 -2
  243. data/vendor/pygments-main/pygments/styles/friendly.py +1 -2
  244. data/vendor/pygments-main/pygments/styles/fruity.py +1 -2
  245. data/vendor/pygments-main/pygments/styles/igor.py +1 -2
  246. data/vendor/pygments-main/pygments/styles/inkpot.py +66 -0
  247. data/vendor/pygments-main/pygments/styles/lovelace.py +1 -2
  248. data/vendor/pygments-main/pygments/styles/manni.py +1 -2
  249. data/vendor/pygments-main/pygments/styles/material.py +118 -0
  250. data/vendor/pygments-main/pygments/styles/monokai.py +4 -4
  251. data/vendor/pygments-main/pygments/styles/murphy.py +1 -2
  252. data/vendor/pygments-main/pygments/styles/native.py +1 -2
  253. data/vendor/pygments-main/pygments/styles/paraiso_dark.py +1 -2
  254. data/vendor/pygments-main/pygments/styles/paraiso_light.py +1 -2
  255. data/vendor/pygments-main/pygments/styles/pastie.py +1 -2
  256. data/vendor/pygments-main/pygments/styles/perldoc.py +1 -2
  257. data/vendor/pygments-main/pygments/styles/rainbow_dash.py +1 -2
  258. data/vendor/pygments-main/pygments/styles/rrt.py +1 -2
  259. data/vendor/pygments-main/pygments/styles/sas.py +1 -2
  260. data/vendor/pygments-main/pygments/styles/solarized.py +136 -0
  261. data/vendor/pygments-main/pygments/styles/stata_dark.py +40 -0
  262. data/vendor/pygments-main/pygments/styles/{stata.py → stata_light.py} +14 -16
  263. data/vendor/pygments-main/pygments/styles/tango.py +1 -2
  264. data/vendor/pygments-main/pygments/styles/trac.py +1 -2
  265. data/vendor/pygments-main/pygments/styles/vim.py +1 -2
  266. data/vendor/pygments-main/pygments/styles/vs.py +1 -2
  267. data/vendor/pygments-main/pygments/styles/xcode.py +1 -2
  268. data/vendor/pygments-main/pygments/styles/zenburn.py +80 -0
  269. data/vendor/pygments-main/pygments/token.py +1 -2
  270. data/vendor/pygments-main/pygments/unistring.py +47 -109
  271. data/vendor/pygments-main/pygments/util.py +16 -96
  272. metadata +81 -139
  273. data/CHANGELOG.md +0 -111
  274. data/README.md +0 -121
  275. data/cache-lexers.rb +0 -8
  276. data/circle.yml +0 -20
  277. data/test/test_data.c +0 -2581
  278. data/test/test_data.py +0 -514
  279. data/test/test_data_generated +0 -2582
  280. data/vendor/custom_lexers/github.py +0 -565
  281. data/vendor/pygments-main/CHANGES +0 -1186
  282. data/vendor/pygments-main/MANIFEST.in +0 -6
  283. data/vendor/pygments-main/Makefile +0 -65
  284. data/vendor/pygments-main/README.rst +0 -39
  285. data/vendor/pygments-main/REVISION +0 -1
  286. data/vendor/pygments-main/TODO +0 -12
  287. data/vendor/pygments-main/doc/Makefile +0 -153
  288. data/vendor/pygments-main/doc/_static/favicon.ico +0 -0
  289. data/vendor/pygments-main/doc/_static/logo_new.png +0 -0
  290. data/vendor/pygments-main/doc/_static/logo_only.png +0 -0
  291. data/vendor/pygments-main/doc/_templates/docssidebar.html +0 -3
  292. data/vendor/pygments-main/doc/_templates/indexsidebar.html +0 -25
  293. data/vendor/pygments-main/doc/_themes/pygments14/layout.html +0 -98
  294. data/vendor/pygments-main/doc/_themes/pygments14/static/bodybg.png +0 -0
  295. data/vendor/pygments-main/doc/_themes/pygments14/static/docbg.png +0 -0
  296. data/vendor/pygments-main/doc/_themes/pygments14/static/listitem.png +0 -0
  297. data/vendor/pygments-main/doc/_themes/pygments14/static/logo.png +0 -0
  298. data/vendor/pygments-main/doc/_themes/pygments14/static/pocoo.png +0 -0
  299. data/vendor/pygments-main/doc/_themes/pygments14/static/pygments14.css_t +0 -401
  300. data/vendor/pygments-main/doc/_themes/pygments14/theme.conf +0 -15
  301. data/vendor/pygments-main/doc/conf.py +0 -241
  302. data/vendor/pygments-main/doc/docs/api.rst +0 -354
  303. data/vendor/pygments-main/doc/docs/authors.rst +0 -4
  304. data/vendor/pygments-main/doc/docs/changelog.rst +0 -1
  305. data/vendor/pygments-main/doc/docs/cmdline.rst +0 -166
  306. data/vendor/pygments-main/doc/docs/filterdevelopment.rst +0 -71
  307. data/vendor/pygments-main/doc/docs/filters.rst +0 -41
  308. data/vendor/pygments-main/doc/docs/formatterdevelopment.rst +0 -169
  309. data/vendor/pygments-main/doc/docs/formatters.rst +0 -48
  310. data/vendor/pygments-main/doc/docs/index.rst +0 -66
  311. data/vendor/pygments-main/doc/docs/integrate.rst +0 -40
  312. data/vendor/pygments-main/doc/docs/java.rst +0 -70
  313. data/vendor/pygments-main/doc/docs/lexerdevelopment.rst +0 -728
  314. data/vendor/pygments-main/doc/docs/lexers.rst +0 -69
  315. data/vendor/pygments-main/doc/docs/moinmoin.rst +0 -39
  316. data/vendor/pygments-main/doc/docs/plugins.rst +0 -93
  317. data/vendor/pygments-main/doc/docs/quickstart.rst +0 -205
  318. data/vendor/pygments-main/doc/docs/rstdirective.rst +0 -22
  319. data/vendor/pygments-main/doc/docs/styles.rst +0 -201
  320. data/vendor/pygments-main/doc/docs/tokens.rst +0 -372
  321. data/vendor/pygments-main/doc/docs/unicode.rst +0 -58
  322. data/vendor/pygments-main/doc/download.rst +0 -41
  323. data/vendor/pygments-main/doc/faq.rst +0 -139
  324. data/vendor/pygments-main/doc/index.rst +0 -54
  325. data/vendor/pygments-main/doc/languages.rst +0 -154
  326. data/vendor/pygments-main/doc/make.bat +0 -190
  327. data/vendor/pygments-main/doc/pygmentize.1 +0 -94
  328. data/vendor/pygments-main/external/autopygmentize +0 -101
  329. data/vendor/pygments-main/external/lasso-builtins-generator-9.lasso +0 -162
  330. data/vendor/pygments-main/external/markdown-processor.py +0 -67
  331. data/vendor/pygments-main/external/moin-parser.py +0 -112
  332. data/vendor/pygments-main/external/pygments.bashcomp +0 -38
  333. data/vendor/pygments-main/external/rst-directive.py +0 -82
  334. data/vendor/pygments-main/pygmentize +0 -8
  335. data/vendor/pygments-main/requirements.txt +0 -5
  336. data/vendor/pygments-main/scripts/check_sources.py +0 -211
  337. data/vendor/pygments-main/scripts/debug_lexer.py +0 -246
  338. data/vendor/pygments-main/scripts/detect_missing_analyse_text.py +0 -33
  339. data/vendor/pygments-main/scripts/epydoc.css +0 -280
  340. data/vendor/pygments-main/scripts/get_vimkw.py +0 -74
  341. data/vendor/pygments-main/scripts/pylintrc +0 -301
  342. data/vendor/pygments-main/scripts/vim2pygments.py +0 -935
  343. data/vendor/pygments-main/setup.cfg +0 -10
  344. data/vendor/pygments-main/setup.py +0 -77
  345. data/vendor/pygments-main/tox.ini +0 -7
  346. data/vendor/simplejson/.gitignore +0 -10
  347. data/vendor/simplejson/.travis.yml +0 -5
  348. data/vendor/simplejson/CHANGES.txt +0 -291
  349. data/vendor/simplejson/LICENSE.txt +0 -19
  350. data/vendor/simplejson/MANIFEST.in +0 -5
  351. data/vendor/simplejson/README.rst +0 -19
  352. data/vendor/simplejson/conf.py +0 -179
  353. data/vendor/simplejson/index.rst +0 -628
  354. data/vendor/simplejson/scripts/make_docs.py +0 -18
  355. data/vendor/simplejson/setup.py +0 -104
  356. data/vendor/simplejson/simplejson/__init__.py +0 -510
  357. data/vendor/simplejson/simplejson/_speedups.c +0 -2745
  358. data/vendor/simplejson/simplejson/decoder.py +0 -425
  359. data/vendor/simplejson/simplejson/encoder.py +0 -567
  360. data/vendor/simplejson/simplejson/ordered_dict.py +0 -119
  361. data/vendor/simplejson/simplejson/scanner.py +0 -77
  362. data/vendor/simplejson/simplejson/tests/__init__.py +0 -67
  363. data/vendor/simplejson/simplejson/tests/test_bigint_as_string.py +0 -55
  364. data/vendor/simplejson/simplejson/tests/test_check_circular.py +0 -30
  365. data/vendor/simplejson/simplejson/tests/test_decimal.py +0 -66
  366. data/vendor/simplejson/simplejson/tests/test_decode.py +0 -83
  367. data/vendor/simplejson/simplejson/tests/test_default.py +0 -9
  368. data/vendor/simplejson/simplejson/tests/test_dump.py +0 -67
  369. data/vendor/simplejson/simplejson/tests/test_encode_basestring_ascii.py +0 -46
  370. data/vendor/simplejson/simplejson/tests/test_encode_for_html.py +0 -32
  371. data/vendor/simplejson/simplejson/tests/test_errors.py +0 -34
  372. data/vendor/simplejson/simplejson/tests/test_fail.py +0 -91
  373. data/vendor/simplejson/simplejson/tests/test_float.py +0 -19
  374. data/vendor/simplejson/simplejson/tests/test_indent.py +0 -86
  375. data/vendor/simplejson/simplejson/tests/test_item_sort_key.py +0 -20
  376. data/vendor/simplejson/simplejson/tests/test_namedtuple.py +0 -121
  377. data/vendor/simplejson/simplejson/tests/test_pass1.py +0 -76
  378. data/vendor/simplejson/simplejson/tests/test_pass2.py +0 -14
  379. data/vendor/simplejson/simplejson/tests/test_pass3.py +0 -20
  380. data/vendor/simplejson/simplejson/tests/test_recursion.py +0 -67
  381. data/vendor/simplejson/simplejson/tests/test_scanstring.py +0 -117
  382. data/vendor/simplejson/simplejson/tests/test_separators.py +0 -42
  383. data/vendor/simplejson/simplejson/tests/test_speedups.py +0 -20
  384. data/vendor/simplejson/simplejson/tests/test_tuple.py +0 -49
  385. data/vendor/simplejson/simplejson/tests/test_unicode.py +0 -109
  386. data/vendor/simplejson/simplejson/tool.py +0 -39
@@ -0,0 +1,82 @@
1
+ """
2
+ pygments.lexers.snobol
3
+ ~~~~~~~~~~~~~~~~~~~~~~
4
+
5
+ Lexers for the SNOBOL language.
6
+
7
+ :copyright: Copyright 2006-2021 by the Pygments team, see AUTHORS.
8
+ :license: BSD, see LICENSE for details.
9
+ """
10
+
11
+ from pygments.lexer import RegexLexer, bygroups
12
+ from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
13
+ Number, Punctuation
14
+
15
+ __all__ = ['SnobolLexer']
16
+
17
+
18
+ class SnobolLexer(RegexLexer):
19
+ """
20
+ Lexer for the SNOBOL4 programming language.
21
+
22
+ Recognizes the common ASCII equivalents of the original SNOBOL4 operators.
23
+ Does not require spaces around binary operators.
24
+
25
+ .. versionadded:: 1.5
26
+ """
27
+
28
+ name = "Snobol"
29
+ aliases = ["snobol"]
30
+ filenames = ['*.snobol']
31
+ mimetypes = ['text/x-snobol']
32
+
33
+ tokens = {
34
+ # root state, start of line
35
+ # comments, continuation lines, and directives start in column 1
36
+ # as do labels
37
+ 'root': [
38
+ (r'\*.*\n', Comment),
39
+ (r'[+.] ', Punctuation, 'statement'),
40
+ (r'-.*\n', Comment),
41
+ (r'END\s*\n', Name.Label, 'heredoc'),
42
+ (r'[A-Za-z$][\w$]*', Name.Label, 'statement'),
43
+ (r'\s+', Text, 'statement'),
44
+ ],
45
+ # statement state, line after continuation or label
46
+ 'statement': [
47
+ (r'\s*\n', Text, '#pop'),
48
+ (r'\s+', Text),
49
+ (r'(?<=[^\w.])(LT|LE|EQ|NE|GE|GT|INTEGER|IDENT|DIFFER|LGT|SIZE|'
50
+ r'REPLACE|TRIM|DUPL|REMDR|DATE|TIME|EVAL|APPLY|OPSYN|LOAD|UNLOAD|'
51
+ r'LEN|SPAN|BREAK|ANY|NOTANY|TAB|RTAB|REM|POS|RPOS|FAIL|FENCE|'
52
+ r'ABORT|ARB|ARBNO|BAL|SUCCEED|INPUT|OUTPUT|TERMINAL)(?=[^\w.])',
53
+ Name.Builtin),
54
+ (r'[A-Za-z][\w.]*', Name),
55
+ # ASCII equivalents of original operators
56
+ # | for the EBCDIC equivalent, ! likewise
57
+ # \ for EBCDIC negation
58
+ (r'\*\*|[?$.!%*/#+\-@|&\\=]', Operator),
59
+ (r'"[^"]*"', String),
60
+ (r"'[^']*'", String),
61
+ # Accept SPITBOL syntax for real numbers
62
+ # as well as Macro SNOBOL4
63
+ (r'[0-9]+(?=[^.EeDd])', Number.Integer),
64
+ (r'[0-9]+(\.[0-9]*)?([EDed][-+]?[0-9]+)?', Number.Float),
65
+ # Goto
66
+ (r':', Punctuation, 'goto'),
67
+ (r'[()<>,;]', Punctuation),
68
+ ],
69
+ # Goto block
70
+ 'goto': [
71
+ (r'\s*\n', Text, "#pop:2"),
72
+ (r'\s+', Text),
73
+ (r'F|S', Keyword),
74
+ (r'(\()([A-Za-z][\w.]*)(\))',
75
+ bygroups(Punctuation, Name.Label, Punctuation))
76
+ ],
77
+ # everything after the END statement is basically one
78
+ # big heredoc.
79
+ 'heredoc': [
80
+ (r'.*\n', String.Heredoc)
81
+ ]
82
+ }
@@ -0,0 +1,91 @@
1
+ """
2
+ pygments.lexers.solidity
3
+ ~~~~~~~~~~~~~~~~~~~~~~~~
4
+
5
+ Lexers for Solidity.
6
+
7
+ :copyright: Copyright 2006-2021 by the Pygments team, see AUTHORS.
8
+ :license: BSD, see LICENSE for details.
9
+ """
10
+
11
+ import re
12
+
13
+ from pygments.lexer import RegexLexer, bygroups, include, words
14
+ from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
15
+ Number, Punctuation, Whitespace
16
+
17
+ __all__ = ['SolidityLexer']
18
+
19
+
20
+ class SolidityLexer(RegexLexer):
21
+ """
22
+ For Solidity source code.
23
+
24
+ .. versionadded:: 2.5
25
+ """
26
+
27
+ name = 'Solidity'
28
+ aliases = ['solidity']
29
+ filenames = ['*.sol']
30
+ mimetypes = []
31
+
32
+ flags = re.MULTILINE | re.UNICODE
33
+
34
+ datatype = (
35
+ r'\b(address|bool|(?:(?:bytes|hash|int|string|uint)(?:8|16|24|32|40|48|56|64'
36
+ r'|72|80|88|96|104|112|120|128|136|144|152|160|168|176|184|192|200|208'
37
+ r'|216|224|232|240|248|256)?))\b'
38
+ )
39
+
40
+ tokens = {
41
+ 'root': [
42
+ include('whitespace'),
43
+ include('comments'),
44
+ (r'\bpragma\s+solidity\b', Keyword, 'pragma'),
45
+ (r'\b(contract)(\s+)([a-zA-Z_]\w*)',
46
+ bygroups(Keyword, Whitespace, Name.Entity)),
47
+ (datatype + r'(\s+)((?:external|public|internal|private)\s+)?' +
48
+ r'([a-zA-Z_]\w*)',
49
+ bygroups(Keyword.Type, Whitespace, Keyword, Name.Variable)),
50
+ (r'\b(enum|event|function|struct)(\s+)([a-zA-Z_]\w*)',
51
+ bygroups(Keyword.Type, Whitespace, Name.Variable)),
52
+ (r'\b(msg|block|tx)\.([A-Za-z_][a-zA-Z0-9_]*)\b', Keyword),
53
+ (words((
54
+ 'block', 'break', 'constant', 'constructor', 'continue',
55
+ 'contract', 'do', 'else', 'external', 'false', 'for',
56
+ 'function', 'if', 'import', 'inherited', 'internal', 'is',
57
+ 'library', 'mapping', 'memory', 'modifier', 'msg', 'new',
58
+ 'payable', 'private', 'public', 'require', 'return',
59
+ 'returns', 'struct', 'suicide', 'throw', 'this', 'true',
60
+ 'tx', 'var', 'while'), prefix=r'\b', suffix=r'\b'),
61
+ Keyword.Type),
62
+ (words(('keccak256',), prefix=r'\b', suffix=r'\b'), Name.Builtin),
63
+ (datatype, Keyword.Type),
64
+ include('constants'),
65
+ (r'[a-zA-Z_]\w*', Text),
66
+ (r'[!<=>+*/-]', Operator),
67
+ (r'[.;:{}(),\[\]]', Punctuation)
68
+ ],
69
+ 'comments': [
70
+ (r'//(\n|[\w\W]*?[^\\]\n)', Comment.Single),
71
+ (r'/(\\\n)?[*][\w\W]*?[*](\\\n)?/', Comment.Multiline),
72
+ (r'/(\\\n)?[*][\w\W]*', Comment.Multiline)
73
+ ],
74
+ 'constants': [
75
+ (r'("(\\"|.)*?")', String.Double),
76
+ (r"('(\\'|.)*?')", String.Single),
77
+ (r'\b0[xX][0-9a-fA-F]+\b', Number.Hex),
78
+ (r'\b\d+\b', Number.Decimal),
79
+ ],
80
+ 'pragma': [
81
+ include('whitespace'),
82
+ include('comments'),
83
+ (r'(\^|>=|<)(\s*)(\d+\.\d+\.\d+)',
84
+ bygroups(Operator, Whitespace, Keyword)),
85
+ (r';', Punctuation, '#pop')
86
+ ],
87
+ 'whitespace': [
88
+ (r'\s+', Whitespace),
89
+ (r'\n', Whitespace)
90
+ ]
91
+ }
@@ -0,0 +1,106 @@
1
+ """
2
+ pygments.lexers.special
3
+ ~~~~~~~~~~~~~~~~~~~~~~~
4
+
5
+ Special lexers.
6
+
7
+ :copyright: Copyright 2006-2021 by the Pygments team, see AUTHORS.
8
+ :license: BSD, see LICENSE for details.
9
+ """
10
+
11
+ import ast
12
+ import re
13
+
14
+ from pygments.lexer import Lexer
15
+ from pygments.token import Token, Error, Text
16
+ from pygments.util import get_choice_opt
17
+
18
+
19
+ __all__ = ['TextLexer', 'RawTokenLexer']
20
+
21
+
22
+ class TextLexer(Lexer):
23
+ """
24
+ "Null" lexer, doesn't highlight anything.
25
+ """
26
+ name = 'Text only'
27
+ aliases = ['text']
28
+ filenames = ['*.txt']
29
+ mimetypes = ['text/plain']
30
+ priority = 0.01
31
+
32
+ def get_tokens_unprocessed(self, text):
33
+ yield 0, Text, text
34
+
35
+ def analyse_text(text):
36
+ return TextLexer.priority
37
+
38
+
39
+ _ttype_cache = {}
40
+
41
+ line_re = re.compile('.*?\n')
42
+
43
+
44
+ class RawTokenLexer(Lexer):
45
+ """
46
+ Recreate a token stream formatted with the `RawTokenFormatter`.
47
+
48
+ Additional options accepted:
49
+
50
+ `compress`
51
+ If set to ``"gz"`` or ``"bz2"``, decompress the token stream with
52
+ the given compression algorithm before lexing (default: ``""``).
53
+ """
54
+ name = 'Raw token data'
55
+ aliases = []
56
+ filenames = []
57
+ mimetypes = ['application/x-pygments-tokens']
58
+
59
+ def __init__(self, **options):
60
+ self.compress = get_choice_opt(options, 'compress',
61
+ ['', 'none', 'gz', 'bz2'], '')
62
+ Lexer.__init__(self, **options)
63
+
64
+ def get_tokens(self, text):
65
+ if self.compress:
66
+ if isinstance(text, str):
67
+ text = text.encode('latin1')
68
+ try:
69
+ if self.compress == 'gz':
70
+ import gzip
71
+ text = gzip.decompress(text)
72
+ elif self.compress == 'bz2':
73
+ import bz2
74
+ text = bz2.decompress(text)
75
+ except OSError:
76
+ yield Error, text.decode('latin1')
77
+ if isinstance(text, bytes):
78
+ text = text.decode('latin1')
79
+
80
+ # do not call Lexer.get_tokens() because stripping is not optional.
81
+ text = text.strip('\n') + '\n'
82
+ for i, t, v in self.get_tokens_unprocessed(text):
83
+ yield t, v
84
+
85
+ def get_tokens_unprocessed(self, text):
86
+ length = 0
87
+ for match in line_re.finditer(text):
88
+ try:
89
+ ttypestr, val = match.group().rstrip().split('\t', 1)
90
+ ttype = _ttype_cache.get(ttypestr)
91
+ if not ttype:
92
+ ttype = Token
93
+ ttypes = ttypestr.split('.')[1:]
94
+ for ttype_ in ttypes:
95
+ if not ttype_ or not ttype_[0].isupper():
96
+ raise ValueError('malformed token name')
97
+ ttype = getattr(ttype, ttype_)
98
+ _ttype_cache[ttypestr] = ttype
99
+ val = ast.literal_eval(val)
100
+ if not isinstance(val, str):
101
+ raise ValueError('expected str')
102
+ except (SyntaxError, ValueError):
103
+ val = match.group()
104
+ ttype = Error
105
+ yield length, ttype, val
106
+ length += len(val)
@@ -0,0 +1,832 @@
1
+ """
2
+ pygments.lexers.sql
3
+ ~~~~~~~~~~~~~~~~~~~
4
+
5
+ Lexers for various SQL dialects and related interactive sessions.
6
+
7
+ Postgres specific lexers:
8
+
9
+ `PostgresLexer`
10
+ A SQL lexer for the PostgreSQL dialect. Differences w.r.t. the SQL
11
+ lexer are:
12
+
13
+ - keywords and data types list parsed from the PG docs (run the
14
+ `_postgres_builtins` module to update them);
15
+ - Content of $-strings parsed using a specific lexer, e.g. the content
16
+ of a PL/Python function is parsed using the Python lexer;
17
+ - parse PG specific constructs: E-strings, $-strings, U&-strings,
18
+ different operators and punctuation.
19
+
20
+ `PlPgsqlLexer`
21
+ A lexer for the PL/pgSQL language. Adds a few specific construct on
22
+ top of the PG SQL lexer (such as <<label>>).
23
+
24
+ `PostgresConsoleLexer`
25
+ A lexer to highlight an interactive psql session:
26
+
27
+ - identifies the prompt and does its best to detect the end of command
28
+ in multiline statement where not all the lines are prefixed by a
29
+ prompt, telling them apart from the output;
30
+ - highlights errors in the output and notification levels;
31
+ - handles psql backslash commands.
32
+
33
+ The ``tests/examplefiles`` contains a few test files with data to be
34
+ parsed by these lexers.
35
+
36
+ :copyright: Copyright 2006-2021 by the Pygments team, see AUTHORS.
37
+ :license: BSD, see LICENSE for details.
38
+ """
39
+
40
+ import re
41
+
42
+ from pygments.lexer import Lexer, RegexLexer, do_insertions, bygroups, words
43
+ from pygments.token import Punctuation, Whitespace, Text, Comment, Operator, \
44
+ Keyword, Name, String, Number, Generic, Literal
45
+ from pygments.lexers import get_lexer_by_name, ClassNotFound
46
+
47
+ from pygments.lexers._postgres_builtins import KEYWORDS, DATATYPES, \
48
+ PSEUDO_TYPES, PLPGSQL_KEYWORDS
49
+ from pygments.lexers._mysql_builtins import \
50
+ MYSQL_CONSTANTS, \
51
+ MYSQL_DATATYPES, \
52
+ MYSQL_FUNCTIONS, \
53
+ MYSQL_KEYWORDS, \
54
+ MYSQL_OPTIMIZER_HINTS
55
+
56
+ from pygments.lexers import _tsql_builtins
57
+
58
+
59
+ __all__ = ['PostgresLexer', 'PlPgsqlLexer', 'PostgresConsoleLexer',
60
+ 'SqlLexer', 'TransactSqlLexer', 'MySqlLexer',
61
+ 'SqliteConsoleLexer', 'RqlLexer']
62
+
63
+ line_re = re.compile('.*?\n')
64
+
65
+ language_re = re.compile(r"\s+LANGUAGE\s+'?(\w+)'?", re.IGNORECASE)
66
+
67
+ do_re = re.compile(r'\bDO\b', re.IGNORECASE)
68
+
69
+ # Regular expressions for analyse_text()
70
+ name_between_bracket_re = re.compile(r'\[[a-zA-Z_]\w*\]')
71
+ name_between_backtick_re = re.compile(r'`[a-zA-Z_]\w*`')
72
+ tsql_go_re = re.compile(r'\bgo\b', re.IGNORECASE)
73
+ tsql_declare_re = re.compile(r'\bdeclare\s+@', re.IGNORECASE)
74
+ tsql_variable_re = re.compile(r'@[a-zA-Z_]\w*\b')
75
+
76
+
77
+ def language_callback(lexer, match):
78
+ """Parse the content of a $-string using a lexer
79
+
80
+ The lexer is chosen looking for a nearby LANGUAGE or assumed as
81
+ plpgsql if inside a DO statement and no LANGUAGE has been found.
82
+ """
83
+ lx = None
84
+ m = language_re.match(lexer.text[match.end():match.end()+100])
85
+ if m is not None:
86
+ lx = lexer._get_lexer(m.group(1))
87
+ else:
88
+ m = list(language_re.finditer(
89
+ lexer.text[max(0, match.start()-100):match.start()]))
90
+ if m:
91
+ lx = lexer._get_lexer(m[-1].group(1))
92
+ else:
93
+ m = list(do_re.finditer(
94
+ lexer.text[max(0, match.start()-25):match.start()]))
95
+ if m:
96
+ lx = lexer._get_lexer('plpgsql')
97
+
98
+ # 1 = $, 2 = delimiter, 3 = $
99
+ yield (match.start(1), String, match.group(1))
100
+ yield (match.start(2), String.Delimiter, match.group(2))
101
+ yield (match.start(3), String, match.group(3))
102
+ # 4 = string contents
103
+ if lx:
104
+ yield from lx.get_tokens_unprocessed(match.group(4))
105
+ else:
106
+ yield (match.start(4), String, match.group(4))
107
+ # 5 = $, 6 = delimiter, 7 = $
108
+ yield (match.start(5), String, match.group(5))
109
+ yield (match.start(6), String.Delimiter, match.group(6))
110
+ yield (match.start(7), String, match.group(7))
111
+
112
+
113
+ class PostgresBase:
114
+ """Base class for Postgres-related lexers.
115
+
116
+ This is implemented as a mixin to avoid the Lexer metaclass kicking in.
117
+ this way the different lexer don't have a common Lexer ancestor. If they
118
+ had, _tokens could be created on this ancestor and not updated for the
119
+ other classes, resulting e.g. in PL/pgSQL parsed as SQL. This shortcoming
120
+ seem to suggest that regexp lexers are not really subclassable.
121
+ """
122
+ def get_tokens_unprocessed(self, text, *args):
123
+ # Have a copy of the entire text to be used by `language_callback`.
124
+ self.text = text
125
+ yield from super().get_tokens_unprocessed(text, *args)
126
+
127
+ def _get_lexer(self, lang):
128
+ if lang.lower() == 'sql':
129
+ return get_lexer_by_name('postgresql', **self.options)
130
+
131
+ tries = [lang]
132
+ if lang.startswith('pl'):
133
+ tries.append(lang[2:])
134
+ if lang.endswith('u'):
135
+ tries.append(lang[:-1])
136
+ if lang.startswith('pl') and lang.endswith('u'):
137
+ tries.append(lang[2:-1])
138
+
139
+ for lx in tries:
140
+ try:
141
+ return get_lexer_by_name(lx, **self.options)
142
+ except ClassNotFound:
143
+ pass
144
+ else:
145
+ # TODO: better logging
146
+ # print >>sys.stderr, "language not found:", lang
147
+ return None
148
+
149
+
150
+ class PostgresLexer(PostgresBase, RegexLexer):
151
+ """
152
+ Lexer for the PostgreSQL dialect of SQL.
153
+
154
+ .. versionadded:: 1.5
155
+ """
156
+
157
+ name = 'PostgreSQL SQL dialect'
158
+ aliases = ['postgresql', 'postgres']
159
+ mimetypes = ['text/x-postgresql']
160
+
161
+ flags = re.IGNORECASE
162
+ tokens = {
163
+ 'root': [
164
+ (r'\s+', Text),
165
+ (r'--.*\n?', Comment.Single),
166
+ (r'/\*', Comment.Multiline, 'multiline-comments'),
167
+ (r'(' + '|'.join(s.replace(" ", r"\s+")
168
+ for s in DATATYPES + PSEUDO_TYPES) + r')\b',
169
+ Name.Builtin),
170
+ (words(KEYWORDS, suffix=r'\b'), Keyword),
171
+ (r'[+*/<>=~!@#%^&|`?-]+', Operator),
172
+ (r'::', Operator), # cast
173
+ (r'\$\d+', Name.Variable),
174
+ (r'([0-9]*\.[0-9]*|[0-9]+)(e[+-]?[0-9]+)?', Number.Float),
175
+ (r'[0-9]+', Number.Integer),
176
+ (r"((?:E|U&)?)(')", bygroups(String.Affix, String.Single), 'string'),
177
+ # quoted identifier
178
+ (r'((?:U&)?)(")', bygroups(String.Affix, String.Name), 'quoted-ident'),
179
+ (r'(?s)(\$)([^$]*)(\$)(.*?)(\$)(\2)(\$)', language_callback),
180
+ (r'[a-z_]\w*', Name),
181
+
182
+ # psql variable in SQL
183
+ (r""":(['"]?)[a-z]\w*\b\1""", Name.Variable),
184
+
185
+ (r'[;:()\[\]{},.]', Punctuation),
186
+ ],
187
+ 'multiline-comments': [
188
+ (r'/\*', Comment.Multiline, 'multiline-comments'),
189
+ (r'\*/', Comment.Multiline, '#pop'),
190
+ (r'[^/*]+', Comment.Multiline),
191
+ (r'[/*]', Comment.Multiline)
192
+ ],
193
+ 'string': [
194
+ (r"[^']+", String.Single),
195
+ (r"''", String.Single),
196
+ (r"'", String.Single, '#pop'),
197
+ ],
198
+ 'quoted-ident': [
199
+ (r'[^"]+', String.Name),
200
+ (r'""', String.Name),
201
+ (r'"', String.Name, '#pop'),
202
+ ],
203
+ }
204
+
205
+
206
+ class PlPgsqlLexer(PostgresBase, RegexLexer):
207
+ """
208
+ Handle the extra syntax in Pl/pgSQL language.
209
+
210
+ .. versionadded:: 1.5
211
+ """
212
+ name = 'PL/pgSQL'
213
+ aliases = ['plpgsql']
214
+ mimetypes = ['text/x-plpgsql']
215
+
216
+ flags = re.IGNORECASE
217
+ tokens = {k: l[:] for (k, l) in PostgresLexer.tokens.items()}
218
+
219
+ # extend the keywords list
220
+ for i, pattern in enumerate(tokens['root']):
221
+ if pattern[1] == Keyword:
222
+ tokens['root'][i] = (
223
+ words(KEYWORDS + PLPGSQL_KEYWORDS, suffix=r'\b'),
224
+ Keyword)
225
+ del i
226
+ break
227
+ else:
228
+ assert 0, "SQL keywords not found"
229
+
230
+ # Add specific PL/pgSQL rules (before the SQL ones)
231
+ tokens['root'][:0] = [
232
+ (r'\%[a-z]\w*\b', Name.Builtin), # actually, a datatype
233
+ (r':=', Operator),
234
+ (r'\<\<[a-z]\w*\>\>', Name.Label),
235
+ (r'\#[a-z]\w*\b', Keyword.Pseudo), # #variable_conflict
236
+ ]
237
+
238
+
239
+ class PsqlRegexLexer(PostgresBase, RegexLexer):
240
+ """
241
+ Extend the PostgresLexer adding support specific for psql commands.
242
+
243
+ This is not a complete psql lexer yet as it lacks prompt support
244
+ and output rendering.
245
+ """
246
+
247
+ name = 'PostgreSQL console - regexp based lexer'
248
+ aliases = [] # not public
249
+
250
+ flags = re.IGNORECASE
251
+ tokens = {k: l[:] for (k, l) in PostgresLexer.tokens.items()}
252
+
253
+ tokens['root'].append(
254
+ (r'\\[^\s]+', Keyword.Pseudo, 'psql-command'))
255
+ tokens['psql-command'] = [
256
+ (r'\n', Text, 'root'),
257
+ (r'\s+', Text),
258
+ (r'\\[^\s]+', Keyword.Pseudo),
259
+ (r""":(['"]?)[a-z]\w*\b\1""", Name.Variable),
260
+ (r"'(''|[^'])*'", String.Single),
261
+ (r"`([^`])*`", String.Backtick),
262
+ (r"[^\s]+", String.Symbol),
263
+ ]
264
+
265
+
266
+ re_prompt = re.compile(r'^(\S.*?)??[=\-\(\$\'\"][#>]')
267
+ re_psql_command = re.compile(r'\s*\\')
268
+ re_end_command = re.compile(r';\s*(--.*?)?$')
269
+ re_psql_command = re.compile(r'(\s*)(\\.+?)(\s+)$')
270
+ re_error = re.compile(r'(ERROR|FATAL):')
271
+ re_message = re.compile(
272
+ r'((?:DEBUG|INFO|NOTICE|WARNING|ERROR|'
273
+ r'FATAL|HINT|DETAIL|CONTEXT|LINE [0-9]+):)(.*?\n)')
274
+
275
+
276
+ class lookahead:
277
+ """Wrap an iterator and allow pushing back an item."""
278
+ def __init__(self, x):
279
+ self.iter = iter(x)
280
+ self._nextitem = None
281
+
282
+ def __iter__(self):
283
+ return self
284
+
285
+ def send(self, i):
286
+ self._nextitem = i
287
+ return i
288
+
289
+ def __next__(self):
290
+ if self._nextitem is not None:
291
+ ni = self._nextitem
292
+ self._nextitem = None
293
+ return ni
294
+ return next(self.iter)
295
+ next = __next__
296
+
297
+
298
+ class PostgresConsoleLexer(Lexer):
299
+ """
300
+ Lexer for psql sessions.
301
+
302
+ .. versionadded:: 1.5
303
+ """
304
+
305
+ name = 'PostgreSQL console (psql)'
306
+ aliases = ['psql', 'postgresql-console', 'postgres-console']
307
+ mimetypes = ['text/x-postgresql-psql']
308
+
309
+ def get_tokens_unprocessed(self, data):
310
+ sql = PsqlRegexLexer(**self.options)
311
+
312
+ lines = lookahead(line_re.findall(data))
313
+
314
+ # prompt-output cycle
315
+ while 1:
316
+
317
+ # consume the lines of the command: start with an optional prompt
318
+ # and continue until the end of command is detected
319
+ curcode = ''
320
+ insertions = []
321
+ for line in lines:
322
+ # Identify a shell prompt in case of psql commandline example
323
+ if line.startswith('$') and not curcode:
324
+ lexer = get_lexer_by_name('console', **self.options)
325
+ yield from lexer.get_tokens_unprocessed(line)
326
+ break
327
+
328
+ # Identify a psql prompt
329
+ mprompt = re_prompt.match(line)
330
+ if mprompt is not None:
331
+ insertions.append((len(curcode),
332
+ [(0, Generic.Prompt, mprompt.group())]))
333
+ curcode += line[len(mprompt.group()):]
334
+ else:
335
+ curcode += line
336
+
337
+ # Check if this is the end of the command
338
+ # TODO: better handle multiline comments at the end with
339
+ # a lexer with an external state?
340
+ if re_psql_command.match(curcode) \
341
+ or re_end_command.search(curcode):
342
+ break
343
+
344
+ # Emit the combined stream of command and prompt(s)
345
+ yield from do_insertions(insertions,
346
+ sql.get_tokens_unprocessed(curcode))
347
+
348
+ # Emit the output lines
349
+ out_token = Generic.Output
350
+ for line in lines:
351
+ mprompt = re_prompt.match(line)
352
+ if mprompt is not None:
353
+ # push the line back to have it processed by the prompt
354
+ lines.send(line)
355
+ break
356
+
357
+ mmsg = re_message.match(line)
358
+ if mmsg is not None:
359
+ if mmsg.group(1).startswith("ERROR") \
360
+ or mmsg.group(1).startswith("FATAL"):
361
+ out_token = Generic.Error
362
+ yield (mmsg.start(1), Generic.Strong, mmsg.group(1))
363
+ yield (mmsg.start(2), out_token, mmsg.group(2))
364
+ else:
365
+ yield (0, out_token, line)
366
+ else:
367
+ return
368
+
369
+
370
+ class SqlLexer(RegexLexer):
371
+ """
372
+ Lexer for Structured Query Language. Currently, this lexer does
373
+ not recognize any special syntax except ANSI SQL.
374
+ """
375
+
376
+ name = 'SQL'
377
+ aliases = ['sql']
378
+ filenames = ['*.sql']
379
+ mimetypes = ['text/x-sql']
380
+
381
+ flags = re.IGNORECASE
382
+ tokens = {
383
+ 'root': [
384
+ (r'\s+', Text),
385
+ (r'--.*\n?', Comment.Single),
386
+ (r'/\*', Comment.Multiline, 'multiline-comments'),
387
+ (words((
388
+ 'ABORT', 'ABS', 'ABSOLUTE', 'ACCESS', 'ADA', 'ADD', 'ADMIN', 'AFTER',
389
+ 'AGGREGATE', 'ALIAS', 'ALL', 'ALLOCATE', 'ALTER', 'ANALYSE', 'ANALYZE',
390
+ 'AND', 'ANY', 'ARE', 'AS', 'ASC', 'ASENSITIVE', 'ASSERTION', 'ASSIGNMENT',
391
+ 'ASYMMETRIC', 'AT', 'ATOMIC', 'AUTHORIZATION', 'AVG', 'BACKWARD',
392
+ 'BEFORE', 'BEGIN', 'BETWEEN', 'BITVAR', 'BIT_LENGTH', 'BOTH', 'BREADTH',
393
+ 'BY', 'C', 'CACHE', 'CALL', 'CALLED', 'CARDINALITY', 'CASCADE',
394
+ 'CASCADED', 'CASE', 'CAST', 'CATALOG', 'CATALOG_NAME', 'CHAIN',
395
+ 'CHARACTERISTICS', 'CHARACTER_LENGTH', 'CHARACTER_SET_CATALOG',
396
+ 'CHARACTER_SET_NAME', 'CHARACTER_SET_SCHEMA', 'CHAR_LENGTH', 'CHECK',
397
+ 'CHECKED', 'CHECKPOINT', 'CLASS', 'CLASS_ORIGIN', 'CLOB', 'CLOSE',
398
+ 'CLUSTER', 'COALESCE', 'COBOL', 'COLLATE', 'COLLATION',
399
+ 'COLLATION_CATALOG', 'COLLATION_NAME', 'COLLATION_SCHEMA', 'COLUMN',
400
+ 'COLUMN_NAME', 'COMMAND_FUNCTION', 'COMMAND_FUNCTION_CODE', 'COMMENT',
401
+ 'COMMIT', 'COMMITTED', 'COMPLETION', 'CONDITION_NUMBER', 'CONNECT',
402
+ 'CONNECTION', 'CONNECTION_NAME', 'CONSTRAINT', 'CONSTRAINTS',
403
+ 'CONSTRAINT_CATALOG', 'CONSTRAINT_NAME', 'CONSTRAINT_SCHEMA',
404
+ 'CONSTRUCTOR', 'CONTAINS', 'CONTINUE', 'CONVERSION', 'CONVERT',
405
+ 'COPY', 'CORRESPONDING', 'COUNT', 'CREATE', 'CREATEDB', 'CREATEUSER',
406
+ 'CROSS', 'CUBE', 'CURRENT', 'CURRENT_DATE', 'CURRENT_PATH',
407
+ 'CURRENT_ROLE', 'CURRENT_TIME', 'CURRENT_TIMESTAMP', 'CURRENT_USER',
408
+ 'CURSOR', 'CURSOR_NAME', 'CYCLE', 'DATA', 'DATABASE',
409
+ 'DATETIME_INTERVAL_CODE', 'DATETIME_INTERVAL_PRECISION', 'DAY',
410
+ 'DEALLOCATE', 'DECLARE', 'DEFAULT', 'DEFAULTS', 'DEFERRABLE',
411
+ 'DEFERRED', 'DEFINED', 'DEFINER', 'DELETE', 'DELIMITER', 'DELIMITERS',
412
+ 'DEREF', 'DESC', 'DESCRIBE', 'DESCRIPTOR', 'DESTROY', 'DESTRUCTOR',
413
+ 'DETERMINISTIC', 'DIAGNOSTICS', 'DICTIONARY', 'DISCONNECT', 'DISPATCH',
414
+ 'DISTINCT', 'DO', 'DOMAIN', 'DROP', 'DYNAMIC', 'DYNAMIC_FUNCTION',
415
+ 'DYNAMIC_FUNCTION_CODE', 'EACH', 'ELSE', 'ELSIF', 'ENCODING',
416
+ 'ENCRYPTED', 'END', 'END-EXEC', 'EQUALS', 'ESCAPE', 'EVERY', 'EXCEPTION',
417
+ 'EXCEPT', 'EXCLUDING', 'EXCLUSIVE', 'EXEC', 'EXECUTE', 'EXISTING',
418
+ 'EXISTS', 'EXPLAIN', 'EXTERNAL', 'EXTRACT', 'FALSE', 'FETCH', 'FINAL',
419
+ 'FIRST', 'FOR', 'FORCE', 'FOREIGN', 'FORTRAN', 'FORWARD', 'FOUND', 'FREE',
420
+ 'FREEZE', 'FROM', 'FULL', 'FUNCTION', 'G', 'GENERAL', 'GENERATED', 'GET',
421
+ 'GLOBAL', 'GO', 'GOTO', 'GRANT', 'GRANTED', 'GROUP', 'GROUPING',
422
+ 'HANDLER', 'HAVING', 'HIERARCHY', 'HOLD', 'HOST', 'IDENTITY', 'IF',
423
+ 'IGNORE', 'ILIKE', 'IMMEDIATE', 'IMMEDIATELY', 'IMMUTABLE', 'IMPLEMENTATION', 'IMPLICIT',
424
+ 'IN', 'INCLUDING', 'INCREMENT', 'INDEX', 'INDITCATOR', 'INFIX',
425
+ 'INHERITS', 'INITIALIZE', 'INITIALLY', 'INNER', 'INOUT', 'INPUT',
426
+ 'INSENSITIVE', 'INSERT', 'INSTANTIABLE', 'INSTEAD', 'INTERSECT', 'INTO',
427
+ 'INVOKER', 'IS', 'ISNULL', 'ISOLATION', 'ITERATE', 'JOIN', 'KEY',
428
+ 'KEY_MEMBER', 'KEY_TYPE', 'LANCOMPILER', 'LANGUAGE', 'LARGE', 'LAST',
429
+ 'LATERAL', 'LEADING', 'LEFT', 'LENGTH', 'LESS', 'LEVEL', 'LIKE', 'LIMIT',
430
+ 'LISTEN', 'LOAD', 'LOCAL', 'LOCALTIME', 'LOCALTIMESTAMP', 'LOCATION',
431
+ 'LOCATOR', 'LOCK', 'LOWER', 'MAP', 'MATCH', 'MAX', 'MAXVALUE',
432
+ 'MESSAGE_LENGTH', 'MESSAGE_OCTET_LENGTH', 'MESSAGE_TEXT', 'METHOD', 'MIN',
433
+ 'MINUTE', 'MINVALUE', 'MOD', 'MODE', 'MODIFIES', 'MODIFY', 'MONTH',
434
+ 'MORE', 'MOVE', 'MUMPS', 'NAMES', 'NATIONAL', 'NATURAL', 'NCHAR', 'NCLOB',
435
+ 'NEW', 'NEXT', 'NO', 'NOCREATEDB', 'NOCREATEUSER', 'NONE', 'NOT',
436
+ 'NOTHING', 'NOTIFY', 'NOTNULL', 'NULL', 'NULLABLE', 'NULLIF', 'OBJECT',
437
+ 'OCTET_LENGTH', 'OF', 'OFF', 'OFFSET', 'OIDS', 'OLD', 'ON', 'ONLY',
438
+ 'OPEN', 'OPERATION', 'OPERATOR', 'OPTION', 'OPTIONS', 'OR', 'ORDER',
439
+ 'ORDINALITY', 'OUT', 'OUTER', 'OUTPUT', 'OVERLAPS', 'OVERLAY',
440
+ 'OVERRIDING', 'OWNER', 'PAD', 'PARAMETER', 'PARAMETERS', 'PARAMETER_MODE',
441
+ 'PARAMETER_NAME', 'PARAMETER_ORDINAL_POSITION',
442
+ 'PARAMETER_SPECIFIC_CATALOG', 'PARAMETER_SPECIFIC_NAME',
443
+ 'PARAMETER_SPECIFIC_SCHEMA', 'PARTIAL', 'PASCAL', 'PENDANT', 'PERIOD', 'PLACING',
444
+ 'PLI', 'POSITION', 'POSTFIX', 'PRECEEDS', 'PRECISION', 'PREFIX', 'PREORDER',
445
+ 'PREPARE', 'PRESERVE', 'PRIMARY', 'PRIOR', 'PRIVILEGES', 'PROCEDURAL',
446
+ 'PROCEDURE', 'PUBLIC', 'READ', 'READS', 'RECHECK', 'RECURSIVE', 'REF',
447
+ 'REFERENCES', 'REFERENCING', 'REINDEX', 'RELATIVE', 'RENAME',
448
+ 'REPEATABLE', 'REPLACE', 'RESET', 'RESTART', 'RESTRICT', 'RESULT',
449
+ 'RETURN', 'RETURNED_LENGTH', 'RETURNED_OCTET_LENGTH', 'RETURNED_SQLSTATE',
450
+ 'RETURNS', 'REVOKE', 'RIGHT', 'ROLE', 'ROLLBACK', 'ROLLUP', 'ROUTINE',
451
+ 'ROUTINE_CATALOG', 'ROUTINE_NAME', 'ROUTINE_SCHEMA', 'ROW', 'ROWS',
452
+ 'ROW_COUNT', 'RULE', 'SAVE_POINT', 'SCALE', 'SCHEMA', 'SCHEMA_NAME',
453
+ 'SCOPE', 'SCROLL', 'SEARCH', 'SECOND', 'SECURITY', 'SELECT', 'SELF',
454
+ 'SENSITIVE', 'SERIALIZABLE', 'SERVER_NAME', 'SESSION', 'SESSION_USER',
455
+ 'SET', 'SETOF', 'SETS', 'SHARE', 'SHOW', 'SIMILAR', 'SIMPLE', 'SIZE',
456
+ 'SOME', 'SOURCE', 'SPACE', 'SPECIFIC', 'SPECIFICTYPE', 'SPECIFIC_NAME',
457
+ 'SQL', 'SQLCODE', 'SQLERROR', 'SQLEXCEPTION', 'SQLSTATE', 'SQLWARNINIG',
458
+ 'STABLE', 'START', 'STATE', 'STATEMENT', 'STATIC', 'STATISTICS', 'STDIN',
459
+ 'STDOUT', 'STORAGE', 'STRICT', 'STRUCTURE', 'STYPE', 'SUBCLASS_ORIGIN',
460
+ 'SUBLIST', 'SUBSTRING', 'SUCCEEDS', 'SUM', 'SYMMETRIC', 'SYSID', 'SYSTEM',
461
+ 'SYSTEM_USER', 'TABLE', 'TABLE_NAME', ' TEMP', 'TEMPLATE', 'TEMPORARY',
462
+ 'TERMINATE', 'THAN', 'THEN', 'TIME', 'TIMESTAMP', 'TIMEZONE_HOUR',
463
+ 'TIMEZONE_MINUTE', 'TO', 'TOAST', 'TRAILING', 'TRANSACTION',
464
+ 'TRANSACTIONS_COMMITTED', 'TRANSACTIONS_ROLLED_BACK', 'TRANSACTION_ACTIVE',
465
+ 'TRANSFORM', 'TRANSFORMS', 'TRANSLATE', 'TRANSLATION', 'TREAT', 'TRIGGER',
466
+ 'TRIGGER_CATALOG', 'TRIGGER_NAME', 'TRIGGER_SCHEMA', 'TRIM', 'TRUE',
467
+ 'TRUNCATE', 'TRUSTED', 'TYPE', 'UNCOMMITTED', 'UNDER', 'UNENCRYPTED',
468
+ 'UNION', 'UNIQUE', 'UNKNOWN', 'UNLISTEN', 'UNNAMED', 'UNNEST', 'UNTIL',
469
+ 'UPDATE', 'UPPER', 'USAGE', 'USER', 'USER_DEFINED_TYPE_CATALOG',
470
+ 'USER_DEFINED_TYPE_NAME', 'USER_DEFINED_TYPE_SCHEMA', 'USING', 'VACUUM',
471
+ 'VALID', 'VALIDATOR', 'VALUES', 'VARIABLE', 'VERBOSE',
472
+ 'VERSION', 'VERSIONS', 'VERSIONING', 'VIEW',
473
+ 'VOLATILE', 'WHEN', 'WHENEVER', 'WHERE', 'WITH', 'WITHOUT', 'WORK',
474
+ 'WRITE', 'YEAR', 'ZONE'), suffix=r'\b'),
475
+ Keyword),
476
+ (words((
477
+ 'ARRAY', 'BIGINT', 'BINARY', 'BIT', 'BLOB', 'BOOLEAN', 'CHAR',
478
+ 'CHARACTER', 'DATE', 'DEC', 'DECIMAL', 'FLOAT', 'INT', 'INTEGER',
479
+ 'INTERVAL', 'NUMBER', 'NUMERIC', 'REAL', 'SERIAL', 'SMALLINT',
480
+ 'VARCHAR', 'VARYING', 'INT8', 'SERIAL8', 'TEXT'), suffix=r'\b'),
481
+ Name.Builtin),
482
+ (r'[+*/<>=~!@#%^&|`?-]', Operator),
483
+ (r'[0-9]+', Number.Integer),
484
+ # TODO: Backslash escapes?
485
+ (r"'(''|[^'])*'", String.Single),
486
+ (r'"(""|[^"])*"', String.Symbol), # not a real string literal in ANSI SQL
487
+ (r'[a-z_][\w$]*', Name), # allow $s in strings for Oracle
488
+ (r'[;:()\[\],.]', Punctuation)
489
+ ],
490
+ 'multiline-comments': [
491
+ (r'/\*', Comment.Multiline, 'multiline-comments'),
492
+ (r'\*/', Comment.Multiline, '#pop'),
493
+ (r'[^/*]+', Comment.Multiline),
494
+ (r'[/*]', Comment.Multiline)
495
+ ]
496
+ }
497
+
498
+
499
+ class TransactSqlLexer(RegexLexer):
500
+ """
501
+ Transact-SQL (T-SQL) is Microsoft's and Sybase's proprietary extension to
502
+ SQL.
503
+
504
+ The list of keywords includes ODBC and keywords reserved for future use..
505
+ """
506
+
507
+ name = 'Transact-SQL'
508
+ aliases = ['tsql', 't-sql']
509
+ filenames = ['*.sql']
510
+ mimetypes = ['text/x-tsql']
511
+
512
+ # Use re.UNICODE to allow non ASCII letters in names.
513
+ flags = re.IGNORECASE | re.UNICODE
514
+ tokens = {
515
+ 'root': [
516
+ (r'\s+', Whitespace),
517
+ (r'--.*?$\n?', Comment.Single),
518
+ (r'/\*', Comment.Multiline, 'multiline-comments'),
519
+ (words(_tsql_builtins.OPERATORS), Operator),
520
+ (words(_tsql_builtins.OPERATOR_WORDS, suffix=r'\b'), Operator.Word),
521
+ (words(_tsql_builtins.TYPES, suffix=r'\b'), Name.Class),
522
+ (words(_tsql_builtins.FUNCTIONS, suffix=r'\b'), Name.Function),
523
+ (r'(goto)(\s+)(\w+\b)', bygroups(Keyword, Whitespace, Name.Label)),
524
+ (words(_tsql_builtins.KEYWORDS, suffix=r'\b'), Keyword),
525
+ (r'(\[)([^]]+)(\])', bygroups(Operator, Name, Operator)),
526
+ (r'0x[0-9a-f]+', Number.Hex),
527
+ # Float variant 1, for example: 1., 1.e2, 1.2e3
528
+ (r'[0-9]+\.[0-9]*(e[+-]?[0-9]+)?', Number.Float),
529
+ # Float variant 2, for example: .1, .1e2
530
+ (r'\.[0-9]+(e[+-]?[0-9]+)?', Number.Float),
531
+ # Float variant 3, for example: 123e45
532
+ (r'[0-9]+e[+-]?[0-9]+', Number.Float),
533
+ (r'[0-9]+', Number.Integer),
534
+ (r"'(''|[^'])*'", String.Single),
535
+ (r'"(""|[^"])*"', String.Symbol),
536
+ (r'[;(),.]', Punctuation),
537
+ # Below we use \w even for the first "real" character because
538
+ # tokens starting with a digit have already been recognized
539
+ # as Number above.
540
+ (r'@@\w+', Name.Builtin),
541
+ (r'@\w+', Name.Variable),
542
+ (r'(\w+)(:)', bygroups(Name.Label, Punctuation)),
543
+ (r'#?#?\w+', Name), # names for temp tables and anything else
544
+ (r'\?', Name.Variable.Magic), # parameter for prepared statements
545
+ ],
546
+ 'multiline-comments': [
547
+ (r'/\*', Comment.Multiline, 'multiline-comments'),
548
+ (r'\*/', Comment.Multiline, '#pop'),
549
+ (r'[^/*]+', Comment.Multiline),
550
+ (r'[/*]', Comment.Multiline)
551
+ ]
552
+ }
553
+
554
+ def analyse_text(text):
555
+ rating = 0
556
+ if tsql_declare_re.search(text):
557
+ # Found T-SQL variable declaration.
558
+ rating = 1.0
559
+ else:
560
+ name_between_backtick_count = len(
561
+ name_between_backtick_re.findall(text))
562
+ name_between_bracket_count = len(
563
+ name_between_bracket_re.findall(text))
564
+ # We need to check if there are any names using
565
+ # backticks or brackets, as otherwise both are 0
566
+ # and 0 >= 2 * 0, so we would always assume it's true
567
+ dialect_name_count = name_between_backtick_count + name_between_bracket_count
568
+ if dialect_name_count >= 1 and \
569
+ name_between_bracket_count >= 2 * name_between_backtick_count:
570
+ # Found at least twice as many [name] as `name`.
571
+ rating += 0.5
572
+ elif name_between_bracket_count > name_between_backtick_count:
573
+ rating += 0.2
574
+ elif name_between_bracket_count > 0:
575
+ rating += 0.1
576
+ if tsql_variable_re.search(text) is not None:
577
+ rating += 0.1
578
+ if tsql_go_re.search(text) is not None:
579
+ rating += 0.1
580
+ return rating
581
+
582
+
583
+ class MySqlLexer(RegexLexer):
584
+ """The Oracle MySQL lexer.
585
+
586
+ This lexer does not attempt to maintain strict compatibility with
587
+ MariaDB syntax or keywords. Although MySQL and MariaDB's common code
588
+ history suggests there may be significant overlap between the two,
589
+ compatibility between the two is not a target for this lexer.
590
+ """
591
+
592
+ name = 'MySQL'
593
+ aliases = ['mysql']
594
+ mimetypes = ['text/x-mysql']
595
+
596
+ flags = re.IGNORECASE
597
+ tokens = {
598
+ 'root': [
599
+ (r'\s+', Text),
600
+
601
+ # Comments
602
+ (r'(?:#|--\s+).*', Comment.Single),
603
+ (r'/\*\+', Comment.Special, 'optimizer-hints'),
604
+ (r'/\*', Comment.Multiline, 'multiline-comment'),
605
+
606
+ # Hexadecimal literals
607
+ (r"x'([0-9a-f]{2})+'", Number.Hex), # MySQL requires paired hex characters in this form.
608
+ (r'0x[0-9a-f]+', Number.Hex),
609
+
610
+ # Binary literals
611
+ (r"b'[01]+'", Number.Bin),
612
+ (r'0b[01]+', Number.Bin),
613
+
614
+ # Numeric literals
615
+ (r'[0-9]+\.[0-9]*(e[+-]?[0-9]+)?', Number.Float), # Mandatory integer, optional fraction and exponent
616
+ (r'[0-9]*\.[0-9]+(e[+-]?[0-9]+)?', Number.Float), # Mandatory fraction, optional integer and exponent
617
+ (r'[0-9]+e[+-]?[0-9]+', Number.Float), # Exponents with integer significands are still floats
618
+ (r'[0-9]+(?=[^0-9a-z$_\u0080-\uffff])', Number.Integer), # Integers that are not in a schema object name
619
+
620
+ # Date literals
621
+ (r"\{\s*d\s*(?P<quote>['\"])\s*\d{2}(\d{2})?.?\d{2}.?\d{2}\s*(?P=quote)\s*\}",
622
+ Literal.Date),
623
+
624
+ # Time literals
625
+ (r"\{\s*t\s*(?P<quote>['\"])\s*(?:\d+\s+)?\d{1,2}.?\d{1,2}.?\d{1,2}(\.\d*)?\s*(?P=quote)\s*\}",
626
+ Literal.Date),
627
+
628
+ # Timestamp literals
629
+ (
630
+ r"\{\s*ts\s*(?P<quote>['\"])\s*"
631
+ r"\d{2}(?:\d{2})?.?\d{2}.?\d{2}" # Date part
632
+ r"\s+" # Whitespace between date and time
633
+ r"\d{1,2}.?\d{1,2}.?\d{1,2}(\.\d*)?" # Time part
634
+ r"\s*(?P=quote)\s*\}",
635
+ Literal.Date
636
+ ),
637
+
638
+ # String literals
639
+ (r"'", String.Single, 'single-quoted-string'),
640
+ (r'"', String.Double, 'double-quoted-string'),
641
+
642
+ # Variables
643
+ (r'@@(?:global\.|persist\.|persist_only\.|session\.)?[a-z_]+', Name.Variable),
644
+ (r'@[a-z0-9_$.]+', Name.Variable),
645
+ (r"@'", Name.Variable, 'single-quoted-variable'),
646
+ (r'@"', Name.Variable, 'double-quoted-variable'),
647
+ (r"@`", Name.Variable, 'backtick-quoted-variable'),
648
+ (r'\?', Name.Variable), # For demonstrating prepared statements
649
+
650
+ # Operators
651
+ (r'[!%&*+/:<=>^|~-]+', Operator),
652
+
653
+ # Exceptions; these words tokenize differently in different contexts.
654
+ (r'\b(set)(?!\s*\()', Keyword),
655
+ (r'\b(character)(\s+)(set)\b', bygroups(Keyword, Text, Keyword)),
656
+ # In all other known cases, "SET" is tokenized by MYSQL_DATATYPES.
657
+
658
+ (words(MYSQL_CONSTANTS, prefix=r'\b', suffix=r'\b'), Name.Constant),
659
+ (words(MYSQL_DATATYPES, prefix=r'\b', suffix=r'\b'), Keyword.Type),
660
+ (words(MYSQL_KEYWORDS, prefix=r'\b', suffix=r'\b'), Keyword),
661
+ (words(MYSQL_FUNCTIONS, prefix=r'\b', suffix=r'\b(\s*)(\()'),
662
+ bygroups(Name.Function, Text, Punctuation)),
663
+
664
+ # Schema object names
665
+ #
666
+ # Note: Although the first regex supports unquoted all-numeric
667
+ # identifiers, this will not be a problem in practice because
668
+ # numeric literals have already been handled above.
669
+ #
670
+ ('[0-9a-z$_\u0080-\uffff]+', Name),
671
+ (r'`', Name.Quoted, 'schema-object-name'),
672
+
673
+ # Punctuation
674
+ (r'[(),.;]', Punctuation),
675
+ ],
676
+
677
+ # Multiline comment substates
678
+ # ---------------------------
679
+
680
+ 'optimizer-hints': [
681
+ (r'[^*a-z]+', Comment.Special),
682
+ (r'\*/', Comment.Special, '#pop'),
683
+ (words(MYSQL_OPTIMIZER_HINTS, suffix=r'\b'), Comment.Preproc),
684
+ ('[a-z]+', Comment.Special),
685
+ (r'\*', Comment.Special),
686
+ ],
687
+
688
+ 'multiline-comment': [
689
+ (r'[^*]+', Comment.Multiline),
690
+ (r'\*/', Comment.Multiline, '#pop'),
691
+ (r'\*', Comment.Multiline),
692
+ ],
693
+
694
+ # String substates
695
+ # ----------------
696
+
697
+ 'single-quoted-string': [
698
+ (r"[^'\\]+", String.Single),
699
+ (r"''", String.Escape),
700
+ (r"""\\[0'"bnrtZ\\%_]""", String.Escape),
701
+ (r"'", String.Single, '#pop'),
702
+ ],
703
+
704
+ 'double-quoted-string': [
705
+ (r'[^"\\]+', String.Double),
706
+ (r'""', String.Escape),
707
+ (r"""\\[0'"bnrtZ\\%_]""", String.Escape),
708
+ (r'"', String.Double, '#pop'),
709
+ ],
710
+
711
+ # Variable substates
712
+ # ------------------
713
+
714
+ 'single-quoted-variable': [
715
+ (r"[^']+", Name.Variable),
716
+ (r"''", Name.Variable),
717
+ (r"'", Name.Variable, '#pop'),
718
+ ],
719
+
720
+ 'double-quoted-variable': [
721
+ (r'[^"]+', Name.Variable),
722
+ (r'""', Name.Variable),
723
+ (r'"', Name.Variable, '#pop'),
724
+ ],
725
+
726
+ 'backtick-quoted-variable': [
727
+ (r'[^`]+', Name.Variable),
728
+ (r'``', Name.Variable),
729
+ (r'`', Name.Variable, '#pop'),
730
+ ],
731
+
732
+ # Schema object name substates
733
+ # ----------------------------
734
+ #
735
+ # "Name.Quoted" and "Name.Quoted.Escape" are non-standard but
736
+ # formatters will style them as "Name" by default but add
737
+ # additional styles based on the token name. This gives users
738
+ # flexibility to add custom styles as desired.
739
+ #
740
+ 'schema-object-name': [
741
+ (r'[^`]+', Name.Quoted),
742
+ (r'``', Name.Quoted.Escape),
743
+ (r'`', Name.Quoted, '#pop'),
744
+ ],
745
+ }
746
+
747
+ def analyse_text(text):
748
+ rating = 0
749
+ name_between_backtick_count = len(
750
+ name_between_backtick_re.findall(text))
751
+ name_between_bracket_count = len(
752
+ name_between_bracket_re.findall(text))
753
+ # Same logic as above in the TSQL analysis
754
+ dialect_name_count = name_between_backtick_count + name_between_bracket_count
755
+ if dialect_name_count >= 1 and \
756
+ name_between_backtick_count >= 2 * name_between_bracket_count:
757
+ # Found at least twice as many `name` as [name].
758
+ rating += 0.5
759
+ elif name_between_backtick_count > name_between_bracket_count:
760
+ rating += 0.2
761
+ elif name_between_backtick_count > 0:
762
+ rating += 0.1
763
+ return rating
764
+
765
+
766
+ class SqliteConsoleLexer(Lexer):
767
+ """
768
+ Lexer for example sessions using sqlite3.
769
+
770
+ .. versionadded:: 0.11
771
+ """
772
+
773
+ name = 'sqlite3con'
774
+ aliases = ['sqlite3']
775
+ filenames = ['*.sqlite3-console']
776
+ mimetypes = ['text/x-sqlite3-console']
777
+
778
+ def get_tokens_unprocessed(self, data):
779
+ sql = SqlLexer(**self.options)
780
+
781
+ curcode = ''
782
+ insertions = []
783
+ for match in line_re.finditer(data):
784
+ line = match.group()
785
+ if line.startswith('sqlite> ') or line.startswith(' ...> '):
786
+ insertions.append((len(curcode),
787
+ [(0, Generic.Prompt, line[:8])]))
788
+ curcode += line[8:]
789
+ else:
790
+ if curcode:
791
+ yield from do_insertions(insertions,
792
+ sql.get_tokens_unprocessed(curcode))
793
+ curcode = ''
794
+ insertions = []
795
+ if line.startswith('SQL error: '):
796
+ yield (match.start(), Generic.Traceback, line)
797
+ else:
798
+ yield (match.start(), Generic.Output, line)
799
+ if curcode:
800
+ yield from do_insertions(insertions,
801
+ sql.get_tokens_unprocessed(curcode))
802
+
803
+
804
+ class RqlLexer(RegexLexer):
805
+ """
806
+ Lexer for Relation Query Language.
807
+
808
+ `RQL <http://www.logilab.org/project/rql>`_
809
+
810
+ .. versionadded:: 2.0
811
+ """
812
+ name = 'RQL'
813
+ aliases = ['rql']
814
+ filenames = ['*.rql']
815
+ mimetypes = ['text/x-rql']
816
+
817
+ flags = re.IGNORECASE
818
+ tokens = {
819
+ 'root': [
820
+ (r'\s+', Text),
821
+ (r'(DELETE|SET|INSERT|UNION|DISTINCT|WITH|WHERE|BEING|OR'
822
+ r'|AND|NOT|GROUPBY|HAVING|ORDERBY|ASC|DESC|LIMIT|OFFSET'
823
+ r'|TODAY|NOW|TRUE|FALSE|NULL|EXISTS)\b', Keyword),
824
+ (r'[+*/<>=%-]', Operator),
825
+ (r'(Any|is|instance_of|CWEType|CWRelation)\b', Name.Builtin),
826
+ (r'[0-9]+', Number.Integer),
827
+ (r'[A-Z_]\w*\??', Name),
828
+ (r"'(''|[^'])*'", String.Single),
829
+ (r'"(""|[^"])*"', String.Single),
830
+ (r'[;:()\[\],.]', Punctuation)
831
+ ],
832
+ }