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,60 @@
1
+ """
2
+ pygments.lexers.sgf
3
+ ~~~~~~~~~~~~~~~~~~~
4
+
5
+ Lexer for Smart Game Format (sgf) file format.
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 Name, Literal, String, Text, Punctuation
13
+
14
+ __all__ = ["SmartGameFormatLexer"]
15
+
16
+
17
+ class SmartGameFormatLexer(RegexLexer):
18
+ """
19
+ Lexer for Smart Game Format (sgf) file format.
20
+
21
+ The format is used to store game records of board games for two players
22
+ (mainly Go game).
23
+ For more information about the definition of the format, see:
24
+ https://www.red-bean.com/sgf/
25
+
26
+ .. versionadded:: 2.4
27
+ """
28
+ name = 'SmartGameFormat'
29
+ aliases = ['sgf']
30
+ filenames = ['*.sgf']
31
+
32
+ tokens = {
33
+ 'root': [
34
+ (r'[\s():;]', Punctuation),
35
+ # tokens:
36
+ (r'(A[BW]|AE|AN|AP|AR|AS|[BW]L|BM|[BW]R|[BW]S|[BW]T|CA|CH|CP|CR|'
37
+ r'DD|DM|DO|DT|EL|EV|EX|FF|FG|G[BW]|GC|GM|GN|HA|HO|ID|IP|IT|IY|KM|'
38
+ r'KO|LB|LN|LT|L|MA|MN|M|N|OB|OM|ON|OP|OT|OV|P[BW]|PC|PL|PM|RE|RG|'
39
+ r'RO|RU|SO|SC|SE|SI|SL|SO|SQ|ST|SU|SZ|T[BW]|TC|TE|TM|TR|UC|US|VW|'
40
+ r'V|[BW]|C)',
41
+ Name.Builtin),
42
+ # number:
43
+ (r'(\[)([0-9.]+)(\])',
44
+ bygroups(Punctuation, Literal.Number, Punctuation)),
45
+ # date:
46
+ (r'(\[)([0-9]{4}-[0-9]{2}-[0-9]{2})(\])',
47
+ bygroups(Punctuation, Literal.Date, Punctuation)),
48
+ # point:
49
+ (r'(\[)([a-z]{2})(\])',
50
+ bygroups(Punctuation, String, Punctuation)),
51
+ # double points:
52
+ (r'(\[)([a-z]{2})(:)([a-z]{2})(\])',
53
+ bygroups(Punctuation, String, Punctuation, String, Punctuation)),
54
+
55
+ (r'(\[)([\w\s#()+,\-.:?]+)(\])',
56
+ bygroups(Punctuation, String, Punctuation)),
57
+ (r'(\[)(\s.*)(\])',
58
+ bygroups(Punctuation, Text, Punctuation)),
59
+ ],
60
+ }
@@ -0,0 +1,909 @@
1
+ """
2
+ pygments.lexers.shell
3
+ ~~~~~~~~~~~~~~~~~~~~~
4
+
5
+ Lexers for various shells.
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 Lexer, RegexLexer, do_insertions, bygroups, \
14
+ include, default, this, using, words
15
+ from pygments.token import Punctuation, \
16
+ Text, Comment, Operator, Keyword, Name, String, Number, Generic
17
+ from pygments.util import shebang_matches
18
+
19
+
20
+ __all__ = ['BashLexer', 'BashSessionLexer', 'TcshLexer', 'BatchLexer',
21
+ 'SlurmBashLexer', 'MSDOSSessionLexer', 'PowerShellLexer',
22
+ 'PowerShellSessionLexer', 'TcshSessionLexer', 'FishShellLexer',
23
+ 'ExeclineLexer']
24
+
25
+ line_re = re.compile('.*?\n')
26
+
27
+
28
+ class BashLexer(RegexLexer):
29
+ """
30
+ Lexer for (ba|k|z|)sh shell scripts.
31
+
32
+ .. versionadded:: 0.6
33
+ """
34
+
35
+ name = 'Bash'
36
+ aliases = ['bash', 'sh', 'ksh', 'zsh', 'shell']
37
+ filenames = ['*.sh', '*.ksh', '*.bash', '*.ebuild', '*.eclass',
38
+ '*.exheres-0', '*.exlib', '*.zsh',
39
+ '.bashrc', 'bashrc', '.bash_*', 'bash_*', 'zshrc', '.zshrc',
40
+ 'PKGBUILD']
41
+ mimetypes = ['application/x-sh', 'application/x-shellscript', 'text/x-shellscript']
42
+
43
+ tokens = {
44
+ 'root': [
45
+ include('basic'),
46
+ (r'`', String.Backtick, 'backticks'),
47
+ include('data'),
48
+ include('interp'),
49
+ ],
50
+ 'interp': [
51
+ (r'\$\(\(', Keyword, 'math'),
52
+ (r'\$\(', Keyword, 'paren'),
53
+ (r'\$\{#?', String.Interpol, 'curly'),
54
+ (r'\$[a-zA-Z_]\w*', Name.Variable), # user variable
55
+ (r'\$(?:\d+|[#$?!_*@-])', Name.Variable), # builtin
56
+ (r'\$', Text),
57
+ ],
58
+ 'basic': [
59
+ (r'\b(if|fi|else|while|in|do|done|for|then|return|function|case|'
60
+ r'select|continue|until|esac|elif)(\s*)\b',
61
+ bygroups(Keyword, Text)),
62
+ (r'\b(alias|bg|bind|break|builtin|caller|cd|command|compgen|'
63
+ r'complete|declare|dirs|disown|echo|enable|eval|exec|exit|'
64
+ r'export|false|fc|fg|getopts|hash|help|history|jobs|kill|let|'
65
+ r'local|logout|popd|printf|pushd|pwd|read|readonly|set|shift|'
66
+ r'shopt|source|suspend|test|time|times|trap|true|type|typeset|'
67
+ r'ulimit|umask|unalias|unset|wait)(?=[\s)`])',
68
+ Name.Builtin),
69
+ (r'\A#!.+\n', Comment.Hashbang),
70
+ (r'#.*\n', Comment.Single),
71
+ (r'\\[\w\W]', String.Escape),
72
+ (r'(\b\w+)(\s*)(\+?=)', bygroups(Name.Variable, Text, Operator)),
73
+ (r'[\[\]{}()=]', Operator),
74
+ (r'<<<', Operator), # here-string
75
+ (r'<<-?\s*(\'?)\\?(\w+)[\w\W]+?\2', String),
76
+ (r'&&|\|\|', Operator),
77
+ ],
78
+ 'data': [
79
+ (r'(?s)\$?"(\\.|[^"\\$])*"', String.Double),
80
+ (r'"', String.Double, 'string'),
81
+ (r"(?s)\$'(\\\\|\\[0-7]+|\\.|[^'\\])*'", String.Single),
82
+ (r"(?s)'.*?'", String.Single),
83
+ (r';', Punctuation),
84
+ (r'&', Punctuation),
85
+ (r'\|', Punctuation),
86
+ (r'\s+', Text),
87
+ (r'\d+\b', Number),
88
+ (r'[^=\s\[\]{}()$"\'`\\<&|;]+', Text),
89
+ (r'<', Text),
90
+ ],
91
+ 'string': [
92
+ (r'"', String.Double, '#pop'),
93
+ (r'(?s)(\\\\|\\[0-7]+|\\.|[^"\\$])+', String.Double),
94
+ include('interp'),
95
+ ],
96
+ 'curly': [
97
+ (r'\}', String.Interpol, '#pop'),
98
+ (r':-', Keyword),
99
+ (r'\w+', Name.Variable),
100
+ (r'[^}:"\'`$\\]+', Punctuation),
101
+ (r':', Punctuation),
102
+ include('root'),
103
+ ],
104
+ 'paren': [
105
+ (r'\)', Keyword, '#pop'),
106
+ include('root'),
107
+ ],
108
+ 'math': [
109
+ (r'\)\)', Keyword, '#pop'),
110
+ (r'[-+*/%^|&]|\*\*|\|\|', Operator),
111
+ (r'\d+#\d+', Number),
112
+ (r'\d+#(?! )', Number),
113
+ (r'\d+', Number),
114
+ include('root'),
115
+ ],
116
+ 'backticks': [
117
+ (r'`', String.Backtick, '#pop'),
118
+ include('root'),
119
+ ],
120
+ }
121
+
122
+ def analyse_text(text):
123
+ if shebang_matches(text, r'(ba|z|)sh'):
124
+ return 1
125
+ if text.startswith('$ '):
126
+ return 0.2
127
+
128
+
129
+ class SlurmBashLexer(BashLexer):
130
+ """
131
+ Lexer for (ba|k|z|)sh Slurm scripts.
132
+
133
+ .. versionadded:: 2.4
134
+ """
135
+
136
+ name = 'Slurm'
137
+ aliases = ['slurm', 'sbatch']
138
+ filenames = ['*.sl']
139
+ mimetypes = []
140
+ EXTRA_KEYWORDS = {'srun'}
141
+
142
+ def get_tokens_unprocessed(self, text):
143
+ for index, token, value in BashLexer.get_tokens_unprocessed(self, text):
144
+ if token is Text and value in self.EXTRA_KEYWORDS:
145
+ yield index, Name.Builtin, value
146
+ elif token is Comment.Single and 'SBATCH' in value:
147
+ yield index, Keyword.Pseudo, value
148
+ else:
149
+ yield index, token, value
150
+
151
+
152
+ class ShellSessionBaseLexer(Lexer):
153
+ """
154
+ Base lexer for shell sessions.
155
+
156
+ .. versionadded:: 2.1
157
+ """
158
+
159
+ _venv = re.compile(r'^(\([^)]*\))(\s*)')
160
+
161
+ def get_tokens_unprocessed(self, text):
162
+ innerlexer = self._innerLexerCls(**self.options)
163
+
164
+ pos = 0
165
+ curcode = ''
166
+ insertions = []
167
+ backslash_continuation = False
168
+
169
+ for match in line_re.finditer(text):
170
+ line = match.group()
171
+
172
+ venv_match = self._venv.match(line)
173
+ if venv_match:
174
+ venv = venv_match.group(1)
175
+ venv_whitespace = venv_match.group(2)
176
+ insertions.append((len(curcode),
177
+ [(0, Generic.Prompt.VirtualEnv, venv)]))
178
+ if venv_whitespace:
179
+ insertions.append((len(curcode),
180
+ [(0, Text, venv_whitespace)]))
181
+ line = line[venv_match.end():]
182
+
183
+ m = self._ps1rgx.match(line)
184
+ if m:
185
+ # To support output lexers (say diff output), the output
186
+ # needs to be broken by prompts whenever the output lexer
187
+ # changes.
188
+ if not insertions:
189
+ pos = match.start()
190
+
191
+ insertions.append((len(curcode),
192
+ [(0, Generic.Prompt, m.group(1))]))
193
+ curcode += m.group(2)
194
+ backslash_continuation = curcode.endswith('\\\n')
195
+ elif line.startswith(self._ps2) and backslash_continuation:
196
+ insertions.append((len(curcode),
197
+ [(0, Generic.Prompt, line[:len(self._ps2)])]))
198
+ curcode += line[len(self._ps2):]
199
+ backslash_continuation = curcode.endswith('\\\n')
200
+ else:
201
+ if insertions:
202
+ toks = innerlexer.get_tokens_unprocessed(curcode)
203
+ for i, t, v in do_insertions(insertions, toks):
204
+ yield pos+i, t, v
205
+ yield match.start(), Generic.Output, line
206
+ insertions = []
207
+ curcode = ''
208
+ if insertions:
209
+ for i, t, v in do_insertions(insertions,
210
+ innerlexer.get_tokens_unprocessed(curcode)):
211
+ yield pos+i, t, v
212
+
213
+
214
+ class BashSessionLexer(ShellSessionBaseLexer):
215
+ """
216
+ Lexer for Bash shell sessions, i.e. command lines, including a
217
+ prompt, interspersed with output.
218
+
219
+ .. versionadded:: 1.1
220
+ """
221
+
222
+ name = 'Bash Session'
223
+ aliases = ['console', 'shell-session']
224
+ filenames = ['*.sh-session', '*.shell-session']
225
+ mimetypes = ['application/x-shell-session', 'application/x-sh-session']
226
+
227
+ _innerLexerCls = BashLexer
228
+ _ps1rgx = re.compile(
229
+ r'^((?:(?:\[.*?\])|(?:\(\S+\))?(?:| |sh\S*?|\w+\S+[@:]\S+(?:\s+\S+)' \
230
+ r'?|\[\S+[@:][^\n]+\].+))\s*[$#%]\s*)(.*\n?)')
231
+ _ps2 = '> '
232
+
233
+
234
+ class BatchLexer(RegexLexer):
235
+ """
236
+ Lexer for the DOS/Windows Batch file format.
237
+
238
+ .. versionadded:: 0.7
239
+ """
240
+ name = 'Batchfile'
241
+ aliases = ['bat', 'batch', 'dosbatch', 'winbatch']
242
+ filenames = ['*.bat', '*.cmd']
243
+ mimetypes = ['application/x-dos-batch']
244
+
245
+ flags = re.MULTILINE | re.IGNORECASE
246
+
247
+ _nl = r'\n\x1a'
248
+ _punct = r'&<>|'
249
+ _ws = r'\t\v\f\r ,;=\xa0'
250
+ _nlws = r'\s\x1a\xa0,;='
251
+ _space = r'(?:(?:(?:\^[%s])?[%s])+)' % (_nl, _ws)
252
+ _keyword_terminator = (r'(?=(?:\^[%s]?)?[%s+./:[\\\]]|[%s%s(])' %
253
+ (_nl, _ws, _nl, _punct))
254
+ _token_terminator = r'(?=\^?[%s]|[%s%s])' % (_ws, _punct, _nl)
255
+ _start_label = r'((?:(?<=^[^:])|^[^:]?)[%s]*)(:)' % _ws
256
+ _label = r'(?:(?:[^%s%s+:^]|\^[%s]?[\w\W])*)' % (_nlws, _punct, _nl)
257
+ _label_compound = r'(?:(?:[^%s%s+:^)]|\^[%s]?[^)])*)' % (_nlws, _punct, _nl)
258
+ _number = r'(?:-?(?:0[0-7]+|0x[\da-f]+|\d+)%s)' % _token_terminator
259
+ _opword = r'(?:equ|geq|gtr|leq|lss|neq)'
260
+ _string = r'(?:"[^%s"]*(?:"|(?=[%s])))' % (_nl, _nl)
261
+ _variable = (r'(?:(?:%%(?:\*|(?:~[a-z]*(?:\$[^:]+:)?)?\d|'
262
+ r'[^%%:%s]+(?::(?:~(?:-?\d+)?(?:,(?:-?\d+)?)?|(?:[^%%%s^]|'
263
+ r'\^[^%%%s])[^=%s]*=(?:[^%%%s^]|\^[^%%%s])*)?)?%%))|'
264
+ r'(?:\^?![^!:%s]+(?::(?:~(?:-?\d+)?(?:,(?:-?\d+)?)?|(?:'
265
+ r'[^!%s^]|\^[^!%s])[^=%s]*=(?:[^!%s^]|\^[^!%s])*)?)?\^?!))' %
266
+ (_nl, _nl, _nl, _nl, _nl, _nl, _nl, _nl, _nl, _nl, _nl, _nl))
267
+ _core_token = r'(?:(?:(?:\^[%s]?)?[^"%s%s])+)' % (_nl, _nlws, _punct)
268
+ _core_token_compound = r'(?:(?:(?:\^[%s]?)?[^"%s%s)])+)' % (_nl, _nlws, _punct)
269
+ _token = r'(?:[%s]+|%s)' % (_punct, _core_token)
270
+ _token_compound = r'(?:[%s]+|%s)' % (_punct, _core_token_compound)
271
+ _stoken = (r'(?:[%s]+|(?:%s|%s|%s)+)' %
272
+ (_punct, _string, _variable, _core_token))
273
+
274
+ def _make_begin_state(compound, _core_token=_core_token,
275
+ _core_token_compound=_core_token_compound,
276
+ _keyword_terminator=_keyword_terminator,
277
+ _nl=_nl, _punct=_punct, _string=_string,
278
+ _space=_space, _start_label=_start_label,
279
+ _stoken=_stoken, _token_terminator=_token_terminator,
280
+ _variable=_variable, _ws=_ws):
281
+ rest = '(?:%s|%s|[^"%%%s%s%s])*' % (_string, _variable, _nl, _punct,
282
+ ')' if compound else '')
283
+ rest_of_line = r'(?:(?:[^%s^]|\^[%s]?[\w\W])*)' % (_nl, _nl)
284
+ rest_of_line_compound = r'(?:(?:[^%s^)]|\^[%s]?[^)])*)' % (_nl, _nl)
285
+ set_space = r'((?:(?:\^[%s]?)?[^\S\n])*)' % _nl
286
+ suffix = ''
287
+ if compound:
288
+ _keyword_terminator = r'(?:(?=\))|%s)' % _keyword_terminator
289
+ _token_terminator = r'(?:(?=\))|%s)' % _token_terminator
290
+ suffix = '/compound'
291
+ return [
292
+ ((r'\)', Punctuation, '#pop') if compound else
293
+ (r'\)((?=\()|%s)%s' % (_token_terminator, rest_of_line),
294
+ Comment.Single)),
295
+ (r'(?=%s)' % _start_label, Text, 'follow%s' % suffix),
296
+ (_space, using(this, state='text')),
297
+ include('redirect%s' % suffix),
298
+ (r'[%s]+' % _nl, Text),
299
+ (r'\(', Punctuation, 'root/compound'),
300
+ (r'@+', Punctuation),
301
+ (r'((?:for|if|rem)(?:(?=(?:\^[%s]?)?/)|(?:(?!\^)|'
302
+ r'(?<=m))(?:(?=\()|%s)))(%s?%s?(?:\^[%s]?)?/(?:\^[%s]?)?\?)' %
303
+ (_nl, _token_terminator, _space,
304
+ _core_token_compound if compound else _core_token, _nl, _nl),
305
+ bygroups(Keyword, using(this, state='text')),
306
+ 'follow%s' % suffix),
307
+ (r'(goto%s)(%s(?:\^[%s]?)?/(?:\^[%s]?)?\?%s)' %
308
+ (_keyword_terminator, rest, _nl, _nl, rest),
309
+ bygroups(Keyword, using(this, state='text')),
310
+ 'follow%s' % suffix),
311
+ (words(('assoc', 'break', 'cd', 'chdir', 'cls', 'color', 'copy',
312
+ 'date', 'del', 'dir', 'dpath', 'echo', 'endlocal', 'erase',
313
+ 'exit', 'ftype', 'keys', 'md', 'mkdir', 'mklink', 'move',
314
+ 'path', 'pause', 'popd', 'prompt', 'pushd', 'rd', 'ren',
315
+ 'rename', 'rmdir', 'setlocal', 'shift', 'start', 'time',
316
+ 'title', 'type', 'ver', 'verify', 'vol'),
317
+ suffix=_keyword_terminator), Keyword, 'follow%s' % suffix),
318
+ (r'(call)(%s?)(:)' % _space,
319
+ bygroups(Keyword, using(this, state='text'), Punctuation),
320
+ 'call%s' % suffix),
321
+ (r'call%s' % _keyword_terminator, Keyword),
322
+ (r'(for%s(?!\^))(%s)(/f%s)' %
323
+ (_token_terminator, _space, _token_terminator),
324
+ bygroups(Keyword, using(this, state='text'), Keyword),
325
+ ('for/f', 'for')),
326
+ (r'(for%s(?!\^))(%s)(/l%s)' %
327
+ (_token_terminator, _space, _token_terminator),
328
+ bygroups(Keyword, using(this, state='text'), Keyword),
329
+ ('for/l', 'for')),
330
+ (r'for%s(?!\^)' % _token_terminator, Keyword, ('for2', 'for')),
331
+ (r'(goto%s)(%s?)(:?)' % (_keyword_terminator, _space),
332
+ bygroups(Keyword, using(this, state='text'), Punctuation),
333
+ 'label%s' % suffix),
334
+ (r'(if(?:(?=\()|%s)(?!\^))(%s?)((?:/i%s)?)(%s?)((?:not%s)?)(%s?)' %
335
+ (_token_terminator, _space, _token_terminator, _space,
336
+ _token_terminator, _space),
337
+ bygroups(Keyword, using(this, state='text'), Keyword,
338
+ using(this, state='text'), Keyword,
339
+ using(this, state='text')), ('(?', 'if')),
340
+ (r'rem(((?=\()|%s)%s?%s?.*|%s%s)' %
341
+ (_token_terminator, _space, _stoken, _keyword_terminator,
342
+ rest_of_line_compound if compound else rest_of_line),
343
+ Comment.Single, 'follow%s' % suffix),
344
+ (r'(set%s)%s(/a)' % (_keyword_terminator, set_space),
345
+ bygroups(Keyword, using(this, state='text'), Keyword),
346
+ 'arithmetic%s' % suffix),
347
+ (r'(set%s)%s((?:/p)?)%s((?:(?:(?:\^[%s]?)?[^"%s%s^=%s]|'
348
+ r'\^[%s]?[^"=])+)?)((?:(?:\^[%s]?)?=)?)' %
349
+ (_keyword_terminator, set_space, set_space, _nl, _nl, _punct,
350
+ ')' if compound else '', _nl, _nl),
351
+ bygroups(Keyword, using(this, state='text'), Keyword,
352
+ using(this, state='text'), using(this, state='variable'),
353
+ Punctuation),
354
+ 'follow%s' % suffix),
355
+ default('follow%s' % suffix)
356
+ ]
357
+
358
+ def _make_follow_state(compound, _label=_label,
359
+ _label_compound=_label_compound, _nl=_nl,
360
+ _space=_space, _start_label=_start_label,
361
+ _token=_token, _token_compound=_token_compound,
362
+ _ws=_ws):
363
+ suffix = '/compound' if compound else ''
364
+ state = []
365
+ if compound:
366
+ state.append((r'(?=\))', Text, '#pop'))
367
+ state += [
368
+ (r'%s([%s]*)(%s)(.*)' %
369
+ (_start_label, _ws, _label_compound if compound else _label),
370
+ bygroups(Text, Punctuation, Text, Name.Label, Comment.Single)),
371
+ include('redirect%s' % suffix),
372
+ (r'(?=[%s])' % _nl, Text, '#pop'),
373
+ (r'\|\|?|&&?', Punctuation, '#pop'),
374
+ include('text')
375
+ ]
376
+ return state
377
+
378
+ def _make_arithmetic_state(compound, _nl=_nl, _punct=_punct,
379
+ _string=_string, _variable=_variable,
380
+ _ws=_ws, _nlws=_nlws):
381
+ op = r'=+\-*/!~'
382
+ state = []
383
+ if compound:
384
+ state.append((r'(?=\))', Text, '#pop'))
385
+ state += [
386
+ (r'0[0-7]+', Number.Oct),
387
+ (r'0x[\da-f]+', Number.Hex),
388
+ (r'\d+', Number.Integer),
389
+ (r'[(),]+', Punctuation),
390
+ (r'([%s]|%%|\^\^)+' % op, Operator),
391
+ (r'(%s|%s|(\^[%s]?)?[^()%s%%\^"%s%s]|\^[%s]?%s)+' %
392
+ (_string, _variable, _nl, op, _nlws, _punct, _nlws,
393
+ r'[^)]' if compound else r'[\w\W]'),
394
+ using(this, state='variable')),
395
+ (r'(?=[\x00|&])', Text, '#pop'),
396
+ include('follow')
397
+ ]
398
+ return state
399
+
400
+ def _make_call_state(compound, _label=_label,
401
+ _label_compound=_label_compound):
402
+ state = []
403
+ if compound:
404
+ state.append((r'(?=\))', Text, '#pop'))
405
+ state.append((r'(:?)(%s)' % (_label_compound if compound else _label),
406
+ bygroups(Punctuation, Name.Label), '#pop'))
407
+ return state
408
+
409
+ def _make_label_state(compound, _label=_label,
410
+ _label_compound=_label_compound, _nl=_nl,
411
+ _punct=_punct, _string=_string, _variable=_variable):
412
+ state = []
413
+ if compound:
414
+ state.append((r'(?=\))', Text, '#pop'))
415
+ state.append((r'(%s?)((?:%s|%s|\^[%s]?%s|[^"%%^%s%s%s])*)' %
416
+ (_label_compound if compound else _label, _string,
417
+ _variable, _nl, r'[^)]' if compound else r'[\w\W]', _nl,
418
+ _punct, r')' if compound else ''),
419
+ bygroups(Name.Label, Comment.Single), '#pop'))
420
+ return state
421
+
422
+ def _make_redirect_state(compound,
423
+ _core_token_compound=_core_token_compound,
424
+ _nl=_nl, _punct=_punct, _stoken=_stoken,
425
+ _string=_string, _space=_space,
426
+ _variable=_variable, _nlws=_nlws):
427
+ stoken_compound = (r'(?:[%s]+|(?:%s|%s|%s)+)' %
428
+ (_punct, _string, _variable, _core_token_compound))
429
+ return [
430
+ (r'((?:(?<=[%s])\d)?)(>>?&|<&)([%s]*)(\d)' %
431
+ (_nlws, _nlws),
432
+ bygroups(Number.Integer, Punctuation, Text, Number.Integer)),
433
+ (r'((?:(?<=[%s])(?<!\^[%s])\d)?)(>>?|<)(%s?%s)' %
434
+ (_nlws, _nl, _space, stoken_compound if compound else _stoken),
435
+ bygroups(Number.Integer, Punctuation, using(this, state='text')))
436
+ ]
437
+
438
+ tokens = {
439
+ 'root': _make_begin_state(False),
440
+ 'follow': _make_follow_state(False),
441
+ 'arithmetic': _make_arithmetic_state(False),
442
+ 'call': _make_call_state(False),
443
+ 'label': _make_label_state(False),
444
+ 'redirect': _make_redirect_state(False),
445
+ 'root/compound': _make_begin_state(True),
446
+ 'follow/compound': _make_follow_state(True),
447
+ 'arithmetic/compound': _make_arithmetic_state(True),
448
+ 'call/compound': _make_call_state(True),
449
+ 'label/compound': _make_label_state(True),
450
+ 'redirect/compound': _make_redirect_state(True),
451
+ 'variable-or-escape': [
452
+ (_variable, Name.Variable),
453
+ (r'%%%%|\^[%s]?(\^!|[\w\W])' % _nl, String.Escape)
454
+ ],
455
+ 'string': [
456
+ (r'"', String.Double, '#pop'),
457
+ (_variable, Name.Variable),
458
+ (r'\^!|%%', String.Escape),
459
+ (r'[^"%%^%s]+|[%%^]' % _nl, String.Double),
460
+ default('#pop')
461
+ ],
462
+ 'sqstring': [
463
+ include('variable-or-escape'),
464
+ (r'[^%]+|%', String.Single)
465
+ ],
466
+ 'bqstring': [
467
+ include('variable-or-escape'),
468
+ (r'[^%]+|%', String.Backtick)
469
+ ],
470
+ 'text': [
471
+ (r'"', String.Double, 'string'),
472
+ include('variable-or-escape'),
473
+ (r'[^"%%^%s%s\d)]+|.' % (_nlws, _punct), Text)
474
+ ],
475
+ 'variable': [
476
+ (r'"', String.Double, 'string'),
477
+ include('variable-or-escape'),
478
+ (r'[^"%%^%s]+|.' % _nl, Name.Variable)
479
+ ],
480
+ 'for': [
481
+ (r'(%s)(in)(%s)(\()' % (_space, _space),
482
+ bygroups(using(this, state='text'), Keyword,
483
+ using(this, state='text'), Punctuation), '#pop'),
484
+ include('follow')
485
+ ],
486
+ 'for2': [
487
+ (r'\)', Punctuation),
488
+ (r'(%s)(do%s)' % (_space, _token_terminator),
489
+ bygroups(using(this, state='text'), Keyword), '#pop'),
490
+ (r'[%s]+' % _nl, Text),
491
+ include('follow')
492
+ ],
493
+ 'for/f': [
494
+ (r'(")((?:%s|[^"])*?")([%s]*)(\))' % (_variable, _nlws),
495
+ bygroups(String.Double, using(this, state='string'), Text,
496
+ Punctuation)),
497
+ (r'"', String.Double, ('#pop', 'for2', 'string')),
498
+ (r"('(?:%%%%|%s|[\w\W])*?')([%s]*)(\))" % (_variable, _nlws),
499
+ bygroups(using(this, state='sqstring'), Text, Punctuation)),
500
+ (r'(`(?:%%%%|%s|[\w\W])*?`)([%s]*)(\))' % (_variable, _nlws),
501
+ bygroups(using(this, state='bqstring'), Text, Punctuation)),
502
+ include('for2')
503
+ ],
504
+ 'for/l': [
505
+ (r'-?\d+', Number.Integer),
506
+ include('for2')
507
+ ],
508
+ 'if': [
509
+ (r'((?:cmdextversion|errorlevel)%s)(%s)(\d+)' %
510
+ (_token_terminator, _space),
511
+ bygroups(Keyword, using(this, state='text'),
512
+ Number.Integer), '#pop'),
513
+ (r'(defined%s)(%s)(%s)' % (_token_terminator, _space, _stoken),
514
+ bygroups(Keyword, using(this, state='text'),
515
+ using(this, state='variable')), '#pop'),
516
+ (r'(exist%s)(%s%s)' % (_token_terminator, _space, _stoken),
517
+ bygroups(Keyword, using(this, state='text')), '#pop'),
518
+ (r'(%s%s)(%s)(%s%s)' % (_number, _space, _opword, _space, _number),
519
+ bygroups(using(this, state='arithmetic'), Operator.Word,
520
+ using(this, state='arithmetic')), '#pop'),
521
+ (_stoken, using(this, state='text'), ('#pop', 'if2')),
522
+ ],
523
+ 'if2': [
524
+ (r'(%s?)(==)(%s?%s)' % (_space, _space, _stoken),
525
+ bygroups(using(this, state='text'), Operator,
526
+ using(this, state='text')), '#pop'),
527
+ (r'(%s)(%s)(%s%s)' % (_space, _opword, _space, _stoken),
528
+ bygroups(using(this, state='text'), Operator.Word,
529
+ using(this, state='text')), '#pop')
530
+ ],
531
+ '(?': [
532
+ (_space, using(this, state='text')),
533
+ (r'\(', Punctuation, ('#pop', 'else?', 'root/compound')),
534
+ default('#pop')
535
+ ],
536
+ 'else?': [
537
+ (_space, using(this, state='text')),
538
+ (r'else%s' % _token_terminator, Keyword, '#pop'),
539
+ default('#pop')
540
+ ]
541
+ }
542
+
543
+
544
+ class MSDOSSessionLexer(ShellSessionBaseLexer):
545
+ """
546
+ Lexer for MS DOS shell sessions, i.e. command lines, including a
547
+ prompt, interspersed with output.
548
+
549
+ .. versionadded:: 2.1
550
+ """
551
+
552
+ name = 'MSDOS Session'
553
+ aliases = ['doscon']
554
+ filenames = []
555
+ mimetypes = []
556
+
557
+ _innerLexerCls = BatchLexer
558
+ _ps1rgx = re.compile(r'^([^>]*>)(.*\n?)')
559
+ _ps2 = 'More? '
560
+
561
+
562
+ class TcshLexer(RegexLexer):
563
+ """
564
+ Lexer for tcsh scripts.
565
+
566
+ .. versionadded:: 0.10
567
+ """
568
+
569
+ name = 'Tcsh'
570
+ aliases = ['tcsh', 'csh']
571
+ filenames = ['*.tcsh', '*.csh']
572
+ mimetypes = ['application/x-csh']
573
+
574
+ tokens = {
575
+ 'root': [
576
+ include('basic'),
577
+ (r'\$\(', Keyword, 'paren'),
578
+ (r'\$\{#?', Keyword, 'curly'),
579
+ (r'`', String.Backtick, 'backticks'),
580
+ include('data'),
581
+ ],
582
+ 'basic': [
583
+ (r'\b(if|endif|else|while|then|foreach|case|default|'
584
+ r'continue|goto|breaksw|end|switch|endsw)\s*\b',
585
+ Keyword),
586
+ (r'\b(alias|alloc|bg|bindkey|break|builtins|bye|caller|cd|chdir|'
587
+ r'complete|dirs|echo|echotc|eval|exec|exit|fg|filetest|getxvers|'
588
+ r'glob|getspath|hashstat|history|hup|inlib|jobs|kill|'
589
+ r'limit|log|login|logout|ls-F|migrate|newgrp|nice|nohup|notify|'
590
+ r'onintr|popd|printenv|pushd|rehash|repeat|rootnode|popd|pushd|'
591
+ r'set|shift|sched|setenv|setpath|settc|setty|setxvers|shift|'
592
+ r'source|stop|suspend|source|suspend|telltc|time|'
593
+ r'umask|unalias|uncomplete|unhash|universe|unlimit|unset|unsetenv|'
594
+ r'ver|wait|warp|watchlog|where|which)\s*\b',
595
+ Name.Builtin),
596
+ (r'#.*', Comment),
597
+ (r'\\[\w\W]', String.Escape),
598
+ (r'(\b\w+)(\s*)(=)', bygroups(Name.Variable, Text, Operator)),
599
+ (r'[\[\]{}()=]+', Operator),
600
+ (r'<<\s*(\'?)\\?(\w+)[\w\W]+?\2', String),
601
+ (r';', Punctuation),
602
+ ],
603
+ 'data': [
604
+ (r'(?s)"(\\\\|\\[0-7]+|\\.|[^"\\])*"', String.Double),
605
+ (r"(?s)'(\\\\|\\[0-7]+|\\.|[^'\\])*'", String.Single),
606
+ (r'\s+', Text),
607
+ (r'[^=\s\[\]{}()$"\'`\\;#]+', Text),
608
+ (r'\d+(?= |\Z)', Number),
609
+ (r'\$#?(\w+|.)', Name.Variable),
610
+ ],
611
+ 'curly': [
612
+ (r'\}', Keyword, '#pop'),
613
+ (r':-', Keyword),
614
+ (r'\w+', Name.Variable),
615
+ (r'[^}:"\'`$]+', Punctuation),
616
+ (r':', Punctuation),
617
+ include('root'),
618
+ ],
619
+ 'paren': [
620
+ (r'\)', Keyword, '#pop'),
621
+ include('root'),
622
+ ],
623
+ 'backticks': [
624
+ (r'`', String.Backtick, '#pop'),
625
+ include('root'),
626
+ ],
627
+ }
628
+
629
+
630
+ class TcshSessionLexer(ShellSessionBaseLexer):
631
+ """
632
+ Lexer for Tcsh sessions, i.e. command lines, including a
633
+ prompt, interspersed with output.
634
+
635
+ .. versionadded:: 2.1
636
+ """
637
+
638
+ name = 'Tcsh Session'
639
+ aliases = ['tcshcon']
640
+ filenames = []
641
+ mimetypes = []
642
+
643
+ _innerLexerCls = TcshLexer
644
+ _ps1rgx = re.compile(r'^([^>]+>)(.*\n?)')
645
+ _ps2 = '? '
646
+
647
+
648
+ class PowerShellLexer(RegexLexer):
649
+ """
650
+ For Windows PowerShell code.
651
+
652
+ .. versionadded:: 1.5
653
+ """
654
+ name = 'PowerShell'
655
+ aliases = ['powershell', 'posh', 'ps1', 'psm1']
656
+ filenames = ['*.ps1', '*.psm1']
657
+ mimetypes = ['text/x-powershell']
658
+
659
+ flags = re.DOTALL | re.IGNORECASE | re.MULTILINE
660
+
661
+ keywords = (
662
+ 'while validateset validaterange validatepattern validatelength '
663
+ 'validatecount until trap switch return ref process param parameter in '
664
+ 'if global: function foreach for finally filter end elseif else '
665
+ 'dynamicparam do default continue cmdletbinding break begin alias \\? '
666
+ '% #script #private #local #global mandatory parametersetname position '
667
+ 'valuefrompipeline valuefrompipelinebypropertyname '
668
+ 'valuefromremainingarguments helpmessage try catch throw').split()
669
+
670
+ operators = (
671
+ 'and as band bnot bor bxor casesensitive ccontains ceq cge cgt cle '
672
+ 'clike clt cmatch cne cnotcontains cnotlike cnotmatch contains '
673
+ 'creplace eq exact f file ge gt icontains ieq ige igt ile ilike ilt '
674
+ 'imatch ine inotcontains inotlike inotmatch ireplace is isnot le like '
675
+ 'lt match ne not notcontains notlike notmatch or regex replace '
676
+ 'wildcard').split()
677
+
678
+ verbs = (
679
+ 'write where watch wait use update unregister unpublish unprotect '
680
+ 'unlock uninstall undo unblock trace test tee take sync switch '
681
+ 'suspend submit stop step start split sort skip show set send select '
682
+ 'search scroll save revoke resume restore restart resolve resize '
683
+ 'reset request repair rename remove register redo receive read push '
684
+ 'publish protect pop ping out optimize open new move mount merge '
685
+ 'measure lock limit join invoke install initialize import hide group '
686
+ 'grant get format foreach find export expand exit enter enable edit '
687
+ 'dismount disconnect disable deny debug cxnew copy convertto '
688
+ 'convertfrom convert connect confirm compress complete compare close '
689
+ 'clear checkpoint block backup assert approve aggregate add').split()
690
+
691
+ aliases_ = (
692
+ 'ac asnp cat cd cfs chdir clc clear clhy cli clp cls clv cnsn '
693
+ 'compare copy cp cpi cpp curl cvpa dbp del diff dir dnsn ebp echo epal '
694
+ 'epcsv epsn erase etsn exsn fc fhx fl foreach ft fw gal gbp gc gci gcm '
695
+ 'gcs gdr ghy gi gjb gl gm gmo gp gps gpv group gsn gsnp gsv gu gv gwmi '
696
+ 'h history icm iex ihy ii ipal ipcsv ipmo ipsn irm ise iwmi iwr kill lp '
697
+ 'ls man md measure mi mount move mp mv nal ndr ni nmo npssc nsn nv ogv '
698
+ 'oh popd ps pushd pwd r rbp rcjb rcsn rd rdr ren ri rjb rm rmdir rmo '
699
+ 'rni rnp rp rsn rsnp rujb rv rvpa rwmi sajb sal saps sasv sbp sc select '
700
+ 'set shcm si sl sleep sls sort sp spjb spps spsv start sujb sv swmi tee '
701
+ 'trcm type wget where wjb write').split()
702
+
703
+ commenthelp = (
704
+ 'component description example externalhelp forwardhelpcategory '
705
+ 'forwardhelptargetname functionality inputs link '
706
+ 'notes outputs parameter remotehelprunspace role synopsis').split()
707
+
708
+ tokens = {
709
+ 'root': [
710
+ # we need to count pairs of parentheses for correct highlight
711
+ # of '$(...)' blocks in strings
712
+ (r'\(', Punctuation, 'child'),
713
+ (r'\s+', Text),
714
+ (r'^(\s*#[#\s]*)(\.(?:%s))([^\n]*$)' % '|'.join(commenthelp),
715
+ bygroups(Comment, String.Doc, Comment)),
716
+ (r'#[^\n]*?$', Comment),
717
+ (r'(&lt;|<)#', Comment.Multiline, 'multline'),
718
+ (r'@"\n', String.Heredoc, 'heredoc-double'),
719
+ (r"@'\n.*?\n'@", String.Heredoc),
720
+ # escaped syntax
721
+ (r'`[\'"$@-]', Punctuation),
722
+ (r'"', String.Double, 'string'),
723
+ (r"'([^']|'')*'", String.Single),
724
+ (r'(\$|@@|@)((global|script|private|env):)?\w+',
725
+ Name.Variable),
726
+ (r'(%s)\b' % '|'.join(keywords), Keyword),
727
+ (r'-(%s)\b' % '|'.join(operators), Operator),
728
+ (r'(%s)-[a-z_]\w*\b' % '|'.join(verbs), Name.Builtin),
729
+ (r'(%s)\s' % '|'.join(aliases_), Name.Builtin),
730
+ (r'\[[a-z_\[][\w. `,\[\]]*\]', Name.Constant), # .net [type]s
731
+ (r'-[a-z_]\w*', Name),
732
+ (r'\w+', Name),
733
+ (r'[.,;@{}\[\]$()=+*/\\&%!~?^`|<>-]|::', Punctuation),
734
+ ],
735
+ 'child': [
736
+ (r'\)', Punctuation, '#pop'),
737
+ include('root'),
738
+ ],
739
+ 'multline': [
740
+ (r'[^#&.]+', Comment.Multiline),
741
+ (r'#(>|&gt;)', Comment.Multiline, '#pop'),
742
+ (r'\.(%s)' % '|'.join(commenthelp), String.Doc),
743
+ (r'[#&.]', Comment.Multiline),
744
+ ],
745
+ 'string': [
746
+ (r"`[0abfnrtv'\"$`]", String.Escape),
747
+ (r'[^$`"]+', String.Double),
748
+ (r'\$\(', Punctuation, 'child'),
749
+ (r'""', String.Double),
750
+ (r'[`$]', String.Double),
751
+ (r'"', String.Double, '#pop'),
752
+ ],
753
+ 'heredoc-double': [
754
+ (r'\n"@', String.Heredoc, '#pop'),
755
+ (r'\$\(', Punctuation, 'child'),
756
+ (r'[^@\n]+"]', String.Heredoc),
757
+ (r".", String.Heredoc),
758
+ ]
759
+ }
760
+
761
+
762
+ class PowerShellSessionLexer(ShellSessionBaseLexer):
763
+ """
764
+ Lexer for PowerShell sessions, i.e. command lines, including a
765
+ prompt, interspersed with output.
766
+
767
+ .. versionadded:: 2.1
768
+ """
769
+
770
+ name = 'PowerShell Session'
771
+ aliases = ['ps1con']
772
+ filenames = []
773
+ mimetypes = []
774
+
775
+ _innerLexerCls = PowerShellLexer
776
+ _ps1rgx = re.compile(r'^((?:\[[^]]+\]: )?PS[^>]*> ?)(.*\n?)')
777
+ _ps2 = '>> '
778
+
779
+
780
+ class FishShellLexer(RegexLexer):
781
+ """
782
+ Lexer for Fish shell scripts.
783
+
784
+ .. versionadded:: 2.1
785
+ """
786
+
787
+ name = 'Fish'
788
+ aliases = ['fish', 'fishshell']
789
+ filenames = ['*.fish', '*.load']
790
+ mimetypes = ['application/x-fish']
791
+
792
+ tokens = {
793
+ 'root': [
794
+ include('basic'),
795
+ include('data'),
796
+ include('interp'),
797
+ ],
798
+ 'interp': [
799
+ (r'\$\(\(', Keyword, 'math'),
800
+ (r'\(', Keyword, 'paren'),
801
+ (r'\$#?(\w+|.)', Name.Variable),
802
+ ],
803
+ 'basic': [
804
+ (r'\b(begin|end|if|else|while|break|for|in|return|function|block|'
805
+ r'case|continue|switch|not|and|or|set|echo|exit|pwd|true|false|'
806
+ r'cd|count|test)(\s*)\b',
807
+ bygroups(Keyword, Text)),
808
+ (r'\b(alias|bg|bind|breakpoint|builtin|command|commandline|'
809
+ r'complete|contains|dirh|dirs|emit|eval|exec|fg|fish|fish_config|'
810
+ r'fish_indent|fish_pager|fish_prompt|fish_right_prompt|'
811
+ r'fish_update_completions|fishd|funced|funcsave|functions|help|'
812
+ r'history|isatty|jobs|math|mimedb|nextd|open|popd|prevd|psub|'
813
+ r'pushd|random|read|set_color|source|status|trap|type|ulimit|'
814
+ r'umask|vared|fc|getopts|hash|kill|printf|time|wait)\s*\b(?!\.)',
815
+ Name.Builtin),
816
+ (r'#.*\n', Comment),
817
+ (r'\\[\w\W]', String.Escape),
818
+ (r'(\b\w+)(\s*)(=)', bygroups(Name.Variable, Text, Operator)),
819
+ (r'[\[\]()=]', Operator),
820
+ (r'<<-?\s*(\'?)\\?(\w+)[\w\W]+?\2', String),
821
+ ],
822
+ 'data': [
823
+ (r'(?s)\$?"(\\\\|\\[0-7]+|\\.|[^"\\$])*"', String.Double),
824
+ (r'"', String.Double, 'string'),
825
+ (r"(?s)\$'(\\\\|\\[0-7]+|\\.|[^'\\])*'", String.Single),
826
+ (r"(?s)'.*?'", String.Single),
827
+ (r';', Punctuation),
828
+ (r'&|\||\^|<|>', Operator),
829
+ (r'\s+', Text),
830
+ (r'\d+(?= |\Z)', Number),
831
+ (r'[^=\s\[\]{}()$"\'`\\<&|;]+', Text),
832
+ ],
833
+ 'string': [
834
+ (r'"', String.Double, '#pop'),
835
+ (r'(?s)(\\\\|\\[0-7]+|\\.|[^"\\$])+', String.Double),
836
+ include('interp'),
837
+ ],
838
+ 'paren': [
839
+ (r'\)', Keyword, '#pop'),
840
+ include('root'),
841
+ ],
842
+ 'math': [
843
+ (r'\)\)', Keyword, '#pop'),
844
+ (r'[-+*/%^|&]|\*\*|\|\|', Operator),
845
+ (r'\d+#\d+', Number),
846
+ (r'\d+#(?! )', Number),
847
+ (r'\d+', Number),
848
+ include('root'),
849
+ ],
850
+ }
851
+
852
+ class ExeclineLexer(RegexLexer):
853
+ """
854
+ Lexer for Laurent Bercot's execline language
855
+ (https://skarnet.org/software/execline).
856
+
857
+ .. versionadded:: 2.7
858
+ """
859
+
860
+ name = 'execline'
861
+ aliases = ['execline']
862
+ filenames = ['*.exec']
863
+
864
+ tokens = {
865
+ 'root': [
866
+ include('basic'),
867
+ include('data'),
868
+ include('interp')
869
+ ],
870
+ 'interp': [
871
+ (r'\$\{', String.Interpol, 'curly'),
872
+ (r'\$[\w@#]+', Name.Variable), # user variable
873
+ (r'\$', Text),
874
+ ],
875
+ 'basic': [
876
+ (r'\b(background|backtick|cd|define|dollarat|elgetopt|'
877
+ r'elgetpositionals|elglob|emptyenv|envfile|exec|execlineb|'
878
+ r'exit|export|fdblock|fdclose|fdmove|fdreserve|fdswap|'
879
+ r'forbacktickx|foreground|forstdin|forx|getcwd|getpid|heredoc|'
880
+ r'homeof|if|ifelse|ifte|ifthenelse|importas|loopwhilex|'
881
+ r'multidefine|multisubstitute|pipeline|piperw|posix-cd|'
882
+ r'redirfd|runblock|shift|trap|tryexec|umask|unexport|wait|'
883
+ r'withstdinas)\b', Name.Builtin),
884
+ (r'\A#!.+\n', Comment.Hashbang),
885
+ (r'#.*\n', Comment.Single),
886
+ (r'[{}]', Operator)
887
+ ],
888
+ 'data': [
889
+ (r'(?s)"(\\.|[^"\\$])*"', String.Double),
890
+ (r'"', String.Double, 'string'),
891
+ (r'\s+', Text),
892
+ (r'[^\s{}$"\\]+', Text)
893
+ ],
894
+ 'string': [
895
+ (r'"', String.Double, '#pop'),
896
+ (r'(?s)(\\\\|\\.|[^"\\$])+', String.Double),
897
+ include('interp'),
898
+ ],
899
+ 'curly': [
900
+ (r'\}', String.Interpol, '#pop'),
901
+ (r'[\w#@]+', Name.Variable),
902
+ include('root')
903
+ ]
904
+
905
+ }
906
+
907
+ def analyse_text(text):
908
+ if shebang_matches(text, r'execlineb'):
909
+ return 1