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.
- checksums.yaml +5 -5
- data/.github/dependabot.yml +13 -0
- data/.github/workflows/ci.yml +28 -0
- data/.github/workflows/release.yml +24 -0
- data/.gitignore +5 -6
- data/CHANGELOG.adoc +119 -0
- data/Gemfile +3 -1
- data/LICENSE +1 -1
- data/README.adoc +161 -0
- data/Rakefile +10 -21
- data/bench.rb +8 -7
- data/cache-lexers.rb +3 -2
- data/lib/pygments.rb +10 -11
- data/lib/pygments/lexer.rb +5 -5
- data/lib/pygments/mentos.py +23 -66
- data/lib/pygments/popen.rb +152 -204
- data/lib/pygments/version.rb +2 -2
- data/pygments.rb.gemspec +11 -9
- data/test/test_pygments.rb +51 -84
- data/vendor/pygments-main/{AUTHORS → Pygments-2.7.3.dist-info/AUTHORS} +21 -3
- data/vendor/pygments-main/Pygments-2.7.3.dist-info/INSTALLER +1 -0
- data/vendor/pygments-main/{LICENSE → Pygments-2.7.3.dist-info/LICENSE} +1 -1
- data/vendor/pygments-main/Pygments-2.7.3.dist-info/METADATA +49 -0
- data/vendor/pygments-main/Pygments-2.7.3.dist-info/RECORD +482 -0
- data/vendor/pygments-main/Pygments-2.7.3.dist-info/REQUESTED +0 -0
- data/vendor/pygments-main/Pygments-2.7.3.dist-info/WHEEL +5 -0
- data/vendor/pygments-main/Pygments-2.7.3.dist-info/entry_points.txt +3 -0
- data/vendor/pygments-main/Pygments-2.7.3.dist-info/top_level.txt +1 -0
- data/vendor/pygments-main/bin/pygmentize +8 -0
- data/vendor/pygments-main/pygments/__init__.py +6 -11
- data/vendor/pygments-main/pygments/__main__.py +18 -0
- data/vendor/pygments-main/pygments/cmdline.py +38 -29
- data/vendor/pygments-main/pygments/console.py +6 -9
- data/vendor/pygments-main/pygments/filter.py +4 -6
- data/vendor/pygments-main/pygments/filters/__init__.py +609 -21
- data/vendor/pygments-main/pygments/formatter.py +4 -4
- data/vendor/pygments-main/pygments/formatters/__init__.py +9 -8
- data/vendor/pygments-main/pygments/formatters/_mapping.py +1 -3
- data/vendor/pygments-main/pygments/formatters/bbcode.py +1 -1
- data/vendor/pygments-main/pygments/formatters/html.py +223 -135
- data/vendor/pygments-main/pygments/formatters/img.py +68 -41
- data/vendor/pygments-main/pygments/formatters/irc.py +39 -39
- data/vendor/pygments-main/pygments/formatters/latex.py +56 -26
- data/vendor/pygments-main/pygments/formatters/other.py +12 -8
- data/vendor/pygments-main/pygments/formatters/rtf.py +29 -29
- data/vendor/pygments-main/pygments/formatters/svg.py +38 -4
- data/vendor/pygments-main/pygments/formatters/terminal.py +25 -31
- data/vendor/pygments-main/pygments/formatters/terminal256.py +22 -12
- data/vendor/pygments-main/pygments/lexer.py +41 -39
- data/vendor/pygments-main/pygments/lexers/__init__.py +342 -0
- data/vendor/pygments-main/pygments/lexers/_asy_builtins.py +1645 -0
- data/vendor/pygments-main/pygments/lexers/_cl_builtins.py +232 -0
- data/vendor/pygments-main/pygments/lexers/_cocoa_builtins.py +71 -0
- data/vendor/pygments-main/pygments/lexers/_csound_builtins.py +1725 -0
- data/vendor/pygments-main/pygments/lexers/_lasso_builtins.py +5327 -0
- data/vendor/pygments-main/pygments/lexers/_lua_builtins.py +293 -0
- data/vendor/pygments-main/pygments/lexers/_mapping.py +551 -0
- data/vendor/pygments-main/pygments/lexers/_mql_builtins.py +1172 -0
- data/vendor/pygments-main/pygments/lexers/_mysql_builtins.py +1282 -0
- data/vendor/pygments-main/pygments/lexers/_openedge_builtins.py +2547 -0
- data/vendor/pygments-main/pygments/lexers/_php_builtins.py +4753 -0
- data/vendor/pygments-main/pygments/lexers/_postgres_builtins.py +678 -0
- data/vendor/pygments-main/pygments/lexers/_scilab_builtins.py +3094 -0
- data/vendor/pygments-main/pygments/lexers/_sourcemod_builtins.py +1161 -0
- data/vendor/pygments-main/pygments/lexers/_stan_builtins.py +558 -0
- data/vendor/pygments-main/pygments/lexers/_stata_builtins.py +421 -0
- data/vendor/pygments-main/pygments/lexers/_tsql_builtins.py +1004 -0
- data/vendor/pygments-main/pygments/lexers/_usd_builtins.py +113 -0
- data/vendor/pygments-main/pygments/lexers/_vbscript_builtins.py +280 -0
- data/vendor/pygments-main/pygments/lexers/_vim_builtins.py +1939 -0
- data/vendor/pygments-main/pygments/lexers/actionscript.py +245 -0
- data/vendor/pygments-main/pygments/lexers/agile.py +24 -0
- data/vendor/pygments-main/pygments/lexers/algebra.py +240 -0
- data/vendor/pygments-main/pygments/lexers/ambient.py +76 -0
- data/vendor/pygments-main/pygments/lexers/ampl.py +87 -0
- data/vendor/pygments-main/pygments/lexers/apl.py +101 -0
- data/vendor/pygments-main/pygments/lexers/archetype.py +318 -0
- data/vendor/pygments-main/pygments/lexers/arrow.py +117 -0
- data/vendor/pygments-main/pygments/lexers/asm.py +1005 -0
- data/vendor/pygments-main/pygments/lexers/automation.py +374 -0
- data/vendor/pygments-main/pygments/lexers/bare.py +104 -0
- data/vendor/pygments-main/pygments/lexers/basic.py +662 -0
- data/vendor/pygments-main/pygments/lexers/bibtex.py +160 -0
- data/vendor/pygments-main/pygments/lexers/boa.py +102 -0
- data/vendor/pygments-main/pygments/lexers/business.py +627 -0
- data/vendor/pygments-main/pygments/lexers/c_cpp.py +344 -0
- data/vendor/pygments-main/pygments/lexers/c_like.py +566 -0
- data/vendor/pygments-main/pygments/lexers/capnproto.py +78 -0
- data/vendor/pygments-main/pygments/lexers/chapel.py +112 -0
- data/vendor/pygments-main/pygments/lexers/clean.py +179 -0
- data/vendor/pygments-main/pygments/lexers/compiled.py +34 -0
- data/vendor/pygments-main/pygments/lexers/configs.py +984 -0
- data/vendor/pygments-main/pygments/lexers/console.py +114 -0
- data/vendor/pygments-main/pygments/lexers/crystal.py +392 -0
- data/vendor/pygments-main/pygments/lexers/csound.py +467 -0
- data/vendor/pygments-main/pygments/lexers/css.py +691 -0
- data/vendor/pygments-main/pygments/lexers/d.py +256 -0
- data/vendor/pygments-main/pygments/lexers/dalvik.py +125 -0
- data/vendor/pygments-main/pygments/lexers/data.py +698 -0
- data/vendor/pygments-main/pygments/lexers/devicetree.py +109 -0
- data/vendor/pygments-main/pygments/lexers/diff.py +165 -0
- data/vendor/pygments-main/pygments/lexers/dotnet.py +707 -0
- data/vendor/pygments-main/pygments/lexers/dsls.py +960 -0
- data/vendor/pygments-main/pygments/lexers/dylan.py +287 -0
- data/vendor/pygments-main/pygments/lexers/ecl.py +139 -0
- data/vendor/pygments-main/pygments/lexers/eiffel.py +65 -0
- data/vendor/pygments-main/pygments/lexers/elm.py +121 -0
- data/vendor/pygments-main/pygments/lexers/email.py +151 -0
- data/vendor/pygments-main/pygments/lexers/erlang.py +530 -0
- data/vendor/pygments-main/pygments/lexers/esoteric.py +304 -0
- data/vendor/pygments-main/pygments/lexers/ezhil.py +77 -0
- data/vendor/pygments-main/pygments/lexers/factor.py +344 -0
- data/vendor/pygments-main/pygments/lexers/fantom.py +250 -0
- data/vendor/pygments-main/pygments/lexers/felix.py +273 -0
- data/vendor/pygments-main/pygments/lexers/floscript.py +83 -0
- data/vendor/pygments-main/pygments/lexers/forth.py +178 -0
- data/vendor/pygments-main/pygments/lexers/fortran.py +206 -0
- data/vendor/pygments-main/pygments/lexers/foxpro.py +428 -0
- data/vendor/pygments-main/pygments/lexers/freefem.py +898 -0
- data/vendor/pygments-main/pygments/lexers/functional.py +21 -0
- data/vendor/pygments-main/pygments/lexers/gdscript.py +346 -0
- data/vendor/pygments-main/pygments/lexers/go.py +101 -0
- data/vendor/pygments-main/pygments/lexers/grammar_notation.py +270 -0
- data/vendor/pygments-main/pygments/lexers/graph.py +85 -0
- data/vendor/pygments-main/pygments/lexers/graphics.py +800 -0
- data/vendor/pygments-main/pygments/lexers/haskell.py +870 -0
- data/vendor/pygments-main/pygments/lexers/haxe.py +936 -0
- data/vendor/pygments-main/pygments/lexers/hdl.py +472 -0
- data/vendor/pygments-main/pygments/lexers/hexdump.py +103 -0
- data/vendor/pygments-main/pygments/lexers/html.py +614 -0
- data/vendor/pygments-main/pygments/lexers/idl.py +281 -0
- data/vendor/pygments-main/pygments/lexers/igor.py +420 -0
- data/vendor/pygments-main/pygments/lexers/inferno.py +96 -0
- data/vendor/pygments-main/pygments/lexers/installers.py +322 -0
- data/vendor/pygments-main/pygments/lexers/int_fiction.py +1368 -0
- data/vendor/pygments-main/pygments/lexers/iolang.py +63 -0
- data/vendor/pygments-main/pygments/lexers/j.py +146 -0
- data/vendor/pygments-main/pygments/lexers/javascript.py +1540 -0
- data/vendor/pygments-main/pygments/lexers/julia.py +331 -0
- data/vendor/pygments-main/pygments/lexers/jvm.py +1673 -0
- data/vendor/pygments-main/pygments/lexers/lisp.py +2699 -0
- data/vendor/pygments-main/pygments/lexers/make.py +206 -0
- data/vendor/pygments-main/pygments/lexers/markup.py +765 -0
- data/vendor/pygments-main/pygments/lexers/math.py +21 -0
- data/vendor/pygments-main/pygments/lexers/matlab.py +720 -0
- data/vendor/pygments-main/pygments/lexers/mime.py +226 -0
- data/vendor/pygments-main/pygments/lexers/ml.py +958 -0
- data/vendor/pygments-main/pygments/lexers/modeling.py +366 -0
- data/vendor/pygments-main/pygments/lexers/modula2.py +1580 -0
- data/vendor/pygments-main/pygments/lexers/monte.py +204 -0
- data/vendor/pygments-main/pygments/lexers/mosel.py +448 -0
- data/vendor/pygments-main/pygments/lexers/ncl.py +894 -0
- data/vendor/pygments-main/pygments/lexers/nimrod.py +159 -0
- data/vendor/pygments-main/pygments/lexers/nit.py +64 -0
- data/vendor/pygments-main/pygments/lexers/nix.py +136 -0
- data/vendor/pygments-main/pygments/lexers/oberon.py +121 -0
- data/vendor/pygments-main/pygments/lexers/objective.py +504 -0
- data/vendor/pygments-main/pygments/lexers/ooc.py +85 -0
- data/vendor/pygments-main/pygments/lexers/other.py +41 -0
- data/vendor/pygments-main/pygments/lexers/parasail.py +79 -0
- data/vendor/pygments-main/pygments/lexers/parsers.py +800 -0
- data/vendor/pygments-main/pygments/lexers/pascal.py +644 -0
- data/vendor/pygments-main/pygments/lexers/pawn.py +205 -0
- data/vendor/pygments-main/pygments/lexers/perl.py +732 -0
- data/vendor/pygments-main/pygments/lexers/php.py +321 -0
- data/vendor/pygments-main/pygments/lexers/pointless.py +71 -0
- data/vendor/pygments-main/pygments/lexers/pony.py +94 -0
- data/vendor/pygments-main/pygments/lexers/praat.py +302 -0
- data/vendor/pygments-main/pygments/lexers/prolog.py +306 -0
- data/vendor/pygments-main/pygments/lexers/promql.py +183 -0
- data/vendor/pygments-main/pygments/lexers/python.py +1151 -0
- data/vendor/pygments-main/pygments/lexers/qvt.py +152 -0
- data/vendor/pygments-main/pygments/lexers/r.py +191 -0
- data/vendor/pygments-main/pygments/lexers/rdf.py +463 -0
- data/vendor/pygments-main/pygments/lexers/rebol.py +431 -0
- data/vendor/pygments-main/pygments/lexers/resource.py +85 -0
- data/vendor/pygments-main/pygments/lexers/ride.py +139 -0
- data/vendor/pygments-main/pygments/lexers/rnc.py +67 -0
- data/vendor/pygments-main/pygments/lexers/roboconf.py +82 -0
- data/vendor/pygments-main/pygments/lexers/robotframework.py +552 -0
- data/vendor/pygments-main/pygments/lexers/ruby.py +517 -0
- data/vendor/pygments-main/pygments/lexers/rust.py +224 -0
- data/vendor/pygments-main/pygments/lexers/sas.py +228 -0
- data/vendor/pygments-main/pygments/lexers/scdoc.py +83 -0
- data/vendor/pygments-main/pygments/lexers/scripting.py +1284 -0
- data/vendor/pygments-main/pygments/lexers/sgf.py +61 -0
- data/vendor/pygments-main/pygments/lexers/shell.py +914 -0
- data/vendor/pygments-main/pygments/lexers/sieve.py +69 -0
- data/vendor/pygments-main/pygments/lexers/slash.py +185 -0
- data/vendor/pygments-main/pygments/lexers/smalltalk.py +195 -0
- data/vendor/pygments-main/pygments/lexers/smv.py +79 -0
- data/vendor/pygments-main/pygments/lexers/snobol.py +83 -0
- data/vendor/pygments-main/pygments/lexers/solidity.py +92 -0
- data/vendor/pygments-main/pygments/lexers/special.py +105 -0
- data/vendor/pygments-main/pygments/lexers/sql.py +837 -0
- data/vendor/pygments-main/pygments/lexers/stata.py +171 -0
- data/vendor/pygments-main/pygments/lexers/supercollider.py +95 -0
- data/vendor/pygments-main/pygments/lexers/tcl.py +145 -0
- data/vendor/pygments-main/pygments/lexers/templates.py +2264 -0
- data/vendor/pygments-main/pygments/lexers/teraterm.py +335 -0
- data/vendor/pygments-main/pygments/lexers/testing.py +207 -0
- data/vendor/pygments-main/pygments/lexers/text.py +26 -0
- data/vendor/pygments-main/pygments/lexers/textedit.py +169 -0
- data/vendor/pygments-main/pygments/lexers/textfmts.py +430 -0
- data/vendor/pygments-main/pygments/lexers/theorem.py +474 -0
- data/vendor/pygments-main/pygments/lexers/tnt.py +263 -0
- data/vendor/pygments-main/pygments/lexers/trafficscript.py +54 -0
- data/vendor/pygments-main/pygments/lexers/typoscript.py +219 -0
- data/vendor/pygments-main/pygments/lexers/unicon.py +412 -0
- data/vendor/pygments-main/pygments/lexers/urbi.py +146 -0
- data/vendor/pygments-main/pygments/lexers/usd.py +90 -0
- data/vendor/pygments-main/pygments/lexers/varnish.py +190 -0
- data/vendor/pygments-main/pygments/lexers/verification.py +114 -0
- data/vendor/pygments-main/pygments/lexers/web.py +24 -0
- data/vendor/pygments-main/pygments/lexers/webidl.py +299 -0
- data/vendor/pygments-main/pygments/lexers/webmisc.py +991 -0
- data/vendor/pygments-main/pygments/lexers/whiley.py +116 -0
- data/vendor/pygments-main/pygments/lexers/x10.py +69 -0
- data/vendor/pygments-main/pygments/lexers/xorg.py +37 -0
- data/vendor/pygments-main/pygments/lexers/yang.py +104 -0
- data/vendor/pygments-main/pygments/lexers/zig.py +124 -0
- data/vendor/pygments-main/pygments/modeline.py +1 -1
- data/vendor/pygments-main/pygments/plugin.py +4 -2
- data/vendor/pygments-main/pygments/regexopt.py +1 -1
- data/vendor/pygments-main/pygments/scanner.py +2 -2
- data/vendor/pygments-main/pygments/sphinxext.py +2 -4
- data/vendor/pygments-main/pygments/style.py +61 -24
- data/vendor/pygments-main/pygments/styles/__init__.py +10 -4
- data/vendor/pygments-main/pygments/styles/abap.py +1 -1
- data/vendor/pygments-main/pygments/styles/algol.py +1 -1
- data/vendor/pygments-main/pygments/styles/algol_nu.py +1 -1
- data/vendor/pygments-main/pygments/styles/arduino.py +2 -2
- data/vendor/pygments-main/pygments/styles/autumn.py +1 -1
- data/vendor/pygments-main/pygments/styles/borland.py +1 -1
- data/vendor/pygments-main/pygments/styles/bw.py +1 -1
- data/vendor/pygments-main/pygments/styles/colorful.py +1 -1
- data/vendor/pygments-main/pygments/styles/default.py +1 -1
- data/vendor/pygments-main/pygments/styles/emacs.py +1 -1
- data/vendor/pygments-main/pygments/styles/friendly.py +1 -1
- data/vendor/pygments-main/pygments/styles/fruity.py +1 -1
- data/vendor/pygments-main/pygments/styles/igor.py +1 -1
- data/vendor/pygments-main/pygments/styles/inkpot.py +67 -0
- data/vendor/pygments-main/pygments/styles/lovelace.py +1 -1
- data/vendor/pygments-main/pygments/styles/manni.py +1 -1
- data/vendor/pygments-main/pygments/styles/monokai.py +4 -3
- data/vendor/pygments-main/pygments/styles/murphy.py +1 -1
- data/vendor/pygments-main/pygments/styles/native.py +1 -1
- data/vendor/pygments-main/pygments/styles/paraiso_dark.py +1 -1
- data/vendor/pygments-main/pygments/styles/paraiso_light.py +1 -1
- data/vendor/pygments-main/pygments/styles/pastie.py +1 -1
- data/vendor/pygments-main/pygments/styles/perldoc.py +1 -1
- data/vendor/pygments-main/pygments/styles/rainbow_dash.py +1 -1
- data/vendor/pygments-main/pygments/styles/rrt.py +1 -1
- data/vendor/pygments-main/pygments/styles/sas.py +1 -1
- data/vendor/pygments-main/pygments/styles/solarized.py +134 -0
- data/vendor/pygments-main/pygments/styles/stata_dark.py +41 -0
- data/vendor/pygments-main/pygments/styles/{stata.py → stata_light.py} +14 -15
- data/vendor/pygments-main/pygments/styles/tango.py +1 -1
- data/vendor/pygments-main/pygments/styles/trac.py +1 -1
- data/vendor/pygments-main/pygments/styles/vim.py +1 -1
- data/vendor/pygments-main/pygments/styles/vs.py +1 -1
- data/vendor/pygments-main/pygments/styles/xcode.py +1 -1
- data/vendor/pygments-main/pygments/token.py +1 -1
- data/vendor/pygments-main/pygments/unistring.py +47 -108
- data/vendor/pygments-main/pygments/util.py +15 -92
- metadata +69 -136
- data/CHANGELOG.md +0 -111
- data/README.md +0 -121
- data/circle.yml +0 -20
- data/test/test_data.py +0 -514
- data/test/test_data_generated +0 -2582
- data/vendor/custom_lexers/github.py +0 -565
- data/vendor/pygments-main/CHANGES +0 -1186
- data/vendor/pygments-main/MANIFEST.in +0 -6
- data/vendor/pygments-main/Makefile +0 -65
- data/vendor/pygments-main/README.rst +0 -39
- data/vendor/pygments-main/REVISION +0 -1
- data/vendor/pygments-main/TODO +0 -12
- data/vendor/pygments-main/doc/Makefile +0 -153
- data/vendor/pygments-main/doc/_static/favicon.ico +0 -0
- data/vendor/pygments-main/doc/_static/logo_new.png +0 -0
- data/vendor/pygments-main/doc/_static/logo_only.png +0 -0
- data/vendor/pygments-main/doc/_templates/docssidebar.html +0 -3
- data/vendor/pygments-main/doc/_templates/indexsidebar.html +0 -25
- data/vendor/pygments-main/doc/_themes/pygments14/layout.html +0 -98
- data/vendor/pygments-main/doc/_themes/pygments14/static/bodybg.png +0 -0
- data/vendor/pygments-main/doc/_themes/pygments14/static/docbg.png +0 -0
- data/vendor/pygments-main/doc/_themes/pygments14/static/listitem.png +0 -0
- data/vendor/pygments-main/doc/_themes/pygments14/static/logo.png +0 -0
- data/vendor/pygments-main/doc/_themes/pygments14/static/pocoo.png +0 -0
- data/vendor/pygments-main/doc/_themes/pygments14/static/pygments14.css_t +0 -401
- data/vendor/pygments-main/doc/_themes/pygments14/theme.conf +0 -15
- data/vendor/pygments-main/doc/conf.py +0 -241
- data/vendor/pygments-main/doc/docs/api.rst +0 -354
- data/vendor/pygments-main/doc/docs/authors.rst +0 -4
- data/vendor/pygments-main/doc/docs/changelog.rst +0 -1
- data/vendor/pygments-main/doc/docs/cmdline.rst +0 -166
- data/vendor/pygments-main/doc/docs/filterdevelopment.rst +0 -71
- data/vendor/pygments-main/doc/docs/filters.rst +0 -41
- data/vendor/pygments-main/doc/docs/formatterdevelopment.rst +0 -169
- data/vendor/pygments-main/doc/docs/formatters.rst +0 -48
- data/vendor/pygments-main/doc/docs/index.rst +0 -66
- data/vendor/pygments-main/doc/docs/integrate.rst +0 -40
- data/vendor/pygments-main/doc/docs/java.rst +0 -70
- data/vendor/pygments-main/doc/docs/lexerdevelopment.rst +0 -728
- data/vendor/pygments-main/doc/docs/lexers.rst +0 -69
- data/vendor/pygments-main/doc/docs/moinmoin.rst +0 -39
- data/vendor/pygments-main/doc/docs/plugins.rst +0 -93
- data/vendor/pygments-main/doc/docs/quickstart.rst +0 -205
- data/vendor/pygments-main/doc/docs/rstdirective.rst +0 -22
- data/vendor/pygments-main/doc/docs/styles.rst +0 -201
- data/vendor/pygments-main/doc/docs/tokens.rst +0 -372
- data/vendor/pygments-main/doc/docs/unicode.rst +0 -58
- data/vendor/pygments-main/doc/download.rst +0 -41
- data/vendor/pygments-main/doc/faq.rst +0 -139
- data/vendor/pygments-main/doc/index.rst +0 -54
- data/vendor/pygments-main/doc/languages.rst +0 -154
- data/vendor/pygments-main/doc/make.bat +0 -190
- data/vendor/pygments-main/doc/pygmentize.1 +0 -94
- data/vendor/pygments-main/external/autopygmentize +0 -101
- data/vendor/pygments-main/external/lasso-builtins-generator-9.lasso +0 -162
- data/vendor/pygments-main/external/markdown-processor.py +0 -67
- data/vendor/pygments-main/external/moin-parser.py +0 -112
- data/vendor/pygments-main/external/pygments.bashcomp +0 -38
- data/vendor/pygments-main/external/rst-directive.py +0 -82
- data/vendor/pygments-main/pygmentize +0 -8
- data/vendor/pygments-main/requirements.txt +0 -5
- data/vendor/pygments-main/scripts/check_sources.py +0 -211
- data/vendor/pygments-main/scripts/debug_lexer.py +0 -246
- data/vendor/pygments-main/scripts/detect_missing_analyse_text.py +0 -33
- data/vendor/pygments-main/scripts/epydoc.css +0 -280
- data/vendor/pygments-main/scripts/get_vimkw.py +0 -74
- data/vendor/pygments-main/scripts/pylintrc +0 -301
- data/vendor/pygments-main/scripts/vim2pygments.py +0 -935
- data/vendor/pygments-main/setup.cfg +0 -10
- data/vendor/pygments-main/setup.py +0 -77
- data/vendor/pygments-main/tox.ini +0 -7
- data/vendor/simplejson/.gitignore +0 -10
- data/vendor/simplejson/.travis.yml +0 -5
- data/vendor/simplejson/CHANGES.txt +0 -291
- data/vendor/simplejson/LICENSE.txt +0 -19
- data/vendor/simplejson/MANIFEST.in +0 -5
- data/vendor/simplejson/README.rst +0 -19
- data/vendor/simplejson/conf.py +0 -179
- data/vendor/simplejson/index.rst +0 -628
- data/vendor/simplejson/scripts/make_docs.py +0 -18
- data/vendor/simplejson/setup.py +0 -104
- data/vendor/simplejson/simplejson/__init__.py +0 -510
- data/vendor/simplejson/simplejson/_speedups.c +0 -2745
- data/vendor/simplejson/simplejson/decoder.py +0 -425
- data/vendor/simplejson/simplejson/encoder.py +0 -567
- data/vendor/simplejson/simplejson/ordered_dict.py +0 -119
- data/vendor/simplejson/simplejson/scanner.py +0 -77
- data/vendor/simplejson/simplejson/tests/__init__.py +0 -67
- data/vendor/simplejson/simplejson/tests/test_bigint_as_string.py +0 -55
- data/vendor/simplejson/simplejson/tests/test_check_circular.py +0 -30
- data/vendor/simplejson/simplejson/tests/test_decimal.py +0 -66
- data/vendor/simplejson/simplejson/tests/test_decode.py +0 -83
- data/vendor/simplejson/simplejson/tests/test_default.py +0 -9
- data/vendor/simplejson/simplejson/tests/test_dump.py +0 -67
- data/vendor/simplejson/simplejson/tests/test_encode_basestring_ascii.py +0 -46
- data/vendor/simplejson/simplejson/tests/test_encode_for_html.py +0 -32
- data/vendor/simplejson/simplejson/tests/test_errors.py +0 -34
- data/vendor/simplejson/simplejson/tests/test_fail.py +0 -91
- data/vendor/simplejson/simplejson/tests/test_float.py +0 -19
- data/vendor/simplejson/simplejson/tests/test_indent.py +0 -86
- data/vendor/simplejson/simplejson/tests/test_item_sort_key.py +0 -20
- data/vendor/simplejson/simplejson/tests/test_namedtuple.py +0 -121
- data/vendor/simplejson/simplejson/tests/test_pass1.py +0 -76
- data/vendor/simplejson/simplejson/tests/test_pass2.py +0 -14
- data/vendor/simplejson/simplejson/tests/test_pass3.py +0 -20
- data/vendor/simplejson/simplejson/tests/test_recursion.py +0 -67
- data/vendor/simplejson/simplejson/tests/test_scanstring.py +0 -117
- data/vendor/simplejson/simplejson/tests/test_separators.py +0 -42
- data/vendor/simplejson/simplejson/tests/test_speedups.py +0 -20
- data/vendor/simplejson/simplejson/tests/test_tuple.py +0 -49
- data/vendor/simplejson/simplejson/tests/test_unicode.py +0 -109
- 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-
|
|
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,
|
|
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
|
-
|
|
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,
|
|
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(
|
|
173
|
-
text = text[len(
|
|
169
|
+
if text.startswith('\ufeff'):
|
|
170
|
+
text = text[len('\ufeff'):]
|
|
174
171
|
else:
|
|
175
|
-
if text.startswith(
|
|
176
|
-
text = text[len(
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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,
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
-
#
|
|
734
|
-
|
|
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,
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|