pygments.rb 1.2.1 → 2.0.0.rc2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (378) hide show
  1. checksums.yaml +5 -5
  2. data/.github/dependabot.yml +13 -0
  3. data/.github/workflows/ci.yml +28 -0
  4. data/.github/workflows/release.yml +24 -0
  5. data/.gitignore +5 -6
  6. data/CHANGELOG.adoc +119 -0
  7. data/Gemfile +3 -1
  8. data/LICENSE +1 -1
  9. data/README.adoc +161 -0
  10. data/Rakefile +10 -21
  11. data/bench.rb +8 -7
  12. data/cache-lexers.rb +3 -2
  13. data/lib/pygments.rb +10 -11
  14. data/lib/pygments/lexer.rb +5 -5
  15. data/lib/pygments/mentos.py +23 -66
  16. data/lib/pygments/popen.rb +152 -204
  17. data/lib/pygments/version.rb +2 -2
  18. data/pygments.rb.gemspec +11 -9
  19. data/test/test_pygments.rb +51 -84
  20. data/vendor/pygments-main/{AUTHORS → Pygments-2.7.3.dist-info/AUTHORS} +21 -3
  21. data/vendor/pygments-main/Pygments-2.7.3.dist-info/INSTALLER +1 -0
  22. data/vendor/pygments-main/{LICENSE → Pygments-2.7.3.dist-info/LICENSE} +1 -1
  23. data/vendor/pygments-main/Pygments-2.7.3.dist-info/METADATA +49 -0
  24. data/vendor/pygments-main/Pygments-2.7.3.dist-info/RECORD +482 -0
  25. data/vendor/pygments-main/Pygments-2.7.3.dist-info/REQUESTED +0 -0
  26. data/vendor/pygments-main/Pygments-2.7.3.dist-info/WHEEL +5 -0
  27. data/vendor/pygments-main/Pygments-2.7.3.dist-info/entry_points.txt +3 -0
  28. data/vendor/pygments-main/Pygments-2.7.3.dist-info/top_level.txt +1 -0
  29. data/vendor/pygments-main/bin/pygmentize +8 -0
  30. data/vendor/pygments-main/pygments/__init__.py +6 -11
  31. data/vendor/pygments-main/pygments/__main__.py +18 -0
  32. data/vendor/pygments-main/pygments/cmdline.py +38 -29
  33. data/vendor/pygments-main/pygments/console.py +6 -9
  34. data/vendor/pygments-main/pygments/filter.py +4 -6
  35. data/vendor/pygments-main/pygments/filters/__init__.py +609 -21
  36. data/vendor/pygments-main/pygments/formatter.py +4 -4
  37. data/vendor/pygments-main/pygments/formatters/__init__.py +9 -8
  38. data/vendor/pygments-main/pygments/formatters/_mapping.py +1 -3
  39. data/vendor/pygments-main/pygments/formatters/bbcode.py +1 -1
  40. data/vendor/pygments-main/pygments/formatters/html.py +223 -135
  41. data/vendor/pygments-main/pygments/formatters/img.py +68 -41
  42. data/vendor/pygments-main/pygments/formatters/irc.py +39 -39
  43. data/vendor/pygments-main/pygments/formatters/latex.py +56 -26
  44. data/vendor/pygments-main/pygments/formatters/other.py +12 -8
  45. data/vendor/pygments-main/pygments/formatters/rtf.py +29 -29
  46. data/vendor/pygments-main/pygments/formatters/svg.py +38 -4
  47. data/vendor/pygments-main/pygments/formatters/terminal.py +25 -31
  48. data/vendor/pygments-main/pygments/formatters/terminal256.py +22 -12
  49. data/vendor/pygments-main/pygments/lexer.py +41 -39
  50. data/vendor/pygments-main/pygments/lexers/__init__.py +342 -0
  51. data/vendor/pygments-main/pygments/lexers/_asy_builtins.py +1645 -0
  52. data/vendor/pygments-main/pygments/lexers/_cl_builtins.py +232 -0
  53. data/vendor/pygments-main/pygments/lexers/_cocoa_builtins.py +71 -0
  54. data/vendor/pygments-main/pygments/lexers/_csound_builtins.py +1725 -0
  55. data/vendor/pygments-main/pygments/lexers/_lasso_builtins.py +5327 -0
  56. data/vendor/pygments-main/pygments/lexers/_lua_builtins.py +293 -0
  57. data/vendor/pygments-main/pygments/lexers/_mapping.py +551 -0
  58. data/vendor/pygments-main/pygments/lexers/_mql_builtins.py +1172 -0
  59. data/vendor/pygments-main/pygments/lexers/_mysql_builtins.py +1282 -0
  60. data/vendor/pygments-main/pygments/lexers/_openedge_builtins.py +2547 -0
  61. data/vendor/pygments-main/pygments/lexers/_php_builtins.py +4753 -0
  62. data/vendor/pygments-main/pygments/lexers/_postgres_builtins.py +678 -0
  63. data/vendor/pygments-main/pygments/lexers/_scilab_builtins.py +3094 -0
  64. data/vendor/pygments-main/pygments/lexers/_sourcemod_builtins.py +1161 -0
  65. data/vendor/pygments-main/pygments/lexers/_stan_builtins.py +558 -0
  66. data/vendor/pygments-main/pygments/lexers/_stata_builtins.py +421 -0
  67. data/vendor/pygments-main/pygments/lexers/_tsql_builtins.py +1004 -0
  68. data/vendor/pygments-main/pygments/lexers/_usd_builtins.py +113 -0
  69. data/vendor/pygments-main/pygments/lexers/_vbscript_builtins.py +280 -0
  70. data/vendor/pygments-main/pygments/lexers/_vim_builtins.py +1939 -0
  71. data/vendor/pygments-main/pygments/lexers/actionscript.py +245 -0
  72. data/vendor/pygments-main/pygments/lexers/agile.py +24 -0
  73. data/vendor/pygments-main/pygments/lexers/algebra.py +240 -0
  74. data/vendor/pygments-main/pygments/lexers/ambient.py +76 -0
  75. data/vendor/pygments-main/pygments/lexers/ampl.py +87 -0
  76. data/vendor/pygments-main/pygments/lexers/apl.py +101 -0
  77. data/vendor/pygments-main/pygments/lexers/archetype.py +318 -0
  78. data/vendor/pygments-main/pygments/lexers/arrow.py +117 -0
  79. data/vendor/pygments-main/pygments/lexers/asm.py +1005 -0
  80. data/vendor/pygments-main/pygments/lexers/automation.py +374 -0
  81. data/vendor/pygments-main/pygments/lexers/bare.py +104 -0
  82. data/vendor/pygments-main/pygments/lexers/basic.py +662 -0
  83. data/vendor/pygments-main/pygments/lexers/bibtex.py +160 -0
  84. data/vendor/pygments-main/pygments/lexers/boa.py +102 -0
  85. data/vendor/pygments-main/pygments/lexers/business.py +627 -0
  86. data/vendor/pygments-main/pygments/lexers/c_cpp.py +344 -0
  87. data/vendor/pygments-main/pygments/lexers/c_like.py +566 -0
  88. data/vendor/pygments-main/pygments/lexers/capnproto.py +78 -0
  89. data/vendor/pygments-main/pygments/lexers/chapel.py +112 -0
  90. data/vendor/pygments-main/pygments/lexers/clean.py +179 -0
  91. data/vendor/pygments-main/pygments/lexers/compiled.py +34 -0
  92. data/vendor/pygments-main/pygments/lexers/configs.py +984 -0
  93. data/vendor/pygments-main/pygments/lexers/console.py +114 -0
  94. data/vendor/pygments-main/pygments/lexers/crystal.py +392 -0
  95. data/vendor/pygments-main/pygments/lexers/csound.py +467 -0
  96. data/vendor/pygments-main/pygments/lexers/css.py +691 -0
  97. data/vendor/pygments-main/pygments/lexers/d.py +256 -0
  98. data/vendor/pygments-main/pygments/lexers/dalvik.py +125 -0
  99. data/vendor/pygments-main/pygments/lexers/data.py +698 -0
  100. data/vendor/pygments-main/pygments/lexers/devicetree.py +109 -0
  101. data/vendor/pygments-main/pygments/lexers/diff.py +165 -0
  102. data/vendor/pygments-main/pygments/lexers/dotnet.py +707 -0
  103. data/vendor/pygments-main/pygments/lexers/dsls.py +960 -0
  104. data/vendor/pygments-main/pygments/lexers/dylan.py +287 -0
  105. data/vendor/pygments-main/pygments/lexers/ecl.py +139 -0
  106. data/vendor/pygments-main/pygments/lexers/eiffel.py +65 -0
  107. data/vendor/pygments-main/pygments/lexers/elm.py +121 -0
  108. data/vendor/pygments-main/pygments/lexers/email.py +151 -0
  109. data/vendor/pygments-main/pygments/lexers/erlang.py +530 -0
  110. data/vendor/pygments-main/pygments/lexers/esoteric.py +304 -0
  111. data/vendor/pygments-main/pygments/lexers/ezhil.py +77 -0
  112. data/vendor/pygments-main/pygments/lexers/factor.py +344 -0
  113. data/vendor/pygments-main/pygments/lexers/fantom.py +250 -0
  114. data/vendor/pygments-main/pygments/lexers/felix.py +273 -0
  115. data/vendor/pygments-main/pygments/lexers/floscript.py +83 -0
  116. data/vendor/pygments-main/pygments/lexers/forth.py +178 -0
  117. data/vendor/pygments-main/pygments/lexers/fortran.py +206 -0
  118. data/vendor/pygments-main/pygments/lexers/foxpro.py +428 -0
  119. data/vendor/pygments-main/pygments/lexers/freefem.py +898 -0
  120. data/vendor/pygments-main/pygments/lexers/functional.py +21 -0
  121. data/vendor/pygments-main/pygments/lexers/gdscript.py +346 -0
  122. data/vendor/pygments-main/pygments/lexers/go.py +101 -0
  123. data/vendor/pygments-main/pygments/lexers/grammar_notation.py +270 -0
  124. data/vendor/pygments-main/pygments/lexers/graph.py +85 -0
  125. data/vendor/pygments-main/pygments/lexers/graphics.py +800 -0
  126. data/vendor/pygments-main/pygments/lexers/haskell.py +870 -0
  127. data/vendor/pygments-main/pygments/lexers/haxe.py +936 -0
  128. data/vendor/pygments-main/pygments/lexers/hdl.py +472 -0
  129. data/vendor/pygments-main/pygments/lexers/hexdump.py +103 -0
  130. data/vendor/pygments-main/pygments/lexers/html.py +614 -0
  131. data/vendor/pygments-main/pygments/lexers/idl.py +281 -0
  132. data/vendor/pygments-main/pygments/lexers/igor.py +420 -0
  133. data/vendor/pygments-main/pygments/lexers/inferno.py +96 -0
  134. data/vendor/pygments-main/pygments/lexers/installers.py +322 -0
  135. data/vendor/pygments-main/pygments/lexers/int_fiction.py +1368 -0
  136. data/vendor/pygments-main/pygments/lexers/iolang.py +63 -0
  137. data/vendor/pygments-main/pygments/lexers/j.py +146 -0
  138. data/vendor/pygments-main/pygments/lexers/javascript.py +1540 -0
  139. data/vendor/pygments-main/pygments/lexers/julia.py +331 -0
  140. data/vendor/pygments-main/pygments/lexers/jvm.py +1673 -0
  141. data/vendor/pygments-main/pygments/lexers/lisp.py +2699 -0
  142. data/vendor/pygments-main/pygments/lexers/make.py +206 -0
  143. data/vendor/pygments-main/pygments/lexers/markup.py +765 -0
  144. data/vendor/pygments-main/pygments/lexers/math.py +21 -0
  145. data/vendor/pygments-main/pygments/lexers/matlab.py +720 -0
  146. data/vendor/pygments-main/pygments/lexers/mime.py +226 -0
  147. data/vendor/pygments-main/pygments/lexers/ml.py +958 -0
  148. data/vendor/pygments-main/pygments/lexers/modeling.py +366 -0
  149. data/vendor/pygments-main/pygments/lexers/modula2.py +1580 -0
  150. data/vendor/pygments-main/pygments/lexers/monte.py +204 -0
  151. data/vendor/pygments-main/pygments/lexers/mosel.py +448 -0
  152. data/vendor/pygments-main/pygments/lexers/ncl.py +894 -0
  153. data/vendor/pygments-main/pygments/lexers/nimrod.py +159 -0
  154. data/vendor/pygments-main/pygments/lexers/nit.py +64 -0
  155. data/vendor/pygments-main/pygments/lexers/nix.py +136 -0
  156. data/vendor/pygments-main/pygments/lexers/oberon.py +121 -0
  157. data/vendor/pygments-main/pygments/lexers/objective.py +504 -0
  158. data/vendor/pygments-main/pygments/lexers/ooc.py +85 -0
  159. data/vendor/pygments-main/pygments/lexers/other.py +41 -0
  160. data/vendor/pygments-main/pygments/lexers/parasail.py +79 -0
  161. data/vendor/pygments-main/pygments/lexers/parsers.py +800 -0
  162. data/vendor/pygments-main/pygments/lexers/pascal.py +644 -0
  163. data/vendor/pygments-main/pygments/lexers/pawn.py +205 -0
  164. data/vendor/pygments-main/pygments/lexers/perl.py +732 -0
  165. data/vendor/pygments-main/pygments/lexers/php.py +321 -0
  166. data/vendor/pygments-main/pygments/lexers/pointless.py +71 -0
  167. data/vendor/pygments-main/pygments/lexers/pony.py +94 -0
  168. data/vendor/pygments-main/pygments/lexers/praat.py +302 -0
  169. data/vendor/pygments-main/pygments/lexers/prolog.py +306 -0
  170. data/vendor/pygments-main/pygments/lexers/promql.py +183 -0
  171. data/vendor/pygments-main/pygments/lexers/python.py +1151 -0
  172. data/vendor/pygments-main/pygments/lexers/qvt.py +152 -0
  173. data/vendor/pygments-main/pygments/lexers/r.py +191 -0
  174. data/vendor/pygments-main/pygments/lexers/rdf.py +463 -0
  175. data/vendor/pygments-main/pygments/lexers/rebol.py +431 -0
  176. data/vendor/pygments-main/pygments/lexers/resource.py +85 -0
  177. data/vendor/pygments-main/pygments/lexers/ride.py +139 -0
  178. data/vendor/pygments-main/pygments/lexers/rnc.py +67 -0
  179. data/vendor/pygments-main/pygments/lexers/roboconf.py +82 -0
  180. data/vendor/pygments-main/pygments/lexers/robotframework.py +552 -0
  181. data/vendor/pygments-main/pygments/lexers/ruby.py +517 -0
  182. data/vendor/pygments-main/pygments/lexers/rust.py +224 -0
  183. data/vendor/pygments-main/pygments/lexers/sas.py +228 -0
  184. data/vendor/pygments-main/pygments/lexers/scdoc.py +83 -0
  185. data/vendor/pygments-main/pygments/lexers/scripting.py +1284 -0
  186. data/vendor/pygments-main/pygments/lexers/sgf.py +61 -0
  187. data/vendor/pygments-main/pygments/lexers/shell.py +914 -0
  188. data/vendor/pygments-main/pygments/lexers/sieve.py +69 -0
  189. data/vendor/pygments-main/pygments/lexers/slash.py +185 -0
  190. data/vendor/pygments-main/pygments/lexers/smalltalk.py +195 -0
  191. data/vendor/pygments-main/pygments/lexers/smv.py +79 -0
  192. data/vendor/pygments-main/pygments/lexers/snobol.py +83 -0
  193. data/vendor/pygments-main/pygments/lexers/solidity.py +92 -0
  194. data/vendor/pygments-main/pygments/lexers/special.py +105 -0
  195. data/vendor/pygments-main/pygments/lexers/sql.py +837 -0
  196. data/vendor/pygments-main/pygments/lexers/stata.py +171 -0
  197. data/vendor/pygments-main/pygments/lexers/supercollider.py +95 -0
  198. data/vendor/pygments-main/pygments/lexers/tcl.py +145 -0
  199. data/vendor/pygments-main/pygments/lexers/templates.py +2264 -0
  200. data/vendor/pygments-main/pygments/lexers/teraterm.py +335 -0
  201. data/vendor/pygments-main/pygments/lexers/testing.py +207 -0
  202. data/vendor/pygments-main/pygments/lexers/text.py +26 -0
  203. data/vendor/pygments-main/pygments/lexers/textedit.py +169 -0
  204. data/vendor/pygments-main/pygments/lexers/textfmts.py +430 -0
  205. data/vendor/pygments-main/pygments/lexers/theorem.py +474 -0
  206. data/vendor/pygments-main/pygments/lexers/tnt.py +263 -0
  207. data/vendor/pygments-main/pygments/lexers/trafficscript.py +54 -0
  208. data/vendor/pygments-main/pygments/lexers/typoscript.py +219 -0
  209. data/vendor/pygments-main/pygments/lexers/unicon.py +412 -0
  210. data/vendor/pygments-main/pygments/lexers/urbi.py +146 -0
  211. data/vendor/pygments-main/pygments/lexers/usd.py +90 -0
  212. data/vendor/pygments-main/pygments/lexers/varnish.py +190 -0
  213. data/vendor/pygments-main/pygments/lexers/verification.py +114 -0
  214. data/vendor/pygments-main/pygments/lexers/web.py +24 -0
  215. data/vendor/pygments-main/pygments/lexers/webidl.py +299 -0
  216. data/vendor/pygments-main/pygments/lexers/webmisc.py +991 -0
  217. data/vendor/pygments-main/pygments/lexers/whiley.py +116 -0
  218. data/vendor/pygments-main/pygments/lexers/x10.py +69 -0
  219. data/vendor/pygments-main/pygments/lexers/xorg.py +37 -0
  220. data/vendor/pygments-main/pygments/lexers/yang.py +104 -0
  221. data/vendor/pygments-main/pygments/lexers/zig.py +124 -0
  222. data/vendor/pygments-main/pygments/modeline.py +1 -1
  223. data/vendor/pygments-main/pygments/plugin.py +4 -2
  224. data/vendor/pygments-main/pygments/regexopt.py +1 -1
  225. data/vendor/pygments-main/pygments/scanner.py +2 -2
  226. data/vendor/pygments-main/pygments/sphinxext.py +2 -4
  227. data/vendor/pygments-main/pygments/style.py +61 -24
  228. data/vendor/pygments-main/pygments/styles/__init__.py +10 -4
  229. data/vendor/pygments-main/pygments/styles/abap.py +1 -1
  230. data/vendor/pygments-main/pygments/styles/algol.py +1 -1
  231. data/vendor/pygments-main/pygments/styles/algol_nu.py +1 -1
  232. data/vendor/pygments-main/pygments/styles/arduino.py +2 -2
  233. data/vendor/pygments-main/pygments/styles/autumn.py +1 -1
  234. data/vendor/pygments-main/pygments/styles/borland.py +1 -1
  235. data/vendor/pygments-main/pygments/styles/bw.py +1 -1
  236. data/vendor/pygments-main/pygments/styles/colorful.py +1 -1
  237. data/vendor/pygments-main/pygments/styles/default.py +1 -1
  238. data/vendor/pygments-main/pygments/styles/emacs.py +1 -1
  239. data/vendor/pygments-main/pygments/styles/friendly.py +1 -1
  240. data/vendor/pygments-main/pygments/styles/fruity.py +1 -1
  241. data/vendor/pygments-main/pygments/styles/igor.py +1 -1
  242. data/vendor/pygments-main/pygments/styles/inkpot.py +67 -0
  243. data/vendor/pygments-main/pygments/styles/lovelace.py +1 -1
  244. data/vendor/pygments-main/pygments/styles/manni.py +1 -1
  245. data/vendor/pygments-main/pygments/styles/monokai.py +4 -3
  246. data/vendor/pygments-main/pygments/styles/murphy.py +1 -1
  247. data/vendor/pygments-main/pygments/styles/native.py +1 -1
  248. data/vendor/pygments-main/pygments/styles/paraiso_dark.py +1 -1
  249. data/vendor/pygments-main/pygments/styles/paraiso_light.py +1 -1
  250. data/vendor/pygments-main/pygments/styles/pastie.py +1 -1
  251. data/vendor/pygments-main/pygments/styles/perldoc.py +1 -1
  252. data/vendor/pygments-main/pygments/styles/rainbow_dash.py +1 -1
  253. data/vendor/pygments-main/pygments/styles/rrt.py +1 -1
  254. data/vendor/pygments-main/pygments/styles/sas.py +1 -1
  255. data/vendor/pygments-main/pygments/styles/solarized.py +134 -0
  256. data/vendor/pygments-main/pygments/styles/stata_dark.py +41 -0
  257. data/vendor/pygments-main/pygments/styles/{stata.py → stata_light.py} +14 -15
  258. data/vendor/pygments-main/pygments/styles/tango.py +1 -1
  259. data/vendor/pygments-main/pygments/styles/trac.py +1 -1
  260. data/vendor/pygments-main/pygments/styles/vim.py +1 -1
  261. data/vendor/pygments-main/pygments/styles/vs.py +1 -1
  262. data/vendor/pygments-main/pygments/styles/xcode.py +1 -1
  263. data/vendor/pygments-main/pygments/token.py +1 -1
  264. data/vendor/pygments-main/pygments/unistring.py +47 -108
  265. data/vendor/pygments-main/pygments/util.py +15 -92
  266. metadata +69 -136
  267. data/CHANGELOG.md +0 -111
  268. data/README.md +0 -121
  269. data/circle.yml +0 -20
  270. data/test/test_data.py +0 -514
  271. data/test/test_data_generated +0 -2582
  272. data/vendor/custom_lexers/github.py +0 -565
  273. data/vendor/pygments-main/CHANGES +0 -1186
  274. data/vendor/pygments-main/MANIFEST.in +0 -6
  275. data/vendor/pygments-main/Makefile +0 -65
  276. data/vendor/pygments-main/README.rst +0 -39
  277. data/vendor/pygments-main/REVISION +0 -1
  278. data/vendor/pygments-main/TODO +0 -12
  279. data/vendor/pygments-main/doc/Makefile +0 -153
  280. data/vendor/pygments-main/doc/_static/favicon.ico +0 -0
  281. data/vendor/pygments-main/doc/_static/logo_new.png +0 -0
  282. data/vendor/pygments-main/doc/_static/logo_only.png +0 -0
  283. data/vendor/pygments-main/doc/_templates/docssidebar.html +0 -3
  284. data/vendor/pygments-main/doc/_templates/indexsidebar.html +0 -25
  285. data/vendor/pygments-main/doc/_themes/pygments14/layout.html +0 -98
  286. data/vendor/pygments-main/doc/_themes/pygments14/static/bodybg.png +0 -0
  287. data/vendor/pygments-main/doc/_themes/pygments14/static/docbg.png +0 -0
  288. data/vendor/pygments-main/doc/_themes/pygments14/static/listitem.png +0 -0
  289. data/vendor/pygments-main/doc/_themes/pygments14/static/logo.png +0 -0
  290. data/vendor/pygments-main/doc/_themes/pygments14/static/pocoo.png +0 -0
  291. data/vendor/pygments-main/doc/_themes/pygments14/static/pygments14.css_t +0 -401
  292. data/vendor/pygments-main/doc/_themes/pygments14/theme.conf +0 -15
  293. data/vendor/pygments-main/doc/conf.py +0 -241
  294. data/vendor/pygments-main/doc/docs/api.rst +0 -354
  295. data/vendor/pygments-main/doc/docs/authors.rst +0 -4
  296. data/vendor/pygments-main/doc/docs/changelog.rst +0 -1
  297. data/vendor/pygments-main/doc/docs/cmdline.rst +0 -166
  298. data/vendor/pygments-main/doc/docs/filterdevelopment.rst +0 -71
  299. data/vendor/pygments-main/doc/docs/filters.rst +0 -41
  300. data/vendor/pygments-main/doc/docs/formatterdevelopment.rst +0 -169
  301. data/vendor/pygments-main/doc/docs/formatters.rst +0 -48
  302. data/vendor/pygments-main/doc/docs/index.rst +0 -66
  303. data/vendor/pygments-main/doc/docs/integrate.rst +0 -40
  304. data/vendor/pygments-main/doc/docs/java.rst +0 -70
  305. data/vendor/pygments-main/doc/docs/lexerdevelopment.rst +0 -728
  306. data/vendor/pygments-main/doc/docs/lexers.rst +0 -69
  307. data/vendor/pygments-main/doc/docs/moinmoin.rst +0 -39
  308. data/vendor/pygments-main/doc/docs/plugins.rst +0 -93
  309. data/vendor/pygments-main/doc/docs/quickstart.rst +0 -205
  310. data/vendor/pygments-main/doc/docs/rstdirective.rst +0 -22
  311. data/vendor/pygments-main/doc/docs/styles.rst +0 -201
  312. data/vendor/pygments-main/doc/docs/tokens.rst +0 -372
  313. data/vendor/pygments-main/doc/docs/unicode.rst +0 -58
  314. data/vendor/pygments-main/doc/download.rst +0 -41
  315. data/vendor/pygments-main/doc/faq.rst +0 -139
  316. data/vendor/pygments-main/doc/index.rst +0 -54
  317. data/vendor/pygments-main/doc/languages.rst +0 -154
  318. data/vendor/pygments-main/doc/make.bat +0 -190
  319. data/vendor/pygments-main/doc/pygmentize.1 +0 -94
  320. data/vendor/pygments-main/external/autopygmentize +0 -101
  321. data/vendor/pygments-main/external/lasso-builtins-generator-9.lasso +0 -162
  322. data/vendor/pygments-main/external/markdown-processor.py +0 -67
  323. data/vendor/pygments-main/external/moin-parser.py +0 -112
  324. data/vendor/pygments-main/external/pygments.bashcomp +0 -38
  325. data/vendor/pygments-main/external/rst-directive.py +0 -82
  326. data/vendor/pygments-main/pygmentize +0 -8
  327. data/vendor/pygments-main/requirements.txt +0 -5
  328. data/vendor/pygments-main/scripts/check_sources.py +0 -211
  329. data/vendor/pygments-main/scripts/debug_lexer.py +0 -246
  330. data/vendor/pygments-main/scripts/detect_missing_analyse_text.py +0 -33
  331. data/vendor/pygments-main/scripts/epydoc.css +0 -280
  332. data/vendor/pygments-main/scripts/get_vimkw.py +0 -74
  333. data/vendor/pygments-main/scripts/pylintrc +0 -301
  334. data/vendor/pygments-main/scripts/vim2pygments.py +0 -935
  335. data/vendor/pygments-main/setup.cfg +0 -10
  336. data/vendor/pygments-main/setup.py +0 -77
  337. data/vendor/pygments-main/tox.ini +0 -7
  338. data/vendor/simplejson/.gitignore +0 -10
  339. data/vendor/simplejson/.travis.yml +0 -5
  340. data/vendor/simplejson/CHANGES.txt +0 -291
  341. data/vendor/simplejson/LICENSE.txt +0 -19
  342. data/vendor/simplejson/MANIFEST.in +0 -5
  343. data/vendor/simplejson/README.rst +0 -19
  344. data/vendor/simplejson/conf.py +0 -179
  345. data/vendor/simplejson/index.rst +0 -628
  346. data/vendor/simplejson/scripts/make_docs.py +0 -18
  347. data/vendor/simplejson/setup.py +0 -104
  348. data/vendor/simplejson/simplejson/__init__.py +0 -510
  349. data/vendor/simplejson/simplejson/_speedups.c +0 -2745
  350. data/vendor/simplejson/simplejson/decoder.py +0 -425
  351. data/vendor/simplejson/simplejson/encoder.py +0 -567
  352. data/vendor/simplejson/simplejson/ordered_dict.py +0 -119
  353. data/vendor/simplejson/simplejson/scanner.py +0 -77
  354. data/vendor/simplejson/simplejson/tests/__init__.py +0 -67
  355. data/vendor/simplejson/simplejson/tests/test_bigint_as_string.py +0 -55
  356. data/vendor/simplejson/simplejson/tests/test_check_circular.py +0 -30
  357. data/vendor/simplejson/simplejson/tests/test_decimal.py +0 -66
  358. data/vendor/simplejson/simplejson/tests/test_decode.py +0 -83
  359. data/vendor/simplejson/simplejson/tests/test_default.py +0 -9
  360. data/vendor/simplejson/simplejson/tests/test_dump.py +0 -67
  361. data/vendor/simplejson/simplejson/tests/test_encode_basestring_ascii.py +0 -46
  362. data/vendor/simplejson/simplejson/tests/test_encode_for_html.py +0 -32
  363. data/vendor/simplejson/simplejson/tests/test_errors.py +0 -34
  364. data/vendor/simplejson/simplejson/tests/test_fail.py +0 -91
  365. data/vendor/simplejson/simplejson/tests/test_float.py +0 -19
  366. data/vendor/simplejson/simplejson/tests/test_indent.py +0 -86
  367. data/vendor/simplejson/simplejson/tests/test_item_sort_key.py +0 -20
  368. data/vendor/simplejson/simplejson/tests/test_namedtuple.py +0 -121
  369. data/vendor/simplejson/simplejson/tests/test_pass1.py +0 -76
  370. data/vendor/simplejson/simplejson/tests/test_pass2.py +0 -14
  371. data/vendor/simplejson/simplejson/tests/test_pass3.py +0 -20
  372. data/vendor/simplejson/simplejson/tests/test_recursion.py +0 -67
  373. data/vendor/simplejson/simplejson/tests/test_scanstring.py +0 -117
  374. data/vendor/simplejson/simplejson/tests/test_separators.py +0 -42
  375. data/vendor/simplejson/simplejson/tests/test_speedups.py +0 -20
  376. data/vendor/simplejson/simplejson/tests/test_tuple.py +0 -49
  377. data/vendor/simplejson/simplejson/tests/test_unicode.py +0 -109
  378. data/vendor/simplejson/simplejson/tool.py +0 -39
