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
@@ -1,16 +1,13 @@
1
- # -*- coding: utf-8 -*-
2
1
  """
3
2
  pygments.lexer
4
3
  ~~~~~~~~~~~~~~
5
4
 
6
5
  Base lexer classes.
7
6
 
8
- :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
7
+ :copyright: Copyright 2006-2021 by the Pygments team, see AUTHORS.
9
8
  :license: BSD, see LICENSE for details.
10
9
  """
11
10
 
12
- from __future__ import print_function
13
-
14
11
  import re
15
12
  import sys
16
13
  import time
@@ -19,7 +16,7 @@ from pygments.filter import apply_filters, Filter
19
16
  from pygments.filters import get_filter_by_name
20
17
  from pygments.token import Error, Text, Other, _TokenType
21
18
  from pygments.util import get_bool_opt, get_int_opt, get_list_opt, \
22
- make_analysator, text_type, add_metaclass, iteritems, Future, guess_decode
19
+ make_analysator, Future, guess_decode
23
20
  from pygments.regexopt import regex_opt
24
21
 
25
22
  __all__ = ['Lexer', 'RegexLexer', 'ExtendedRegexLexer', 'DelegatingLexer',
@@ -48,8 +45,7 @@ class LexerMeta(type):
48
45
  return type.__new__(mcs, name, bases, d)
49
46
 
50
47
 
51
- @add_metaclass(LexerMeta)
52
- class Lexer(object):
48
+ class Lexer(metaclass=LexerMeta):
53
49
  """
54
50
  Lexer for a specific language.
55
51
 
@@ -145,16 +141,16 @@ class Lexer(object):
145
141
  Also preprocess the text, i.e. expand tabs and strip it if
146
142
  wanted and applies registered filters.
147
143
  """
148
- if not isinstance(text, text_type):
144
+ if not isinstance(text, str):
149
145
  if self.encoding == 'guess':
150
146
  text, _ = guess_decode(text)
151
147
  elif self.encoding == 'chardet':
152
148
  try:
153
149
  import chardet
154
- except ImportError:
150
+ except ImportError as e:
155
151
  raise ImportError('To enable chardet encoding guessing, '
156
152
  'please install the chardet library '
157
- 'from http://chardet.feedparser.org/')
153
+ 'from http://chardet.feedparser.org/') from e
158
154
  # check for BOM first
159
155
  decoded = None
160
156
  for bom, encoding in _encoding_map:
@@ -169,11 +165,11 @@ class Lexer(object):
169
165
  text = decoded
170
166
  else:
171
167
  text = text.decode(self.encoding)
172
- if text.startswith(u'\ufeff'):
173
- text = text[len(u'\ufeff'):]
168
+ if text.startswith('\ufeff'):
169
+ text = text[len('\ufeff'):]
174
170
  else:
175
- if text.startswith(u'\ufeff'):
176
- text = text[len(u'\ufeff'):]
171
+ if text.startswith('\ufeff'):
172
+ text = text[len('\ufeff'):]
177
173
 
178
174
  # text now *is* a unicode string
179
175
  text = text.replace('\r\n', '\n')
@@ -252,7 +248,7 @@ class include(str): # pylint: disable=invalid-name
252
248
  pass
253
249
 
254
250
 
255
- class _inherit(object):
251
+ class _inherit:
256
252
  """
257
253
  Indicates the a state should inherit from its superclass.
258
254
  """
@@ -275,7 +271,7 @@ class combined(tuple): # pylint: disable=invalid-name
275
271
  pass
276
272
 
277
273
 
278
- class _PseudoMatch(object):
274
+ class _PseudoMatch:
279
275
  """
280
276
  A pseudo match object constructed from a string.
281
277
  """
@@ -328,11 +324,12 @@ def bygroups(*args):
328
324
  return callback
329
325
 
330
326
 
331
- class _This(object):
327
+ class _This:
332
328
  """
333
329
  Special singleton used for indicating the caller class.
334
330
  Used by ``using``.
335
331
  """
332
+
336
333
  this = _This()
337
334
 
338
335
 
@@ -498,7 +495,7 @@ class RegexLexerMeta(LexerMeta):
498
495
  rex = cls._process_regex(tdef[0], rflags, state)
499
496
  except Exception as err:
