pygments.rb 1.2.1 → 2.0.0.rc2

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 (378) hide show
  1. checksums.yaml +5 -5
  2. data/.github/dependabot.yml +13 -0
  3. data/.github/workflows/ci.yml +28 -0
  4. data/.github/workflows/release.yml +24 -0
  5. data/.gitignore +5 -6
  6. data/CHANGELOG.adoc +119 -0
  7. data/Gemfile +3 -1
  8. data/LICENSE +1 -1
  9. data/README.adoc +161 -0
  10. data/Rakefile +10 -21
  11. data/bench.rb +8 -7
  12. data/cache-lexers.rb +3 -2
  13. data/lib/pygments.rb +10 -11
  14. data/lib/pygments/lexer.rb +5 -5
  15. data/lib/pygments/mentos.py +23 -66
  16. data/lib/pygments/popen.rb +152 -204
  17. data/lib/pygments/version.rb +2 -2
  18. data/pygments.rb.gemspec +11 -9
  19. data/test/test_pygments.rb +51 -84
  20. data/vendor/pygments-main/{AUTHORS → Pygments-2.7.3.dist-info/AUTHORS} +21 -3
  21. data/vendor/pygments-main/Pygments-2.7.3.dist-info/INSTALLER +1 -0
  22. data/vendor/pygments-main/{LICENSE → Pygments-2.7.3.dist-info/LICENSE} +1 -1
  23. data/vendor/pygments-main/Pygments-2.7.3.dist-info/METADATA +49 -0
  24. data/vendor/pygments-main/Pygments-2.7.3.dist-info/RECORD +482 -0
  25. data/vendor/pygments-main/Pygments-2.7.3.dist-info/REQUESTED +0 -0
  26. data/vendor/pygments-main/Pygments-2.7.3.dist-info/WHEEL +5 -0
  27. data/vendor/pygments-main/Pygments-2.7.3.dist-info/entry_points.txt +3 -0
  28. data/vendor/pygments-main/Pygments-2.7.3.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 -11
  31. data/vendor/pygments-main/pygments/__main__.py +18 -0
  32. data/vendor/pygments-main/pygments/cmdline.py +38 -29
  33. data/vendor/pygments-main/pygments/console.py +6 -9
  34. data/vendor/pygments-main/pygments/filter.py +4 -6
  35. data/vendor/pygments-main/pygments/filters/__init__.py +609 -21
  36. data/vendor/pygments-main/pygments/formatter.py +4 -4
  37. data/vendor/pygments-main/pygments/formatters/__init__.py +9 -8
  38. data/vendor/pygments-main/pygments/formatters/_mapping.py +1 -3
  39. data/vendor/pygments-main/pygments/formatters/bbcode.py +1 -1
  40. data/vendor/pygments-main/pygments/formatters/html.py +223 -135
  41. data/vendor/pygments-main/pygments/formatters/img.py +68 -41
  42. data/vendor/pygments-main/pygments/formatters/irc.py +39 -39
  43. data/vendor/pygments-main/pygments/formatters/latex.py +56 -26
  44. data/vendor/pygments-main/pygments/formatters/other.py +12 -8
  45. data/vendor/pygments-main/pygments/formatters/rtf.py +29 -29
  46. data/vendor/pygments-main/pygments/formatters/svg.py +38 -4
  47. data/vendor/pygments-main/pygments/formatters/terminal.py +25 -31
  48. data/vendor/pygments-main/pygments/formatters/terminal256.py +22 -12
  49. data/vendor/pygments-main/pygments/lexer.py +41 -39
  50. data/vendor/pygments-main/pygments/lexers/__init__.py +342 -0
  51. data/vendor/pygments-main/pygments/lexers/_asy_builtins.py +1645 -0
  52. data/vendor/pygments-main/pygments/lexers/_cl_builtins.py +232 -0
  53. data/vendor/pygments-main/pygments/lexers/_cocoa_builtins.py +71 -0
  54. data/vendor/pygments-main/pygments/lexers/_csound_builtins.py +1725 -0
  55. data/vendor/pygments-main/pygments/lexers/_lasso_builtins.py +5327 -0
  56. data/vendor/pygments-main/pygments/lexers/_lua_builtins.py +293 -0
  57. data/vendor/pygments-main/pygments/lexers/_mapping.py +551 -0
  58. data/vendor/pygments-main/pygments/lexers/_mql_builtins.py +1172 -0
  59. data/vendor/pygments-main/pygments/lexers/_mysql_builtins.py +1282 -0
  60. data/vendor/pygments-main/pygments/lexers/_openedge_builtins.py +2547 -0
  61. data/vendor/pygments-main/pygments/lexers/_php_builtins.py +4753 -0
  62. data/vendor/pygments-main/pygments/lexers/_postgres_builtins.py +678 -0
  63. data/vendor/pygments-main/pygments/lexers/_scilab_builtins.py +3094 -0
  64. data/vendor/pygments-main/pygments/lexers/_sourcemod_builtins.py +1161 -0
  65. data/vendor/pygments-main/pygments/lexers/_stan_builtins.py +558 -0
  66. data/vendor/pygments-main/pygments/lexers/_stata_builtins.py +421 -0
  67. data/vendor/pygments-main/pygments/lexers/_tsql_builtins.py +1004 -0
  68. data/vendor/pygments-main/pygments/lexers/_usd_builtins.py +113 -0
  69. data/vendor/pygments-main/pygments/lexers/_vbscript_builtins.py +280 -0
  70. data/vendor/pygments-main/pygments/lexers/_vim_builtins.py +1939 -0
  71. data/vendor/pygments-main/pygments/lexers/actionscript.py +245 -0
  72. data/vendor/pygments-main/pygments/lexers/agile.py +24 -0
  73. data/vendor/pygments-main/pygments/lexers/algebra.py +240 -0
  74. data/vendor/pygments-main/pygments/lexers/ambient.py +76 -0
  75. data/vendor/pygments-main/pygments/lexers/ampl.py +87 -0
  76. data/vendor/pygments-main/pygments/lexers/apl.py +101 -0
  77. data/vendor/pygments-main/pygments/lexers/archetype.py +318 -0
  78. data/vendor/pygments-main/pygments/lexers/arrow.py +117 -0
  79. data/vendor/pygments-main/pygments/lexers/asm.py +1005 -0
  80. data/vendor/pygments-main/pygments/lexers/automation.py +374 -0
  81. data/vendor/pygments-main/pygments/lexers/bare.py +104 -0
  82. data/vendor/pygments-main/pygments/lexers/basic.py +662 -0
  83. data/vendor/pygments-main/pygments/lexers/bibtex.py +160 -0
  84. data/vendor/pygments-main/pygments/lexers/boa.py +102 -0
  85. data/vendor/pygments-main/pygments/lexers/business.py +627 -0
  86. data/vendor/pygments-main/pygments/lexers/c_cpp.py +344 -0
  87. data/vendor/pygments-main/pygments/lexers/c_like.py +566 -0
  88. data/vendor/pygments-main/pygments/lexers/capnproto.py +78 -0
  89. data/vendor/pygments-main/pygments/lexers/chapel.py +112 -0
  90. data/vendor/pygments-main/pygments/lexers/clean.py +179 -0
  91. data/vendor/pygments-main/pygments/lexers/compiled.py +34 -0
  92. data/vendor/pygments-main/pygments/lexers/configs.py +984 -0
  93. data/vendor/pygments-main/pygments/lexers/console.py +114 -0
  94. data/vendor/pygments-main/pygments/lexers/crystal.py +392 -0
  95. data/vendor/pygments-main/pygments/lexers/csound.py +467 -0
  96. data/vendor/pygments-main/pygments/lexers/css.py +691 -0
  97. data/vendor/pygments-main/pygments/lexers/d.py +256 -0
  98. data/vendor/pygments-main/pygments/lexers/dalvik.py +125 -0
  99. data/vendor/pygments-main/pygments/lexers/data.py +698 -0
  100. data/vendor/pygments-main/pygments/lexers/devicetree.py +109 -0
  101. data/vendor/pygments-main/pygments/lexers/diff.py +165 -0
  102. data/vendor/pygments-main/pygments/lexers/dotnet.py +707 -0
  103. data/vendor/pygments-main/pygments/lexers/dsls.py +960 -0
  104. data/vendor/pygments-main/pygments/lexers/dylan.py +287 -0
  105. data/vendor/pygments-main/pygments/lexers/ecl.py +139 -0
  106. data/vendor/pygments-main/pygments/lexers/eiffel.py +65 -0
  107. data/vendor/pygments-main/pygments/lexers/elm.py +121 -0
  108. data/vendor/pygments-main/pygments/lexers/email.py +151 -0
  109. data/vendor/pygments-main/pygments/lexers/erlang.py +530 -0
  110. data/vendor/pygments-main/pygments/lexers/esoteric.py +304 -0
  111. data/vendor/pygments-main/pygments/lexers/ezhil.py +77 -0
  112. data/vendor/pygments-main/pygments/lexers/factor.py +344 -0
  113. data/vendor/pygments-main/pygments/lexers/fantom.py +250 -0
  114. data/vendor/pygments-main/pygments/lexers/felix.py +273 -0
  115. data/vendor/pygments-main/pygments/lexers/floscript.py +83 -0
  116. data/vendor/pygments-main/pygments/lexers/forth.py +178 -0
  117. data/vendor/pygments-main/pygments/lexers/fortran.py +206 -0
  118. data/vendor/pygments-main/pygments/lexers/foxpro.py +428 -0
  119. data/vendor/pygments-main/pygments/lexers/freefem.py +898 -0
  120. data/vendor/pygments-main/pygments/lexers/functional.py +21 -0
  121. data/vendor/pygments-main/pygments/lexers/gdscript.py +346 -0
  122. data/vendor/pygments-main/pygments/lexers/go.py +101 -0
  123. data/vendor/pygments-main/pygments/lexers/grammar_notation.py +270 -0
  124. data/vendor/pygments-main/pygments/lexers/graph.py +85 -0
  125. data/vendor/pygments-main/pygments/lexers/graphics.py +800 -0
  126. data/vendor/pygments-main/pygments/lexers/haskell.py +870 -0
  127. data/vendor/pygments-main/pygments/lexers/haxe.py +936 -0
  128. data/vendor/pygments-main/pygments/lexers/hdl.py +472 -0
  129. data/vendor/pygments-main/pygments/lexers/hexdump.py +103 -0
  130. data/vendor/pygments-main/pygments/lexers/html.py +614 -0
  131. data/vendor/pygments-main/pygments/lexers/idl.py +281 -0
  132. data/vendor/pygments-main/pygments/lexers/igor.py +420 -0
  133. data/vendor/pygments-main/pygments/lexers/inferno.py +96 -0
  134. data/vendor/pygments-main/pygments/lexers/installers.py +322 -0
  135. data/vendor/pygments-main/pygments/lexers/int_fiction.py +1368 -0
  136. data/vendor/pygments-main/pygments/lexers/iolang.py +63 -0
  137. data/vendor/pygments-main/pygments/lexers/j.py +146 -0
  138. data/vendor/pygments-main/pygments/lexers/javascript.py +1540 -0
  139. data/vendor/pygments-main/pygments/lexers/julia.py +331 -0
  140. data/vendor/pygments-main/pygments/lexers/jvm.py +1673 -0
  141. data/vendor/pygments-main/pygments/lexers/lisp.py +2699 -0
  142. data/vendor/pygments-main/pygments/lexers/make.py +206 -0
  143. data/vendor/pygments-main/pygments/lexers/markup.py +765 -0
  144. data/vendor/pygments-main/pygments/lexers/math.py +21 -0
  145. data/vendor/pygments-main/pygments/lexers/matlab.py +720 -0
  146. data/vendor/pygments-main/pygments/lexers/mime.py +226 -0
  147. data/vendor/pygments-main/pygments/lexers/ml.py +958 -0
  148. data/vendor/pygments-main/pygments/lexers/modeling.py +366 -0
  149. data/vendor/pygments-main/pygments/lexers/modula2.py +1580 -0
  150. data/vendor/pygments-main/pygments/lexers/monte.py +204 -0
  151. data/vendor/pygments-main/pygments/lexers/mosel.py +448 -0
  152. data/vendor/pygments-main/pygments/lexers/ncl.py +894 -0
  153. data/vendor/pygments-main/pygments/lexers/nimrod.py +159 -0
  154. data/vendor/pygments-main/pygments/lexers/nit.py +64 -0
  155. data/vendor/pygments-main/pygments/lexers/nix.py +136 -0
  156. data/vendor/pygments-main/pygments/lexers/oberon.py +121 -0
  157. data/vendor/pygments-main/pygments/lexers/objective.py +504 -0
  158. data/vendor/pygments-main/pygments/lexers/ooc.py +85 -0
  159. data/vendor/pygments-main/pygments/lexers/other.py +41 -0
  160. data/vendor/pygments-main/pygments/lexers/parasail.py +79 -0
  161. data/vendor/pygments-main/pygments/lexers/parsers.py +800 -0
  162. data/vendor/pygments-main/pygments/lexers/pascal.py +644 -0
  163. data/vendor/pygments-main/pygments/lexers/pawn.py +205 -0
  164. data/vendor/pygments-main/pygments/lexers/perl.py +732 -0
  165. data/vendor/pygments-main/pygments/lexers/php.py +321 -0
  166. data/vendor/pygments-main/pygments/lexers/pointless.py +71 -0
  167. data/vendor/pygments-main/pygments/lexers/pony.py +94 -0
  168. data/vendor/pygments-main/pygments/lexers/praat.py +302 -0
  169. data/vendor/pygments-main/pygments/lexers/prolog.py +306 -0
  170. data/vendor/pygments-main/pygments/lexers/promql.py +183 -0
  171. data/vendor/pygments-main/pygments/lexers/python.py +1151 -0
  172. data/vendor/pygments-main/pygments/lexers/qvt.py +152 -0
  173. data/vendor/pygments-main/pygments/lexers/r.py +191 -0
  174. data/vendor/pygments-main/pygments/lexers/rdf.py +463 -0
  175. data/vendor/pygments-main/pygments/lexers/rebol.py +431 -0
  176. data/vendor/pygments-main/pygments/lexers/resource.py +85 -0
  177. data/vendor/pygments-main/pygments/lexers/ride.py +139 -0
  178. data/vendor/pygments-main/pygments/lexers/rnc.py +67 -0
  179. data/vendor/pygments-main/pygments/lexers/roboconf.py +82 -0
  180. data/vendor/pygments-main/pygments/lexers/robotframework.py +552 -0
  181. data/vendor/pygments-main/pygments/lexers/ruby.py +517 -0
  182. data/vendor/pygments-main/pygments/lexers/rust.py +224 -0
  183. data/vendor/pygments-main/pygments/lexers/sas.py +228 -0
  184. data/vendor/pygments-main/pygments/lexers/scdoc.py +83 -0
  185. data/vendor/pygments-main/pygments/lexers/scripting.py +1284 -0
  186. data/vendor/pygments-main/pygments/lexers/sgf.py +61 -0
  187. data/vendor/pygments-main/pygments/lexers/shell.py +914 -0
  188. data/vendor/pygments-main/pygments/lexers/sieve.py +69 -0
  189. data/vendor/pygments-main/pygments/lexers/slash.py +185 -0
  190. data/vendor/pygments-main/pygments/lexers/smalltalk.py +195 -0
  191. data/vendor/pygments-main/pygments/lexers/smv.py +79 -0
  192. data/vendor/pygments-main/pygments/lexers/snobol.py +83 -0
  193. data/vendor/pygments-main/pygments/lexers/solidity.py +92 -0
  194. data/vendor/pygments-main/pygments/lexers/special.py +105 -0
  195. data/vendor/pygments-main/pygments/lexers/sql.py +837 -0
  196. data/vendor/pygments-main/pygments/lexers/stata.py +171 -0
  197. data/vendor/pygments-main/pygments/lexers/supercollider.py +95 -0
  198. data/vendor/pygments-main/pygments/lexers/tcl.py +145 -0
  199. data/vendor/pygments-main/pygments/lexers/templates.py +2264 -0
  200. data/vendor/pygments-main/pygments/lexers/teraterm.py +335 -0
  201. data/vendor/pygments-main/pygments/lexers/testing.py +207 -0
  202. data/vendor/pygments-main/pygments/lexers/text.py +26 -0
  203. data/vendor/pygments-main/pygments/lexers/textedit.py +169 -0
  204. data/vendor/pygments-main/pygments/lexers/textfmts.py +430 -0
  205. data/vendor/pygments-main/pygments/lexers/theorem.py +474 -0
  206. data/vendor/pygments-main/pygments/lexers/tnt.py +263 -0
  207. data/vendor/pygments-main/pygments/lexers/trafficscript.py +54 -0
  208. data/vendor/pygments-main/pygments/lexers/typoscript.py +219 -0
  209. data/vendor/pygments-main/pygments/lexers/unicon.py +412 -0
  210. data/vendor/pygments-main/pygments/lexers/urbi.py +146 -0
  211. data/vendor/pygments-main/pygments/lexers/usd.py +90 -0
  212. data/vendor/pygments-main/pygments/lexers/varnish.py +190 -0
  213. data/vendor/pygments-main/pygments/lexers/verification.py +114 -0
  214. data/vendor/pygments-main/pygments/lexers/web.py +24 -0
  215. data/vendor/pygments-main/pygments/lexers/webidl.py +299 -0
  216. data/vendor/pygments-main/pygments/lexers/webmisc.py +991 -0
  217. data/vendor/pygments-main/pygments/lexers/whiley.py +116 -0
  218. data/vendor/pygments-main/pygments/lexers/x10.py +69 -0
  219. data/vendor/pygments-main/pygments/lexers/xorg.py +37 -0
  220. data/vendor/pygments-main/pygments/lexers/yang.py +104 -0
  221. data/vendor/pygments-main/pygments/lexers/zig.py +124 -0
  222. data/vendor/pygments-main/pygments/modeline.py +1 -1
  223. data/vendor/pygments-main/pygments/plugin.py +4 -2
  224. data/vendor/pygments-main/pygments/regexopt.py +1 -1
  225. data/vendor/pygments-main/pygments/scanner.py +2 -2
  226. data/vendor/pygments-main/pygments/sphinxext.py +2 -4
  227. data/vendor/pygments-main/pygments/style.py +61 -24
  228. data/vendor/pygments-main/pygments/styles/__init__.py +10 -4
  229. data/vendor/pygments-main/pygments/styles/abap.py +1 -1
  230. data/vendor/pygments-main/pygments/styles/algol.py +1 -1
  231. data/vendor/pygments-main/pygments/styles/algol_nu.py +1 -1
  232. data/vendor/pygments-main/pygments/styles/arduino.py +2 -2
  233. data/vendor/pygments-main/pygments/styles/autumn.py +1 -1
  234. data/vendor/pygments-main/pygments/styles/borland.py +1 -1
  235. data/vendor/pygments-main/pygments/styles/bw.py +1 -1
  236. data/vendor/pygments-main/pygments/styles/colorful.py +1 -1
  237. data/vendor/pygments-main/pygments/styles/default.py +1 -1
  238. data/vendor/pygments-main/pygments/styles/emacs.py +1 -1
  239. data/vendor/pygments-main/pygments/styles/friendly.py +1 -1
  240. data/vendor/pygments-main/pygments/styles/fruity.py +1 -1
  241. data/vendor/pygments-main/pygments/styles/igor.py +1 -1
  242. data/vendor/pygments-main/pygments/styles/inkpot.py +67 -0
  243. data/vendor/pygments-main/pygments/styles/lovelace.py +1 -1
  244. data/vendor/pygments-main/pygments/styles/manni.py +1 -1
  245. data/vendor/pygments-main/pygments/styles/monokai.py +4 -3
  246. data/vendor/pygments-main/pygments/styles/murphy.py +1 -1
  247. data/vendor/pygments-main/pygments/styles/native.py +1 -1
  248. data/vendor/pygments-main/pygments/styles/paraiso_dark.py +1 -1
  249. data/vendor/pygments-main/pygments/styles/paraiso_light.py +1 -1
  250. data/vendor/pygments-main/pygments/styles/pastie.py +1 -1
  251. data/vendor/pygments-main/pygments/styles/perldoc.py +1 -1
  252. data/vendor/pygments-main/pygments/styles/rainbow_dash.py +1 -1
  253. data/vendor/pygments-main/pygments/styles/rrt.py +1 -1
  254. data/vendor/pygments-main/pygments/styles/sas.py +1 -1
  255. data/vendor/pygments-main/pygments/styles/solarized.py +134 -0
  256. data/vendor/pygments-main/pygments/styles/stata_dark.py +41 -0
  257. data/vendor/pygments-main/pygments/styles/{stata.py → stata_light.py} +14 -15
  258. data/vendor/pygments-main/pygments/styles/tango.py +1 -1
  259. data/vendor/pygments-main/pygments/styles/trac.py +1 -1
  260. data/vendor/pygments-main/pygments/styles/vim.py +1 -1
  261. data/vendor/pygments-main/pygments/styles/vs.py +1 -1
  262. data/vendor/pygments-main/pygments/styles/xcode.py +1 -1
  263. data/vendor/pygments-main/pygments/token.py +1 -1
  264. data/vendor/pygments-main/pygments/unistring.py +47 -108
  265. data/vendor/pygments-main/pygments/util.py +15 -92
  266. metadata +69 -136
  267. data/CHANGELOG.md +0 -111
  268. data/README.md +0 -121
  269. data/circle.yml +0 -20
  270. data/test/test_data.py +0 -514
  271. data/test/test_data_generated +0 -2582
  272. data/vendor/custom_lexers/github.py +0 -565
  273. data/vendor/pygments-main/CHANGES +0 -1186
  274. data/vendor/pygments-main/MANIFEST.in +0 -6
  275. data/vendor/pygments-main/Makefile +0 -65
  276. data/vendor/pygments-main/README.rst +0 -39
  277. data/vendor/pygments-main/REVISION +0 -1
  278. data/vendor/pygments-main/TODO +0 -12
  279. data/vendor/pygments-main/doc/Makefile +0 -153
  280. data/vendor/pygments-main/doc/_static/favicon.ico +0 -0
  281. data/vendor/pygments-main/doc/_static/logo_new.png +0 -0
  282. data/vendor/pygments-main/doc/_static/logo_only.png +0 -0
  283. data/vendor/pygments-main/doc/_templates/docssidebar.html +0 -3
  284. data/vendor/pygments-main/doc/_templates/indexsidebar.html +0 -25
  285. data/vendor/pygments-main/doc/_themes/pygments14/layout.html +0 -98
  286. data/vendor/pygments-main/doc/_themes/pygments14/static/bodybg.png +0 -0
  287. data/vendor/pygments-main/doc/_themes/pygments14/static/docbg.png +0 -0
  288. data/vendor/pygments-main/doc/_themes/pygments14/static/listitem.png +0 -0
  289. data/vendor/pygments-main/doc/_themes/pygments14/static/logo.png +0 -0
  290. data/vendor/pygments-main/doc/_themes/pygments14/static/pocoo.png +0 -0
  291. data/vendor/pygments-main/doc/_themes/pygments14/static/pygments14.css_t +0 -401
  292. data/vendor/pygments-main/doc/_themes/pygments14/theme.conf +0 -15
  293. data/vendor/pygments-main/doc/conf.py +0 -241
  294. data/vendor/pygments-main/doc/docs/api.rst +0 -354
  295. data/vendor/pygments-main/doc/docs/authors.rst +0 -4
  296. data/vendor/pygments-main/doc/docs/changelog.rst +0 -1
  297. data/vendor/pygments-main/doc/docs/cmdline.rst +0 -166
  298. data/vendor/pygments-main/doc/docs/filterdevelopment.rst +0 -71
  299. data/vendor/pygments-main/doc/docs/filters.rst +0 -41
  300. data/vendor/pygments-main/doc/docs/formatterdevelopment.rst +0 -169
  301. data/vendor/pygments-main/doc/docs/formatters.rst +0 -48
  302. data/vendor/pygments-main/doc/docs/index.rst +0 -66
  303. data/vendor/pygments-main/doc/docs/integrate.rst +0 -40
  304. data/vendor/pygments-main/doc/docs/java.rst +0 -70
  305. data/vendor/pygments-main/doc/docs/lexerdevelopment.rst +0 -728
  306. data/vendor/pygments-main/doc/docs/lexers.rst +0 -69
  307. data/vendor/pygments-main/doc/docs/moinmoin.rst +0 -39
  308. data/vendor/pygments-main/doc/docs/plugins.rst +0 -93
  309. data/vendor/pygments-main/doc/docs/quickstart.rst +0 -205
  310. data/vendor/pygments-main/doc/docs/rstdirective.rst +0 -22
  311. data/vendor/pygments-main/doc/docs/styles.rst +0 -201
  312. data/vendor/pygments-main/doc/docs/tokens.rst +0 -372
  313. data/vendor/pygments-main/doc/docs/unicode.rst +0 -58
  314. data/vendor/pygments-main/doc/download.rst +0 -41
  315. data/vendor/pygments-main/doc/faq.rst +0 -139
  316. data/vendor/pygments-main/doc/index.rst +0 -54
  317. data/vendor/pygments-main/doc/languages.rst +0 -154
  318. data/vendor/pygments-main/doc/make.bat +0 -190
  319. data/vendor/pygments-main/doc/pygmentize.1 +0 -94
  320. data/vendor/pygments-main/external/autopygmentize +0 -101
  321. data/vendor/pygments-main/external/lasso-builtins-generator-9.lasso +0 -162
  322. data/vendor/pygments-main/external/markdown-processor.py +0 -67
  323. data/vendor/pygments-main/external/moin-parser.py +0 -112
  324. data/vendor/pygments-main/external/pygments.bashcomp +0 -38
  325. data/vendor/pygments-main/external/rst-directive.py +0 -82
  326. data/vendor/pygments-main/pygmentize +0 -8
  327. data/vendor/pygments-main/requirements.txt +0 -5
  328. data/vendor/pygments-main/scripts/check_sources.py +0 -211
  329. data/vendor/pygments-main/scripts/debug_lexer.py +0 -246
  330. data/vendor/pygments-main/scripts/detect_missing_analyse_text.py +0 -33
  331. data/vendor/pygments-main/scripts/epydoc.css +0 -280
  332. data/vendor/pygments-main/scripts/get_vimkw.py +0 -74
  333. data/vendor/pygments-main/scripts/pylintrc +0 -301
  334. data/vendor/pygments-main/scripts/vim2pygments.py +0 -935
  335. data/vendor/pygments-main/setup.cfg +0 -10
  336. data/vendor/pygments-main/setup.py +0 -77
  337. data/vendor/pygments-main/tox.ini +0 -7
  338. data/vendor/simplejson/.gitignore +0 -10
  339. data/vendor/simplejson/.travis.yml +0 -5
  340. data/vendor/simplejson/CHANGES.txt +0 -291
  341. data/vendor/simplejson/LICENSE.txt +0 -19
  342. data/vendor/simplejson/MANIFEST.in +0 -5
  343. data/vendor/simplejson/README.rst +0 -19
  344. data/vendor/simplejson/conf.py +0 -179
  345. data/vendor/simplejson/index.rst +0 -628
  346. data/vendor/simplejson/scripts/make_docs.py +0 -18
  347. data/vendor/simplejson/setup.py +0 -104
  348. data/vendor/simplejson/simplejson/__init__.py +0 -510
  349. data/vendor/simplejson/simplejson/_speedups.c +0 -2745
  350. data/vendor/simplejson/simplejson/decoder.py +0 -425
  351. data/vendor/simplejson/simplejson/encoder.py +0 -567
  352. data/vendor/simplejson/simplejson/ordered_dict.py +0 -119
  353. data/vendor/simplejson/simplejson/scanner.py +0 -77
  354. data/vendor/simplejson/simplejson/tests/__init__.py +0 -67
  355. data/vendor/simplejson/simplejson/tests/test_bigint_as_string.py +0 -55
  356. data/vendor/simplejson/simplejson/tests/test_check_circular.py +0 -30
  357. data/vendor/simplejson/simplejson/tests/test_decimal.py +0 -66
  358. data/vendor/simplejson/simplejson/tests/test_decode.py +0 -83
  359. data/vendor/simplejson/simplejson/tests/test_default.py +0 -9
  360. data/vendor/simplejson/simplejson/tests/test_dump.py +0 -67
  361. data/vendor/simplejson/simplejson/tests/test_encode_basestring_ascii.py +0 -46
  362. data/vendor/simplejson/simplejson/tests/test_encode_for_html.py +0 -32
  363. data/vendor/simplejson/simplejson/tests/test_errors.py +0 -34
  364. data/vendor/simplejson/simplejson/tests/test_fail.py +0 -91
  365. data/vendor/simplejson/simplejson/tests/test_float.py +0 -19
  366. data/vendor/simplejson/simplejson/tests/test_indent.py +0 -86
  367. data/vendor/simplejson/simplejson/tests/test_item_sort_key.py +0 -20
  368. data/vendor/simplejson/simplejson/tests/test_namedtuple.py +0 -121
  369. data/vendor/simplejson/simplejson/tests/test_pass1.py +0 -76
  370. data/vendor/simplejson/simplejson/tests/test_pass2.py +0 -14
  371. data/vendor/simplejson/simplejson/tests/test_pass3.py +0 -20
  372. data/vendor/simplejson/simplejson/tests/test_recursion.py +0 -67
  373. data/vendor/simplejson/simplejson/tests/test_scanstring.py +0 -117
  374. data/vendor/simplejson/simplejson/tests/test_separators.py +0 -42
  375. data/vendor/simplejson/simplejson/tests/test_speedups.py +0 -20
  376. data/vendor/simplejson/simplejson/tests/test_tuple.py +0 -49
  377. data/vendor/simplejson/simplejson/tests/test_unicode.py +0 -109
  378. data/vendor/simplejson/simplejson/tool.py +0 -39