data/bench.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require File.join(File.dirname(__FILE__), '/lib/pygments.rb')
2
4
  require 'benchmark'
3
5
 
@@ -8,15 +10,14 @@ num = ARGV[0] ? ARGV[0].to_i : 10
8
10
  # we can also repeat the code itself
9
11
  repeats = ARGV[1] ? ARGV[1].to_i : 1
10
12
 
11
- code = File.open('test/test_data.py').read.to_s * repeats
13
+ code = File.open('test/test_pygments.rb').read.to_s * repeats
12
14
 
13
15
  puts "Benchmarking....\n"
14
- puts "Size: " + code.bytesize.to_s + " bytes\n"
15
- puts "Iterations: " + num.to_s + "\n"
16
+ puts 'Size: ' + code.bytesize.to_s + " bytes\n"
17
+ puts 'Iterations: ' + num.to_s + "\n"
16
18
 
17
19
  Benchmark.bm(40) do |x|
18
- x.report("pygments popen ") { for i in 1..num; Pygments.highlight(code, :lexer => 'python'); end }
19
- x.report("pygments popen (process already started) ") { for i in 1..num; Pygments.highlight(code, :lexer => 'python'); end }
20
- x.report("pygments popen (process already started 2) ") { for i in 1..num; Pygments.highlight(code, :lexer => 'python'); end }
20
+ x.report('pygments popen ') { (1..num).each { |_i|; Pygments.highlight(code, lexer: 'python'); } }
21
+ x.report('pygments popen (process already started) ') { (1..num).each { |_i|; Pygments.highlight(code, lexer: 'python'); } }
22
+ x.report('pygments popen (process already started 2) ') { (1..num).each { |_i|; Pygments.highlight(code, lexer: 'python'); } }
21
23
  end