500
497
  raise ValueError("uncompilable regex %r in state %r of %r: %s" %
501
- (tdef[0], state, cls, err))
498
+ (tdef[0], state, cls, err)) from err
502
499
 
503
500
  token = cls._process_token(tdef[1])
504
501
 
@@ -536,7 +533,7 @@ class RegexLexerMeta(LexerMeta):
536
533
  for c in cls.__mro__:
537
534
  toks = c.__dict__.get('tokens', {})
538
535
 
539
- for state, items in iteritems(toks):
536
+ for state, items in toks.items():
540
537
  curitems = tokens.get(state)
541
538
  if curitems is None:
542
539
  # N.b. because this is assigned by reference, sufficiently
@@ -582,8 +579,7 @@ class RegexLexerMeta(LexerMeta):
582
579
  return type.__call__(cls, *args, **kwds)
583
580
 
584
581
 
585
- @add_metaclass(RegexLexerMeta)
586
- class RegexLexer(Lexer):
582
+ class RegexLexer(Lexer, metaclass=RegexLexerMeta):
587
583
  """
588
584
  Base for simple stateful regular expression-based lexers.
589
585
  Simplifies the lexing process so that you need only
@@ -631,22 +627,27 @@ class RegexLexer(Lexer):
631
627
  if type(action) is _TokenType:
632
628
  yield pos, action, m.group()
633
629
  else:
634
- for item in action(self, m):
635
- yield item
630
+ yield from action(self, m)
636
631
  pos = m.end()
637
632
  if new_state is not None:
638
633
  # state transition
639
634
  if isinstance(new_state, tuple):
640
635
  for state in new_state:
641
636
  if state == '#pop':
642
- statestack.pop()
637
+ if len(statestack) > 1:
638
+ statestack.pop()
643
639
  elif state == '#push':
644
640
  statestack.append(statestack[-1])
645
641
  else:
646
642
  statestack.append(state)
647
643
  elif isinstance(new_state, int):
648
- # pop
649
- del statestack[new_state:]
644
+ # pop, but keep at least one state on the stack
645
+ # (random code leading to unexpected pops should
646
+ # not allow exceptions)
647
+ if abs(new_state) >= len(statestack):
648
+ del statestack[1:]
649
+ else:
650
+ del statestack[new_state:]
650
651
  elif new_state == '#push':
651
652
  statestack.append(statestack[-1])
652
653
  else:
@@ -661,7 +662,7 @@ class RegexLexer(Lexer):
661
662
  # at EOL, reset state to "root"
662
663
  statestack = ['root']
663
664
  statetokens = tokendefs['root']
664
- yield pos, Text, u'\n'
665
+ yield pos, Text, '\n'
665
666
  pos += 1
666
667
  continue
667
668
  yield pos, Error, text[pos]
@@ -670,7 +671,7 @@ class RegexLexer(Lexer):
670
671
  break
671
672
 
672
673
 
673
- class LexerContext(object):
674
+ class LexerContext:
674
675
  """
675
676
  A helper object that holds lexer position data.