@@ -5,12 +5,10 @@
5
5
 
6
6
  Base lexer classes.
7
7
 
8
- :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
8
+ :copyright: Copyright 2006-2020 by the Pygments team, see AUTHORS.
9
9
  :license: BSD, see LICENSE for details.
10
10
  """
11
11
 
12
- from __future__ import print_function
13
-
14
12
  import re
15
13
  import sys
16
14
  import time
@@ -19,7 +17,7 @@ from pygments.filter import apply_filters, Filter
19
17
  from pygments.filters import get_filter_by_name
20
18
  from pygments.token import Error, Text, Other, _TokenType
21
19
  from pygments.util import get_bool_opt, get_int_opt, get_list_opt, \
22
- make_analysator, text_type, add_metaclass, iteritems, Future, guess_decode
20
+ make_analysator, Future, guess_decode
23
21
  from pygments.regexopt import regex_opt
24
22
 
25
23
  __all__ = ['Lexer', 'RegexLexer', 'ExtendedRegexLexer', 'DelegatingLexer',
@@ -48,8 +46,7 @@ class LexerMeta(type):
48
46
  return type.__new__(mcs, name, bases, d)
49
47
 
50
48
 
51
- @add_metaclass(LexerMeta)
52
- class Lexer(object):
49
+ class Lexer(metaclass=LexerMeta):
53
50
  """