22
-
@@ -1,8 +1,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require File.join(File.dirname(__FILE__), '/lib/pygments.rb')
2
4
 
3
5
  # Simple marshalling
4
6
  serialized_lexers = Marshal.dump(Pygments.lexers!)
5
7
 
6
8
  # Write to a file
7
- File.open("lexers", 'wb') { |file| file.write(serialized_lexers) }
8
-
9
+ File.open('lexers', 'wb') { |file| file.write(serialized_lexers) }
@@ -1,10 +1,9 @@
1
- # coding: utf-8
2
1
  # frozen_string_literal: true
2
+
3
3
  require File.join(File.dirname(__FILE__), 'pygments/popen')
4
4
  require 'forwardable'
5
5
 
6
6
  module Pygments
7
-
8
7
  autoload :Lexer, 'pygments/lexer'
9
8
 
10
9
  class << self
@@ -16,14 +15,14 @@ module Pygments
16
15
  end
17
16
 
18
17
  def_delegators :engine,
19
- :formatters,
20
- :lexers,
21
- :lexers!,
22
- :filters,
23
- :styles,
24
- :css,
25
- :lexer_name_for,
26
- :highlight,
27
- :start
18
+ :formatters,
19
+ :lexers,
20
+ :lexers!,
21
+ :filters,
22
+ :styles,
23
+ :css,
24
+ :lexer_name_for,
25
+ :highlight,
26
+ :start
28
27
  end