676
677
  """
@@ -713,8 +714,7 @@ class ExtendedRegexLexer(RegexLexer):
713
714
  yield ctx.pos, action, m.group()
714
715
  ctx.pos = m.end()
715
716
  else:
716
- for item in action(self, m, ctx):
717
- yield item
717
+ yield from action(self, m, ctx)
718
718
  if not new_state:
719
719
  # altered the state stack?
720
720
  statetokens = tokendefs[ctx.stack[-1]]
@@ -724,14 +724,18 @@ class ExtendedRegexLexer(RegexLexer):
724
724
  if isinstance(new_state, tuple):
725
725
  for state in new_state:
726
726
  if state == '#pop':
727
- ctx.stack.pop()
727
+ if len(ctx.stack) > 1:
728
+ ctx.stack.pop()
728
729
  elif state == '#push':
729
730
  ctx.stack.append(ctx.stack[-1])
730
731
  else:
731
732
  ctx.stack.append(state)
732
733
  elif isinstance(new_state, int):
733
- # pop
734
- del ctx.stack[new_state:]
734
+ # see RegexLexer for why this check is made
735
+ if abs(new_state) >= len(ctx.stack):
736
+ del ctx.state[1:]
737
+ else:
738
+ del ctx.stack[new_state:]
735
739
  elif new_state == '#push':
736
740
  ctx.stack.append(ctx.stack[-1])
737
741
  else:
@@ -746,7 +750,7 @@ class ExtendedRegexLexer(RegexLexer):
746
750
  # at EOL, reset state to "root"
747
751
  ctx.stack = ['root']
748
752
  statetokens = tokendefs['root']
749
- yield ctx.pos, Text, u'\n'
753
+ yield ctx.pos, Text, '\n'
750
754
  ctx.pos += 1
751
755
  continue
752
756
  yield ctx.pos, Error, text[ctx.pos]
@@ -774,8 +778,7 @@ def do_insertions(insertions, tokens):
774
778
  index, itokens = next(insertions)
775
779
  except StopIteration:
776
780
  # no insertions
777
- for item in tokens:
778
- yield item
781
+ yield from tokens
779
782
  return
780
783
 
781
784
  realpos = None
@@ -790,8 +793,9 @@ def do_insertions(insertions, tokens):
790
793
  oldi = 0
791
794
  while insleft and i + len(v) >= index:
792
795
  tmpval = v[oldi:index - i]
793
- yield realpos, t, tmpval
794
- realpos += len(tmpval)
796
+ if tmpval:
797
+ yield realpos, t, tmpval
798
+ realpos += len(tmpval)
795
799
  for it_index, it_token, it_value in itokens:
796
800
  yield realpos, it_token, it_value
797
801
  realpos += len(it_value)
@@ -801,8 +805,9 @@ def do_insertions(insertions, tokens):
801
805
  except StopIteration:
802
806
  insleft = False
803
807
  break # not strictly necessary
804
- yield realpos, t, v[oldi:]
805
- realpos += len(v) - oldi
808
+ if oldi < len(v):
809
+ yield realpos, t, v[oldi:]
810
+ realpos += len(v) - oldi
806
811
 
807
812
  # leftover tokens
808
813
  while insleft:
@@ -840,8 +845,7 @@ class ProfilingRegexLexerMeta(RegexLexerMeta):
840
845
  return match_func
841
846
 
842
847
 
843
- @add_metaclass(ProfilingRegexLexerMeta)
844
- class ProfilingRegexLexer(RegexLexer):
848
+ class ProfilingRegexLexer(RegexLexer, metaclass=ProfilingRegexLexerMeta):
845
849
  """Drop-in replacement for RegexLexer that does profiling of its regexes."""
846
850
 
847
851
  _prof_data = []
@@ -850,8 +854,7 @@ class ProfilingRegexLexer(RegexLexer):
850
854
  def get_tokens_unprocessed(self, text, stack=('root',)):
851
855
  # this needs to be a stack, since using(this) will produce nested calls
852
856
  self.__class__._prof_data.append({})
853
- for tok in RegexLexer.get_tokens_unprocessed(self, text, stack):
854
- yield tok
857
+ yield from RegexLexer.get_tokens_unprocessed(self, text, stack)
855
858
  rawdata = self.__class__._prof_data.pop()
856
859
  data = sorted(((s, repr(r).strip('u\'').replace('\\\\', '\\')[:65],
857
860
  n, 1000 * t, 1000 * t / n)
@@ -0,0 +1,341 @@
1
+ """
2
+ pygments.lexers
3
+ ~~~~~~~~~~~~~~~
4
+
5
+ Pygments lexers.
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
+ import sys
13
+ import types
14
+ import fnmatch
15
+ from os.path import basename
16
+
17
+ from pygments.lexers._mapping import LEXERS
18
+ from pygments.modeline import get_filetype_from_buffer
19
+ from pygments.plugin import find_plugin_lexers
20
+ from pygments.util import ClassNotFound, guess_decode
21
+
22
+ COMPAT = {
23
+ 'Python3Lexer': 'PythonLexer',
24
+ 'Python3TracebackLexer': 'PythonTracebackLexer',
25
+ }
26
+
27
+ __all__ = ['get_lexer_by_name', 'get_lexer_for_filename', 'find_lexer_class',
28
+ 'guess_lexer', 'load_lexer_from_file'] + list(LEXERS) + list(COMPAT)
29
+
30
+ _lexer_cache = {}
31
+ _pattern_cache = {}
32
+
33
+
34
+ def _fn_matches(fn, glob):
35
+ """Return whether the supplied file name fn matches pattern filename."""
36
+ if glob not in _pattern_cache:
37
+ pattern = _pattern_cache[glob] = re.compile(fnmatch.translate(glob))
38
+ return pattern.match(fn)
39
+ return _pattern_cache[glob].match(fn)
40
+
41
+
42
+ def _load_lexers(module_name):
43
+ """Load a lexer (and all others in the module too)."""
44
+ mod = __import__(module_name, None, None, ['__all__'])
45
+ for lexer_name in mod.__all__:
46
+ cls = getattr(mod, lexer_name)
47
+ _lexer_cache[cls.name] = cls
48
+
49
+
50
+ def get_all_lexers():
51
+ """Return a generator of tuples in the form ``(name, aliases,
52
+ filenames, mimetypes)`` of all know lexers.
53
+ """
54
+ for item in LEXERS.values():
55
+ yield item[1:]
56
+ for lexer in find_plugin_lexers():
57
+ yield lexer.name, lexer.aliases, lexer.filenames, lexer.mimetypes
58
+
59
+
60
+ def find_lexer_class(name):
61
+ """Lookup a lexer class by name.
62
+
63
+ Return None if not found.
64
+ """
65
+ if name in _lexer_cache:
66
+ return _lexer_cache[name]
67
+ # lookup builtin lexers
68
+ for module_name, lname, aliases, _, _ in LEXERS.values():
69
+ if name == lname:
70
+ _load_lexers(module_name)
71
+ return _lexer_cache[name]
72
+ # continue with lexers from setuptools entrypoints
73
+ for cls in find_plugin_lexers():
74
+ if cls.name == name:
75
+ return cls
76
+
77
+
78
+ def find_lexer_class_by_name(_alias):
79
+ """Lookup a lexer class by alias.
80
+
81
+ Like `get_lexer_by_name`, but does not instantiate the class.
82
+
83
+ .. versionadded:: 2.2
84
+ """
85
+ if not _alias:
86
+ raise ClassNotFound('no lexer for alias %r found' % _alias)
87
+ # lookup builtin lexers
88
+ for module_name, name, aliases, _, _ in LEXERS.values():
89
+ if _alias.lower() in aliases:
90
+ if name not in _lexer_cache:
91
+ _load_lexers(module_name)
92
+ return _lexer_cache[name]
93
+ # continue with lexers from setuptools entrypoints
94
+ for cls in find_plugin_lexers():
95
+ if _alias.lower() in cls.aliases:
96
+ return cls
97
+ raise ClassNotFound('no lexer for alias %r found' % _alias)
98
+
99
+
100
+ def get_lexer_by_name(_alias, **options):
101
+ """Get a lexer by an alias.
102
+
103
+ Raises ClassNotFound if not found.
104
+ """
105
+ if not _alias:
106
+ raise ClassNotFound('no lexer for alias %r found' % _alias)
107
+
108
+ # lookup builtin lexers
109
+ for module_name, name, aliases, _, _ in LEXERS.values():
110
+ if _alias.lower() in aliases:
111
+ if name not in _lexer_cache:
112
+ _load_lexers(module_name)
113
+ return _lexer_cache[name](**options)
114
+ # continue with lexers from setuptools entrypoints
115
+ for cls in find_plugin_lexers():
116
+ if _alias.lower() in cls.aliases:
117
+ return cls(**options)
118
+ raise ClassNotFound('no lexer for alias %r found' % _alias)
119
+
120
+
121
+ def load_lexer_from_file(filename, lexername="CustomLexer", **options):
122
+ """Load a lexer from a file.
123
+
124
+ This method expects a file located relative to the current working
125
+ directory, which contains a Lexer class. By default, it expects the
126
+ Lexer to be name CustomLexer; you can specify your own class name
127
+ as the second argument to this function.
128
+
129
+ Users should be very careful with the input, because this method
130
+ is equivalent to running eval on the input file.
131
+
132
+ Raises ClassNotFound if there are any problems importing the Lexer.
133
+
134
+ .. versionadded:: 2.2
135
+ """
136
+ try:
137
+ # This empty dict will contain the namespace for the exec'd file
138
+ custom_namespace = {}
139
+ with open(filename, 'rb') as f:
140
+ exec(f.read(), custom_namespace)
141
+ # Retrieve the class `lexername` from that namespace
142
+ if lexername not in custom_namespace:
143
+ raise ClassNotFound('no valid %s class found in %s' %
144
+ (lexername, filename))
145
+ lexer_class = custom_namespace[lexername]
146
+ # And finally instantiate it with the options
147
+ return lexer_class(**options)
148
+ except OSError as err:
149
+ raise ClassNotFound('cannot read %s: %s' % (filename, err))
150
+ except ClassNotFound:
151
+ raise
152
+ except Exception as err:
153
+ raise ClassNotFound('error when loading custom lexer: %s' % err)
154
+
155
+
156
+ def find_lexer_class_for_filename(_fn, code=None):
157
+ """Get a lexer for a filename.
158
+
159
+ If multiple lexers match the filename pattern, use ``analyse_text()`` to
160
+ figure out which one is more appropriate.
161
+
162
+ Returns None if not found.
163
+ """
164
+ matches = []
165
+ fn = basename(_fn)
166
+ for modname, name, _, filenames, _ in LEXERS.values():
167
+ for filename in filenames:
168
+ if _fn_matches(fn, filename):
169
+ if name not in _lexer_cache:
170
+ _load_lexers(modname)
171
+ matches.append((_lexer_cache[name], filename))
172
+ for cls in find_plugin_lexers():
173
+ for filename in cls.filenames:
174
+ if _fn_matches(fn, filename):
175
+ matches.append((cls, filename))
176
+
177
+ if isinstance(code, bytes):
178
+ # decode it, since all analyse_text functions expect unicode
179
+ code = guess_decode(code)
180
+
181
+ def get_rating(info):
182
+ cls, filename = info
183
+ # explicit patterns get a bonus
184
+ bonus = '*' not in filename and 0.5 or 0
185
+ # The class _always_ defines analyse_text because it's included in
186
+ # the Lexer class. The default implementation returns None which
187
+ # gets turned into 0.0. Run scripts/detect_missing_analyse_text.py
188
+ # to find lexers which need it overridden.
189
+ if code:
190
+ return cls.analyse_text(code) + bonus, cls.__name__
191
+ return cls.priority + bonus, cls.__name__
192
+
193
+ if matches:
194
+ matches.sort(key=get_rating)
195
+ # print "Possible lexers, after sort:", matches
196
+ return matches[-1][0]
197
+
198
+
199
+ def get_lexer_for_filename(_fn, code=None, **options):
200
+ """Get a lexer for a filename.
201
+
202
+ If multiple lexers match the filename pattern, use ``analyse_text()`` to
203
+ figure out which one is more appropriate.
204
+
205
+ Raises ClassNotFound if not found.
206
+ """
207
+ res = find_lexer_class_for_filename(_fn, code)
208
+ if not res:
209
+ raise ClassNotFound('no lexer for filename %r found' % _fn)
210
+ return res(**options)
211
+
212
+
213
+ def get_lexer_for_mimetype(_mime, **options):
214
+ """Get a lexer for a mimetype.
215
+
216
+ Raises ClassNotFound if not found.
217
+ """
218
+ for modname, name, _, _, mimetypes in LEXERS.values():
219
+ if _mime in mimetypes:
220
+ if name not in _lexer_cache:
221
+ _load_lexers(modname)
222
+ return _lexer_cache[name](**options)
223
+ for cls in find_plugin_lexers():
224
+ if _mime in cls.mimetypes:
225
+ return cls(**options)
226
+ raise ClassNotFound('no lexer for mimetype %r found' % _mime)
227
+
228
+
229
+ def _iter_lexerclasses(plugins=True):
230
+ """Return an iterator over all lexer classes."""
231
+ for key in sorted(LEXERS):
232
+ module_name, name = LEXERS[key][:2]
233
+ if name not in _lexer_cache:
234
+ _load_lexers(module_name)
235
+ yield _lexer_cache[name]
236
+ if plugins:
237
+ yield from find_plugin_lexers()
238
+
239
+
240
+ def guess_lexer_for_filename(_fn, _text, **options):
241
+ """
242
+ Lookup all lexers that handle those filenames primary (``filenames``)
243
+ or secondary (``alias_filenames``). Then run a text analysis for those
244
+ lexers and choose the best result.
245
+
246
+ usage::
247
+
248
+ >>> from pygments.lexers import guess_lexer_for_filename
249
+ >>> guess_lexer_for_filename('hello.html', '<%= @foo %>')
250
+ <pygments.lexers.templates.RhtmlLexer object at 0xb7d2f32c>
251
+ >>> guess_lexer_for_filename('hello.html', '<h1>{{ title|e }}</h1>')
252
+ <pygments.lexers.templates.HtmlDjangoLexer object at 0xb7d2f2ac>
253
+ >>> guess_lexer_for_filename('style.css', 'a { color: <?= $link ?> }')
254
+ <pygments.lexers.templates.CssPhpLexer object at 0xb7ba518c>
255
+ """
256
+ fn = basename(_fn)
257
+ primary = {}
258
+ matching_lexers = set()
259
+ for lexer in _iter_lexerclasses():
260
+ for filename in lexer.filenames:
261
+ if _fn_matches(fn, filename):
262
+ matching_lexers.add(lexer)
263
+ primary[lexer] = True
264
+ for filename in lexer.alias_filenames:
265
+ if _fn_matches(fn, filename):
266
+ matching_lexers.add(lexer)
267
+ primary[lexer] = False
268
+ if not matching_lexers:
269
+ raise ClassNotFound('no lexer for filename %r found' % fn)
270
+ if len(matching_lexers) == 1:
271
+ return matching_lexers.pop()(**options)
272
+ result = []
273
+ for lexer in matching_lexers:
274
+ rv = lexer.analyse_text(_text)
275
+ if rv == 1.0:
276
+ return lexer(**options)
277
+ result.append((rv, lexer))
278
+
279
+ def type_sort(t):
280
+ # sort by:
281
+ # - analyse score
282
+ # - is primary filename pattern?
283
+ # - priority
284
+ # - last resort: class name
285
+ return (t[0], primary[t[1]], t[1].priority, t[1].__name__)
286
+ result.sort(key=type_sort)
287
+
288
+ return result[-1][1](**options)
289
+
290
+
291
+ def guess_lexer(_text, **options):
292
+ """Guess a lexer by strong distinctions in the text (eg, shebang)."""
293
+
294
+ if not isinstance(_text, str):
295
+ inencoding = options.get('inencoding', options.get('encoding'))
296
+ if inencoding:
297
+ _text = _text.decode(inencoding or 'utf8')
298
+ else:
299
+ _text, _ = guess_decode(_text)
300
+
301
+ # try to get a vim modeline first
302
+ ft = get_filetype_from_buffer(_text)
303
+
304
+ if ft is not None:
305
+ try:
306
+ return get_lexer_by_name(ft, **options)
307
+ except ClassNotFound:
308
+ pass
309
+
310
+ best_lexer = [0.0, None]
311
+ for lexer in _iter_lexerclasses():
312
+ rv = lexer.analyse_text(_text)
313
+ if rv == 1.0:
314
+ return lexer(**options)
315
+ if rv > best_lexer[0]:
316
+ best_lexer[:] = (rv, lexer)
317
+ if not best_lexer[0] or best_lexer[1] is None:
318
+ raise ClassNotFound('no lexer matching the text found')
319
+ return best_lexer[1](**options)
320
+
321
+
322
+ class _automodule(types.ModuleType):
323
+ """Automatically import lexers."""
324
+
325
+ def __getattr__(self, name):
326
+ info = LEXERS.get(name)
327
+ if info:
328
+ _load_lexers(info[0])
329
+ cls = _lexer_cache[info[1]]
330
+ setattr(self, name, cls)
331
+ return cls
332
+ if name in COMPAT:
333
+ return getattr(self, COMPAT[name])
334
+ raise AttributeError(name)
335
+
336
+
337
+ oldmod = sys.modules[__name__]
338
+ newmod = _automodule(__name__)
339
+ newmod.__dict__.update(oldmod.__dict__)
340
+ sys.modules[__name__] = newmod
341
+ del newmod.newmod, newmod.oldmod, newmod.sys, newmod.types