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.
- checksums.yaml +5 -5
- data/.github/dependabot.yml +13 -0
- data/.github/workflows/ci.yml +40 -0
- data/.github/workflows/release.yml +24 -0
- data/.gitignore +4 -6
- data/.rubocop.yml +16 -0
- data/CHANGELOG.adoc +137 -0
- data/Gemfile +3 -1
- data/LICENSE +1 -1
- data/README.adoc +159 -0
- data/Rakefile +8 -32
- data/bench.rb +14 -8
- data/lib/pygments.rb +16 -14
- data/lib/pygments/lexer.rb +87 -65
- data/lib/pygments/mentos.py +23 -110
- data/lib/pygments/popen.rb +188 -284
- data/lib/pygments/version.rb +2 -2
- data/pygments.rb.gemspec +20 -13
- data/test/test_pygments.rb +50 -110
- data/vendor/pygments-main/{AUTHORS → Pygments-2.8.1.dist-info/AUTHORS} +26 -3
- data/vendor/pygments-main/Pygments-2.8.1.dist-info/INSTALLER +1 -0
- data/vendor/pygments-main/{LICENSE → Pygments-2.8.1.dist-info/LICENSE} +1 -1
- data/vendor/pygments-main/Pygments-2.8.1.dist-info/METADATA +48 -0
- data/vendor/pygments-main/Pygments-2.8.1.dist-info/RECORD +494 -0
- data/vendor/pygments-main/Pygments-2.8.1.dist-info/REQUESTED +0 -0
- data/vendor/pygments-main/Pygments-2.8.1.dist-info/WHEEL +5 -0
- data/vendor/pygments-main/Pygments-2.8.1.dist-info/entry_points.txt +3 -0
- data/vendor/pygments-main/Pygments-2.8.1.dist-info/top_level.txt +1 -0
- data/vendor/pygments-main/bin/pygmentize +8 -0
- data/vendor/pygments-main/pygments/__init__.py +6 -12
- data/vendor/pygments-main/pygments/__main__.py +17 -0
- data/vendor/pygments-main/pygments/cmdline.py +213 -184
- data/vendor/pygments-main/pygments/console.py +6 -10
- data/vendor/pygments-main/pygments/filter.py +4 -7
- data/vendor/pygments-main/pygments/filters/__init__.py +609 -22
- data/vendor/pygments-main/pygments/formatter.py +4 -5
- data/vendor/pygments-main/pygments/formatters/__init__.py +10 -10
- data/vendor/pygments-main/pygments/formatters/_mapping.py +1 -4
- data/vendor/pygments-main/pygments/formatters/bbcode.py +1 -2
- data/vendor/pygments-main/pygments/formatters/html.py +242 -139
- data/vendor/pygments-main/pygments/formatters/img.py +91 -50
- data/vendor/pygments-main/pygments/formatters/irc.py +39 -40
- data/vendor/pygments-main/pygments/formatters/latex.py +62 -33
- data/vendor/pygments-main/pygments/formatters/other.py +18 -17
- data/vendor/pygments-main/pygments/formatters/rtf.py +29 -30
- data/vendor/pygments-main/pygments/formatters/svg.py +40 -5
- data/vendor/pygments-main/pygments/formatters/terminal.py +25 -32
- data/vendor/pygments-main/pygments/formatters/terminal256.py +45 -14
- data/vendor/pygments-main/pygments/lexer.py +47 -44
- data/vendor/pygments-main/pygments/lexers/__init__.py +341 -0
- data/vendor/pygments-main/pygments/lexers/_asy_builtins.py +1644 -0
- data/vendor/pygments-main/pygments/lexers/_cl_builtins.py +231 -0
- data/vendor/pygments-main/pygments/lexers/_cocoa_builtins.py +75 -0
- data/vendor/pygments-main/pygments/lexers/_csound_builtins.py +1724 -0
- data/vendor/pygments-main/pygments/lexers/_lasso_builtins.py +5326 -0
- data/vendor/pygments-main/pygments/lexers/_lua_builtins.py +292 -0
- data/vendor/pygments-main/pygments/lexers/_mapping.py +554 -0
- data/vendor/pygments-main/pygments/lexers/_mql_builtins.py +1171 -0
- data/vendor/pygments-main/pygments/lexers/_mysql_builtins.py +1281 -0
- data/vendor/pygments-main/pygments/lexers/_openedge_builtins.py +2600 -0
- data/vendor/pygments-main/pygments/lexers/_php_builtins.py +4752 -0
- data/vendor/pygments-main/pygments/lexers/_postgres_builtins.py +677 -0
- data/vendor/pygments-main/pygments/lexers/_scilab_builtins.py +3093 -0
- data/vendor/pygments-main/pygments/lexers/_sourcemod_builtins.py +1160 -0
- data/vendor/pygments-main/pygments/lexers/_stan_builtins.py +557 -0
- data/vendor/pygments-main/pygments/lexers/_stata_builtins.py +457 -0
- data/vendor/pygments-main/pygments/lexers/_tsql_builtins.py +1003 -0
- data/vendor/pygments-main/pygments/lexers/_usd_builtins.py +112 -0
- data/vendor/pygments-main/pygments/lexers/_vbscript_builtins.py +279 -0
- data/vendor/pygments-main/pygments/lexers/_vim_builtins.py +1938 -0
- data/vendor/pygments-main/pygments/lexers/actionscript.py +244 -0
- data/vendor/pygments-main/pygments/lexers/agile.py +23 -0
- data/vendor/pygments-main/pygments/lexers/algebra.py +239 -0
- data/vendor/pygments-main/pygments/lexers/ambient.py +75 -0
- data/vendor/pygments-main/pygments/lexers/amdgpu.py +48 -0
- data/vendor/pygments-main/pygments/lexers/ampl.py +86 -0
- data/vendor/pygments-main/pygments/lexers/apl.py +100 -0
- data/vendor/pygments-main/pygments/lexers/archetype.py +317 -0
- data/vendor/pygments-main/pygments/lexers/arrow.py +116 -0
- data/vendor/pygments-main/pygments/lexers/asm.py +1004 -0
- data/vendor/pygments-main/pygments/lexers/automation.py +379 -0
- data/vendor/pygments-main/pygments/lexers/bare.py +103 -0
- data/vendor/pygments-main/pygments/lexers/basic.py +661 -0
- data/vendor/pygments-main/pygments/lexers/bibtex.py +159 -0
- data/vendor/pygments-main/pygments/lexers/boa.py +101 -0
- data/vendor/pygments-main/pygments/lexers/business.py +626 -0
- data/vendor/pygments-main/pygments/lexers/c_cpp.py +342 -0
- data/vendor/pygments-main/pygments/lexers/c_like.py +565 -0
- data/vendor/pygments-main/pygments/lexers/capnproto.py +77 -0
- data/vendor/pygments-main/pygments/lexers/cddl.py +190 -0
- data/vendor/pygments-main/pygments/lexers/chapel.py +111 -0
- data/vendor/pygments-main/pygments/lexers/clean.py +178 -0
- data/vendor/pygments-main/pygments/lexers/compiled.py +33 -0
- data/vendor/pygments-main/pygments/lexers/configs.py +985 -0
- data/vendor/pygments-main/pygments/lexers/console.py +113 -0
- data/vendor/pygments-main/pygments/lexers/crystal.py +366 -0
- data/vendor/pygments-main/pygments/lexers/csound.py +466 -0
- data/vendor/pygments-main/pygments/lexers/css.py +694 -0
- data/vendor/pygments-main/pygments/lexers/d.py +255 -0
- data/vendor/pygments-main/pygments/lexers/dalvik.py +124 -0
- data/vendor/pygments-main/pygments/lexers/data.py +697 -0
- data/vendor/pygments-main/pygments/lexers/devicetree.py +108 -0
- data/vendor/pygments-main/pygments/lexers/diff.py +164 -0
- data/vendor/pygments-main/pygments/lexers/dotnet.py +706 -0
- data/vendor/pygments-main/pygments/lexers/dsls.py +959 -0
- data/vendor/pygments-main/pygments/lexers/dylan.py +286 -0
- data/vendor/pygments-main/pygments/lexers/ecl.py +137 -0
- data/vendor/pygments-main/pygments/lexers/eiffel.py +64 -0
- data/vendor/pygments-main/pygments/lexers/elm.py +120 -0
- data/vendor/pygments-main/pygments/lexers/email.py +150 -0
- data/vendor/pygments-main/pygments/lexers/erlang.py +529 -0
- data/vendor/pygments-main/pygments/lexers/esoteric.py +303 -0
- data/vendor/pygments-main/pygments/lexers/ezhil.py +76 -0
- data/vendor/pygments-main/pygments/lexers/factor.py +343 -0
- data/vendor/pygments-main/pygments/lexers/fantom.py +249 -0
- data/vendor/pygments-main/pygments/lexers/felix.py +272 -0
- data/vendor/pygments-main/pygments/lexers/floscript.py +82 -0
- data/vendor/pygments-main/pygments/lexers/forth.py +177 -0
- data/vendor/pygments-main/pygments/lexers/fortran.py +208 -0
- data/vendor/pygments-main/pygments/lexers/foxpro.py +427 -0
- data/vendor/pygments-main/pygments/lexers/freefem.py +897 -0
- data/vendor/pygments-main/pygments/lexers/functional.py +20 -0
- data/vendor/pygments-main/pygments/lexers/futhark.py +110 -0
- data/vendor/pygments-main/pygments/lexers/gdscript.py +345 -0
- data/vendor/pygments-main/pygments/lexers/go.py +100 -0
- data/vendor/pygments-main/pygments/lexers/grammar_notation.py +269 -0
- data/vendor/pygments-main/pygments/lexers/graph.py +84 -0
- data/vendor/pygments-main/pygments/lexers/graphics.py +799 -0
- data/vendor/pygments-main/pygments/lexers/graphviz.py +57 -0
- data/vendor/pygments-main/pygments/lexers/haskell.py +869 -0
- data/vendor/pygments-main/pygments/lexers/haxe.py +935 -0
- data/vendor/pygments-main/pygments/lexers/hdl.py +468 -0
- data/vendor/pygments-main/pygments/lexers/hexdump.py +102 -0
- data/vendor/pygments-main/pygments/lexers/html.py +613 -0
- data/vendor/pygments-main/pygments/lexers/idl.py +280 -0
- data/vendor/pygments-main/pygments/lexers/igor.py +419 -0
- data/vendor/pygments-main/pygments/lexers/inferno.py +95 -0
- data/vendor/pygments-main/pygments/lexers/installers.py +321 -0
- data/vendor/pygments-main/pygments/lexers/int_fiction.py +1367 -0
- data/vendor/pygments-main/pygments/lexers/iolang.py +62 -0
- data/vendor/pygments-main/pygments/lexers/j.py +145 -0
- data/vendor/pygments-main/pygments/lexers/javascript.py +1536 -0
- data/vendor/pygments-main/pygments/lexers/julia.py +330 -0
- data/vendor/pygments-main/pygments/lexers/jvm.py +1739 -0
- data/vendor/pygments-main/pygments/lexers/lisp.py +2698 -0
- data/vendor/pygments-main/pygments/lexers/make.py +205 -0
- data/vendor/pygments-main/pygments/lexers/markup.py +762 -0
- data/vendor/pygments-main/pygments/lexers/math.py +20 -0
- data/vendor/pygments-main/pygments/lexers/matlab.py +3280 -0
- data/vendor/pygments-main/pygments/lexers/mime.py +225 -0
- data/vendor/pygments-main/pygments/lexers/ml.py +957 -0
- data/vendor/pygments-main/pygments/lexers/modeling.py +365 -0
- data/vendor/pygments-main/pygments/lexers/modula2.py +1579 -0
- data/vendor/pygments-main/pygments/lexers/monte.py +203 -0
- data/vendor/pygments-main/pygments/lexers/mosel.py +447 -0
- data/vendor/pygments-main/pygments/lexers/ncl.py +893 -0
- data/vendor/pygments-main/pygments/lexers/nimrod.py +158 -0
- data/vendor/pygments-main/pygments/lexers/nit.py +63 -0
- data/vendor/pygments-main/pygments/lexers/nix.py +135 -0
- data/vendor/pygments-main/pygments/lexers/oberon.py +120 -0
- data/vendor/pygments-main/pygments/lexers/objective.py +503 -0
- data/vendor/pygments-main/pygments/lexers/ooc.py +84 -0
- data/vendor/pygments-main/pygments/lexers/other.py +40 -0
- data/vendor/pygments-main/pygments/lexers/parasail.py +78 -0
- data/vendor/pygments-main/pygments/lexers/parsers.py +799 -0
- data/vendor/pygments-main/pygments/lexers/pascal.py +643 -0
- data/vendor/pygments-main/pygments/lexers/pawn.py +202 -0
- data/vendor/pygments-main/pygments/lexers/perl.py +731 -0
- data/vendor/pygments-main/pygments/lexers/php.py +320 -0
- data/vendor/pygments-main/pygments/lexers/pointless.py +70 -0
- data/vendor/pygments-main/pygments/lexers/pony.py +93 -0
- data/vendor/pygments-main/pygments/lexers/praat.py +301 -0
- data/vendor/pygments-main/pygments/lexers/prolog.py +305 -0
- data/vendor/pygments-main/pygments/lexers/promql.py +182 -0
- data/vendor/pygments-main/pygments/lexers/python.py +1158 -0
- data/vendor/pygments-main/pygments/lexers/qvt.py +151 -0
- data/vendor/pygments-main/pygments/lexers/r.py +190 -0
- data/vendor/pygments-main/pygments/lexers/rdf.py +462 -0
- data/vendor/pygments-main/pygments/lexers/rebol.py +430 -0
- data/vendor/pygments-main/pygments/lexers/resource.py +84 -0
- data/vendor/pygments-main/pygments/lexers/ride.py +138 -0
- data/vendor/pygments-main/pygments/lexers/rnc.py +66 -0
- data/vendor/pygments-main/pygments/lexers/roboconf.py +81 -0
- data/vendor/pygments-main/pygments/lexers/robotframework.py +551 -0
- data/vendor/pygments-main/pygments/lexers/ruby.py +523 -0
- data/vendor/pygments-main/pygments/lexers/rust.py +223 -0
- data/vendor/pygments-main/pygments/lexers/sas.py +227 -0
- data/vendor/pygments-main/pygments/lexers/scdoc.py +82 -0
- data/vendor/pygments-main/pygments/lexers/scripting.py +1283 -0
- data/vendor/pygments-main/pygments/lexers/sgf.py +60 -0
- data/vendor/pygments-main/pygments/lexers/shell.py +909 -0
- data/vendor/pygments-main/pygments/lexers/sieve.py +68 -0
- data/vendor/pygments-main/pygments/lexers/slash.py +184 -0
- data/vendor/pygments-main/pygments/lexers/smalltalk.py +194 -0
- data/vendor/pygments-main/pygments/lexers/smv.py +78 -0
- data/vendor/pygments-main/pygments/lexers/snobol.py +82 -0
- data/vendor/pygments-main/pygments/lexers/solidity.py +91 -0
- data/vendor/pygments-main/pygments/lexers/special.py +106 -0
- data/vendor/pygments-main/pygments/lexers/sql.py +832 -0
- data/vendor/pygments-main/pygments/lexers/stata.py +170 -0
- data/vendor/pygments-main/pygments/lexers/supercollider.py +94 -0
- data/vendor/pygments-main/pygments/lexers/tcl.py +144 -0
- data/vendor/pygments-main/pygments/lexers/templates.py +2263 -0
- data/vendor/pygments-main/pygments/lexers/teraterm.py +334 -0
- data/vendor/pygments-main/pygments/lexers/testing.py +206 -0
- data/vendor/pygments-main/pygments/lexers/text.py +25 -0
- data/vendor/pygments-main/pygments/lexers/textedit.py +168 -0
- data/vendor/pygments-main/pygments/lexers/textfmts.py +429 -0
- data/vendor/pygments-main/pygments/lexers/theorem.py +476 -0
- data/vendor/pygments-main/pygments/lexers/tnt.py +262 -0
- data/vendor/pygments-main/pygments/lexers/trafficscript.py +53 -0
- data/vendor/pygments-main/pygments/lexers/typoscript.py +218 -0
- data/vendor/pygments-main/pygments/lexers/unicon.py +411 -0
- data/vendor/pygments-main/pygments/lexers/urbi.py +145 -0
- data/vendor/pygments-main/pygments/lexers/usd.py +89 -0
- data/vendor/pygments-main/pygments/lexers/varnish.py +189 -0
- data/vendor/pygments-main/pygments/lexers/verification.py +113 -0
- data/vendor/pygments-main/pygments/lexers/web.py +23 -0
- data/vendor/pygments-main/pygments/lexers/webidl.py +298 -0
- data/vendor/pygments-main/pygments/lexers/webmisc.py +991 -0
- data/vendor/pygments-main/pygments/lexers/whiley.py +115 -0
- data/vendor/pygments-main/pygments/lexers/x10.py +68 -0
- data/vendor/pygments-main/pygments/lexers/xorg.py +36 -0
- data/vendor/pygments-main/pygments/lexers/yang.py +103 -0
- data/vendor/pygments-main/pygments/lexers/zig.py +123 -0
- data/vendor/pygments-main/pygments/modeline.py +1 -2
- data/vendor/pygments-main/pygments/plugin.py +4 -3
- data/vendor/pygments-main/pygments/regexopt.py +1 -2
- data/vendor/pygments-main/pygments/scanner.py +2 -3
- data/vendor/pygments-main/pygments/sphinxext.py +2 -5
- data/vendor/pygments-main/pygments/style.py +61 -25
- data/vendor/pygments-main/pygments/styles/__init__.py +12 -5
- data/vendor/pygments-main/pygments/styles/abap.py +1 -2
- data/vendor/pygments-main/pygments/styles/algol.py +1 -2
- data/vendor/pygments-main/pygments/styles/algol_nu.py +1 -2
- data/vendor/pygments-main/pygments/styles/arduino.py +2 -3
- data/vendor/pygments-main/pygments/styles/autumn.py +1 -2
- data/vendor/pygments-main/pygments/styles/borland.py +1 -2
- data/vendor/pygments-main/pygments/styles/bw.py +1 -2
- data/vendor/pygments-main/pygments/styles/colorful.py +1 -2
- data/vendor/pygments-main/pygments/styles/default.py +1 -2
- data/vendor/pygments-main/pygments/styles/emacs.py +1 -2
- data/vendor/pygments-main/pygments/styles/friendly.py +1 -2
- data/vendor/pygments-main/pygments/styles/fruity.py +1 -2
- data/vendor/pygments-main/pygments/styles/igor.py +1 -2
- data/vendor/pygments-main/pygments/styles/inkpot.py +66 -0
- data/vendor/pygments-main/pygments/styles/lovelace.py +1 -2
- data/vendor/pygments-main/pygments/styles/manni.py +1 -2
- data/vendor/pygments-main/pygments/styles/material.py +118 -0
- data/vendor/pygments-main/pygments/styles/monokai.py +4 -4
- data/vendor/pygments-main/pygments/styles/murphy.py +1 -2
- data/vendor/pygments-main/pygments/styles/native.py +1 -2
- data/vendor/pygments-main/pygments/styles/paraiso_dark.py +1 -2
- data/vendor/pygments-main/pygments/styles/paraiso_light.py +1 -2
- data/vendor/pygments-main/pygments/styles/pastie.py +1 -2
- data/vendor/pygments-main/pygments/styles/perldoc.py +1 -2
- data/vendor/pygments-main/pygments/styles/rainbow_dash.py +1 -2
- data/vendor/pygments-main/pygments/styles/rrt.py +1 -2
- data/vendor/pygments-main/pygments/styles/sas.py +1 -2
- data/vendor/pygments-main/pygments/styles/solarized.py +136 -0
- data/vendor/pygments-main/pygments/styles/stata_dark.py +40 -0
- data/vendor/pygments-main/pygments/styles/{stata.py → stata_light.py} +14 -16
- data/vendor/pygments-main/pygments/styles/tango.py +1 -2
- data/vendor/pygments-main/pygments/styles/trac.py +1 -2
- data/vendor/pygments-main/pygments/styles/vim.py +1 -2
- data/vendor/pygments-main/pygments/styles/vs.py +1 -2
- data/vendor/pygments-main/pygments/styles/xcode.py +1 -2
- data/vendor/pygments-main/pygments/styles/zenburn.py +80 -0
- data/vendor/pygments-main/pygments/token.py +1 -2
- data/vendor/pygments-main/pygments/unistring.py +47 -109
- data/vendor/pygments-main/pygments/util.py +16 -96
- metadata +81 -139
- data/CHANGELOG.md +0 -111
- data/README.md +0 -121
- data/cache-lexers.rb +0 -8
- data/circle.yml +0 -20
- data/test/test_data.c +0 -2581
- 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
|
@@ -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-
|
|
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,
|
|
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
|
-
|
|
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,
|
|
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(
|
|
173
|
-
text = text[len(
|
|
168
|
+
if text.startswith('\ufeff'):
|
|
169
|
+
text = text[len('\ufeff'):]
|
|
174
170
|
else:
|
|
175
|
-
if text.startswith(
|
|
176
|
-
text = text[len(
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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,
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
-
#
|
|
734
|
-
|
|
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,
|
|
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
|
-
|
|
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
|
-
|
|
794
|
-
|
|
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
|
-
|
|
805
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|