29
28
  end
@@ -1,5 +1,5 @@
1
- # coding: utf-8
2
1
  # frozen_string_literal: true
2
+
3
3
  module Pygments
4
4
  class Lexer < Struct.new(:name, :aliases, :filenames, :mimetypes)
5
5
  @lexers = []
@@ -34,13 +34,13 @@ module Pygments
34
34
  m[1].scan(/./).each do |s|
35
35
  extnames << extname.sub(m[0], s)
36
36
  end
37
- elsif extname != ""
37
+ elsif extname != ''
38
38
  extnames << extname
39
39
  end
40
40
 
41
41
  extnames.each do |the_extname|
42
42
  @extname_index[the_extname] = lexer
43
- @index[the_extname.downcase.sub(/^\./, "")] ||= lexer
43
+ @index[the_extname.downcase.sub(/^\./, '')] ||= lexer
44
44
  end
45
45
  end
46
46
 
@@ -142,8 +142,8 @@ module Pygments
142
142
  Pygments.highlight(text, options)
143
143
  end
144
144
 
145
- alias_method :==, :equal?
146
- alias_method :eql?, :equal?
145
+ alias == equal?
146
+ alias eql? equal?
147
147
  end
148
148
 
149
149
  lexers.values.each { |h| Lexer.create(h) }
