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,225 @@
1
+ """
2
+ pygments.lexers.mime
3
+ ~~~~~~~~~~~~~~~~~~~~
4
+
5
+ Lexer for Multipurpose Internet Mail Extensions (MIME) data.
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, include
14
+ from pygments.lexers import get_lexer_for_mimetype
15
+ from pygments.token import Text, Name, String, Operator, Comment, Other
16
+ from pygments.util import get_int_opt, ClassNotFound
17
+
18
+ __all__ = ["MIMELexer"]
19
+
20
+
21
+ class MIMELexer(RegexLexer):
22
+ """
23
+ Lexer for Multipurpose Internet Mail Extensions (MIME) data. This lexer is
24
+ designed to process the nested mulitpart data.
25
+
26
+ It assumes that the given data contains both header and body (and is
27
+ splitted by empty line). If no valid header is found, then the entire data
28
+ would be treated as body.
29
+
30
+ Additional options accepted:
31
+
32
+ `MIME-max-level`
33
+ Max recurssion level for nested MIME structure. Any negative number
34
+ would treated as unlimited. (default: -1)
35
+
36
+ `Content-Type`
37
+ Treat the data as specific content type. Useful when header is
38
+ missing, or this lexer would try to parse from header. (default:
39
+ `text/plain`)
40
+
41
+ `Multipart-Boundary`
42
+ Set the default multipart boundary delimiter. This option is only used
43
+ when `Content-Type` is `multipart` and header is missing. This lexer
44
+ would try to parse from header by default. (default: None)
45
+
46
+ `Content-Transfer-Encoding`
47
+ Treat the data as specific encoding. Or this lexer would try to parse
48
+ from header by default. (default: None)
49
+
50
+ .. versionadded:: 2.5
51
+ """
52
+
53
+ name = "MIME"
54
+ aliases = ["mime"]
55
+ mimetypes = ["multipart/mixed",
56
+ "multipart/related",
57
+ "multipart/alternative"]
58
+
59
+ def __init__(self, **options):
60
+ super().__init__(**options)
61
+ self.boundary = options.get("Multipart-Boundary")
62
+ self.content_transfer_encoding = options.get("Content_Transfer_Encoding")
63
+ self.content_type = options.get("Content_Type", "text/plain")
64
+ self.max_nested_level = get_int_opt(options, "MIME-max-level", -1)
65
+
66
+ def analyse_text(text):
67
+ try:
68
+ header, body = text.strip().split("\n\n", 1)
69
+ if not body.strip():
70
+ return 0.1
71
+
72
+ invalid_headers = MIMELexer.tokens["header"].sub("", header)
73
+ if invalid_headers.strip():
74
+ return 0.1
75
+ else:
76
+ return 1
77
+
78
+ except ValueError:
79
+ return 0
80
+
81
+ def get_header_tokens(self, match):
82
+ field = match.group(1)
83
+
84
+ if field.lower() in self.attention_headers:
85
+ yield match.start(1), Name.Tag, field + ":"
86
+ yield match.start(2), Text.Whitespace, match.group(2)
87
+
88
+ pos = match.end(2)
89
+ body = match.group(3)
90
+ for i, t, v in self.get_tokens_unprocessed(body, ("root", field.lower())):
91
+ yield pos + i, t, v
92
+
93
+ else:
94
+ yield match.start(), Comment, match.group()
95
+
96
+ def get_body_tokens(self, match):
97
+ pos_body_start = match.start()
98
+ entire_body = match.group()
99
+
100
+ # skip first newline
101
+ if entire_body[0] == '\n':
102
+ yield pos_body_start, Text.Whitespace, '\n'
103
+ pos_body_start = pos_body_start + 1
104
+ entire_body = entire_body[1:]
105
+
106
+ # if it is not a mulitpart
107
+ if not self.content_type.startswith("multipart") or not self.boundary:
108
+ for i, t, v in self.get_bodypart_tokens(entire_body):
109
+ yield pos_body_start + i, t, v
110
+ return
111
+
112
+ # find boundary
113
+ bdry_pattern = r"^--%s(--)?\n" % re.escape(self.boundary)
114
+ bdry_matcher = re.compile(bdry_pattern, re.MULTILINE)
115
+
116
+ # some data has prefix text before first boundary
117
+ m = bdry_matcher.search(entire_body)
118
+ if m:
119
+ pos_part_start = pos_body_start + m.end()
120
+ pos_iter_start = lpos_end = m.end()
121
+ yield pos_body_start, Text, entire_body[:m.start()]
122
+ yield pos_body_start + lpos_end, String.Delimiter, m.group()
123
+ else:
124
+ pos_part_start = pos_body_start
125
+ pos_iter_start = 0
126
+
127
+ # process tokens of each body part
128
+ for m in bdry_matcher.finditer(entire_body, pos_iter_start):
129
+ # bodypart
130
+ lpos_start = pos_part_start - pos_body_start
131
+ lpos_end = m.start()
132
+ part = entire_body[lpos_start:lpos_end]
133
+ for i, t, v in self.get_bodypart_tokens(part):
134
+ yield pos_part_start + i, t, v
135
+
136
+ # boundary
137
+ yield pos_body_start + lpos_end, String.Delimiter, m.group()
138
+ pos_part_start = pos_body_start + m.end()
139
+
140
+ # some data has suffix text after last boundary
141
+ lpos_start = pos_part_start - pos_body_start
142
+ if lpos_start != len(entire_body):
143
+ yield pos_part_start, Text, entire_body[lpos_start:]
144
+
145
+ def get_bodypart_tokens(self, text):
146
+ # return if:
147
+ # * no content
148
+ # * no content type specific
149
+ # * content encoding is not readable
150
+ # * max recurrsion exceed
151
+ if not text.strip() or not self.content_type:
152
+ return [(0, Other, text)]
153
+
154
+ cte = self.content_transfer_encoding
155
+ if cte and cte not in {"8bit", "7bit", "quoted-printable"}:
156
+ return [(0, Other, text)]
157
+
158
+ if self.max_nested_level == 0:
159
+ return [(0, Other, text)]
160
+
161
+ # get lexer
162
+ try:
163
+ lexer = get_lexer_for_mimetype(self.content_type)
164
+ except ClassNotFound:
165
+ return [(0, Other, text)]
166
+
167
+ if isinstance(lexer, type(self)):
168
+ lexer.max_nested_level = self.max_nested_level - 1
169
+
170
+ return lexer.get_tokens_unprocessed(text)
171
+
172
+ def store_content_type(self, match):
173
+ self.content_type = match.group(1)
174
+
175
+ prefix_len = match.start(1) - match.start(0)
176
+ yield match.start(0), Text.Whitespace, match.group(0)[:prefix_len]
177
+ yield match.start(1), Name.Label, match.group(2)
178
+ yield match.end(2), String.Delimiter, '/'
179
+ yield match.start(3), Name.Label, match.group(3)
180
+
181
+ def get_content_type_subtokens(self, match):
182
+ yield match.start(1), Text, match.group(1)
183
+ yield match.start(2), Text.Whitespace, match.group(2)
184
+ yield match.start(3), Name.Attribute, match.group(3)
185
+ yield match.start(4), Operator, match.group(4)
186
+ yield match.start(5), String, match.group(5)
187
+
188
+ if match.group(3).lower() == "boundary":
189
+ boundary = match.group(5).strip()
190
+ if boundary[0] == '"' and boundary[-1] == '"':
191
+ boundary = boundary[1:-1]
192
+ self.boundary = boundary
193
+
194
+ def store_content_transfer_encoding(self, match):
195
+ self.content_transfer_encoding = match.group(0).lower()
196
+ yield match.start(0), Name.Constant, match.group(0)
197
+
198
+ attention_headers = {"content-type", "content-transfer-encoding"}
199
+
200
+ tokens = {
201
+ "root": [
202
+ (r"^([\w-]+):( *)([\s\S]*?\n)(?![ \t])", get_header_tokens),
203
+ (r"^$[\s\S]+", get_body_tokens),
204
+ ],
205
+ "header": [
206
+ # folding
207
+ (r"\n[ \t]", Text.Whitespace),
208
+ (r"\n(?![ \t])", Text.Whitespace, "#pop"),
209
+ ],
210
+ "content-type": [
211
+ include("header"),
212
+ (
213
+ r"^\s*((multipart|application|audio|font|image|model|text|video"
214
+ r"|message)/([\w-]+))",
215
+ store_content_type,
216
+ ),
217
+ (r'(;)((?:[ \t]|\n[ \t])*)([\w:-]+)(=)([\s\S]*?)(?=;|\n(?![ \t]))',
218
+ get_content_type_subtokens),
219
+ (r';[ \t]*\n(?![ \t])', Text, '#pop'),
220
+ ],
221
+ "content-transfer-encoding": [
222
+ include("header"),
223
+ (r"([\w-]+)", store_content_transfer_encoding),
224
+ ],
225
+ }
@@ -0,0 +1,957 @@
1
+ """
2
+ pygments.lexers.ml
3
+ ~~~~~~~~~~~~~~~~~~
4
+
5
+ Lexers for ML family languages.
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, include, bygroups, default, words
14
+ from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
15
+ Number, Punctuation, Error
16
+
17
+ __all__ = ['SMLLexer', 'OcamlLexer', 'OpaLexer', 'ReasonLexer', 'FStarLexer']
18
+
19
+
20
+ class SMLLexer(RegexLexer):
21
+ """
22
+ For the Standard ML language.
23
+
24
+ .. versionadded:: 1.5
25
+ """
26
+
27
+ name = 'Standard ML'
28
+ aliases = ['sml']
29
+ filenames = ['*.sml', '*.sig', '*.fun']
30
+ mimetypes = ['text/x-standardml', 'application/x-standardml']
31
+
32
+ alphanumid_reserved = {
33
+ # Core
34
+ 'abstype', 'and', 'andalso', 'as', 'case', 'datatype', 'do', 'else',
35
+ 'end', 'exception', 'fn', 'fun', 'handle', 'if', 'in', 'infix',
36
+ 'infixr', 'let', 'local', 'nonfix', 'of', 'op', 'open', 'orelse',
37
+ 'raise', 'rec', 'then', 'type', 'val', 'with', 'withtype', 'while',
38
+ # Modules
39
+ 'eqtype', 'functor', 'include', 'sharing', 'sig', 'signature',
40
+ 'struct', 'structure', 'where',
41
+ }
42
+
43
+ symbolicid_reserved = {
44
+ # Core
45
+ ':', r'\|', '=', '=>', '->', '#',
46
+ # Modules
47
+ ':>',
48
+ }
49
+
50
+ nonid_reserved = {'(', ')', '[', ']', '{', '}', ',', ';', '...', '_'}
51
+
52
+ alphanumid_re = r"[a-zA-Z][\w']*"
53
+ symbolicid_re = r"[!%&$#+\-/:<=>?@\\~`^|*]+"
54
+
55
+ # A character constant is a sequence of the form #s, where s is a string
56
+ # constant denoting a string of size one character. This setup just parses
57
+ # the entire string as either a String.Double or a String.Char (depending
58
+ # on the argument), even if the String.Char is an erronous
59
+ # multiple-character string.
60
+ def stringy(whatkind):
61
+ return [
62
+ (r'[^"\\]', whatkind),
63
+ (r'\\[\\"abtnvfr]', String.Escape),
64
+ # Control-character notation is used for codes < 32,
65
+ # where \^@ == \000
66
+ (r'\\\^[\x40-\x5e]', String.Escape),
67
+ # Docs say 'decimal digits'
68
+ (r'\\[0-9]{3}', String.Escape),
69
+ (r'\\u[0-9a-fA-F]{4}', String.Escape),
70
+ (r'\\\s+\\', String.Interpol),
71
+ (r'"', whatkind, '#pop'),
72
+ ]
73
+
74
+ # Callbacks for distinguishing tokens and reserved words
75
+ def long_id_callback(self, match):
76
+ if match.group(1) in self.alphanumid_reserved:
77
+ token = Error
78
+ else:
79
+ token = Name.Namespace
80
+ yield match.start(1), token, match.group(1)
81
+ yield match.start(2), Punctuation, match.group(2)
82
+
83
+ def end_id_callback(self, match):
84
+ if match.group(1) in self.alphanumid_reserved:
85
+ token = Error
86
+ elif match.group(1) in self.symbolicid_reserved:
87
+ token = Error
88
+ else:
89
+ token = Name
90
+ yield match.start(1), token, match.group(1)
91
+
92
+ def id_callback(self, match):
93
+ str = match.group(1)
94
+ if str in self.alphanumid_reserved:
95
+ token = Keyword.Reserved
96
+ elif str in self.symbolicid_reserved:
97
+ token = Punctuation
98
+ else:
99
+ token = Name
100
+ yield match.start(1), token, str
101
+
102
+ tokens = {
103
+ # Whitespace and comments are (almost) everywhere
104
+ 'whitespace': [
105
+ (r'\s+', Text),
106
+ (r'\(\*', Comment.Multiline, 'comment'),
107
+ ],
108
+
109
+ 'delimiters': [
110
+ # This lexer treats these delimiters specially:
111
+ # Delimiters define scopes, and the scope is how the meaning of
112
+ # the `|' is resolved - is it a case/handle expression, or function
113
+ # definition by cases? (This is not how the Definition works, but
114
+ # it's how MLton behaves, see http://mlton.org/SMLNJDeviations)
115
+ (r'\(|\[|\{', Punctuation, 'main'),
116
+ (r'\)|\]|\}', Punctuation, '#pop'),
117
+ (r'\b(let|if|local)\b(?!\')', Keyword.Reserved, ('main', 'main')),
118
+ (r'\b(struct|sig|while)\b(?!\')', Keyword.Reserved, 'main'),
119
+ (r'\b(do|else|end|in|then)\b(?!\')', Keyword.Reserved, '#pop'),
120
+ ],
121
+
122
+ 'core': [
123
+ # Punctuation that doesn't overlap symbolic identifiers
124
+ (r'(%s)' % '|'.join(re.escape(z) for z in nonid_reserved),
125
+ Punctuation),
126
+
127
+ # Special constants: strings, floats, numbers in decimal and hex
128
+ (r'#"', String.Char, 'char'),
129
+ (r'"', String.Double, 'string'),
130
+ (r'~?0x[0-9a-fA-F]+', Number.Hex),
131
+ (r'0wx[0-9a-fA-F]+', Number.Hex),
132
+ (r'0w\d+', Number.Integer),
133
+ (r'~?\d+\.\d+[eE]~?\d+', Number.Float),
134
+ (r'~?\d+\.\d+', Number.Float),
135
+ (r'~?\d+[eE]~?\d+', Number.Float),
136
+ (r'~?\d+', Number.Integer),
137
+
138
+ # Labels
139
+ (r'#\s*[1-9][0-9]*', Name.Label),
140
+ (r'#\s*(%s)' % alphanumid_re, Name.Label),
141
+ (r'#\s+(%s)' % symbolicid_re, Name.Label),
142
+ # Some reserved words trigger a special, local lexer state change
143
+ (r'\b(datatype|abstype)\b(?!\')', Keyword.Reserved, 'dname'),
144
+ (r'\b(exception)\b(?!\')', Keyword.Reserved, 'ename'),
145
+ (r'\b(functor|include|open|signature|structure)\b(?!\')',
146
+ Keyword.Reserved, 'sname'),
147
+ (r'\b(type|eqtype)\b(?!\')', Keyword.Reserved, 'tname'),
148
+
149
+ # Regular identifiers, long and otherwise
150
+ (r'\'[\w\']*', Name.Decorator),
151
+ (r'(%s)(\.)' % alphanumid_re, long_id_callback, "dotted"),
152
+ (r'(%s)' % alphanumid_re, id_callback),
153
+ (r'(%s)' % symbolicid_re, id_callback),
154
+ ],
155
+ 'dotted': [
156
+ (r'(%s)(\.)' % alphanumid_re, long_id_callback),
157
+ (r'(%s)' % alphanumid_re, end_id_callback, "#pop"),
158
+ (r'(%s)' % symbolicid_re, end_id_callback, "#pop"),
159
+ (r'\s+', Error),
160
+ (r'\S+', Error),
161
+ ],
162
+
163
+
164
+ # Main parser (prevents errors in files that have scoping errors)
165
+ 'root': [
166
+ default('main')
167
+ ],
168
+
169
+ # In this scope, I expect '|' to not be followed by a function name,
170
+ # and I expect 'and' to be followed by a binding site
171
+ 'main': [
172
+ include('whitespace'),
173
+
174
+ # Special behavior of val/and/fun
175
+ (r'\b(val|and)\b(?!\')', Keyword.Reserved, 'vname'),
176
+ (r'\b(fun)\b(?!\')', Keyword.Reserved,
177
+ ('#pop', 'main-fun', 'fname')),
178
+
179
+ include('delimiters'),
180
+ include('core'),
181
+ (r'\S+', Error),
182
+ ],
183
+
184
+ # In this scope, I expect '|' and 'and' to be followed by a function
185
+ 'main-fun': [
186
+ include('whitespace'),
187
+
188
+ (r'\s', Text),
189
+ (r'\(\*', Comment.Multiline, 'comment'),
190
+
191
+ # Special behavior of val/and/fun
192
+ (r'\b(fun|and)\b(?!\')', Keyword.Reserved, 'fname'),
193
+ (r'\b(val)\b(?!\')', Keyword.Reserved,
194
+ ('#pop', 'main', 'vname')),
195
+
196
+ # Special behavior of '|' and '|'-manipulating keywords
197
+ (r'\|', Punctuation, 'fname'),
198
+ (r'\b(case|handle)\b(?!\')', Keyword.Reserved,
199
+ ('#pop', 'main')),
200
+
201
+ include('delimiters'),
202
+ include('core'),
203
+ (r'\S+', Error),
204
+ ],
205
+
206
+ # Character and string parsers
207
+ 'char': stringy(String.Char),
208
+ 'string': stringy(String.Double),
209
+
210
+ 'breakout': [
211
+ (r'(?=\b(%s)\b(?!\'))' % '|'.join(alphanumid_reserved), Text, '#pop'),
212
+ ],
213
+
214
+ # Dealing with what comes after module system keywords
215
+ 'sname': [
216
+ include('whitespace'),
217
+ include('breakout'),
218
+
219
+ (r'(%s)' % alphanumid_re, Name.Namespace),
220
+ default('#pop'),
221
+ ],
222
+
223
+ # Dealing with what comes after the 'fun' (or 'and' or '|') keyword
224
+ 'fname': [
225
+ include('whitespace'),
226
+ (r'\'[\w\']*', Name.Decorator),
227
+ (r'\(', Punctuation, 'tyvarseq'),
228
+
229
+ (r'(%s)' % alphanumid_re, Name.Function, '#pop'),
230
+ (r'(%s)' % symbolicid_re, Name.Function, '#pop'),
231
+
232
+ # Ignore interesting function declarations like "fun (x + y) = ..."
233
+ default('#pop'),
234
+ ],
235
+
236
+ # Dealing with what comes after the 'val' (or 'and') keyword
237
+ 'vname': [
238
+ include('whitespace'),
239
+ (r'\'[\w\']*', Name.Decorator),
240
+ (r'\(', Punctuation, 'tyvarseq'),
241
+
242
+ (r'(%s)(\s*)(=(?!%s))' % (alphanumid_re, symbolicid_re),
243
+ bygroups(Name.Variable, Text, Punctuation), '#pop'),
244
+ (r'(%s)(\s*)(=(?!%s))' % (symbolicid_re, symbolicid_re),
245
+ bygroups(Name.Variable, Text, Punctuation), '#pop'),
246
+ (r'(%s)' % alphanumid_re, Name.Variable, '#pop'),
247
+ (r'(%s)' % symbolicid_re, Name.Variable, '#pop'),
248
+
249
+ # Ignore interesting patterns like 'val (x, y)'
250
+ default('#pop'),
251
+ ],
252
+
253
+ # Dealing with what comes after the 'type' (or 'and') keyword
254
+ 'tname': [
255
+ include('whitespace'),
256
+ include('breakout'),
257
+
258
+ (r'\'[\w\']*', Name.Decorator),
259
+ (r'\(', Punctuation, 'tyvarseq'),
260
+ (r'=(?!%s)' % symbolicid_re, Punctuation, ('#pop', 'typbind')),
261
+
262
+ (r'(%s)' % alphanumid_re, Keyword.Type),
263
+ (r'(%s)' % symbolicid_re, Keyword.Type),
264
+ (r'\S+', Error, '#pop'),
265
+ ],
266
+
267
+ # A type binding includes most identifiers
268
+ 'typbind': [
269
+ include('whitespace'),
270
+
271
+ (r'\b(and)\b(?!\')', Keyword.Reserved, ('#pop', 'tname')),
272
+
273
+ include('breakout'),
274
+ include('core'),
275
+ (r'\S+', Error, '#pop'),
276
+ ],
277
+
278
+ # Dealing with what comes after the 'datatype' (or 'and') keyword
279
+ 'dname': [
280
+ include('whitespace'),
281
+ include('breakout'),
282
+
283
+ (r'\'[\w\']*', Name.Decorator),
284
+ (r'\(', Punctuation, 'tyvarseq'),
285
+ (r'(=)(\s*)(datatype)',
286
+ bygroups(Punctuation, Text, Keyword.Reserved), '#pop'),
287
+ (r'=(?!%s)' % symbolicid_re, Punctuation,
288
+ ('#pop', 'datbind', 'datcon')),
289
+
290
+ (r'(%s)' % alphanumid_re, Keyword.Type),
291
+ (r'(%s)' % symbolicid_re, Keyword.Type),
292
+ (r'\S+', Error, '#pop'),
293
+ ],
294
+
295
+ # common case - A | B | C of int
296
+ 'datbind': [
297
+ include('whitespace'),
298
+
299
+ (r'\b(and)\b(?!\')', Keyword.Reserved, ('#pop', 'dname')),
300
+ (r'\b(withtype)\b(?!\')', Keyword.Reserved, ('#pop', 'tname')),
301
+ (r'\b(of)\b(?!\')', Keyword.Reserved),
302
+
303
+ (r'(\|)(\s*)(%s)' % alphanumid_re,
304
+ bygroups(Punctuation, Text, Name.Class)),
305
+ (r'(\|)(\s+)(%s)' % symbolicid_re,
306
+ bygroups(Punctuation, Text, Name.Class)),
307
+
308
+ include('breakout'),
309
+ include('core'),
310
+ (r'\S+', Error),
311
+ ],
312
+
313
+ # Dealing with what comes after an exception
314
+ 'ename': [
315
+ include('whitespace'),
316
+
317
+ (r'(and\b)(\s+)(%s)' % alphanumid_re,
318
+ bygroups(Keyword.Reserved, Text, Name.Class)),
319
+ (r'(and\b)(\s*)(%s)' % symbolicid_re,
320
+ bygroups(Keyword.Reserved, Text, Name.Class)),
321
+ (r'\b(of)\b(?!\')', Keyword.Reserved),
322
+ (r'(%s)|(%s)' % (alphanumid_re, symbolicid_re), Name.Class),
323
+
324
+ default('#pop'),
325
+ ],
326
+
327
+ 'datcon': [
328
+ include('whitespace'),
329
+ (r'(%s)' % alphanumid_re, Name.Class, '#pop'),
330
+ (r'(%s)' % symbolicid_re, Name.Class, '#pop'),
331
+ (r'\S+', Error, '#pop'),
332
+ ],
333
+
334
+ # Series of type variables
335
+ 'tyvarseq': [
336
+ (r'\s', Text),
337
+ (r'\(\*', Comment.Multiline, 'comment'),
338
+
339
+ (r'\'[\w\']*', Name.Decorator),
340
+ (alphanumid_re, Name),
341
+ (r',', Punctuation),
342
+ (r'\)', Punctuation, '#pop'),
343
+ (symbolicid_re, Name),
344
+ ],
345
+
346
+ 'comment': [
347
+ (r'[^(*)]', Comment.Multiline),
348
+ (r'\(\*', Comment.Multiline, '#push'),
349
+ (r'\*\)', Comment.Multiline, '#pop'),
350
+ (r'[(*)]', Comment.Multiline),
351
+ ],
352
+ }
353
+
354
+
355
+ class OcamlLexer(RegexLexer):
356
+ """
357
+ For the OCaml language.
358
+
359
+ .. versionadded:: 0.7
360
+ """
361
+
362
+ name = 'OCaml'
363
+ aliases = ['ocaml']
364
+ filenames = ['*.ml', '*.mli', '*.mll', '*.mly']
365
+ mimetypes = ['text/x-ocaml']
366
+
367
+ keywords = (
368
+ 'as', 'assert', 'begin', 'class', 'constraint', 'do', 'done',
369
+ 'downto', 'else', 'end', 'exception', 'external', 'false',
370
+ 'for', 'fun', 'function', 'functor', 'if', 'in', 'include',
371
+ 'inherit', 'initializer', 'lazy', 'let', 'match', 'method',
372
+ 'module', 'mutable', 'new', 'object', 'of', 'open', 'private',
373
+ 'raise', 'rec', 'sig', 'struct', 'then', 'to', 'true', 'try',
374
+ 'type', 'value', 'val', 'virtual', 'when', 'while', 'with',
375
+ )
376
+ keyopts = (
377
+ '!=', '#', '&', '&&', r'\(', r'\)', r'\*', r'\+', ',', '-',
378
+ r'-\.', '->', r'\.', r'\.\.', ':', '::', ':=', ':>', ';', ';;', '<',
379
+ '<-', '=', '>', '>]', r'>\}', r'\?', r'\?\?', r'\[', r'\[<', r'\[>',
380
+ r'\[\|', ']', '_', '`', r'\{', r'\{<', r'\|', r'\|]', r'\}', '~'
381
+ )
382
+
383
+ operators = r'[!$%&*+\./:<=>?@^|~-]'
384
+ word_operators = ('and', 'asr', 'land', 'lor', 'lsl', 'lxor', 'mod', 'or')
385
+ prefix_syms = r'[!?~]'
386
+ infix_syms = r'[=<>@^|&+\*/$%-]'
387
+ primitives = ('unit', 'int', 'float', 'bool', 'string', 'char', 'list', 'array')
388
+
389
+ tokens = {
390
+ 'escape-sequence': [
391
+ (r'\\[\\"\'ntbr]', String.Escape),
392
+ (r'\\[0-9]{3}', String.Escape),
393
+ (r'\\x[0-9a-fA-F]{2}', String.Escape),
394
+ ],
395
+ 'root': [
396
+ (r'\s+', Text),
397
+ (r'false|true|\(\)|\[\]', Name.Builtin.Pseudo),
398
+ (r'\b([A-Z][\w\']*)(?=\s*\.)', Name.Namespace, 'dotted'),
399
+ (r'\b([A-Z][\w\']*)', Name.Class),
400
+ (r'\(\*(?![)])', Comment, 'comment'),
401
+ (r'\b(%s)\b' % '|'.join(keywords), Keyword),
402
+ (r'(%s)' % '|'.join(keyopts[::-1]), Operator),
403
+ (r'(%s|%s)?%s' % (infix_syms, prefix_syms, operators), Operator),
404
+ (r'\b(%s)\b' % '|'.join(word_operators), Operator.Word),
405
+ (r'\b(%s)\b' % '|'.join(primitives), Keyword.Type),
406
+
407
+ (r"[^\W\d][\w']*", Name),
408
+
409
+ (r'-?\d[\d_]*(.[\d_]*)?([eE][+\-]?\d[\d_]*)', Number.Float),
410
+ (r'0[xX][\da-fA-F][\da-fA-F_]*', Number.Hex),
411
+ (r'0[oO][0-7][0-7_]*', Number.Oct),
412
+ (r'0[bB][01][01_]*', Number.Bin),
413
+ (r'\d[\d_]*', Number.Integer),
414
+
415
+ (r"'(?:(\\[\\\"'ntbr ])|(\\[0-9]{3})|(\\x[0-9a-fA-F]{2}))'",
416
+ String.Char),
417
+ (r"'.'", String.Char),
418
+ (r"'", Keyword), # a stray quote is another syntax element
419
+
420
+ (r'"', String.Double, 'string'),
421
+
422
+ (r'[~?][a-z][\w\']*:', Name.Variable),
423
+ ],
424
+ 'comment': [
425
+ (r'[^(*)]+', Comment),
426
+ (r'\(\*', Comment, '#push'),
427
+ (r'\*\)', Comment, '#pop'),
428
+ (r'[(*)]', Comment),
429
+ ],
430
+ 'string': [
431
+ (r'[^\\"]+', String.Double),
432
+ include('escape-sequence'),
433
+ (r'\\\n', String.Double),
434
+ (r'"', String.Double, '#pop'),
435
+ ],
436
+ 'dotted': [
437
+ (r'\s+', Text),
438
+ (r'\.', Punctuation),
439
+ (r'[A-Z][\w\']*(?=\s*\.)', Name.Namespace),
440
+ (r'[A-Z][\w\']*', Name.Class, '#pop'),
441
+ (r'[a-z_][\w\']*', Name, '#pop'),
442
+ default('#pop'),
443
+ ],
444
+ }
445
+
446
+
447
+ class OpaLexer(RegexLexer):
448
+ """
449
+ Lexer for the Opa language (http://opalang.org).
450
+
451
+ .. versionadded:: 1.5
452
+ """
453
+
454
+ name = 'Opa'
455
+ aliases = ['opa']
456
+ filenames = ['*.opa']
457
+ mimetypes = ['text/x-opa']
458
+
459
+ # most of these aren't strictly keywords
460
+ # but if you color only real keywords, you might just
461
+ # as well not color anything
462
+ keywords = (
463
+ 'and', 'as', 'begin', 'case', 'client', 'css', 'database', 'db', 'do',
464
+ 'else', 'end', 'external', 'forall', 'function', 'if', 'import',
465
+ 'match', 'module', 'or', 'package', 'parser', 'rec', 'server', 'then',
466
+ 'type', 'val', 'with', 'xml_parser',
467
+ )
468
+
469
+ # matches both stuff and `stuff`
470
+ ident_re = r'(([a-zA-Z_]\w*)|(`[^`]*`))'
471
+
472
+ op_re = r'[.=\-<>,@~%/+?*&^!]'
473
+ punc_re = r'[()\[\],;|]' # '{' and '}' are treated elsewhere
474
+ # because they are also used for inserts
475
+
476
+ tokens = {
477
+ # copied from the caml lexer, should be adapted
478
+ 'escape-sequence': [
479
+ (r'\\[\\"\'ntr}]', String.Escape),
480
+ (r'\\[0-9]{3}', String.Escape),
481
+ (r'\\x[0-9a-fA-F]{2}', String.Escape),
482
+ ],
483
+
484
+ # factorizing these rules, because they are inserted many times
485
+ 'comments': [
486
+ (r'/\*', Comment, 'nested-comment'),
487
+ (r'//.*?$', Comment),
488
+ ],
489
+ 'comments-and-spaces': [
490
+ include('comments'),
491
+ (r'\s+', Text),
492
+ ],
493
+
494
+ 'root': [
495
+ include('comments-and-spaces'),
496
+ # keywords
497
+ (words(keywords, prefix=r'\b', suffix=r'\b'), Keyword),
498
+ # directives
499
+ # we could parse the actual set of directives instead of anything
500
+ # starting with @, but this is troublesome
501
+ # because it needs to be adjusted all the time
502
+ # and assuming we parse only sources that compile, it is useless
503
+ (r'@' + ident_re + r'\b', Name.Builtin.Pseudo),
504
+
505
+ # number literals
506
+ (r'-?.[\d]+([eE][+\-]?\d+)', Number.Float),
507
+ (r'-?\d+.\d*([eE][+\-]?\d+)', Number.Float),
508
+ (r'-?\d+[eE][+\-]?\d+', Number.Float),
509
+ (r'0[xX][\da-fA-F]+', Number.Hex),
510
+ (r'0[oO][0-7]+', Number.Oct),
511
+ (r'0[bB][01]+', Number.Bin),
512
+ (r'\d+', Number.Integer),
513
+ # color literals
514
+ (r'#[\da-fA-F]{3,6}', Number.Integer),
515
+
516
+ # string literals
517
+ (r'"', String.Double, 'string'),
518
+ # char literal, should be checked because this is the regexp from
519
+ # the caml lexer
520
+ (r"'(?:(\\[\\\"'ntbr ])|(\\[0-9]{3})|(\\x[0-9a-fA-F]{2})|.)'",
521
+ String.Char),
522
+
523
+ # this is meant to deal with embedded exprs in strings
524
+ # every time we find a '}' we pop a state so that if we were
525
+ # inside a string, we are back in the string state
526
+ # as a consequence, we must also push a state every time we find a
527
+ # '{' or else we will have errors when parsing {} for instance
528
+ (r'\{', Operator, '#push'),
529
+ (r'\}', Operator, '#pop'),
530
+
531
+ # html literals
532
+ # this is a much more strict that the actual parser,
533
+ # since a<b would not be parsed as html
534
+ # but then again, the parser is way too lax, and we can't hope
535
+ # to have something as tolerant
536
+ (r'<(?=[a-zA-Z>])', String.Single, 'html-open-tag'),
537
+
538
+ # db path
539
+ # matching the '[_]' in '/a[_]' because it is a part
540
+ # of the syntax of the db path definition
541
+ # unfortunately, i don't know how to match the ']' in
542
+ # /a[1], so this is somewhat inconsistent
543
+ (r'[@?!]?(/\w+)+(\[_\])?', Name.Variable),
544
+ # putting the same color on <- as on db path, since
545
+ # it can be used only to mean Db.write
546
+ (r'<-(?!'+op_re+r')', Name.Variable),
547
+
548
+ # 'modules'
549
+ # although modules are not distinguished by their names as in caml
550
+ # the standard library seems to follow the convention that modules
551
+ # only area capitalized
552
+ (r'\b([A-Z]\w*)(?=\.)', Name.Namespace),
553
+
554
+ # operators
555
+ # = has a special role because this is the only
556
+ # way to syntactic distinguish binding constructions
557
+ # unfortunately, this colors the equal in {x=2} too
558
+ (r'=(?!'+op_re+r')', Keyword),
559
+ (r'(%s)+' % op_re, Operator),
560
+ (r'(%s)+' % punc_re, Operator),
561
+
562
+ # coercions
563
+ (r':', Operator, 'type'),
564
+ # type variables
565
+ # we need this rule because we don't parse specially type
566
+ # definitions so in "type t('a) = ...", "'a" is parsed by 'root'
567
+ ("'"+ident_re, Keyword.Type),
568
+
569
+ # id literal, #something, or #{expr}
570
+ (r'#'+ident_re, String.Single),
571
+ (r'#(?=\{)', String.Single),
572
+
573
+ # identifiers
574
+ # this avoids to color '2' in 'a2' as an integer
575
+ (ident_re, Text),
576
+
577
+ # default, not sure if that is needed or not
578
+ # (r'.', Text),
579
+ ],
580
+
581
+ # it is quite painful to have to parse types to know where they end
582
+ # this is the general rule for a type
583
+ # a type is either:
584
+ # * -> ty
585
+ # * type-with-slash
586
+ # * type-with-slash -> ty
587
+ # * type-with-slash (, type-with-slash)+ -> ty
588
+ #
589
+ # the code is pretty funky in here, but this code would roughly
590
+ # translate in caml to:
591
+ # let rec type stream =
592
+ # match stream with
593
+ # | [< "->"; stream >] -> type stream
594
+ # | [< ""; stream >] ->
595
+ # type_with_slash stream
596
+ # type_lhs_1 stream;
597
+ # and type_1 stream = ...
598
+ 'type': [
599
+ include('comments-and-spaces'),
600
+ (r'->', Keyword.Type),
601
+ default(('#pop', 'type-lhs-1', 'type-with-slash')),
602
+ ],
603
+
604
+ # parses all the atomic or closed constructions in the syntax of type
605
+ # expressions: record types, tuple types, type constructors, basic type
606
+ # and type variables
607
+ 'type-1': [
608
+ include('comments-and-spaces'),
609
+ (r'\(', Keyword.Type, ('#pop', 'type-tuple')),
610
+ (r'~?\{', Keyword.Type, ('#pop', 'type-record')),
611
+ (ident_re+r'\(', Keyword.Type, ('#pop', 'type-tuple')),
612
+ (ident_re, Keyword.Type, '#pop'),
613
+ ("'"+ident_re, Keyword.Type),
614
+ # this case is not in the syntax but sometimes
615
+ # we think we are parsing types when in fact we are parsing
616
+ # some css, so we just pop the states until we get back into
617
+ # the root state
618
+ default('#pop'),
619
+ ],
620
+
621
+ # type-with-slash is either:
622
+ # * type-1
623
+ # * type-1 (/ type-1)+
624
+ 'type-with-slash': [
625
+ include('comments-and-spaces'),
626
+ default(('#pop', 'slash-type-1', 'type-1')),
627
+ ],
628
+ 'slash-type-1': [
629
+ include('comments-and-spaces'),
630
+ ('/', Keyword.Type, ('#pop', 'type-1')),
631
+ # same remark as above
632
+ default('#pop'),
633
+ ],
634
+
635
+ # we go in this state after having parsed a type-with-slash
636
+ # while trying to parse a type
637
+ # and at this point we must determine if we are parsing an arrow
638
+ # type (in which case we must continue parsing) or not (in which
639
+ # case we stop)
640
+ 'type-lhs-1': [
641
+ include('comments-and-spaces'),
642
+ (r'->', Keyword.Type, ('#pop', 'type')),
643
+ (r'(?=,)', Keyword.Type, ('#pop', 'type-arrow')),
644
+ default('#pop'),
645
+ ],
646
+ 'type-arrow': [
647
+ include('comments-and-spaces'),
648
+ # the look ahead here allows to parse f(x : int, y : float -> truc)
649
+ # correctly
650
+ (r',(?=[^:]*?->)', Keyword.Type, 'type-with-slash'),
651
+ (r'->', Keyword.Type, ('#pop', 'type')),
652
+ # same remark as above
653
+ default('#pop'),
654
+ ],
655
+
656
+ # no need to do precise parsing for tuples and records
657
+ # because they are closed constructions, so we can simply
658
+ # find the closing delimiter
659
+ # note that this function would be not work if the source
660
+ # contained identifiers like `{)` (although it could be patched
661
+ # to support it)
662
+ 'type-tuple': [
663
+ include('comments-and-spaces'),
664
+ (r'[^()/*]+', Keyword.Type),
665
+ (r'[/*]', Keyword.Type),
666
+ (r'\(', Keyword.Type, '#push'),
667
+ (r'\)', Keyword.Type, '#pop'),
668
+ ],
669
+ 'type-record': [
670
+ include('comments-and-spaces'),
671
+ (r'[^{}/*]+', Keyword.Type),
672
+ (r'[/*]', Keyword.Type),
673
+ (r'\{', Keyword.Type, '#push'),
674
+ (r'\}', Keyword.Type, '#pop'),
675
+ ],
676
+
677
+ # 'type-tuple': [
678
+ # include('comments-and-spaces'),
679
+ # (r'\)', Keyword.Type, '#pop'),
680
+ # default(('#pop', 'type-tuple-1', 'type-1')),
681
+ # ],
682
+ # 'type-tuple-1': [
683
+ # include('comments-and-spaces'),
684
+ # (r',?\s*\)', Keyword.Type, '#pop'), # ,) is a valid end of tuple, in (1,)
685
+ # (r',', Keyword.Type, 'type-1'),
686
+ # ],
687
+ # 'type-record':[
688
+ # include('comments-and-spaces'),
689
+ # (r'\}', Keyword.Type, '#pop'),
690
+ # (r'~?(?:\w+|`[^`]*`)', Keyword.Type, 'type-record-field-expr'),
691
+ # ],
692
+ # 'type-record-field-expr': [
693
+ #
694
+ # ],
695
+
696
+ 'nested-comment': [
697
+ (r'[^/*]+', Comment),
698
+ (r'/\*', Comment, '#push'),
699
+ (r'\*/', Comment, '#pop'),
700
+ (r'[/*]', Comment),
701
+ ],
702
+
703
+ # the copy pasting between string and single-string
704
+ # is kinda sad. Is there a way to avoid that??
705
+ 'string': [
706
+ (r'[^\\"{]+', String.Double),
707
+ (r'"', String.Double, '#pop'),
708
+ (r'\{', Operator, 'root'),
709
+ include('escape-sequence'),
710
+ ],
711
+ 'single-string': [
712
+ (r'[^\\\'{]+', String.Double),
713
+ (r'\'', String.Double, '#pop'),
714
+ (r'\{', Operator, 'root'),
715
+ include('escape-sequence'),
716
+ ],
717
+
718
+ # all the html stuff
719
+ # can't really reuse some existing html parser
720
+ # because we must be able to parse embedded expressions
721
+
722
+ # we are in this state after someone parsed the '<' that
723
+ # started the html literal
724
+ 'html-open-tag': [
725
+ (r'[\w\-:]+', String.Single, ('#pop', 'html-attr')),
726
+ (r'>', String.Single, ('#pop', 'html-content')),
727
+ ],
728
+
729
+ # we are in this state after someone parsed the '</' that
730
+ # started the end of the closing tag
731
+ 'html-end-tag': [
732
+ # this is a star, because </> is allowed
733
+ (r'[\w\-:]*>', String.Single, '#pop'),
734
+ ],
735
+
736
+ # we are in this state after having parsed '<ident(:ident)?'
737
+ # we thus parse a possibly empty list of attributes
738
+ 'html-attr': [
739
+ (r'\s+', Text),
740
+ (r'[\w\-:]+=', String.Single, 'html-attr-value'),
741
+ (r'/>', String.Single, '#pop'),
742
+ (r'>', String.Single, ('#pop', 'html-content')),
743
+ ],
744
+
745
+ 'html-attr-value': [
746
+ (r"'", String.Single, ('#pop', 'single-string')),
747
+ (r'"', String.Single, ('#pop', 'string')),
748
+ (r'#'+ident_re, String.Single, '#pop'),
749
+ (r'#(?=\{)', String.Single, ('#pop', 'root')),
750
+ (r'[^"\'{`=<>]+', String.Single, '#pop'),
751
+ (r'\{', Operator, ('#pop', 'root')), # this is a tail call!
752
+ ],
753
+
754
+ # we should probably deal with '\' escapes here
755
+ 'html-content': [
756
+ (r'<!--', Comment, 'html-comment'),
757
+ (r'</', String.Single, ('#pop', 'html-end-tag')),
758
+ (r'<', String.Single, 'html-open-tag'),
759
+ (r'\{', Operator, 'root'),
760
+ (r'[^<{]+', String.Single),
761
+ ],
762
+
763
+ 'html-comment': [
764
+ (r'-->', Comment, '#pop'),
765
+ (r'[^\-]+|-', Comment),
766
+ ],
767
+ }
768
+
769
+
770
+ class ReasonLexer(RegexLexer):
771
+ """
772
+ For the ReasonML language (https://reasonml.github.io/).
773
+
774
+ .. versionadded:: 2.6
775
+ """
776
+
777
+ name = 'ReasonML'
778
+ aliases = ['reason', "reasonml"]
779
+ filenames = ['*.re', '*.rei']
780
+ mimetypes = ['text/x-reasonml']
781
+
782
+ keywords = (
783
+ 'as', 'assert', 'begin', 'class', 'constraint', 'do', 'done', 'downto',
784
+ 'else', 'end', 'exception', 'external', 'false', 'for', 'fun', 'esfun',
785
+ 'function', 'functor', 'if', 'in', 'include', 'inherit', 'initializer', 'lazy',
786
+ 'let', 'switch', 'module', 'pub', 'mutable', 'new', 'nonrec', 'object', 'of',
787
+ 'open', 'pri', 'rec', 'sig', 'struct', 'then', 'to', 'true', 'try',
788
+ 'type', 'val', 'virtual', 'when', 'while', 'with',
789
+ )
790
+ keyopts = (
791
+ '!=', '#', '&', '&&', r'\(', r'\)', r'\*', r'\+', ',', '-',
792
+ r'-\.', '=>', r'\.', r'\.\.', r'\.\.\.', ':', '::', ':=', ':>', ';', ';;', '<',
793
+ '<-', '=', '>', '>]', r'>\}', r'\?', r'\?\?', r'\[', r'\[<', r'\[>',
794
+ r'\[\|', ']', '_', '`', r'\{', r'\{<', r'\|', r'\|\|', r'\|]', r'\}', '~'
795
+ )
796
+
797
+ operators = r'[!$%&*+\./:<=>?@^|~-]'
798
+ word_operators = ('and', 'asr', 'land', 'lor', 'lsl', 'lsr', 'lxor', 'mod', 'or')
799
+ prefix_syms = r'[!?~]'
800
+ infix_syms = r'[=<>@^|&+\*/$%-]'
801
+ primitives = ('unit', 'int', 'float', 'bool', 'string', 'char', 'list', 'array')
802
+
803
+ tokens = {
804
+ 'escape-sequence': [
805
+ (r'\\[\\"\'ntbr]', String.Escape),
806
+ (r'\\[0-9]{3}', String.Escape),
807
+ (r'\\x[0-9a-fA-F]{2}', String.Escape),
808
+ ],
809
+ 'root': [
810
+ (r'\s+', Text),
811
+ (r'false|true|\(\)|\[\]', Name.Builtin.Pseudo),
812
+ (r'\b([A-Z][\w\']*)(?=\s*\.)', Name.Namespace, 'dotted'),
813
+ (r'\b([A-Z][\w\']*)', Name.Class),
814
+ (r'//.*?\n', Comment.Single),
815
+ (r'\/\*(?!/)', Comment.Multiline, 'comment'),
816
+ (r'\b(%s)\b' % '|'.join(keywords), Keyword),
817
+ (r'(%s)' % '|'.join(keyopts[::-1]), Operator.Word),
818
+ (r'(%s|%s)?%s' % (infix_syms, prefix_syms, operators), Operator),
819
+ (r'\b(%s)\b' % '|'.join(word_operators), Operator.Word),
820
+ (r'\b(%s)\b' % '|'.join(primitives), Keyword.Type),
821
+
822
+ (r"[^\W\d][\w']*", Name),
823
+
824
+ (r'-?\d[\d_]*(.[\d_]*)?([eE][+\-]?\d[\d_]*)', Number.Float),
825
+ (r'0[xX][\da-fA-F][\da-fA-F_]*', Number.Hex),
826
+ (r'0[oO][0-7][0-7_]*', Number.Oct),
827
+ (r'0[bB][01][01_]*', Number.Bin),
828
+ (r'\d[\d_]*', Number.Integer),
829
+
830
+ (r"'(?:(\\[\\\"'ntbr ])|(\\[0-9]{3})|(\\x[0-9a-fA-F]{2}))'",
831
+ String.Char),
832
+ (r"'.'", String.Char),
833
+ (r"'", Keyword),
834
+
835
+ (r'"', String.Double, 'string'),
836
+
837
+ (r'[~?][a-z][\w\']*:', Name.Variable),
838
+ ],
839
+ 'comment': [
840
+ (r'[^/*]+', Comment.Multiline),
841
+ (r'\/\*', Comment.Multiline, '#push'),
842
+ (r'\*\/', Comment.Multiline, '#pop'),
843
+ (r'\*', Comment.Multiline),
844
+ ],
845
+ 'string': [
846
+ (r'[^\\"]+', String.Double),
847
+ include('escape-sequence'),
848
+ (r'\\\n', String.Double),
849
+ (r'"', String.Double, '#pop'),
850
+ ],
851
+ 'dotted': [
852
+ (r'\s+', Text),
853
+ (r'\.', Punctuation),
854
+ (r'[A-Z][\w\']*(?=\s*\.)', Name.Namespace),
855
+ (r'[A-Z][\w\']*', Name.Class, '#pop'),
856
+ (r'[a-z_][\w\']*', Name, '#pop'),
857
+ default('#pop'),
858
+ ],
859
+ }
860
+
861
+
862
+ class FStarLexer(RegexLexer):
863
+ """
864
+ For the F* language (https://www.fstar-lang.org/).
865
+ .. versionadded:: 2.7
866
+ """
867
+
868
+ name = 'FStar'
869
+ aliases = ['fstar']
870
+ filenames = ['*.fst', '*.fsti']
871
+ mimetypes = ['text/x-fstar']
872
+
873
+ keywords = (
874
+ 'abstract', 'attributes', 'noeq', 'unopteq', 'and'
875
+ 'begin', 'by', 'default', 'effect', 'else', 'end', 'ensures',
876
+ 'exception', 'exists', 'false', 'forall', 'fun', 'function', 'if',
877
+ 'in', 'include', 'inline', 'inline_for_extraction', 'irreducible',
878
+ 'logic', 'match', 'module', 'mutable', 'new', 'new_effect', 'noextract',
879
+ 'of', 'open', 'opaque', 'private', 'range_of', 'reifiable',
880
+ 'reify', 'reflectable', 'requires', 'set_range_of', 'sub_effect',
881
+ 'synth', 'then', 'total', 'true', 'try', 'type', 'unfold', 'unfoldable',
882
+ 'val', 'when', 'with', 'not'
883
+ )
884
+ decl_keywords = ('let', 'rec')
885
+ assume_keywords = ('assume', 'admit', 'assert', 'calc')
886
+ keyopts = (
887
+ r'~', r'-', r'/\\', r'\\/', r'<:', r'<@', r'\(\|', r'\|\)', r'#', r'u#',
888
+ r'&', r'\(', r'\)', r'\(\)', r',', r'~>', r'->', r'<-', r'<--', r'<==>',
889
+ r'==>', r'\.', r'\?', r'\?\.', r'\.\[', r'\.\(', r'\.\(\|', r'\.\[\|',
890
+ r'\{:pattern', r':', r'::', r':=', r';', r';;', r'=', r'%\[', r'!\{',
891
+ r'\[', r'\[@', r'\[\|', r'\|>', r'\]', r'\|\]', r'\{', r'\|', r'\}', r'\$'
892
+ )
893
+
894
+ operators = r'[!$%&*+\./:<=>?@^|~-]'
895
+ prefix_syms = r'[!?~]'
896
+ infix_syms = r'[=<>@^|&+\*/$%-]'
897
+ primitives = ('unit', 'int', 'float', 'bool', 'string', 'char', 'list', 'array')
898
+
899
+ tokens = {
900
+ 'escape-sequence': [
901
+ (r'\\[\\"\'ntbr]', String.Escape),
902
+ (r'\\[0-9]{3}', String.Escape),
903
+ (r'\\x[0-9a-fA-F]{2}', String.Escape),
904
+ ],
905
+ 'root': [
906
+ (r'\s+', Text),
907
+ (r'false|true|False|True|\(\)|\[\]', Name.Builtin.Pseudo),
908
+ (r'\b([A-Z][\w\']*)(?=\s*\.)', Name.Namespace, 'dotted'),
909
+ (r'\b([A-Z][\w\']*)', Name.Class),
910
+ (r'\(\*(?![)])', Comment, 'comment'),
911
+ (r'^\/\/.+$', Comment),
912
+ (r'\b(%s)\b' % '|'.join(keywords), Keyword),
913
+ (r'\b(%s)\b' % '|'.join(assume_keywords), Name.Exception),
914
+ (r'\b(%s)\b' % '|'.join(decl_keywords), Keyword.Declaration),
915
+ (r'(%s)' % '|'.join(keyopts[::-1]), Operator),
916
+ (r'(%s|%s)?%s' % (infix_syms, prefix_syms, operators), Operator),
917
+ (r'\b(%s)\b' % '|'.join(primitives), Keyword.Type),
918
+
919
+ (r"[^\W\d][\w']*", Name),
920
+
921
+ (r'-?\d[\d_]*(.[\d_]*)?([eE][+\-]?\d[\d_]*)', Number.Float),
922
+ (r'0[xX][\da-fA-F][\da-fA-F_]*', Number.Hex),
923
+ (r'0[oO][0-7][0-7_]*', Number.Oct),
924
+ (r'0[bB][01][01_]*', Number.Bin),
925
+ (r'\d[\d_]*', Number.Integer),
926
+
927
+ (r"'(?:(\\[\\\"'ntbr ])|(\\[0-9]{3})|(\\x[0-9a-fA-F]{2}))'",
928
+ String.Char),
929
+ (r"'.'", String.Char),
930
+ (r"'", Keyword), # a stray quote is another syntax element
931
+ (r"\`([\w\'.]+)\`", Operator.Word), # for infix applications
932
+ (r"\`", Keyword), # for quoting
933
+ (r'"', String.Double, 'string'),
934
+
935
+ (r'[~?][a-z][\w\']*:', Name.Variable),
936
+ ],
937
+ 'comment': [
938
+ (r'[^(*)]+', Comment),
939
+ (r'\(\*', Comment, '#push'),
940
+ (r'\*\)', Comment, '#pop'),
941
+ (r'[(*)]', Comment),
942
+ ],
943
+ 'string': [
944
+ (r'[^\\"]+', String.Double),
945
+ include('escape-sequence'),
946
+ (r'\\\n', String.Double),
947
+ (r'"', String.Double, '#pop'),
948
+ ],
949
+ 'dotted': [
950
+ (r'\s+', Text),
951
+ (r'\.', Punctuation),
952
+ (r'[A-Z][\w\']*(?=\s*\.)', Name.Namespace),
953
+ (r'[A-Z][\w\']*', Name.Class, '#pop'),
954
+ (r'[a-z_][\w\']*', Name, '#pop'),
955
+ default('#pop'),
956
+ ],
957
+ }