54
51
  Lexer for a specific language.
55
52
 
@@ -145,16 +142,16 @@ class Lexer(object):
145
142
  Also preprocess the text, i.e. expand tabs and strip it if
146
143
  wanted and applies registered filters.
147
144
  """
148
- if not isinstance(text, text_type):
145
+ if not isinstance(text, str):
149
146
  if self.encoding == 'guess':
150
147
  text, _ = guess_decode(text)
151
148
  elif self.encoding == 'chardet':
152
149
  try:
153
150
  import chardet
154
- except ImportError:
151
+ except ImportError as e:
155
152
  raise ImportError('To enable chardet encoding guessing, '
156
153
  'please install the chardet library '
157
- 'from http://chardet.feedparser.org/')
154
+ 'from http://chardet.feedparser.org/') from e
158
155
  # check for BOM first
159
156
  decoded = None
160
157
  for bom, encoding in _encoding_map:
@@ -169,11 +166,11 @@ class Lexer(object):
169
166
  text = decoded
170
167
  else:
171
168
  text = text.decode(self.encoding)
172
- if text.startswith(u'\ufeff'):
173
- text = text[len(u'\ufeff'):]
169
+ if text.startswith('\ufeff'):
170
+ text = text[len('\ufeff'):]
174
171
  else:
175
- if text.startswith(u'\ufeff'):
176
- text = text[len(u'\ufeff'):]
172
+ if text.startswith('\ufeff'):
173
+ text = text[len('\ufeff'):]
177
174
 
178
175
  # text now *is* a unicode string
179
176
  text = text.replace('\r\n', '\n')
@@ -252,7 +249,7 @@ class include(str): # pylint: disable=invalid-name
252
249
  pass
253
250
 
254
251
 
255
- class _inherit(object):
252
+ class _inherit:
256
253
  """