@@ -1,6 +1,7 @@
1
- #!/usr/bin/env python
1
+ #!/usr/bin/env python3
2
2
  # -*- coding: utf-8 -*-
3
3
 
4
+ import struct
4
5
  import sys, re, os, signal
5
6
  import traceback
6
7
  if 'PYGMENTS_PATH' in os.environ:
@@ -9,15 +10,11 @@ if 'PYGMENTS_PATH' in os.environ:
9
10
  dirname = os.path.dirname
10
11
 
11
12
  base_dir = dirname(dirname(dirname(os.path.abspath(__file__))))
12
- sys.path.append(base_dir + "/vendor")
13
13
  sys.path.append(base_dir + "/vendor/pygments-main")
14
- sys.path.append(base_dir + "/vendor/simplejson")
15
14
 
16
15
  import pygments
17
16
  from pygments import lexers, formatters, styles, filters
18
17
 
19
- from threading import Lock
20
-
21
18
  try:
22
19
  import json
23
20
  except ImportError:
@@ -27,22 +24,16 @@ def _convert_keys(dictionary):
27
24
  if not isinstance(dictionary, dict):
28
25
  return dictionary
29
26
  return dict((str(k), _convert_keys(v))
30
- for k, v in dictionary.items())
27
+ for k, v in list(dictionary.items()))
31
28
 
32
29
  def _write_error(error):
33
30
  res = {"error": error}
34
- out_header = json.dumps(res).encode('utf-8')
35
- bits = _get_fixed_bits_from_header(out_header)
36
- sys.stdout.write(bits + "\n")
37
- sys.stdout.flush()
38
- sys.stdout.write(out_header + "\n")
31
+ out_header_bytes = json.dumps(res).encode('utf-8')
32
+ sys.stdout.buffer.write(struct.pack('!i', len(out_header_bytes)))
33
+ sys.stdout.buffer.write(out_header_bytes)
39
34
  sys.stdout.flush()
40
35
  return
41
36
 
42
- def _get_fixed_bits_from_header(out_header):
43
- size = len(out_header)
44
- return "".join(map(lambda y:str((size>>y)&1), range(32-1, -1, -1)))
45
-
46
37
  def _signal_handler(signal, frame):
