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
data/lib/pygments/popen.rb
CHANGED
|
@@ -1,9 +1,7 @@
|
|
|
1
|
-
# coding: utf-8
|
|
2
1
|
# frozen_string_literal: true
|
|
3
2
|
|
|
3
|
+
require 'json'
|
|
4
4
|
require 'open3'
|
|
5
|
-
require 'multi_json'
|
|
6
|
-
require 'timeout'
|
|
7
5
|
require 'logger'
|
|
8
6
|
require 'time'
|
|
9
7
|
|
|
@@ -15,38 +13,26 @@ end
|
|
|
15
13
|
# Python process.
|
|
16
14
|
module Pygments
|
|
17
15
|
class Popen
|
|
18
|
-
|
|
19
|
-
def popen4(cmd)
|
|
20
|
-
stdin, stdout, stderr, wait_thr = Open3.popen3(cmd)
|
|
21
|
-
[wait_thr[:pid], stdin, stdout, stderr]
|
|
22
|
-
end
|
|
23
|
-
|
|
24
16
|
# Get things started by opening a pipe to mentos (the freshmaker), a
|
|
25
17
|
# Python process that talks to the Pygments library. We'll talk back and
|
|
26
18
|
# forth across this pipe.
|
|
27
|
-
def start(pygments_path = File.
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
@log.datetime_format = "%Y-%m-%d %H:%M "
|
|
32
|
-
rescue
|
|
33
|
-
@log = Logger.new(File::NULL)
|
|
34
|
-
end
|
|
19
|
+
def start(pygments_path = File.join(__dir__, '..', '..', 'vendor', 'pygments-main'))
|
|
20
|
+
@log = Logger.new(ENV['MENTOS_LOG'] || File::NULL)
|
|
21
|
+
@log.level = Logger::INFO
|
|
22
|
+
@log.datetime_format = '%Y-%m-%d %H:%M '
|
|
35
23
|
|
|
36
24
|
ENV['PYGMENTS_PATH'] = pygments_path
|
|
37
25
|
|
|
38
26
|
# Make sure we kill off the child when we're done
|
|
39
|
-
at_exit { stop
|
|
27
|
+
at_exit { stop 'Exiting' }
|
|
40
28
|
|
|
41
29
|
# A pipe to the mentos python process. #popen4 gives us
|
|
42
30
|
# the pid and three IO objects to write and read.
|
|
43
|
-
|
|
44
|
-
@pid, @in, @out, @err = popen4(
|
|
45
|
-
@
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
def windows?
|
|
49
|
-
RUBY_PLATFORM =~ /mswin|mingw/
|
|
31
|
+
argv = [*python_binary, File.join(__dir__, 'mentos.py')]
|
|
32
|
+
@pid, @in, @out, @err = popen4(argv)
|
|
33
|
+
@in.binmode
|
|
34
|
+
@out.binmode
|
|
35
|
+
@log.info "Starting pid #{@pid} with python #{python_binary}."
|
|
50
36
|
end
|
|
51
37
|
|
|
52
38
|
def python_binary
|
|
@@ -57,30 +43,6 @@ module Pygments
|
|
|
57
43
|
@python_bin = python_bin
|
|
58
44
|
end
|
|
59
45
|
|
|
60
|
-
# Detect a suitable Python binary to use.
|
|
61
|
-
# Or return $PYGMENTS_RB_PYTHON if it's exists.
|
|
62
|
-
def find_python_binary
|
|
63
|
-
if ENV['PYGMENTS_RB_PYTHON']
|
|
64
|
-
return which(ENV['PYGMENTS_RB_PYTHON'])
|
|
65
|
-
elsif windows? && which('py')
|
|
66
|
-
return 'py -2'
|
|
67
|
-
end
|
|
68
|
-
return which('python2') || which('python')
|
|
69
|
-
end
|
|
70
|
-
|
|
71
|
-
# Cross platform which command
|
|
72
|
-
# from http://stackoverflow.com/a/5471032/284795
|
|
73
|
-
def which(command)
|
|
74
|
-
exts = ENV['PATHEXT'] ? ENV['PATHEXT'].split(';') : ['']
|
|
75
|
-
ENV['PATH'].split(File::PATH_SEPARATOR).each do |dir|
|
|
76
|
-
exts.each { |ext|
|
|
77
|
-
path = File.join(dir, "#{command}#{ext}")
|
|
78
|
-
return path if File.executable?(path) && !File.directory?(path)
|
|
79
|
-
}
|
|
80
|
-
end
|
|
81
|
-
return nil
|
|
82
|
-
end
|
|
83
|
-
|
|
84
46
|
# Stop the child process by issuing a kill -9.
|
|
85
47
|
#
|
|
86
48
|
# We then call waitpid() with the pid, which waits for that particular
|
|
@@ -93,15 +55,17 @@ module Pygments
|
|
|
93
55
|
# Technically, kill() can also fail with EPERM or EINVAL (wherein
|
|
94
56
|
# the signal isn't sent); but we have permissions, and
|
|
95
57
|
# we're not doing anything invalid here.
|
|
58
|
+
# @param reason [String]
|
|
96
59
|
def stop(reason)
|
|
97
|
-
|
|
60
|
+
unless @pid.nil?
|
|
61
|
+
@log.info "Killing pid: #{@pid}. Reason: #{reason}"
|
|
98
62
|
begin
|
|
99
63
|
Process.kill('KILL', @pid)
|
|
100
64
|
Process.waitpid(@pid)
|
|
101
|
-
rescue Errno::ESRCH, Errno::ECHILD
|
|
65
|
+
rescue Errno::ESRCH, Errno::ECHILD => e
|
|
66
|
+
@log.warn(e)
|
|
102
67
|
end
|
|
103
68
|
end
|
|
104
|
-
@log.info "Killing pid: #{@pid.to_s}. Reason: #{reason}"
|
|
105
69
|
@pid = nil
|
|
106
70
|
end
|
|
107
71
|
|
|
@@ -113,82 +77,60 @@ module Pygments
|
|
|
113
77
|
# process and the pid has already been re-used) we'll want to raise
|
|
114
78
|
# that as a more informative Mentos exception.
|
|
115
79
|
#
|
|
116
|
-
#
|
|
80
|
+
# @return [Boolean] true if the child is alive.
|
|
117
81
|
def alive?
|
|
118
82
|
return true if defined?(@pid) && @pid && Process.kill(0, @pid)
|
|
83
|
+
|
|
119
84
|
false
|
|
120
85
|
rescue Errno::ENOENT, Errno::ESRCH
|
|
121
86
|
false
|
|
122
87
|
rescue Errno::EPERM
|
|
123
|
-
raise MentosError,
|
|
88
|
+
raise MentosError, 'EPERM checking if child process is alive.'
|
|
124
89
|
end
|
|
125
90
|
|
|
126
91
|
# Public: Get an array of available Pygments formatters
|
|
127
92
|
#
|
|
128
|
-
#
|
|
93
|
+
# @return [Array<String>] an array of formatters
|
|
129
94
|
def formatters
|
|
130
|
-
mentos(:get_all_formatters).
|
|
95
|
+
mentos(:get_all_formatters).each_with_object({}) do |(name, desc, aliases), hash|
|
|
131
96
|
# Remove the long-winded and repetitive 'Formatter' suffix
|
|
132
97
|
name.sub!(/Formatter$/, '')
|
|
133
98
|
hash[name] = {
|
|
134
|
-
:
|
|
135
|
-
:
|
|
136
|
-
:
|
|
99
|
+
name: name,
|
|
100
|
+
description: desc,
|
|
101
|
+
aliases: aliases
|
|
137
102
|
}
|
|
138
|
-
hash
|
|
139
103
|
end
|
|
140
104
|
end
|
|
141
105
|
|
|
142
|
-
|
|
143
|
-
#
|
|
144
|
-
# mentos when it's not really needed (e.g., one-off jobs, loading the Rails env, etc).
|
|
145
|
-
#
|
|
146
|
-
# Should be preferred to #lexers!
|
|
147
|
-
#
|
|
148
|
-
# Returns an array of lexers.
|
|
149
|
-
def lexers
|
|
150
|
-
begin
|
|
151
|
-
lexer_file = File.expand_path('../../../lexers', __FILE__)
|
|
152
|
-
raw = File.open(lexer_file, "rb").read
|
|
153
|
-
Marshal.load(raw)
|
|
154
|
-
rescue Errno::ENOENT
|
|
155
|
-
raise MentosError, "Error loading lexer file. Was it created and vendored?"
|
|
156
|
-
end
|
|
157
|
-
end
|
|
158
|
-
|
|
159
|
-
# Public: Get back all available lexers from mentos itself
|
|
106
|
+
# Get all available lexers from mentos itself
|
|
107
|
+
# Do not use this method directly, instead use Pygments#lexers
|
|
160
108
|
#
|
|
161
|
-
#
|
|
109
|
+
# @return [Array<String>] an array of lexers
|
|
162
110
|
def lexers!
|
|
163
|
-
mentos(:get_all_lexers).
|
|
111
|
+
mentos(:get_all_lexers).each_with_object({}) do |lxr, hash|
|
|
164
112
|
name = lxr[0]
|
|
165
113
|
hash[name] = {
|
|
166
|
-
:
|
|
167
|
-
:
|
|
168
|
-
:
|
|
169
|
-
:
|
|
114
|
+
name: name,
|
|
115
|
+
aliases: lxr[1],
|
|
116
|
+
filenames: lxr[2],
|
|
117
|
+
mimetypes: lxr[3]
|
|
170
118
|
}
|
|
171
|
-
hash["dasm16"] = {:name=>"dasm16", :aliases=>["DASM16"], :filenames=>["*.dasm16", "*.dasm"], :mimetypes=>['text/x-dasm16']}
|
|
172
|
-
hash["Puppet"] = {:name=>"Puppet", :aliases=>["puppet"], :filenames=>["*.pp"], :mimetypes=>[]}
|
|
173
|
-
hash["Augeas"] = {:name=>"Augeas", :aliases=>["augeas"], :filenames=>["*.aug"], :mimetypes=>[]}
|
|
174
|
-
hash["TOML"] = {:name=>"TOML", :aliases=>["toml"], :filenames=>["*.toml"], :mimetypes=>[]}
|
|
175
|
-
hash["Slash"] = {:name=>"Slash", :aliases=>["slash"], :filenames=>["*.sl"], :mimetypes=>[]}
|
|
176
|
-
hash
|
|
177
119
|
end
|
|
178
120
|
end
|
|
179
121
|
|
|
180
|
-
#
|
|
122
|
+
# @return [Array<String>] an array of all available filters
|
|
181
123
|
def filters
|
|
182
124
|
mentos(:get_all_filters)
|
|
183
125
|
end
|
|
184
126
|
|
|
185
|
-
#
|
|
127
|
+
# @return [Array<String>] an array of all available styles
|
|
186
128
|
def styles
|
|
187
129
|
mentos(:get_all_styles)
|
|
188
130
|
end
|
|
189
131
|
|
|
190
|
-
#
|
|
191
|
-
def css(klass='', opts={})
|
|
132
|
+
# @return [String] css for highlighted code
|
|
133
|
+
def css(klass = '', opts = {})
|
|
192
134
|
if klass.is_a?(Hash)
|
|
193
135
|
opts = klass
|
|
194
136
|
klass = ''
|
|
@@ -196,32 +138,29 @@ module Pygments
|
|
|
196
138
|
mentos(:css, ['html', klass], opts)
|
|
197
139
|
end
|
|
198
140
|
|
|
199
|
-
#
|
|
141
|
+
# @return [String, nil] the name of a lexer.
|
|
200
142
|
def lexer_name_for(*args)
|
|
201
143
|
# Pop off the last arg if it's a hash, which becomes our opts
|
|
202
|
-
if args.last.is_a?(Hash)
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
144
|
+
opts = if args.last.is_a?(Hash)
|
|
145
|
+
args.pop
|
|
146
|
+
else
|
|
147
|
+
{}
|
|
148
|
+
end
|
|
207
149
|
|
|
208
|
-
if args.last.is_a?(String)
|
|
209
|
-
code = args.pop
|
|
210
|
-
else
|
|
211
|
-
code = nil
|
|
212
|
-
end
|
|
150
|
+
code = (args.pop if args.last.is_a?(String))
|
|
213
151
|
|
|
214
152
|
mentos(:lexer_name_for, args, opts, code)
|
|
215
153
|
end
|
|
216
154
|
|
|
217
155
|
# Public: Highlight code.
|
|
218
156
|
#
|
|
219
|
-
# Takes a first-position argument of the code to be highlighted,
|
|
220
|
-
# second-position hash of various arguments specifying
|
|
157
|
+
# Takes a first-position argument of the code to be highlighted,
|
|
158
|
+
# and a second-position hash of various arguments specifying
|
|
159
|
+
# highlighting properties.
|
|
221
160
|
#
|
|
222
161
|
# Returns the highlighted string
|
|
223
162
|
# or nil when the request to the Python process timed out.
|
|
224
|
-
def highlight(code, opts={})
|
|
163
|
+
def highlight(code, opts = {})
|
|
225
164
|
# If the caller didn't give us any code, we have nothing to do,
|
|
226
165
|
# so return right away.
|
|
227
166
|
return code if code.nil? || code.empty?
|
|
@@ -240,221 +179,186 @@ module Pygments
|
|
|
240
179
|
|
|
241
180
|
private
|
|
242
181
|
|
|
243
|
-
#
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
182
|
+
# @param argv [Array<String>]
|
|
183
|
+
def popen4(argv)
|
|
184
|
+
stdin, stdout, stderr, wait_thr = Open3.popen3(*argv, { close_others: true })
|
|
185
|
+
while (pid = wait_thr.pid).nil? && wait_thr.alive?
|
|
186
|
+
# wait_thr.pid is not immediately available on JRuby. Why???
|
|
187
|
+
end
|
|
188
|
+
[pid, stdin, stdout, stderr]
|
|
189
|
+
end
|
|
190
|
+
|
|
191
|
+
# Detect a suitable Python binary to use.
|
|
192
|
+
def find_python_binary
|
|
193
|
+
return %w[py python3 python].first { |py| !which(py).nil? } if Gem.win_platform?
|
|
194
|
+
|
|
195
|
+
# On non-Windows platforms, we simply rely on shebang
|
|
196
|
+
[]
|
|
197
|
+
end
|
|
198
|
+
|
|
199
|
+
# Cross platform which command
|
|
200
|
+
# from http://stackoverflow.com/a/5471032/284795
|
|
201
|
+
def which(command)
|
|
202
|
+
exts = ENV['PATHEXT'] ? ENV['PATHEXT'].split(';') : ['']
|
|
203
|
+
ENV['PATH'].split(File::PATH_SEPARATOR).each do |dir|
|
|
204
|
+
exts.each do |ext|
|
|
205
|
+
path = File.join(dir, "#{command}#{ext}")
|
|
206
|
+
return path if File.executable?(path) && !File.directory?(path)
|
|
207
|
+
end
|
|
208
|
+
end
|
|
209
|
+
nil
|
|
210
|
+
end
|
|
211
|
+
|
|
212
|
+
# @param timeout [Integer]
|
|
213
|
+
# @param error_message [String]
|
|
214
|
+
# @yield
|
|
215
|
+
def with_watchdog(timeout, error_message)
|
|
216
|
+
state_mutex = Mutex.new
|
|
217
|
+
state = :alive
|
|
218
|
+
wd_cleanup = ConditionVariable.new
|
|
219
|
+
|
|
220
|
+
watchdog = if timeout.positive?
|
|
221
|
+
Thread.new do
|
|
222
|
+
state_mutex.synchronize do
|
|
223
|
+
wd_cleanup.wait(state_mutex, timeout) if state != :finished
|
|
224
|
+
if state != :finished
|
|
225
|
+
@log.error error_message
|
|
226
|
+
stop error_message
|
|
227
|
+
state = :timeout
|
|
228
|
+
end
|
|
229
|
+
end
|
|
230
|
+
end
|
|
231
|
+
end
|
|
248
232
|
|
|
249
233
|
begin
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
# It then returns the id's back to Rubyland.
|
|
258
|
-
id = (0...8).map{65.+(rand(25)).chr}.join
|
|
259
|
-
code = add_ids(original_code, id) if original_code
|
|
260
|
-
|
|
261
|
-
# Add metadata to the header and generate it.
|
|
262
|
-
if code
|
|
263
|
-
bytesize = code.bytesize
|
|
264
|
-
else
|
|
265
|
-
bytesize = 0
|
|
234
|
+
yield
|
|
235
|
+
ensure
|
|
236
|
+
if watchdog
|
|
237
|
+
state_mutex.synchronize do
|
|
238
|
+
state = :finished if state == :alive
|
|
239
|
+
# wake up watchdog thread
|
|
240
|
+
wd_cleanup.signal
|
|
266
241
|
end
|
|
242
|
+
watchdog.join
|
|
243
|
+
end
|
|
267
244
|
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
245
|
+
raise MentosError, error_message if state == :timeout
|
|
246
|
+
end
|
|
247
|
+
end
|
|
271
248
|
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
249
|
+
# Our 'rpc'-ish request to mentos. Requires a method name, and then optional
|
|
250
|
+
# args, kwargs, code.
|
|
251
|
+
def mentos(method, args = [], kwargs = {}, code = nil)
|
|
252
|
+
# Open the pipe if necessary
|
|
253
|
+
start unless alive?
|
|
275
254
|
|
|
276
|
-
|
|
277
|
-
|
|
255
|
+
# Add metadata to the header and generate it.
|
|
256
|
+
kwargs = kwargs.merge('bytes' => (code.nil? ? 0 : code.bytesize))
|
|
257
|
+
out_header = JSON.generate(method: method, args: args, kwargs: kwargs)
|
|
278
258
|
|
|
279
|
-
|
|
259
|
+
begin
|
|
260
|
+
timeout = get_timeout(kwargs.delete(:timeout))
|
|
261
|
+
res = with_watchdog(timeout, "Timeout on a mentos #{method} call") do
|
|
262
|
+
write_header(out_header, code)
|
|
280
263
|
|
|
281
264
|
# mentos will now return data to us. First it sends the header.
|
|
282
|
-
|
|
265
|
+
header_len_bytes = @out.read(4)
|
|
266
|
+
if header_len_bytes.nil?
|
|
267
|
+
raise Errno::EPIPE, %(Failed to read response from Python process on a mentos #{method} call)
|
|
268
|
+
end
|
|
269
|
+
|
|
270
|
+
header_len = header_len_bytes.unpack('N')[0]
|
|
271
|
+
@log.info "Size in: #{header_len}"
|
|
272
|
+
header = @out.read(header_len)
|
|
283
273
|
|
|
284
274
|
# Now handle the header, any read any more data required.
|
|
285
|
-
|
|
275
|
+
handle_header_and_return(header)
|
|
276
|
+
end
|
|
286
277
|
|
|
287
|
-
|
|
288
|
-
|
|
278
|
+
# Finally, return what we got.
|
|
279
|
+
return_result(res, method)
|
|
280
|
+
rescue Errno::EPIPE => e
|
|
281
|
+
begin
|
|
282
|
+
error_msg = @err.read
|
|
283
|
+
@log.error "Error running Python script: #{error_msg}"
|
|
284
|
+
stop "Error running Python script: #{error_msg}"
|
|
285
|
+
raise MentosError, %(#{e}: #{error_msg})
|
|
286
|
+
rescue Errno::EPIPE
|
|
287
|
+
@log.error e.to_s
|
|
288
|
+
stop e.to_s
|
|
289
|
+
raise e
|
|
289
290
|
end
|
|
290
|
-
rescue
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
291
|
+
rescue StandardError => e
|
|
292
|
+
@log.error e.to_s
|
|
293
|
+
stop e.to_s
|
|
294
|
+
raise e
|
|
294
295
|
end
|
|
295
|
-
|
|
296
|
-
rescue Errno::EPIPE, EOFError
|
|
297
|
-
stop "EPIPE"
|
|
298
|
-
raise MentosError, "EPIPE"
|
|
299
296
|
end
|
|
300
297
|
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
298
|
+
# @param header [String]
|
|
299
|
+
# @param code [String, nil]
|
|
300
|
+
def write_header(header, code)
|
|
301
|
+
# Get the size of the header itself and write that.
|
|
302
|
+
@in.write([header.bytesize].pack('N'))
|
|
303
|
+
@log.info "Size out: #{header.bytesize}"
|
|
304
|
+
|
|
305
|
+
# mentos is now waiting for the header, and, potentially, code.
|
|
306
|
+
@in.write(header)
|
|
307
|
+
@log.info "Out header: #{header}"
|
|
308
|
+
@in.write(code) unless code.nil?
|
|
309
|
+
@in.flush
|
|
310
|
+
end
|
|
305
311
|
|
|
306
|
-
|
|
307
|
-
|
|
312
|
+
# @param timeout [Integer, nil]
|
|
313
|
+
# @return [Integer]
|
|
314
|
+
def get_timeout(timeout)
|
|
315
|
+
return timeout unless timeout.nil?
|
|
308
316
|
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
end
|
|
317
|
+
begin
|
|
318
|
+
Integer(ENV['MENTOS_TIMEOUT'])
|
|
319
|
+
rescue TypeError
|
|
320
|
+
0
|
|
314
321
|
end
|
|
315
|
-
rescue Timeout::Error
|
|
316
|
-
# during the specified time no error were found
|
|
317
|
-
@err.close
|
|
318
322
|
end
|
|
319
323
|
|
|
320
|
-
|
|
321
324
|
# Based on the header we receive, determine if we need
|
|
322
325
|
# to read more bytes, and read those bytes if necessary.
|
|
323
326
|
#
|
|
324
|
-
#
|
|
325
|
-
#
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
if header
|
|
329
|
-
header = header_to_json(header)
|
|
330
|
-
bytes = header[:bytes]
|
|
331
|
-
|
|
332
|
-
# Read more bytes (the actual response body)
|
|
333
|
-
res = @out.read(bytes.to_i)
|
|
334
|
-
|
|
335
|
-
if header[:method] == "highlight"
|
|
336
|
-
# Make sure we have a result back; else consider this an error.
|
|
337
|
-
if res.nil?
|
|
338
|
-
@log.warn "No highlight result back from mentos."
|
|
339
|
-
stop "No highlight result back from mentos."
|
|
340
|
-
raise MentosError, "No highlight result back from mentos."
|
|
341
|
-
end
|
|
342
|
-
|
|
343
|
-
# Remove the newline from Python
|
|
344
|
-
res = res[0..-2]
|
|
345
|
-
@log.info "Highlight in process."
|
|
346
|
-
|
|
347
|
-
# Get the id's
|
|
348
|
-
start_id = res[0..7]
|
|
349
|
-
end_id = res[-8..-1]
|
|
350
|
-
|
|
351
|
-
# Sanity check.
|
|
352
|
-
if not (start_id == id and end_id == id)
|
|
353
|
-
@log.error "ID's did not match. Aborting."
|
|
354
|
-
stop "ID's did not match. Aborting."
|
|
355
|
-
raise MentosError, "ID's did not match. Aborting."
|
|
356
|
-
else
|
|
357
|
-
# We're good. Remove the padding
|
|
358
|
-
res = res[10..-11]
|
|
359
|
-
@log.info "Highlighting complete."
|
|
360
|
-
res
|
|
361
|
-
end
|
|
362
|
-
end
|
|
363
|
-
res
|
|
364
|
-
else
|
|
365
|
-
@log.error "No header data back."
|
|
366
|
-
stop "No header data back."
|
|
367
|
-
raise MentosError, "No header received back."
|
|
368
|
-
end
|
|
369
|
-
end
|
|
327
|
+
# @param header [String, nil]
|
|
328
|
+
# @return [String, nil] either highlighted text or metadata.
|
|
329
|
+
def handle_header_and_return(header)
|
|
330
|
+
raise MentosError, 'No header received back.' if header.nil?
|
|
370
331
|
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
# code + 8 characters.
|
|
375
|
-
def add_ids(code, id)
|
|
376
|
-
(id + " #{code} #{id}").freeze
|
|
377
|
-
end
|
|
332
|
+
@log.info "In header: #{header}"
|
|
333
|
+
header = header_to_json(header)
|
|
334
|
+
bytes = header[:bytes]
|
|
378
335
|
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
# Returns nothing.
|
|
382
|
-
def write_data(out_header, code=nil)
|
|
383
|
-
@in.write(out_header)
|
|
384
|
-
@log.info "Out header: #{out_header}"
|
|
385
|
-
@in.write(code) if code
|
|
386
|
-
end
|
|
336
|
+
# Read more bytes (the actual response body)
|
|
337
|
+
res = @out.read(bytes.to_i)
|
|
387
338
|
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
if size_regex.match(size)
|
|
392
|
-
true
|
|
393
|
-
else
|
|
394
|
-
false
|
|
339
|
+
if header[:method] == 'highlight'
|
|
340
|
+
# Make sure we have a result back; else consider this an error.
|
|
341
|
+
raise MentosError, 'No highlight result back from mentos.' if res.nil?
|
|
395
342
|
end
|
|
396
|
-
end
|
|
397
|
-
|
|
398
|
-
# Read the header via the pipe.
|
|
399
|
-
#
|
|
400
|
-
# Returns a header.
|
|
401
|
-
def get_header
|
|
402
|
-
begin
|
|
403
|
-
size = @out.read(33)
|
|
404
|
-
size = size[0..-2]
|
|
405
|
-
|
|
406
|
-
# Sanity check the size
|
|
407
|
-
if not size_check(size)
|
|
408
|
-
@log.error "Size returned from mentos.py invalid."
|
|
409
|
-
stop "Size returned from mentos.py invalid."
|
|
410
|
-
raise MentosError, "Size returned from mentos.py invalid."
|
|
411
|
-
end
|
|
412
343
|
|
|
413
|
-
|
|
414
|
-
# convert the string of bits into an integer.
|
|
415
|
-
header_bytes = size.to_s.to_i(2) + 1
|
|
416
|
-
@log.info "Size in: #{size.to_s} (#{header_bytes.to_s})"
|
|
417
|
-
@out.read(header_bytes)
|
|
418
|
-
rescue
|
|
419
|
-
@log.error "Failed to get header."
|
|
420
|
-
stop "Failed to get header."
|
|
421
|
-
raise MentosError, "Failed to get header."
|
|
422
|
-
end
|
|
344
|
+
res
|
|
423
345
|
end
|
|
424
346
|
|
|
425
|
-
#
|
|
426
|
-
# want them, text otherwise.
|
|
347
|
+
# @return Ruby objects for the methods that want them, text otherwise.
|
|
427
348
|
def return_result(res, method)
|
|
428
|
-
|
|
429
|
-
res = MultiJson.load(res, :symbolize_keys => true)
|
|
430
|
-
end
|
|
349
|
+
res = JSON.parse(res, symbolize_names: true) unless %i[lexer_name_for highlight css].include?(method)
|
|
431
350
|
res = res.rstrip if res.class == String
|
|
432
351
|
res
|
|
433
352
|
end
|
|
434
353
|
|
|
435
354
|
# Convert a text header into JSON for easy access.
|
|
355
|
+
# @param header [String]
|
|
356
|
+
# @return [JSON]
|
|
436
357
|
def header_to_json(header)
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
if header[:error]
|
|
441
|
-
# Raise this as a Ruby exception of the MentosError class.
|
|
442
|
-
# Stop so we don't leave the pipe in an inconsistent state.
|
|
443
|
-
@log.error "Failed to convert header to JSON."
|
|
444
|
-
stop header[:error]
|
|
445
|
-
raise MentosError, header[:error]
|
|
446
|
-
else
|
|
447
|
-
header
|
|
448
|
-
end
|
|
449
|
-
end
|
|
450
|
-
|
|
451
|
-
def get_fixed_bits_from_header(out_header)
|
|
452
|
-
size = out_header.bytesize
|
|
358
|
+
json = JSON.parse(header, symbolize_names: true)
|
|
359
|
+
raise MentosError, json[:error] unless json[:error].nil?
|
|
453
360
|
|
|
454
|
-
|
|
455
|
-
# representation: e.g, "00000000000000000000000000011110"
|
|
456
|
-
Array.new(32) { |i| size[i] }.reverse!.join
|
|
361
|
+
json
|
|
457
362
|
end
|
|
458
363
|
end
|
|
459
364
|
end
|
|
460
|
-
|