257
254
  Indicates the a state should inherit from its superclass.
258
255
  """
@@ -275,7 +272,7 @@ class combined(tuple): # pylint: disable=invalid-name
275
272
  pass
276
273
 
277
274
 
278
- class _PseudoMatch(object):
275
+ class _PseudoMatch:
279
276
  """
280
277
  A pseudo match object constructed from a string.
281
278
  """
@@ -328,11 +325,12 @@ def bygroups(*args):
328
325
  return callback
329
326
 
330
327
 
331
- class _This(object):
328
+ class _This:
332
329
  """
333
330
  Special singleton used for indicating the caller class.
334
331
  Used by ``using``.
335
332
  """
333
+
336
334
  this = _This()
337
335
 
338
336
 
@@ -498,7 +496,7 @@ class RegexLexerMeta(LexerMeta):
498
496
  rex = cls._process_regex(tdef[0], rflags, state)
499
497
  except Exception as err:
500
498
  raise ValueError("uncompilable regex %r in state %r of %r: %s" %
501
- (tdef[0], state, cls, err))
499
+ (tdef[0], state, cls, err)) from err
502
500
 
503
501
  token = cls._process_token(tdef[1])
504
502
 
@@ -536,7 +534,7 @@ class RegexLexerMeta(LexerMeta):
536
534
  for c in cls.__mro__:
537
535
  toks = c.__dict__.get('tokens', {})
538
536
 
539
- for state, items in iteritems(toks):
537
+ for state, items in toks.items():
540
538
  curitems = tokens.get(state)
541
539
  if curitems is None:
542
540
  # N.b. because this is assigned by reference, sufficiently
@@ -582,8 +580,7 @@ class RegexLexerMeta(LexerMeta):
582
580
  return type.__call__(cls, *args, **kwds)
583
581
 
584
582
 
585
- @add_metaclass(RegexLexerMeta)
586
- class RegexLexer(Lexer):
583
+ class RegexLexer(Lexer, metaclass=RegexLexerMeta):
587
584
  """