47
38
  """
48
39
  Handle the signal given in the first argument, exiting gracefully
@@ -163,12 +154,9 @@ class Mentos(object):
163
154
  res = json.dumps(res)
164
155
 
165
156
  elif method == 'highlight':
166
- try:
167
- text = text.decode('utf-8')
168
- except UnicodeDecodeError:
169
- # The text may already be encoded
170
- text = text
171
157
  res = self.highlight_text(text, lexer, formatter_name, args, _convert_keys(opts))
158
+ if type(res) is bytes:
159
+ res = res.decode('utf-8')
172
160
 
173
161
  elif method == 'css':
174
162
  kwargs = _convert_keys(kwargs)
@@ -193,29 +181,19 @@ class Mentos(object):
193
181
 
194
182
 
195
183
  def _send_data(self, res, method):
196
-
197
184
  # Base header. We'll build on this, adding keys as necessary.
198
185
  base_header = {"method": method}
199
186
 
200
- res_bytes = len(res) + 1
201
- base_header["bytes"] = res_bytes
202
-
203
- out_header = json.dumps(base_header).encode('utf-8')
187
+ res_bytes = res.encode("utf-8")
188
+ bytes = len(res_bytes)
189
+ base_header["bytes"] = bytes
204
190
 
205
- # Following the protocol, send over a fixed size represenation of the
206
- # size of the JSON header
207
- bits = _get_fixed_bits_from_header(out_header)
191
+ out_header_bytes = json.dumps(base_header).encode('utf-8')
208
192
 
209
193
  # Send it to Rubyland
210
- sys.stdout.write(bits + "\n")
211
- sys.stdout.flush()
212
-
213
- # Send the header.
214
- sys.stdout.write(out_header + "\n")
215
- sys.stdout.flush()
216
-
217
- # Finally, send the result
218
- sys.stdout.write(res + "\n")
194
+ sys.stdout.buffer.write(struct.pack('!i', len(out_header_bytes)))
195
+ sys.stdout.buffer.write(out_header_bytes)
196
+ sys.stdout.buffer.write(res_bytes)
219
197
  sys.stdout.flush()
220
198
 
221
199
 
@@ -258,27 +236,16 @@ class Mentos(object):
258
236
  The header is of form:
259
237
  { "method": "highlight", "args": [], "kwargs": {"arg1": "v"}, "bytes": 128, "fd": "8"}
260
238
  """
261
- lock = Lock()
262
239
 
263
240
  while True:
264
- # The loop begins by reading off a simple 32-arity string
265
- # representing an integer of 32 bits. This is the length of
266
- # our JSON header.
267
- size = sys.stdin.read(32)
241
+ header_size_bytes = sys.stdin.buffer.read(4)
242
+ if not header_size_bytes:
243
+ break
268
244
 
269
- lock.acquire()
245
+ header_size = struct.unpack('!i', header_size_bytes)[0]
270
246
 
271
247
  try:
272
- # Read from stdin the amount of bytes we were told to expect.
273
- header_bytes = int(size, 2)
274
-
275
- # Sanity check the size
276
- size_regex = re.compile('[0-1]{32}')
277
- if not size_regex.match(size):
278
- _write_error("Size received is not valid.")
279
-
280
- line = sys.stdin.read(header_bytes)
281
-
248
+ line = sys.stdin.buffer.read(header_size).decode('utf-8')
282
249
  header = json.loads(line)
283
250
 
284
251
  method, args, kwargs, lexer = self._parse_header(header)
@@ -291,8 +258,8 @@ class Mentos(object):
291
258
  if kwargs:
292
259
  _bytes = kwargs.get("bytes", 0)
293
260
 
294
- # Read up to the given number bytes (possibly 0)
295
- text = sys.stdin.read(_bytes)
261
+ # Read up to the given number of *bytes* (not chars) (possibly 0)
262
+ text = sys.stdin.buffer.read(_bytes).decode('utf-8')
296
263
 
297
264
  # Sanity check the return.
298
265
  if _bytes:
@@ -312,9 +279,6 @@ class Mentos(object):
312
279
  tb = traceback.format_exc()
313
280
  _write_error(tb)
314
281
 
315
- finally:
316
- lock.release()
317
-
318
282
  def main():
319
283
 
320
284
  # Signal handlers to trap signals.
@@ -325,11 +289,7 @@ def main():
325
289
 
326
290
  mentos = Mentos()
327
291
 
328
- if sys.platform == "win32":
329
- # disable CRLF
330
- import msvcrt
331
- msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)
332
- else:
292
+ if sys.platform != "win32":
333
293
  # close fd's inherited from the ruby parent
334
294
  import resource
335
295
  maxfd = resource.getrlimit(resource.RLIMIT_NOFILE)[1]
@@ -346,6 +306,3 @@ def main():
346
306
 
347
307
  if __name__ == "__main__":
348
308
  main()
349
-
350
-
351
-
@@ -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,40 +13,38 @@ 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]
16
+ def popen4(argv)
17
+ stdin, stdout, stderr, wait_thr = Open3.popen3(*argv)
18
+ while (pid = wait_thr.pid).nil? && wait_thr.alive?
19
+ # For unknown reasons, wait_thr.pid is not immediately available on JRuby
20
+ end
21
+ [pid, stdin, stdout, stderr]
22
22
  end
23
23
 
24
24
  # Get things started by opening a pipe to mentos (the freshmaker), a
25
25
  # Python process that talks to the Pygments library. We'll talk back and
26
26
  # forth across this pipe.
27
- def start(pygments_path = File.expand_path('../../../vendor/pygments-main/', __FILE__))
27
+ def start(pygments_path = File.expand_path('../../vendor/pygments-main', __dir__))
28
28
  begin
29
- @log = Logger.new(ENV['MENTOS_LOG'] ||= File::NULL)
29
+ @log = Logger.new(ENV['MENTOS_LOG'] || File::NULL)
30
30
  @log.level = Logger::INFO
31
- @log.datetime_format = "%Y-%m-%d %H:%M "
32
- rescue
33
- @log = Logger.new(File::NULL)
31
+ @log.datetime_format = '%Y-%m-%d %H:%M '
34
32
  end
35
33
 
36
34
  ENV['PYGMENTS_PATH'] = pygments_path
37
35
 
38
36
  # Make sure we kill off the child when we're done
39
- at_exit { stop "Exiting" }
37
+ at_exit { stop 'Exiting' }
40
38
 
41
39
  # A pipe to the mentos python process. #popen4 gives us
42
40
  # the pid and three IO objects to write and read.
43
- script = "#{python_binary} #{File.expand_path('../mentos.py', __FILE__)}"
44
- @pid, @in, @out, @err = popen4(script)
41
+ argv = [*python_binary, File.expand_path('mentos.py', __dir__)]
42
+ @pid, @in, @out, @err = popen4(argv)
43
+ @in.binmode
44
+ @out.binmode
45
45
  @log.info "Starting pid #{@pid} with fd #{@out.to_i} and python #{python_binary}."
46
46
  end
47
47
 
48
- def windows?
49
- RUBY_PLATFORM =~ /mswin|mingw/
50
- end
51
-
52
48
  def python_binary
53
49
  @python_binary ||= find_python_binary
54
50
  end
@@ -58,14 +54,13 @@ module Pygments
58
54
  end
59
55
 
60
56
  # Detect a suitable Python binary to use.
61
- # Or return $PYGMENTS_RB_PYTHON if it's exists.
62
57
  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'
58
+ if Gem.win_platform?
59
+ return %w[py python3 python].first { |py| !which(py).nil? }
67
60
  end
68
- return which('python2') || which('python')
61
+
62
+ # On non-Windows platforms, we simply rely on shebang
63
+ []
69
64
  end
70
65
 
71
66
  # Cross platform which command
@@ -73,12 +68,12 @@ module Pygments
73
68
  def which(command)
74
69
  exts = ENV['PATHEXT'] ? ENV['PATHEXT'].split(';') : ['']
75
70
  ENV['PATH'].split(File::PATH_SEPARATOR).each do |dir|
76
- exts.each { |ext|
71
+ exts.each do |ext|
77
72
  path = File.join(dir, "#{command}#{ext}")
78
73
  return path if File.executable?(path) && !File.directory?(path)
79
- }
74
+ end
80
75
  end
