pygments.rb 1.2.1 → 2.0.0.rc2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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
-