588
585
  Base for simple stateful regular expression-based lexers.
589
586
  Simplifies the lexing process so that you need only
@@ -631,22 +628,27 @@ class RegexLexer(Lexer):
631
628
  if type(action) is _TokenType:
632
629
  yield pos, action, m.group()
633
630
  else:
634
- for item in action(self, m):
635
- yield item
631
+ yield from action(self, m)
636
632
  pos = m.end()
637
633
  if new_state is not None:
638
634
  # state transition
639
635
  if isinstance(new_state, tuple):
640
636
  for state in new_state:
641
637
  if state == '#pop':
642
- statestack.pop()
638
+ if len(statestack) > 1:
639
+ statestack.pop()
643
640
  elif state == '#push':
644
641
  statestack.append(statestack[-1])
645
642
  else:
646
643
  statestack.append(state)
647
644
  elif isinstance(new_state, int):
648
- # pop
649
- del statestack[new_state:]
645
+ # pop, but keep at least one state on the stack
646
+ # (random code leading to unexpected pops should
647
+ # not allow exceptions)
648
+ if abs(new_state) >= len(statestack):
649
+ del statestack[1:]
650
+ else:
651
+ del statestack[new_state:]
650
652
  elif new_state == '#push':
651
653
  statestack.append(statestack[-1])