81
- return nil
76
+ nil
82
77
  end
83
78
 
84
79
  # Stop the child process by issuing a kill -9.
@@ -94,14 +89,14 @@ module Pygments
94
89
  # the signal isn't sent); but we have permissions, and
95
90
  # we're not doing anything invalid here.
96
91
  def stop(reason)
97
- if @pid
92
+ unless @pid.nil?
93
+ @log.info "Killing pid: #{@pid}. Reason: #{reason}"
98
94
  begin
99
95
  Process.kill('KILL', @pid)
100
96
  Process.waitpid(@pid)
101
97
  rescue Errno::ESRCH, Errno::ECHILD
102
98
  end
103
99
  end
104
- @log.info "Killing pid: #{@pid.to_s}. Reason: #{reason}"
105
100
  @pid = nil
106
101
  end
107
102
 
@@ -116,30 +111,29 @@ module Pygments
116
111
  # Returns true if the child is alive.
117
112
  def alive?
118
113
  return true if defined?(@pid) && @pid && Process.kill(0, @pid)
114
+
119
115
  false
120
116
  rescue Errno::ENOENT, Errno::ESRCH
121
117
  false
122
118
  rescue Errno::EPERM
123
- raise MentosError, "EPERM checking if child process is alive."
119
+ raise MentosError, 'EPERM checking if child process is alive.'
124
120
  end
125
121
 
126
122
  # Public: Get an array of available Pygments formatters
127
123
  #
128
124
  # Returns an array of formatters.
129
125
  def formatters
130
- mentos(:get_all_formatters).inject(Hash.new) do | hash, (name, desc, aliases) |
126
+ mentos(:get_all_formatters).each_with_object({}) do |(name, desc, aliases), hash|
131
127
  # Remove the long-winded and repetitive 'Formatter' suffix
132
128
  name.sub!(/Formatter$/, '')
133
129
  hash[name] = {
134
- :name => name,
135
- :description => desc,
136
- :aliases => aliases
130
+ name: name,
131
+ description: desc,
132
+ aliases: aliases
137
133
  }
138
- hash
139
134
  end
140
135
  end
141
136
 
142
-
143
137
  # Public: Get all lexers from a serialized array. This avoids needing to spawn
144
138
  # mentos when it's not really needed (e.g., one-off jobs, loading the Rails env, etc).
145
139
  #
@@ -147,33 +141,25 @@ module Pygments
147
141
  #
148
142
  # Returns an array of lexers.
149
143
  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
144
+ lexer_file = File.expand_path('../../lexers', __dir__)
145
+ raw = File.open(lexer_file, 'rb').read
146
+ Marshal.load(raw)
147
+ rescue Errno::ENOENT
148
+ raise MentosError, 'Error loading lexer file. Was it created and vendored?'
157
149
  end
158
150
 
159
151
  # Public: Get back all available lexers from mentos itself
160
152
  #
161
153
  # Returns an array of lexers.
162
154
  def lexers!
163
- mentos(:get_all_lexers).inject(Hash.new) do |hash, lxr|
155
+ mentos(:get_all_lexers).each_with_object({}) do |lxr, hash|
164
156
  name = lxr[0]
165
157
  hash[name] = {
166
- :name => name,
167
- :aliases => lxr[1],
168
- :filenames => lxr[2],
169
- :mimetypes => lxr[3]
158
+ name: name,
159
+ aliases: lxr[1],
160
+ filenames: lxr[2],
161
+ mimetypes: lxr[3]
170
162
  }
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
163
  end
178
164
  end
179
165
 
@@ -188,7 +174,7 @@ module Pygments
188
174
  end
189
175
 
190
176
  # Public: Return css for highlighted code
191
- def css(klass='', opts={})
177
+ def css(klass = '', opts = {})
192
178
  if klass.is_a?(Hash)
193
179
  opts = klass
194
180
  klass = ''
@@ -199,17 +185,13 @@ module Pygments
199
185
  # Public: Return the name of a lexer.
200
186
  def lexer_name_for(*args)
201
187
  # Pop off the last arg if it's a hash, which becomes our opts
202
- if args.last.is_a?(Hash)
203
- opts = args.pop
204
- else
205
- opts = {}
206
- end
188
+ opts = if args.last.is_a?(Hash)
189
+ args.pop
190
+ else
191
+ {}
192
+ end
207
193
 
208
- if args.last.is_a?(String)
209
- code = args.pop
210
- else
211
- code = nil
212
- end
194
+ code = (args.pop if args.last.is_a?(String))
213
195
 
214
196
  mentos(:lexer_name_for, args, opts, code)
215
197
  end
@@ -221,7 +203,7 @@ module Pygments
221
203
  #
222
204
  # Returns the highlighted string
223
205
  # or nil when the request to the Python process timed out.
224
- def highlight(code, opts={})
206
+ def highlight(code, opts = {})
225
207
  # If the caller didn't give us any code, we have nothing to do,
226
208
  # so return right away.
227
209
  return code if code.nil? || code.empty?
@@ -234,137 +216,163 @@ module Pygments
234
216
 
235
217
  # Get back the string from mentos and force encoding if we can
236
218
  str = mentos(:highlight, nil, opts, code)
237
- str.force_encoding(opts[:options][:outencoding]) if str.respond_to?(:force_encoding)
219
+ if str.respond_to?(:force_encoding)
220
+ str.force_encoding(opts[:options][:outencoding])
221
+ end
238
222
  str
239
223
  end
240
224
 
241
225
  private
242
226
 
227
+ def with_watchdog(timeout_time, error_message)
228
+ state_mutex = Mutex.new
229
+ state = :alive
230
+
231
+ watchdog = timeout_time > 0 ? Thread.new do
232
+ state_mutex.synchronize do
233
+ state_mutex.sleep(timeout_time) if state != :finished
234
+ if state != :finished
235
+ @log.error error_message
236
+ stop error_message
237
+ state = :timeout
238
+ end
239
+ end
240
+ end : nil
241
+ begin
242
+ yield
243
+ ensure
244
+ if watchdog
245
+ state_mutex.synchronize do
246
+ state = :finished if state == :alive
247
+ watchdog.wakeup if watchdog.alive?
248
+ end
249
+ watchdog.join
250
+ end
251
+
252
+ raise MentosError, error_message if state == :timeout
253
+ end
254
+ end
255
+
243
256
  # Our 'rpc'-ish request to mentos. Requires a method name, and then optional
244
257
  # args, kwargs, code.
245
- def mentos(method, args=[], kwargs={}, original_code=nil)
258
+ def mentos(method, args = [], kwargs = {}, original_code = nil)
246
259
  # Open the pipe if necessary
247
260
  start unless alive?
248
261
 
249
- begin
250
- # Timeout requests that take too long.
251
- # Invalid MENTOS_TIMEOUT results in just using default.
252
- timeout_time = Integer(ENV["MENTOS_TIMEOUT"]) rescue 8
253
-
254
- Timeout::timeout(timeout_time) do
255
- # For sanity checking on both sides of the pipe when highlighting, we prepend and
256
- # append an id. mentos checks that these are 8 character ids and that they match.
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
266
- end
262
+ # Timeout requests that take too long.
263
+ # Invalid MENTOS_TIMEOUT results in just using default.
264
+ timeout_time = kwargs.delete(:timeout)
265
+ if timeout_time.nil?
266
+ timeout_time = begin
267
+ Integer(ENV['MENTOS_TIMEOUT'])
268
+ rescue TypeError
269
+ 0
270
+ end
271
+ end
272
+
273
+ # For sanity checking on both sides of the pipe when highlighting, we prepend and
274
+ # append an id. mentos checks that these are 8 character ids and that they match.
275
+ # It then returns the id's back to Rubyland.
276
+ id = (0...8).map { rand(65..89).chr }.join
277
+ code = original_code ? add_ids(original_code, id) : nil
267
278
 
