pygments.rb 1.2.1 → 2.0.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 +28 -0
- data/.github/workflows/release.yml +24 -0
- data/.gitignore +5 -6
- data/CHANGELOG.adoc +128 -0
- data/Gemfile +3 -1
- data/LICENSE +1 -1
- data/README.adoc +160 -0
- data/Rakefile +11 -21
- data/bench.rb +8 -7
- data/cache-lexers.rb +3 -2
- data/lexers +0 -0
- data/lib/pygments/lexer.rb +5 -5
- data/lib/pygments/mentos.py +23 -110
- data/lib/pygments/popen.rb +148 -229
- data/lib/pygments/version.rb +2 -2
- data/lib/pygments.rb +10 -11
- data/pygments.rb.gemspec +12 -10
- data/test/test_pygments.rb +46 -104
- 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 +28 -15
- data/vendor/pygments-main/pygments/lexers/_asy_builtins.py +5 -5
- data/vendor/pygments-main/pygments/lexers/_cl_builtins.py +15 -15
- data/vendor/pygments-main/pygments/lexers/_cocoa_builtins.py +11 -12
- data/vendor/pygments-main/pygments/lexers/_csound_builtins.py +1717 -1338
- data/vendor/pygments-main/pygments/lexers/_lasso_builtins.py +1 -1
- data/vendor/pygments-main/pygments/lexers/_lua_builtins.py +2 -4
- data/vendor/pygments-main/pygments/lexers/_mapping.py +74 -29
- data/vendor/pygments-main/pygments/lexers/_mql_builtins.py +2 -2
- data/vendor/pygments-main/pygments/lexers/_mysql_builtins.py +1282 -0
- data/vendor/pygments-main/pygments/lexers/_openedge_builtins.py +1 -1
- data/vendor/pygments-main/pygments/lexers/_php_builtins.py +17 -20
- data/vendor/pygments-main/pygments/lexers/_postgres_builtins.py +73 -16
- data/vendor/pygments-main/pygments/lexers/_scilab_builtins.py +2 -2
- data/vendor/pygments-main/pygments/lexers/_sourcemod_builtins.py +1 -3
- data/vendor/pygments-main/pygments/lexers/_stan_builtins.py +151 -125
- data/vendor/pygments-main/pygments/lexers/_stata_builtins.py +6 -4
- data/vendor/pygments-main/pygments/lexers/_tsql_builtins.py +1 -1
- 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 +1 -1
- data/vendor/pygments-main/pygments/lexers/actionscript.py +8 -3
- data/vendor/pygments-main/pygments/lexers/agile.py +1 -1
- data/vendor/pygments-main/pygments/lexers/algebra.py +20 -1
- data/vendor/pygments-main/pygments/lexers/ambient.py +1 -1
- data/vendor/pygments-main/pygments/lexers/ampl.py +3 -3
- data/vendor/pygments-main/pygments/lexers/apl.py +15 -15
- data/vendor/pygments-main/pygments/lexers/archetype.py +3 -3
- data/vendor/pygments-main/pygments/lexers/arrow.py +117 -0
- data/vendor/pygments-main/pygments/lexers/asm.py +440 -76
- data/vendor/pygments-main/pygments/lexers/automation.py +1 -1
- data/vendor/pygments-main/pygments/lexers/bare.py +104 -0
- data/vendor/pygments-main/pygments/lexers/basic.py +166 -4
- data/vendor/pygments-main/pygments/lexers/bibtex.py +5 -5
- data/vendor/pygments-main/pygments/lexers/boa.py +102 -0
- data/vendor/pygments-main/pygments/lexers/business.py +17 -2
- data/vendor/pygments-main/pygments/lexers/c_cpp.py +137 -45
- data/vendor/pygments-main/pygments/lexers/c_like.py +67 -42
- data/vendor/pygments-main/pygments/lexers/capnproto.py +7 -7
- data/vendor/pygments-main/pygments/lexers/chapel.py +23 -13
- data/vendor/pygments-main/pygments/lexers/clean.py +135 -244
- data/vendor/pygments-main/pygments/lexers/compiled.py +1 -1
- data/vendor/pygments-main/pygments/lexers/configs.py +187 -36
- data/vendor/pygments-main/pygments/lexers/console.py +1 -1
- data/vendor/pygments-main/pygments/lexers/crystal.py +3 -4
- data/vendor/pygments-main/pygments/lexers/csound.py +288 -187
- data/vendor/pygments-main/pygments/lexers/css.py +18 -16
- data/vendor/pygments-main/pygments/lexers/d.py +10 -5
- data/vendor/pygments-main/pygments/lexers/dalvik.py +1 -1
- data/vendor/pygments-main/pygments/lexers/data.py +240 -97
- data/vendor/pygments-main/pygments/lexers/devicetree.py +109 -0
- data/vendor/pygments-main/pygments/lexers/diff.py +4 -4
- data/vendor/pygments-main/pygments/lexers/dotnet.py +40 -24
- data/vendor/pygments-main/pygments/lexers/dsls.py +144 -62
- data/vendor/pygments-main/pygments/lexers/dylan.py +16 -18
- data/vendor/pygments-main/pygments/lexers/ecl.py +16 -2
- data/vendor/pygments-main/pygments/lexers/eiffel.py +1 -1
- data/vendor/pygments-main/pygments/lexers/elm.py +5 -5
- data/vendor/pygments-main/pygments/lexers/email.py +151 -0
- data/vendor/pygments-main/pygments/lexers/erlang.py +29 -32
- data/vendor/pygments-main/pygments/lexers/esoteric.py +46 -19
- data/vendor/pygments-main/pygments/lexers/ezhil.py +21 -13
- data/vendor/pygments-main/pygments/lexers/factor.py +1 -1
- data/vendor/pygments-main/pygments/lexers/fantom.py +1 -1
- data/vendor/pygments-main/pygments/lexers/felix.py +1 -1
- data/vendor/pygments-main/pygments/lexers/floscript.py +83 -0
- data/vendor/pygments-main/pygments/lexers/forth.py +41 -40
- data/vendor/pygments-main/pygments/lexers/fortran.py +5 -4
- data/vendor/pygments-main/pygments/lexers/foxpro.py +2 -2
- data/vendor/pygments-main/pygments/lexers/freefem.py +898 -0
- data/vendor/pygments-main/pygments/lexers/functional.py +1 -1
- data/vendor/pygments-main/pygments/lexers/gdscript.py +346 -0
- data/vendor/pygments-main/pygments/lexers/go.py +1 -1
- data/vendor/pygments-main/pygments/lexers/grammar_notation.py +62 -5
- data/vendor/pygments-main/pygments/lexers/graph.py +14 -9
- data/vendor/pygments-main/pygments/lexers/graphics.py +272 -25
- data/vendor/pygments-main/pygments/lexers/haskell.py +48 -21
- data/vendor/pygments-main/pygments/lexers/haxe.py +6 -6
- data/vendor/pygments-main/pygments/lexers/hdl.py +176 -86
- data/vendor/pygments-main/pygments/lexers/hexdump.py +1 -1
- data/vendor/pygments-main/pygments/lexers/html.py +31 -19
- data/vendor/pygments-main/pygments/lexers/idl.py +19 -8
- data/vendor/pygments-main/pygments/lexers/igor.py +244 -112
- data/vendor/pygments-main/pygments/lexers/inferno.py +2 -2
- data/vendor/pygments-main/pygments/lexers/installers.py +1 -1
- data/vendor/pygments-main/pygments/lexers/int_fiction.py +40 -15
- data/vendor/pygments-main/pygments/lexers/iolang.py +2 -2
- data/vendor/pygments-main/pygments/lexers/j.py +3 -3
- data/vendor/pygments-main/pygments/lexers/javascript.py +60 -45
- data/vendor/pygments-main/pygments/lexers/julia.py +44 -46
- data/vendor/pygments-main/pygments/lexers/jvm.py +265 -165
- data/vendor/pygments-main/pygments/lexers/lisp.py +882 -804
- data/vendor/pygments-main/pygments/lexers/make.py +10 -6
- data/vendor/pygments-main/pygments/lexers/markup.py +213 -43
- data/vendor/pygments-main/pygments/lexers/math.py +1 -1
- data/vendor/pygments-main/pygments/lexers/matlab.py +98 -41
- data/vendor/pygments-main/pygments/lexers/mime.py +226 -0
- data/vendor/pygments-main/pygments/lexers/ml.py +198 -9
- data/vendor/pygments-main/pygments/lexers/modeling.py +26 -18
- data/vendor/pygments-main/pygments/lexers/modula2.py +25 -6
- data/vendor/pygments-main/pygments/lexers/monte.py +1 -1
- data/vendor/pygments-main/pygments/lexers/mosel.py +448 -0
- data/vendor/pygments-main/pygments/lexers/ncl.py +1 -1
- data/vendor/pygments-main/pygments/lexers/nimrod.py +4 -4
- data/vendor/pygments-main/pygments/lexers/nit.py +1 -1
- data/vendor/pygments-main/pygments/lexers/nix.py +1 -1
- data/vendor/pygments-main/pygments/lexers/oberon.py +17 -1
- data/vendor/pygments-main/pygments/lexers/objective.py +16 -16
- data/vendor/pygments-main/pygments/lexers/ooc.py +1 -1
- data/vendor/pygments-main/pygments/lexers/other.py +1 -1
- data/vendor/pygments-main/pygments/lexers/parasail.py +1 -1
- data/vendor/pygments-main/pygments/lexers/parsers.py +23 -58
- data/vendor/pygments-main/pygments/lexers/pascal.py +22 -22
- data/vendor/pygments-main/pygments/lexers/pawn.py +30 -24
- data/vendor/pygments-main/pygments/lexers/perl.py +260 -148
- data/vendor/pygments-main/pygments/lexers/php.py +64 -10
- 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 +38 -30
- data/vendor/pygments-main/pygments/lexers/prolog.py +36 -36
- data/vendor/pygments-main/pygments/lexers/promql.py +183 -0
- data/vendor/pygments-main/pygments/lexers/python.py +439 -227
- data/vendor/pygments-main/pygments/lexers/qvt.py +6 -6
- data/vendor/pygments-main/pygments/lexers/r.py +13 -275
- data/vendor/pygments-main/pygments/lexers/rdf.py +232 -39
- data/vendor/pygments-main/pygments/lexers/rebol.py +8 -8
- data/vendor/pygments-main/pygments/lexers/resource.py +2 -2
- data/vendor/pygments-main/pygments/lexers/ride.py +139 -0
- data/vendor/pygments-main/pygments/lexers/rnc.py +1 -1
- data/vendor/pygments-main/pygments/lexers/roboconf.py +1 -1
- data/vendor/pygments-main/pygments/lexers/robotframework.py +23 -31
- data/vendor/pygments-main/pygments/lexers/ruby.py +22 -24
- data/vendor/pygments-main/pygments/lexers/rust.py +76 -72
- data/vendor/pygments-main/pygments/lexers/sas.py +1 -1
- data/vendor/pygments-main/pygments/lexers/scdoc.py +83 -0
- data/vendor/pygments-main/pygments/lexers/scripting.py +75 -13
- data/vendor/pygments-main/pygments/lexers/sgf.py +61 -0
- data/vendor/pygments-main/pygments/lexers/shell.py +162 -42
- 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 +2 -2
- data/vendor/pygments-main/pygments/lexers/smv.py +3 -3
- data/vendor/pygments-main/pygments/lexers/snobol.py +1 -1
- data/vendor/pygments-main/pygments/lexers/solidity.py +92 -0
- data/vendor/pygments-main/pygments/lexers/special.py +5 -3
- data/vendor/pygments-main/pygments/lexers/sql.py +333 -177
- data/vendor/pygments-main/pygments/lexers/stata.py +107 -44
- data/vendor/pygments-main/pygments/lexers/supercollider.py +6 -1
- data/vendor/pygments-main/pygments/lexers/tcl.py +1 -1
- data/vendor/pygments-main/pygments/lexers/templates.py +102 -121
- data/vendor/pygments-main/pygments/lexers/teraterm.py +335 -0
- data/vendor/pygments-main/pygments/lexers/testing.py +6 -6
- data/vendor/pygments-main/pygments/lexers/text.py +2 -1
- data/vendor/pygments-main/pygments/lexers/textedit.py +4 -4
- data/vendor/pygments-main/pygments/lexers/textfmts.py +146 -13
- data/vendor/pygments-main/pygments/lexers/theorem.py +69 -53
- data/vendor/pygments-main/pygments/lexers/tnt.py +263 -0
- data/vendor/pygments-main/pygments/lexers/trafficscript.py +1 -1
- data/vendor/pygments-main/pygments/lexers/typoscript.py +4 -11
- data/vendor/pygments-main/pygments/lexers/unicon.py +412 -0
- data/vendor/pygments-main/pygments/lexers/urbi.py +14 -1
- data/vendor/pygments-main/pygments/lexers/usd.py +90 -0
- data/vendor/pygments-main/pygments/lexers/varnish.py +3 -3
- data/vendor/pygments-main/pygments/lexers/verification.py +13 -10
- data/vendor/pygments-main/pygments/lexers/web.py +1 -1
- data/vendor/pygments-main/pygments/lexers/webidl.py +299 -0
- data/vendor/pygments-main/pygments/lexers/webmisc.py +31 -28
- data/vendor/pygments-main/pygments/lexers/whiley.py +5 -5
- data/vendor/pygments-main/pygments/lexers/x10.py +1 -1
- data/vendor/pygments-main/pygments/lexers/xorg.py +5 -4
- 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 +68 -136
- data/CHANGELOG.md +0 -111
- data/README.md +0 -121
- 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/pygments/lexers/github.py +0 -565
- 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,13 +5,14 @@
|
|
|
5
5
|
|
|
6
6
|
Lexers for Matlab and related languages.
|
|
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
12
|
import re
|
|
13
13
|
|
|
14
|
-
from pygments.lexer import Lexer, RegexLexer, bygroups, words,
|
|
14
|
+
from pygments.lexer import Lexer, RegexLexer, bygroups, default, words, \
|
|
15
|
+
do_insertions
|
|
15
16
|
from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
|
|
16
17
|
Number, Punctuation, Generic, Whitespace
|
|
17
18
|
|
|
@@ -45,33 +46,35 @@ class MatlabLexer(RegexLexer):
|
|
|
45
46
|
# specfun: Special Math functions
|
|
46
47
|
# elmat: Elementary matrices and matrix manipulation
|
|
47
48
|
#
|
|
48
|
-
# taken from Matlab version
|
|
49
|
+
# taken from Matlab version 9.4 (R2018a)
|
|
49
50
|
#
|
|
50
51
|
elfun = ("sin", "sind", "sinh", "asin", "asind", "asinh", "cos", "cosd", "cosh",
|
|
51
52
|
"acos", "acosd", "acosh", "tan", "tand", "tanh", "atan", "atand", "atan2",
|
|
52
|
-
"atanh", "sec", "secd", "sech", "asec", "asecd", "asech", "csc", "cscd",
|
|
53
|
+
"atan2d", "atanh", "sec", "secd", "sech", "asec", "asecd", "asech", "csc", "cscd",
|
|
53
54
|
"csch", "acsc", "acscd", "acsch", "cot", "cotd", "coth", "acot", "acotd",
|
|
54
|
-
"acoth", "hypot", "exp", "expm1", "log", "log1p", "log10", "log2", "pow2",
|
|
55
|
+
"acoth", "hypot", "deg2rad", "rad2deg", "exp", "expm1", "log", "log1p", "log10", "log2", "pow2",
|
|
55
56
|
"realpow", "reallog", "realsqrt", "sqrt", "nthroot", "nextpow2", "abs",
|
|
56
57
|
"angle", "complex", "conj", "imag", "real", "unwrap", "isreal", "cplxpair",
|
|
57
58
|
"fix", "floor", "ceil", "round", "mod", "rem", "sign")
|
|
58
59
|
specfun = ("airy", "besselj", "bessely", "besselh", "besseli", "besselk", "beta",
|
|
59
|
-
"betainc", "betaln", "ellipj", "ellipke", "erf", "erfc", "erfcx",
|
|
60
|
-
"erfinv", "expint", "gamma", "gammainc", "gammaln", "psi", "legendre",
|
|
60
|
+
"betainc", "betaincinv", "betaln", "ellipj", "ellipke", "erf", "erfc", "erfcx",
|
|
61
|
+
"erfinv", "erfcinv", "expint", "gamma", "gammainc", "gammaincinv", "gammaln", "psi", "legendre",
|
|
61
62
|
"cross", "dot", "factor", "isprime", "primes", "gcd", "lcm", "rat",
|
|
62
63
|
"rats", "perms", "nchoosek", "factorial", "cart2sph", "cart2pol",
|
|
63
64
|
"pol2cart", "sph2cart", "hsv2rgb", "rgb2hsv")
|
|
64
|
-
elmat = ("zeros", "ones", "eye", "repmat", "
|
|
65
|
+
elmat = ("zeros", "ones", "eye", "repmat", "repelem", "linspace", "logspace",
|
|
65
66
|
"freqspace", "meshgrid", "accumarray", "size", "length", "ndims", "numel",
|
|
66
|
-
"disp", "isempty", "isequal", "
|
|
67
|
-
"diag", "blkdiag", "tril", "triu", "fliplr", "flipud", "
|
|
67
|
+
"disp", "isempty", "isequal", "isequaln", "cat", "reshape",
|
|
68
|
+
"diag", "blkdiag", "tril", "triu", "fliplr", "flipud", "flip", "rot90",
|
|
68
69
|
"find", "end", "sub2ind", "ind2sub", "bsxfun", "ndgrid", "permute",
|
|
69
70
|
"ipermute", "shiftdim", "circshift", "squeeze", "isscalar", "isvector",
|
|
70
|
-
"
|
|
71
|
-
"isinf", "isfinite", "j", "
|
|
71
|
+
"isrow", "iscolumn", "ismatrix", "eps", "realmax", "realmin", "intmax", "intmin", "flintmax", "pi", "i", "inf", "nan", "isnan",
|
|
72
|
+
"isinf", "isfinite", "j", "true", "false", "compan", "gallery", "hadamard", "hankel",
|
|
72
73
|
"hilb", "invhilb", "magic", "pascal", "rosser", "toeplitz", "vander",
|
|
73
74
|
"wilkinson")
|
|
74
75
|
|
|
76
|
+
_operators = r'-|==|~=|<=|>=|<|>|&&|&|~|\|\|?|\.\*|\*|\+|\.\^|\.\\|\./|/|\\'
|
|
77
|
+
|
|
75
78
|
tokens = {
|
|
76
79
|
'root': [
|
|
77
80
|
# line starting with '!' is sent as a system command. not sure what
|
|
@@ -79,25 +82,40 @@ class MatlabLexer(RegexLexer):
|
|
|
79
82
|
(r'^!.*', String.Other),
|
|
80
83
|
(r'%\{\s*\n', Comment.Multiline, 'blockcomment'),
|
|
81
84
|
(r'%.*$', Comment),
|
|
82
|
-
(r'^\s*function', Keyword, 'deffunc'),
|
|
83
|
-
|
|
84
|
-
# from 'iskeyword' on version
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
85
|
+
(r'^\s*function\b', Keyword, 'deffunc'),
|
|
86
|
+
|
|
87
|
+
# from 'iskeyword' on version 9.4 (R2018a):
|
|
88
|
+
# Check that there is no preceding dot, as keywords are valid field
|
|
89
|
+
# names.
|
|
90
|
+
(words(('break', 'case', 'catch', 'classdef', 'continue', 'else',
|
|
91
|
+
'elseif', 'end', 'for', 'function',
|
|
92
|
+
'global', 'if', 'otherwise', 'parfor',
|
|
93
|
+
'persistent', 'return', 'spmd', 'switch',
|
|
94
|
+
'try', 'while'),
|
|
95
|
+
prefix=r'(?<!\.)', suffix=r'\b'),
|
|
90
96
|
Keyword),
|
|
91
97
|
|
|
92
98
|
("(" + "|".join(elfun + specfun + elmat) + r')\b', Name.Builtin),
|
|
93
99
|
|
|
94
100
|
# line continuation with following comment:
|
|
95
|
-
(r'
|
|
101
|
+
(r'(\.\.\.)(.*)$', bygroups(Keyword, Comment)),
|
|
102
|
+
|
|
103
|
+
# command form:
|
|
104
|
+
# "How MATLAB Recognizes Command Syntax" specifies that an operator
|
|
105
|
+
# is recognized if it is either surrounded by spaces or by no
|
|
106
|
+
# spaces on both sides; only the former case matters for us. (This
|
|
107
|
+
# allows distinguishing `cd ./foo` from `cd ./ foo`.)
|
|
108
|
+
(r'(?:^|(?<=;))(\s*)(\w+)(\s+)(?!=|\(|(?:%s)\s+)' % _operators,
|
|
109
|
+
bygroups(Text, Name, Text), 'commandargs'),
|
|
96
110
|
|
|
97
111
|
# operators:
|
|
98
|
-
(
|
|
99
|
-
|
|
100
|
-
(
|
|
112
|
+
(_operators, Operator),
|
|
113
|
+
|
|
114
|
+
# numbers (must come before punctuation to handle `.5`; cannot use
|
|
115
|
+
# `\b` due to e.g. `5. + .5`).
|
|
116
|
+
(r'(?<!\w)((\d+\.\d*)|(\d*\.\d+))([eEf][+-]?\d+)?(?!\w)', Number.Float),
|
|
117
|
+
(r'\b\d+[eEf][+-]?[0-9]+\b', Number.Float),
|
|
118
|
+
(r'\b\d+\b', Number.Integer),
|
|
101
119
|
|
|
102
120
|
# punctuation:
|
|
103
121
|
(r'\[|\]|\(|\)|\{|\}|:|@|\.|,', Punctuation),
|
|
@@ -107,17 +125,12 @@ class MatlabLexer(RegexLexer):
|
|
|
107
125
|
# (not great, but handles common cases...)
|
|
108
126
|
(r'(?<=[\w)\].])\'+', Operator),
|
|
109
127
|
|
|
110
|
-
(r'(
|
|
111
|
-
(r'\d+[eEf][+-]?[0-9]+', Number.Float),
|
|
112
|
-
(r'\d+', Number.Integer),
|
|
128
|
+
(r'"(""|[^"])*"', String),
|
|
113
129
|
|
|
114
130
|
(r'(?<![\w)\].])\'', String, 'string'),
|
|
115
131
|
(r'[a-zA-Z_]\w*', Name),
|
|
116
132
|
(r'.', Text),
|
|
117
133
|
],
|
|
118
|
-
'string': [
|
|
119
|
-
(r'[^\']*\'', String, '#pop')
|
|
120
|
-
],
|
|
121
134
|
'blockcomment': [
|
|
122
135
|
(r'^\s*%\}', Comment.Multiline, '#pop'),
|
|
123
136
|
(r'^.*\n', Comment.Multiline),
|
|
@@ -131,12 +144,36 @@ class MatlabLexer(RegexLexer):
|
|
|
131
144
|
# function with no args
|
|
132
145
|
(r'(\s*)([a-zA-Z_]\w*)', bygroups(Text, Name.Function), '#pop'),
|
|
133
146
|
],
|
|
147
|
+
'string': [
|
|
148
|
+
(r"[^']*'", String, '#pop'),
|
|
149
|
+
],
|
|
150
|
+
'commandargs': [
|
|
151
|
+
# If an equal sign or other operator is encountered, this
|
|
152
|
+
# isn't a command. It might be a variable assignment or
|
|
153
|
+
# comparison operation with multiple spaces before the
|
|
154
|
+
# equal sign or operator
|
|
155
|
+
(r"=", Punctuation, '#pop'),
|
|
156
|
+
(_operators, Operator, '#pop'),
|
|
157
|
+
(r"[ \t]+", Text),
|
|
158
|
+
("'[^']*'", String),
|
|
159
|
+
(r"[^';\s]+", String),
|
|
160
|
+
(";", Punctuation, '#pop'),
|
|
161
|
+
default('#pop'),
|
|
162
|
+
]
|
|
134
163
|
}
|
|
135
164
|
|
|
136
165
|
def analyse_text(text):
|
|
137
|
-
|
|
166
|
+
# function declaration.
|
|
167
|
+
first_non_comment = next((line for line in text.splitlines()
|
|
168
|
+
if not re.match(r'^\s*%', text)), '').strip()
|
|
169
|
+
if (first_non_comment.startswith('function')
|
|
170
|
+
and '{' not in first_non_comment):
|
|
171
|
+
return 1.
|
|
172
|
+
# comment
|
|
173
|
+
elif re.search(r'^\s*%', text, re.M):
|
|
138
174
|
return 0.2
|
|
139
|
-
|
|
175
|
+
# system cmd
|
|
176
|
+
elif re.search(r'^!\w+', text, re.M):
|
|
140
177
|
return 0.2
|
|
141
178
|
|
|
142
179
|
|
|
@@ -158,6 +195,7 @@ class MatlabSessionLexer(Lexer):
|
|
|
158
195
|
|
|
159
196
|
curcode = ''
|
|
160
197
|
insertions = []
|
|
198
|
+
continuation = False
|
|
161
199
|
|
|
162
200
|
for match in line_re.finditer(text):
|
|
163
201
|
line = match.group()
|
|
@@ -180,21 +218,36 @@ class MatlabSessionLexer(Lexer):
|
|
|
180
218
|
# line = "\n" + line
|
|
181
219
|
token = (0, Generic.Traceback, line)
|
|
182
220
|
insertions.append((idx, [token]))
|
|
183
|
-
|
|
221
|
+
elif continuation:
|
|
222
|
+
# line_start is the length of the most recent prompt symbol
|
|
223
|
+
line_start = len(insertions[-1][-1][-1])
|
|
224
|
+
# Set leading spaces with the length of the prompt to be a generic prompt
|
|
225
|
+
# This keeps code aligned when prompts are removed, say with some Javascript
|
|
226
|
+
if line.startswith(' '*line_start):
|
|
227
|
+
insertions.append((len(curcode),
|
|
228
|
+
[(0, Generic.Prompt, line[:line_start])]))
|
|
229
|
+
curcode += line[line_start:]
|
|
230
|
+
else:
|
|
231
|
+
curcode += line
|
|
184
232
|
else:
|
|
185
233
|
if curcode:
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
yield item
|
|
234
|
+
yield from do_insertions(
|
|
235
|
+
insertions, mlexer.get_tokens_unprocessed(curcode))
|
|
189
236
|
curcode = ''
|
|
190
237
|
insertions = []
|
|
191
238
|
|
|
192
239
|
yield match.start(), Generic.Output, line
|
|
193
240
|
|
|
241
|
+
# Does not allow continuation if a comment is included after the ellipses.
|
|
242
|
+
# Continues any line that ends with ..., even comments (lines that start with %)
|
|
243
|
+
if line.strip().endswith('...'):
|
|
244
|
+
continuation = True
|
|
245
|
+
else:
|
|
246
|
+
continuation = False
|
|
247
|
+
|
|
194
248
|
if curcode: # or item:
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
yield item
|
|
249
|
+
yield from do_insertions(
|
|
250
|
+
insertions, mlexer.get_tokens_unprocessed(curcode))
|
|
198
251
|
|
|
199
252
|
|
|
200
253
|
class OctaveLexer(RegexLexer):
|
|
@@ -536,7 +589,7 @@ class OctaveLexer(RegexLexer):
|
|
|
536
589
|
'root': [
|
|
537
590
|
# We should look into multiline comments
|
|
538
591
|
(r'[%#].*$', Comment),
|
|
539
|
-
(r'^\s*function', Keyword, 'deffunc'),
|
|
592
|
+
(r'^\s*function\b', Keyword, 'deffunc'),
|
|
540
593
|
|
|
541
594
|
# from 'iskeyword' on hg changeset 8cc154f45e37
|
|
542
595
|
(words((
|
|
@@ -594,6 +647,10 @@ class OctaveLexer(RegexLexer):
|
|
|
594
647
|
],
|
|
595
648
|
}
|
|
596
649
|
|
|
650
|
+
def analyse_text(text):
|
|
651
|
+
"""Octave is quite hard to spot, and it looks like Matlab as well."""
|
|
652
|
+
return 0
|
|
653
|
+
|
|
597
654
|
|
|
598
655
|
class ScilabLexer(RegexLexer):
|
|
599
656
|
"""
|
|
@@ -609,7 +666,7 @@ class ScilabLexer(RegexLexer):
|
|
|
609
666
|
tokens = {
|
|
610
667
|
'root': [
|
|
611
668
|
(r'//.*?$', Comment.Single),
|
|
612
|
-
(r'^\s*function', Keyword, 'deffunc'),
|
|
669
|
+
(r'^\s*function\b', Keyword, 'deffunc'),
|
|
613
670
|
|
|
614
671
|
(words((
|
|
615
672
|
'__FILE__', '__LINE__', 'break', 'case', 'catch', 'classdef', 'continue', 'do', 'else',
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
"""
|
|
3
|
+
pygments.lexers.mime
|
|
4
|
+
~~~~~~~~~~~~~~~~~~~~
|
|
5
|
+
|
|
6
|
+
Lexer for Multipurpose Internet Mail Extensions (MIME) data.
|
|
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
|
+
|
|
14
|
+
from pygments.lexer import RegexLexer, include
|
|
15
|
+
from pygments.lexers import get_lexer_for_mimetype
|
|
16
|
+
from pygments.token import Text, Name, String, Operator, Comment, Other
|
|
17
|
+
from pygments.util import get_int_opt, ClassNotFound
|
|
18
|
+
|
|
19
|
+
__all__ = ["MIMELexer"]
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class MIMELexer(RegexLexer):
|
|
23
|
+
"""
|
|
24
|
+
Lexer for Multipurpose Internet Mail Extensions (MIME) data. This lexer is
|
|
25
|
+
designed to process the nested mulitpart data.
|
|
26
|
+
|
|
27
|
+
It assumes that the given data contains both header and body (and is
|
|
28
|
+
splitted by empty line). If no valid header is found, then the entire data
|
|
29
|
+
would be treated as body.
|
|
30
|
+
|
|
31
|
+
Additional options accepted:
|
|
32
|
+
|
|
33
|
+
`MIME-max-level`
|
|
34
|
+
Max recurssion level for nested MIME structure. Any negative number
|
|
35
|
+
would treated as unlimited. (default: -1)
|
|
36
|
+
|
|
37
|
+
`Content-Type`
|
|
38
|
+
Treat the data as specific content type. Useful when header is
|
|
39
|
+
missing, or this lexer would try to parse from header. (default:
|
|
40
|
+
`text/plain`)
|
|
41
|
+
|
|
42
|
+
`Multipart-Boundary`
|
|
43
|
+
Set the default multipart boundary delimiter. This option is only used
|
|
44
|
+
when `Content-Type` is `multipart` and header is missing. This lexer
|
|
45
|
+
would try to parse from header by default. (default: None)
|
|
46
|
+
|
|
47
|
+
`Content-Transfer-Encoding`
|
|
48
|
+
Treat the data as specific encoding. Or this lexer would try to parse
|
|
49
|
+
from header by default. (default: None)
|
|
50
|
+
|
|
51
|
+
.. versionadded:: 2.5
|
|
52
|
+
"""
|
|
53
|
+
|
|
54
|
+
name = "MIME"
|
|
55
|
+
aliases = ["mime"]
|
|
56
|
+
mimetypes = ["multipart/mixed",
|
|
57
|
+
"multipart/related",
|
|
58
|
+
"multipart/alternative"]
|
|
59
|
+
|
|
60
|
+
def __init__(self, **options):
|
|
61
|
+
super().__init__(**options)
|
|
62
|
+
self.boundary = options.get("Multipart-Boundary")
|
|
63
|
+
self.content_transfer_encoding = options.get("Content_Transfer_Encoding")
|
|
64
|
+
self.content_type = options.get("Content_Type", "text/plain")
|
|
65
|
+
self.max_nested_level = get_int_opt(options, "MIME-max-level", -1)
|
|
66
|
+
|
|
67
|
+
def analyse_text(text):
|
|
68
|
+
try:
|
|
69
|
+
header, body = text.strip().split("\n\n", 1)
|
|
70
|
+
if not body.strip():
|
|
71
|
+
return 0.1
|
|
72
|
+
|
|
73
|
+
invalid_headers = MIMELexer.tokens["header"].sub("", header)
|
|
74
|
+
if invalid_headers.strip():
|
|
75
|
+
return 0.1
|
|
76
|
+
else:
|
|
77
|
+
return 1
|
|
78
|
+
|
|
79
|
+
except ValueError:
|
|
80
|
+
return 0.1
|
|
81
|
+
|
|
82
|
+
def get_header_tokens(self, match):
|
|
83
|
+
field = match.group(1)
|
|
84
|
+
|
|
85
|
+
if field.lower() in self.attention_headers:
|
|
86
|
+
yield match.start(1), Name.Tag, field + ":"
|
|
87
|
+
yield match.start(2), Text.Whitespace, match.group(2)
|
|
88
|
+
|
|
89
|
+
pos = match.end(2)
|
|
90
|
+
body = match.group(3)
|
|
91
|
+
for i, t, v in self.get_tokens_unprocessed(body, ("root", field.lower())):
|
|
92
|
+
yield pos + i, t, v
|
|
93
|
+
|
|
94
|
+
else:
|
|
95
|
+
yield match.start(), Comment, match.group()
|
|
96
|
+
|
|
97
|
+
def get_body_tokens(self, match):
|
|
98
|
+
pos_body_start = match.start()
|
|
99
|
+
entire_body = match.group()
|
|
100
|
+
|
|
101
|
+
# skip first newline
|
|
102
|
+
if entire_body[0] == '\n':
|
|
103
|
+
yield pos_body_start, Text.Whitespace, '\n'
|
|
104
|
+
pos_body_start = pos_body_start + 1
|
|
105
|
+
entire_body = entire_body[1:]
|
|
106
|
+
|
|
107
|
+
# if it is not a mulitpart
|
|
108
|
+
if not self.content_type.startswith("multipart") or not self.boundary:
|
|
109
|
+
for i, t, v in self.get_bodypart_tokens(entire_body):
|
|
110
|
+
yield pos_body_start + i, t, v
|
|
111
|
+
return
|
|
112
|
+
|
|
113
|
+
# find boundary
|
|
114
|
+
bdry_pattern = r"^--%s(--)?\n" % re.escape(self.boundary)
|
|
115
|
+
bdry_matcher = re.compile(bdry_pattern, re.MULTILINE)
|
|
116
|
+
|
|
117
|
+
# some data has prefix text before first boundary
|
|
118
|
+
m = bdry_matcher.search(entire_body)
|
|
119
|
+
if m:
|
|
120
|
+
pos_part_start = pos_body_start + m.end()
|
|
121
|
+
pos_iter_start = lpos_end = m.end()
|
|
122
|
+
yield pos_body_start, Text, entire_body[:m.start()]
|
|
123
|
+
yield pos_body_start + lpos_end, String.Delimiter, m.group()
|
|
124
|
+
else:
|
|
125
|
+
pos_part_start = pos_body_start
|
|
126
|
+
pos_iter_start = 0
|
|
127
|
+
|
|
128
|
+
# process tokens of each body part
|
|
129
|
+
for m in bdry_matcher.finditer(entire_body, pos_iter_start):
|
|
130
|
+
# bodypart
|
|
131
|
+
lpos_start = pos_part_start - pos_body_start
|
|
132
|
+
lpos_end = m.start()
|
|
133
|
+
part = entire_body[lpos_start:lpos_end]
|
|
134
|
+
for i, t, v in self.get_bodypart_tokens(part):
|
|
135
|
+
yield pos_part_start + i, t, v
|
|
136
|
+
|
|
137
|
+
# boundary
|
|
138
|
+
yield pos_body_start + lpos_end, String.Delimiter, m.group()
|
|
139
|
+
pos_part_start = pos_body_start + m.end()
|
|
140
|
+
|
|
141
|
+
# some data has suffix text after last boundary
|
|
142
|
+
lpos_start = pos_part_start - pos_body_start
|
|
143
|
+
if lpos_start != len(entire_body):
|
|
144
|
+
yield pos_part_start, Text, entire_body[lpos_start:]
|
|
145
|
+
|
|
146
|
+
def get_bodypart_tokens(self, text):
|
|
147
|
+
# return if:
|
|
148
|
+
# * no content
|
|
149
|
+
# * no content type specific
|
|
150
|
+
# * content encoding is not readable
|
|
151
|
+
# * max recurrsion exceed
|
|
152
|
+
if not text.strip() or not self.content_type:
|
|
153
|
+
return [(0, Other, text)]
|
|
154
|
+
|
|
155
|
+
cte = self.content_transfer_encoding
|
|
156
|
+
if cte and cte not in {"8bit", "7bit", "quoted-printable"}:
|
|
157
|
+
return [(0, Other, text)]
|
|
158
|
+
|
|
159
|
+
if self.max_nested_level == 0:
|
|
160
|
+
return [(0, Other, text)]
|
|
161
|
+
|
|
162
|
+
# get lexer
|
|
163
|
+
try:
|
|
164
|
+
lexer = get_lexer_for_mimetype(self.content_type)
|
|
165
|
+
except ClassNotFound:
|
|
166
|
+
return [(0, Other, text)]
|
|
167
|
+
|
|
168
|
+
if isinstance(lexer, type(self)):
|
|
169
|
+
lexer.max_nested_level = self.max_nested_level - 1
|
|
170
|
+
|
|
171
|
+
return lexer.get_tokens_unprocessed(text)
|
|
172
|
+
|
|
173
|
+
def store_content_type(self, match):
|
|
174
|
+
self.content_type = match.group(1)
|
|
175
|
+
|
|
176
|
+
prefix_len = match.start(1) - match.start(0)
|
|
177
|
+
yield match.start(0), Text.Whitespace, match.group(0)[:prefix_len]
|
|
178
|
+
yield match.start(1), Name.Label, match.group(2)
|
|
179
|
+
yield match.end(2), String.Delimiter, '/'
|
|
180
|
+
yield match.start(3), Name.Label, match.group(3)
|
|
181
|
+
|
|
182
|
+
def get_content_type_subtokens(self, match):
|
|
183
|
+
yield match.start(1), Text, match.group(1)
|
|
184
|
+
yield match.start(2), Text.Whitespace, match.group(2)
|
|
185
|
+
yield match.start(3), Name.Attribute, match.group(3)
|
|
186
|
+
yield match.start(4), Operator, match.group(4)
|
|
187
|
+
yield match.start(5), String, match.group(5)
|
|
188
|
+
|
|
189
|
+
if match.group(3).lower() == "boundary":
|
|
190
|
+
boundary = match.group(5).strip()
|
|
191
|
+
if boundary[0] == '"' and boundary[-1] == '"':
|
|
192
|
+
boundary = boundary[1:-1]
|
|
193
|
+
self.boundary = boundary
|
|
194
|
+
|
|
195
|
+
def store_content_transfer_encoding(self, match):
|
|
196
|
+
self.content_transfer_encoding = match.group(0).lower()
|
|
197
|
+
yield match.start(0), Name.Constant, match.group(0)
|
|
198
|
+
|
|
199
|
+
attention_headers = {"content-type", "content-transfer-encoding"}
|
|
200
|
+
|
|
201
|
+
tokens = {
|
|
202
|
+
"root": [
|
|
203
|
+
(r"^([\w-]+):( *)([\s\S]*?\n)(?![ \t])", get_header_tokens),
|
|
204
|
+
(r"^$[\s\S]+", get_body_tokens),
|
|
205
|
+
],
|
|
206
|
+
"header": [
|
|
207
|
+
# folding
|
|
208
|
+
(r"\n[ \t]", Text.Whitespace),
|
|
209
|
+
(r"\n(?![ \t])", Text.Whitespace, "#pop"),
|
|
210
|
+
],
|
|
211
|
+
"content-type": [
|
|
212
|
+
include("header"),
|
|
213
|
+
(
|
|
214
|
+
r"^\s*((multipart|application|audio|font|image|model|text|video"
|
|
215
|
+
r"|message)/([\w-]+))",
|
|
216
|
+
store_content_type,
|
|
217
|
+
),
|
|
218
|
+
(r'(;)((?:[ \t]|\n[ \t])*)([\w:-]+)(=)([\s\S]*?)(?=;|\n(?![ \t]))',
|
|
219
|
+
get_content_type_subtokens),
|
|
220
|
+
(r';[ \t]*\n(?![ \t])', Text, '#pop'),
|
|
221
|
+
],
|
|
222
|
+
"content-transfer-encoding": [
|
|
223
|
+
include("header"),
|
|
224
|
+
(r"([\w-]+)", store_content_transfer_encoding),
|
|
225
|
+
],
|
|
226
|
+
}
|