652
654
  else:
@@ -661,7 +663,7 @@ class RegexLexer(Lexer):
661
663
  # at EOL, reset state to "root"
662
664
  statestack = ['root']
663
665
  statetokens = tokendefs['root']
664
- yield pos, Text, u'\n'
666
+ yield pos, Text, '\n'
665
667
  pos += 1
666
668
  continue
667
669
  yield pos, Error, text[pos]
@@ -670,7 +672,7 @@ class RegexLexer(Lexer):
670
672
  break
671
673
 
672
674
 
673
- class LexerContext(object):
675
+ class LexerContext:
674
676
  """
675
677
  A helper object that holds lexer position data.
676
678
  """
@@ -713,8 +715,7 @@ class ExtendedRegexLexer(RegexLexer):
713
715
  yield ctx.pos, action, m.group()
714
716
  ctx.pos = m.end()
715
717
  else:
716
- for item in action(self, m, ctx):
717
- yield item
718
+ yield from action(self, m, ctx)
718
719
  if not new_state:
719
720
  # altered the state stack?
720
721
  statetokens = tokendefs[ctx.stack[-1]]
@@ -724,14 +725,18 @@ class ExtendedRegexLexer(RegexLexer):
724
725
  if isinstance(new_state, tuple):
725
726
  for state in new_state:
726
727
  if state == '#pop':
727
- ctx.stack.pop()
728
+ if len(ctx.stack) > 1:
729
+ ctx.stack.pop()
728
730
  elif state == '#push':
729
731
  ctx.stack.append(ctx.stack[-1])
730
732
  else:
731
733
  ctx.stack.append(state)
732
734
  elif isinstance(new_state, int):
733
- # pop
734
- del ctx.stack[new_state:]
735
+ # see RegexLexer for why this check is made
736
+ if abs(new_state) >= len(ctx.stack):
737
+ del ctx.state[1:]
738
+ else:
739
+ del ctx.stack[new_state:]
735
740
  elif new_state == '#push':
736
741
  ctx.stack.append(ctx.stack[-1])
737
742
  else:
@@ -746,7 +751,7 @@ class ExtendedRegexLexer(RegexLexer):
746
751
  # at EOL, reset state to "root"
747
752
  ctx.stack = ['root']
748
753
  statetokens = tokendefs['root']
749
- yield ctx.pos, Text, u'\n'
754
+ yield ctx.pos, Text, '\n'
750
755
  ctx.pos += 1
751
756
  continue
752
757
  yield ctx.pos, Error, text[ctx.pos]
@@ -774,8 +779,7 @@ def do_insertions(insertions, tokens):
774
779
  index, itokens = next(insertions)
775
780
  except StopIteration:
776
781
  # no insertions
777
- for item in tokens:
778
- yield item
782
+ yield from tokens
779
783
  return
780
784
 
781
785
  realpos = None
@@ -840,8 +844,7 @@ class ProfilingRegexLexerMeta(RegexLexerMeta):
840
844
  return match_func
841
845
 
842
846
 
843
- @add_metaclass(ProfilingRegexLexerMeta)
844
- class ProfilingRegexLexer(RegexLexer):
847
+ class ProfilingRegexLexer(RegexLexer, metaclass=ProfilingRegexLexerMeta):
845
848
  """Drop-in replacement for RegexLexer that does profiling of its regexes."""
846
849
 
847
850
  _prof_data = []
@@ -850,8 +853,7 @@ class ProfilingRegexLexer(RegexLexer):
850
853
  def get_tokens_unprocessed(self, text, stack=('root',)):
851
854
  # this needs to be a stack, since using(this) will produce nested calls
852
855
  self.__class__._prof_data.append({})
853
- for tok in RegexLexer.get_tokens_unprocessed(self, text, stack):
854
- yield tok
856
+ yield from RegexLexer.get_tokens_unprocessed(self, text, stack)
855
857
  rawdata = self.__class__._prof_data.pop()