268
- kwargs.freeze
269
- kwargs = kwargs.merge("fd" => @out.to_i, "id" => id, "bytes" => bytesize)
270
- out_header = MultiJson.dump(:method => method, :args => args, :kwargs => kwargs)
279
+ # Add metadata to the header and generate it.
280
+ bytesize = if code
281
+ code.bytesize
282
+ else
283
+ 0
284
+ end
271
285
 
286
+ kwargs.freeze
287
+ kwargs = kwargs.merge('fd' => @out.to_i, 'id' => id, 'bytes' => bytesize)
288
+ out_header = JSON.generate(method: method, args: args, kwargs: kwargs)
289
+
290
+ begin
291
+ res = with_watchdog(timeout_time, "Timeout on a mentos #{method} call") do
272
292
  # Get the size of the header itself and write that.
273
- bits = get_fixed_bits_from_header(out_header)
274
- @in.write(bits)
293
+ @in.write([out_header.bytesize].pack('N'))
294
+ @log.info "Size out: #{out_header.bytesize}"
275
295
 
276
296
  # mentos is now waiting for the header, and, potentially, code.
277
- write_data(out_header, code)
297
+ @in.write(out_header)
298
+ @log.info "Out header: #{out_header}"
299
+ @in.write(code) unless code.nil?
278
300
 
279
- check_for_error
301
+ @in.flush
280
302
 
281
303
  # mentos will now return data to us. First it sends the header.
282
- header = get_header
283
304
 
284
- # Now handle the header, any read any more data required.
285
- res = handle_header_and_return(header, id)
286
-
287
- # Finally, return what we got.
288
- return_result(res, method)
289
- end
290
- rescue Timeout::Error
291
- # If we timeout, we need to clear out the pipe and start over.
292
- @log.error "Timeout on a mentos #{method} call"
293
- stop "Timeout on mentos #{method} call."
294
- end
295
-
296
- rescue Errno::EPIPE, EOFError
297
- stop "EPIPE"
298
- raise MentosError, "EPIPE"
299
- end
300
-
301
- def check_for_error
302
- return if @err.closed?
305
+ header_len_bytes = @out.read(4)
306
+ if header_len_bytes.nil?
307
+ raise Errno::EPIPE, %(Failed to read response from Python process on a mentos #{method} call)
308
+ end
303
309
 
304
- timeout_time = 0.25 # set a very little timeout so that we do not hang the parser
310
+ header_len = header_len_bytes.unpack('N')[0]
311
+ @log.info "Size in: #{header_len}"
312
+ header = @out.read(header_len)
305
313
 
306
- Timeout::timeout(timeout_time) do
307
- error_msg = @err.read
314
+ # Now handle the header, any read any more data required.
315
+ handle_header_and_return(header, id)
316
+ end
308
317
 
309
- unless error_msg.empty?
310
- @log.error "Error running python script: #{error_msg}"
311
- stop "Error running python script: #{error_msg}"
312
- raise MentosError, error_msg
318
+ # Finally, return what we got.
319
+ return_result(res, method)
320
+ rescue Errno::EPIPE => e
321
+ begin
322
+ error_msg = @err.read
323
+ @log.error "Error running Python script: #{error_msg}"
324
+ stop "Error running Python script: #{error_msg}"
325
+ raise MentosError, %(#{e}: #{error_msg})
326
+ rescue Errno::EPIPE
327
+ @log.error e.to_s
328
+ stop e.to_s
329
+ raise e
313
330
  end
331
+ rescue StandardError => e
332
+ @log.error e.to_s
333
+ stop e.to_s
334
+ raise e
314
335
  end
315
- rescue Timeout::Error
316
- # during the specified time no error were found
317
- @err.close
318
336
  end
319
337
 
320
-
321
338
  # Based on the header we receive, determine if we need
322
339
  # to read more bytes, and read those bytes if necessary.
323
340
  #
324
341
  # Then, do a sanity check with the ids.
325
342
  #
326
- # Returns a result — either highlighted text or metadata.
343
+ # Returns a result - either highlighted text or metadata.
327
344
  def handle_header_and_return(header, id)
328
345
  if header
346
+ @log.info "In header: #{header}"
329
347
  header = header_to_json(header)
330
348
  bytes = header[:bytes]
331
349
 
332
350
  # Read more bytes (the actual response body)
333
351
  res = @out.read(bytes.to_i)
334
352
 
335
- if header[:method] == "highlight"
353
+ if header[:method] == 'highlight'
336
354
  # 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
355
+ raise MentosError, 'No highlight result back from mentos.' if res.nil?
342
356
 
343
- # Remove the newline from Python
344
- res = res[0..-2]
345
- @log.info "Highlight in process."
357
+ @log.info 'Highlight in process.'
346
358
 
347
359
  # Get the id's
348
360
  start_id = res[0..7]
349
361
  end_id = res[-8..-1]
350
362
 
351
363
  # 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."
364
+ if !((start_id == id) && (end_id == id))
355
365
  raise MentosError, "ID's did not match. Aborting."
356
366
  else
357
367
  # We're good. Remove the padding
358
368
  res = res[10..-11]
359
- @log.info "Highlighting complete."
369
+ @log.info 'Highlighting complete.'
360
370
  res
361
371
  end
362
372
  end
363
373
  res
364
374
  else
365
- @log.error "No header data back."
366
- stop "No header data back."
367
- raise MentosError, "No header received back."
375
+ raise MentosError, 'No header received back.'
368
376
  end
369
377
  end
370
378
 
@@ -376,57 +384,11 @@ module Pygments
376
384
  (id + " #{code} #{id}").freeze
377
385
  end
378
386
 
379
- # Write data to mentos, the Python process.
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
387
-
388
- # Sanity check for size (32-arity of 0's and 1's)
389
- def size_check(size)
390
- size_regex = /[0-1]{32}/
391
- if size_regex.match(size)
392
- true
393
- else
394
- false
395
- 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
-
413
- # Read the amount of bytes we should be expecting. We first
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
423
- end
424
-
425
387
  # Return the final result for the API. Return Ruby objects for the methods that
426
388
  # want them, text otherwise.
427
389
  def return_result(res, method)
428
390
  unless method == :lexer_name_for || method == :highlight || method == :css
429
- res = MultiJson.load(res, :symbolize_keys => true)
391
+ res = JSON.parse(res, symbolize_names: true)
430
392
  end
431
393
  res = res.rstrip if res.class == String
432
394
  res
@@ -434,27 +396,13 @@ module Pygments
434
396
 
435
397
  # Convert a text header into JSON for easy access.
436
398
  def header_to_json(header)
437
- @log.info "[In header: #{header} "
438
- header = MultiJson.load(header, :symbolize_keys => true)
399
+ header = JSON.parse(header, symbolize_names: true)
439
400
 
440
401
  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
402
  raise MentosError, header[:error]
446
403
  else
447
404
  header
448
405
  end
449
406
  end
450
-
451
- def get_fixed_bits_from_header(out_header)
452
- size = out_header.bytesize
453
-
454
- # Fixed 32 bits to represent the int. We return a string
455
- # representation: e.g, "00000000000000000000000000011110"
456
- Array.new(32) { |i| size[i] }.reverse!.join
457
- end
458
407
  end
459
408
  end
460
-