856
858
  data = sorted(((s, repr(r).strip('u\'').replace('\\\\', '\\')[:65],
857
859
  n, 1000 * t, 1000 * t / n)
@@ -0,0 +1,342 @@
1
+ # -*- coding: utf-8 -*-
2
+ """
3
+ pygments.lexers
4
+ ~~~~~~~~~~~~~~~
5
+
6
+ Pygments lexers.
7
+
8
+ :copyright: Copyright 2006-2020 by the Pygments team, see AUTHORS.
9
+ :license: BSD, see LICENSE for details.
10
+ """
11
+
12
+ import re
13
+ import sys
14
+ import types
15
+ import fnmatch
16
+ from os.path import basename
17
+
18
+ from pygments.lexers._mapping import LEXERS
19
+ from pygments.modeline import get_filetype_from_buffer
20
+ from pygments.plugin import find_plugin_lexers
21
+ from pygments.util import ClassNotFound, guess_decode
22
+
23
+ COMPAT = {
24
+ 'Python3Lexer': 'PythonLexer',
25
+ 'Python3TracebackLexer': 'PythonTracebackLexer',
26
+ }
27
+
28
+ __all__ = ['get_lexer_by_name', 'get_lexer_for_filename', 'find_lexer_class',
29
+ 'guess_lexer', 'load_lexer_from_file'] + list(LEXERS) + list(COMPAT)
30
+
31
+ _lexer_cache = {}
32
+ _pattern_cache = {}
33
+
34
+
35
+ def _fn_matches(fn, glob):
36
+ """Return whether the supplied file name fn matches pattern filename."""
37
+ if glob not in _pattern_cache:
38
+ pattern = _pattern_cache[glob] = re.compile(fnmatch.translate(glob))
39
+ return pattern.match(fn)
40
+ return _pattern_cache[glob].match(fn)
41
+
42
+
43
+ def _load_lexers(module_name):
44
+ """Load a lexer (and all others in the module too)."""
45
+ mod = __import__(module_name, None, None, ['__all__'])
46
+ for lexer_name in mod.__all__:
47
+ cls = getattr(mod, lexer_name)
48
+ _lexer_cache[cls.name] = cls
49
+
50
+
51
+ def get_all_lexers():
52
+ """Return a generator of tuples in the form ``(name, aliases,
53
+ filenames, mimetypes)`` of all know lexers.
54
+ """
55
+ for item in LEXERS.values():
56
+ yield item[1:]
57
+ for lexer in find_plugin_lexers():
58
+ yield lexer.name, lexer.aliases, lexer.filenames, lexer.mimetypes
59
+
60
+
61
+ def find_lexer_class(name):
62
+ """Lookup a lexer class by name.
63
+
64
+ Return None if not found.
65
+ """
66
+ if name in _lexer_cache:
67
+ return _lexer_cache[name]
68
+ # lookup builtin lexers
69
+ for module_name, lname, aliases, _, _ in LEXERS.values():
70
+ if name == lname:
71
+ _load_lexers(module_name)
72
+ return _lexer_cache[name]
73
+ # continue with lexers from setuptools entrypoints
74
+ for cls in find_plugin_lexers():
75
+ if cls.name == name:
76
+ return cls
77
+
78
+
79
+ def find_lexer_class_by_name(_alias):
80
+ """Lookup a lexer class by alias.
81
+
82
+ Like `get_lexer_by_name`, but does not instantiate the class.
83
+
84
+ .. versionadded:: 2.2
85
+ """
86
+ if not _alias:
87
+ raise ClassNotFound('no lexer for alias %r found' % _alias)
88
+ # lookup builtin lexers
89
+ for module_name, name, aliases, _, _ in LEXERS.values():
90
+ if _alias.lower() in aliases:
91
+ if name not in _lexer_cache:
92
+ _load_lexers(module_name)
93
+ return _lexer_cache[name]
94
+ # continue with lexers from setuptools entrypoints
95
+ for cls in find_plugin_lexers():
96
+ if _alias.lower() in cls.aliases:
97
+ return cls
98
+ raise ClassNotFound('no lexer for alias %r found' % _alias)
99
+
100
+
101
+ def get_lexer_by_name(_alias, **options):
102
+ """Get a lexer by an alias.
103
+
104
+ Raises ClassNotFound if not found.
105
+ """
106
+ if not _alias:
107
+ raise ClassNotFound('no lexer for alias %r found' % _alias)
108
+
109
+ # lookup builtin lexers
110
+ for module_name, name, aliases, _, _ in LEXERS.values():
111
+ if _alias.lower() in aliases:
112
+ if name not in _lexer_cache:
113
+ _load_lexers(module_name)
114
+ return _lexer_cache[name](**options)
115
+ # continue with lexers from setuptools entrypoints
116
+ for cls in find_plugin_lexers():
117
+ if _alias.lower() in cls.aliases:
118
+ return cls(**options)
119
+ raise ClassNotFound('no lexer for alias %r found' % _alias)
120
+
121
+
122
+ def load_lexer_from_file(filename, lexername="CustomLexer", **options):
123
+ """Load a lexer from a file.
124
+
125
+ This method expects a file located relative to the current working
126
+ directory, which contains a Lexer class. By default, it expects the
127
+ Lexer to be name CustomLexer; you can specify your own class name
128
+ as the second argument to this function.
129
+
130
+ Users should be very careful with the input, because this method
131
+ is equivalent to running eval on the input file.
132
+
133
+ Raises ClassNotFound if there are any problems importing the Lexer.
134
+
135
+ .. versionadded:: 2.2
136
+ """
137
+ try:
138
+ # This empty dict will contain the namespace for the exec'd file
139
+ custom_namespace = {}
140
+ with open(filename, 'rb') as f:
141
+ exec(f.read(), custom_namespace)
142
+ # Retrieve the class `lexername` from that namespace
143
+ if lexername not in custom_namespace:
144
+ raise ClassNotFound('no valid %s class found in %s' %
145
+ (lexername, filename))
146
+ lexer_class = custom_namespace[lexername]
147
+ # And finally instantiate it with the options
148
+ return lexer_class(**options)
149
+ except IOError as err:
150
+ raise ClassNotFound('cannot read %s: %s' % (filename, err))
151
+ except ClassNotFound:
152
+ raise
153
+ except Exception as err:
154
+ raise ClassNotFound('error when loading custom lexer: %s' % err)
155
+
156
+
157
+ def find_lexer_class_for_filename(_fn, code=None):
158
+ """Get a lexer for a filename.
159
+
160
+ If multiple lexers match the filename pattern, use ``analyse_text()`` to
161
+ figure out which one is more appropriate.
162
+
163
+ Returns None if not found.
164
+ """
165
+ matches = []
166
+ fn = basename(_fn)
167
+ for modname, name, _, filenames, _ in LEXERS.values():
168
+ for filename in filenames:
169
+ if _fn_matches(fn, filename):
170
+ if name not in _lexer_cache:
171
+ _load_lexers(modname)
172
+ matches.append((_lexer_cache[name], filename))
173
+ for cls in find_plugin_lexers():
174
+ for filename in cls.filenames:
175
+ if _fn_matches(fn, filename):
176
+ matches.append((cls, filename))
177
+
178
+ if isinstance(code, bytes):
179
+ # decode it, since all analyse_text functions expect unicode
180
+ code = guess_decode(code)
181
+
182
+ def get_rating(info):
183
+ cls, filename = info
184
+ # explicit patterns get a bonus
185
+ bonus = '*' not in filename and 0.5 or 0
186
+ # The class _always_ defines analyse_text because it's included in
187
+ # the Lexer class. The default implementation returns None which
188
+ # gets turned into 0.0. Run scripts/detect_missing_analyse_text.py
189
+ # to find lexers which need it overridden.
190
+ if code:
191
+ return cls.analyse_text(code) + bonus, cls.__name__
192
+ return cls.priority + bonus, cls.__name__
193
+
194
+ if matches:
195
+ matches.sort(key=get_rating)
196
+ # print "Possible lexers, after sort:", matches
197
+ return matches[-1][0]
198
+
199
+
200
+ def get_lexer_for_filename(_fn, code=None, **options):
201
+ """Get a lexer for a filename.
202
+
203
+ If multiple lexers match the filename pattern, use ``analyse_text()`` to
204
+ figure out which one is more appropriate.
205
+
206
+ Raises ClassNotFound if not found.
207
+ """
208
+ res = find_lexer_class_for_filename(_fn, code)
209
+ if not res:
210
+ raise ClassNotFound('no lexer for filename %r found' % _fn)
211
+ return res(**options)
212
+
213
+
214
+ def get_lexer_for_mimetype(_mime, **options):
215
+ """Get a lexer for a mimetype.
216
+
217
+ Raises ClassNotFound if not found.
218
+ """
219
+ for modname, name, _, _, mimetypes in LEXERS.values():
220
+ if _mime in mimetypes:
221
+ if name not in _lexer_cache:
222
+ _load_lexers(modname)
223
+ return _lexer_cache[name](**options)
224
+ for cls in find_plugin_lexers():
225
+ if _mime in cls.mimetypes:
226
+ return cls(**options)
227
+ raise ClassNotFound('no lexer for mimetype %r found' % _mime)
228
+
229
+
230
+ def _iter_lexerclasses(plugins=True):
231
+ """Return an iterator over all lexer classes."""
232
+ for key in sorted(LEXERS):
233
+ module_name, name = LEXERS[key][:2]
234
+ if name not in _lexer_cache:
235
+ _load_lexers(module_name)
236
+ yield _lexer_cache[name]
237
+ if plugins:
238
+ yield from find_plugin_lexers()
239
+
240
+
241
+ def guess_lexer_for_filename(_fn, _text, **options):
242
+ """
243
+ Lookup all lexers that handle those filenames primary (``filenames``)
244
+ or secondary (``alias_filenames``). Then run a text analysis for those
245
+ lexers and choose the best result.
246
+
247
+ usage::
248
+
249
+ >>> from pygments.lexers import guess_lexer_for_filename
250
+ >>> guess_lexer_for_filename('hello.html', '<%= @foo %>')
251
+ <pygments.lexers.templates.RhtmlLexer object at 0xb7d2f32c>
252
+ >>> guess_lexer_for_filename('hello.html', '<h1>{{ title|e }}</h1>')
253
+ <pygments.lexers.templates.HtmlDjangoLexer object at 0xb7d2f2ac>
254
+ >>> guess_lexer_for_filename('style.css', 'a { color: <?= $link ?> }')
255
+ <pygments.lexers.templates.CssPhpLexer object at 0xb7ba518c>
256
+ """
257
+ fn = basename(_fn)
258
+ primary = {}
259
+ matching_lexers = set()
260
+ for lexer in _iter_lexerclasses():
261
+ for filename in lexer.filenames:
262
+ if _fn_matches(fn, filename):
263
+ matching_lexers.add(lexer)
264
+ primary[lexer] = True
265
+ for filename in lexer.alias_filenames:
266
+ if _fn_matches(fn, filename):
267
+ matching_lexers.add(lexer)
268
+ primary[lexer] = False
269
+ if not matching_lexers:
270
+ raise ClassNotFound('no lexer for filename %r found' % fn)
271
+ if len(matching_lexers) == 1:
272
+ return matching_lexers.pop()(**options)
273
+ result = []
274
+ for lexer in matching_lexers:
275
+ rv = lexer.analyse_text(_text)
276
+ if rv == 1.0:
277
+ return lexer(**options)
278
+ result.append((rv, lexer))
279
+
280
+ def type_sort(t):
281
+ # sort by:
282
+ # - analyse score
283
+ # - is primary filename pattern?
284
+ # - priority
285
+ # - last resort: class name
286
+ return (t[0], primary[t[1]], t[1].priority, t[1].__name__)
287
+ result.sort(key=type_sort)
288
+
289
+ return result[-1][1](**options)
290
+
291
+
292
+ def guess_lexer(_text, **options):
293
+ """Guess a lexer by strong distinctions in the text (eg, shebang)."""
294
+
295
+ if not isinstance(_text, str):
296
+ inencoding = options.get('inencoding', options.get('encoding'))
297
+ if inencoding:
298
+ _text = _text.decode(inencoding or 'utf8')
299
+ else:
300
+ _text, _ = guess_decode(_text)
301
+
302
+ # try to get a vim modeline first
303
+ ft = get_filetype_from_buffer(_text)
304
+
305
+ if ft is not None:
306
+ try:
307
+ return get_lexer_by_name(ft, **options)
308
+ except ClassNotFound:
309
+ pass
310
+
311
+ best_lexer = [0.0, None]
312
+ for lexer in _iter_lexerclasses():
313
+ rv = lexer.analyse_text(_text)
314
+ if rv == 1.0:
315
+ return lexer(**options)
316
+ if rv > best_lexer[0]:
317
+ best_lexer[:] = (rv, lexer)
318
+ if not best_lexer[0] or best_lexer[1] is None:
319
+ raise ClassNotFound('no lexer matching the text found')
320
+ return best_lexer[1](**options)
321
+
322
+
323
+ class _automodule(types.ModuleType):
324
+ """Automatically import lexers."""
325
+
326
+ def __getattr__(self, name):
327
+ info = LEXERS.get(name)
328
+ if info:
329
+ _load_lexers(info[0])
330
+ cls = _lexer_cache[info[1]]
331
+ setattr(self, name, cls)
332
+ return cls
333
+ if name in COMPAT:
334
+ return getattr(self, COMPAT[name])
335
+ raise AttributeError(name)
336
+
337
+
338
+ oldmod = sys.modules[__name__]
339
+ newmod = _automodule(__name__)
340
+ newmod.__dict__.update(oldmod.__dict__)
341
+ sys.modules[__name__] = newmod
342
+ del newmod.newmod, newmod.oldmod, newmod.sys, newmod.types