pygments.rb 2.0.0.rc3 → 2.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (286) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci.yml +13 -1
  3. data/.gitignore +0 -1
  4. data/.rubocop.yml +16 -0
  5. data/CHANGELOG.adoc +19 -0
  6. data/README.adoc +1 -3
  7. data/Rakefile +0 -14
  8. data/bench.rb +11 -6
  9. data/lib/pygments/lexer.rb +84 -62
  10. data/lib/pygments/mentos.py +7 -49
  11. data/lib/pygments/popen.rb +133 -173
  12. data/lib/pygments/version.rb +1 -1
  13. data/lib/pygments.rb +15 -6
  14. data/pygments.rb.gemspec +16 -11
  15. data/test/test_pygments.rb +19 -40
  16. data/vendor/pygments-main/{Pygments-2.7.3.dist-info → Pygments-2.10.0.dist-info}/AUTHORS +13 -1
  17. data/vendor/pygments-main/{Pygments-2.7.3.dist-info → Pygments-2.10.0.dist-info}/INSTALLER +0 -0
  18. data/vendor/pygments-main/{Pygments-2.7.3.dist-info → Pygments-2.10.0.dist-info}/LICENSE +1 -1
  19. data/vendor/pygments-main/{Pygments-2.7.3.dist-info → Pygments-2.10.0.dist-info}/METADATA +8 -9
  20. data/vendor/pygments-main/Pygments-2.10.0.dist-info/RECORD +524 -0
  21. data/vendor/pygments-main/{Pygments-2.7.3.dist-info → Pygments-2.10.0.dist-info}/REQUESTED +0 -0
  22. data/vendor/pygments-main/{Pygments-2.7.3.dist-info → Pygments-2.10.0.dist-info}/WHEEL +0 -0
  23. data/vendor/pygments-main/{Pygments-2.7.3.dist-info → Pygments-2.10.0.dist-info}/entry_points.txt +0 -0
  24. data/vendor/pygments-main/{Pygments-2.7.3.dist-info → Pygments-2.10.0.dist-info}/top_level.txt +0 -0
  25. data/vendor/pygments-main/bin/pygmentize +1 -1
  26. data/vendor/pygments-main/pygments/__init__.py +2 -3
  27. data/vendor/pygments-main/pygments/__main__.py +1 -2
  28. data/vendor/pygments-main/pygments/cmdline.py +179 -159
  29. data/vendor/pygments-main/pygments/console.py +1 -2
  30. data/vendor/pygments-main/pygments/filter.py +1 -2
  31. data/vendor/pygments-main/pygments/filters/__init__.py +1 -2
  32. data/vendor/pygments-main/pygments/formatter.py +1 -2
  33. data/vendor/pygments-main/pygments/formatters/__init__.py +2 -3
  34. data/vendor/pygments-main/pygments/formatters/_mapping.py +2 -2
  35. data/vendor/pygments-main/pygments/formatters/bbcode.py +1 -2
  36. data/vendor/pygments-main/pygments/formatters/html.py +53 -25
  37. data/vendor/pygments-main/pygments/formatters/img.py +24 -10
  38. data/vendor/pygments-main/pygments/formatters/irc.py +1 -2
  39. data/vendor/pygments-main/pygments/formatters/latex.py +8 -9
  40. data/vendor/pygments-main/pygments/formatters/other.py +7 -10
  41. data/vendor/pygments-main/pygments/formatters/pangomarkup.py +83 -0
  42. data/vendor/pygments-main/pygments/formatters/rtf.py +1 -2
  43. data/vendor/pygments-main/pygments/formatters/svg.py +5 -4
  44. data/vendor/pygments-main/pygments/formatters/terminal.py +1 -2
  45. data/vendor/pygments-main/pygments/formatters/terminal256.py +24 -3
  46. data/vendor/pygments-main/pygments/lexer.py +7 -6
  47. data/vendor/pygments-main/pygments/lexers/__init__.py +2 -3
  48. data/vendor/pygments-main/pygments/lexers/_asy_builtins.py +1 -2
  49. data/vendor/pygments-main/pygments/lexers/_cl_builtins.py +1 -2
  50. data/vendor/pygments-main/pygments/lexers/_cocoa_builtins.py +16 -12
  51. data/vendor/pygments-main/pygments/lexers/_csound_builtins.py +56 -16
  52. data/vendor/pygments-main/pygments/lexers/_julia_builtins.py +401 -0
  53. data/vendor/pygments-main/pygments/lexers/_lasso_builtins.py +1 -2
  54. data/vendor/pygments-main/pygments/lexers/_lua_builtins.py +1 -2
  55. data/vendor/pygments-main/pygments/lexers/_mapping.py +73 -54
  56. data/vendor/pygments-main/pygments/lexers/_mql_builtins.py +1 -2
  57. data/vendor/pygments-main/pygments/lexers/_mysql_builtins.py +2 -3
  58. data/vendor/pygments-main/pygments/lexers/_openedge_builtins.py +439 -386
  59. data/vendor/pygments-main/pygments/lexers/_php_builtins.py +1 -2
  60. data/vendor/pygments-main/pygments/lexers/_postgres_builtins.py +1 -2
  61. data/vendor/pygments-main/pygments/lexers/_scilab_builtins.py +1 -2
  62. data/vendor/pygments-main/pygments/lexers/_sourcemod_builtins.py +1 -2
  63. data/vendor/pygments-main/pygments/lexers/_stan_builtins.py +1 -2
  64. data/vendor/pygments-main/pygments/lexers/_stata_builtins.py +91 -55
  65. data/vendor/pygments-main/pygments/lexers/_tsql_builtins.py +1 -2
  66. data/vendor/pygments-main/pygments/lexers/_usd_builtins.py +1 -2
  67. data/vendor/pygments-main/pygments/lexers/_vbscript_builtins.py +1 -2
  68. data/vendor/pygments-main/pygments/lexers/_vim_builtins.py +1 -2
  69. data/vendor/pygments-main/pygments/lexers/actionscript.py +9 -10
  70. data/vendor/pygments-main/pygments/lexers/agile.py +1 -2
  71. data/vendor/pygments-main/pygments/lexers/algebra.py +1 -2
  72. data/vendor/pygments-main/pygments/lexers/ambient.py +3 -4
  73. data/vendor/pygments-main/pygments/lexers/amdgpu.py +53 -0
  74. data/vendor/pygments-main/pygments/lexers/ampl.py +1 -2
  75. data/vendor/pygments-main/pygments/lexers/apdlexer.py +448 -0
  76. data/vendor/pygments-main/pygments/lexers/apl.py +7 -5
  77. data/vendor/pygments-main/pygments/lexers/archetype.py +2 -3
  78. data/vendor/pygments-main/pygments/lexers/arrow.py +1 -2
  79. data/vendor/pygments-main/pygments/lexers/asc.py +51 -0
  80. data/vendor/pygments-main/pygments/lexers/asm.py +87 -60
  81. data/vendor/pygments-main/pygments/lexers/automation.py +8 -3
  82. data/vendor/pygments-main/pygments/lexers/bare.py +1 -2
  83. data/vendor/pygments-main/pygments/lexers/basic.py +3 -4
  84. data/vendor/pygments-main/pygments/lexers/bibtex.py +3 -4
  85. data/vendor/pygments-main/pygments/lexers/boa.py +4 -5
  86. data/vendor/pygments-main/pygments/lexers/business.py +3 -4
  87. data/vendor/pygments-main/pygments/lexers/c_cpp.py +61 -36
  88. data/vendor/pygments-main/pygments/lexers/c_like.py +103 -5
  89. data/vendor/pygments-main/pygments/lexers/capnproto.py +1 -2
  90. data/vendor/pygments-main/pygments/lexers/cddl.py +190 -0
  91. data/vendor/pygments-main/pygments/lexers/chapel.py +52 -29
  92. data/vendor/pygments-main/pygments/lexers/clean.py +7 -8
  93. data/vendor/pygments-main/pygments/lexers/compiled.py +1 -2
  94. data/vendor/pygments-main/pygments/lexers/configs.py +139 -48
  95. data/vendor/pygments-main/pygments/lexers/console.py +1 -2
  96. data/vendor/pygments-main/pygments/lexers/crystal.py +53 -79
  97. data/vendor/pygments-main/pygments/lexers/csound.py +3 -4
  98. data/vendor/pygments-main/pygments/lexers/css.py +11 -8
  99. data/vendor/pygments-main/pygments/lexers/d.py +3 -4
  100. data/vendor/pygments-main/pygments/lexers/dalvik.py +1 -2
  101. data/vendor/pygments-main/pygments/lexers/data.py +2 -3
  102. data/vendor/pygments-main/pygments/lexers/devicetree.py +2 -3
  103. data/vendor/pygments-main/pygments/lexers/diff.py +1 -2
  104. data/vendor/pygments-main/pygments/lexers/dotnet.py +7 -8
  105. data/vendor/pygments-main/pygments/lexers/dsls.py +3 -4
  106. data/vendor/pygments-main/pygments/lexers/dylan.py +1 -2
  107. data/vendor/pygments-main/pygments/lexers/ecl.py +4 -6
  108. data/vendor/pygments-main/pygments/lexers/eiffel.py +2 -3
  109. data/vendor/pygments-main/pygments/lexers/elm.py +1 -2
  110. data/vendor/pygments-main/pygments/lexers/email.py +1 -2
  111. data/vendor/pygments-main/pygments/lexers/erlang.py +2 -3
  112. data/vendor/pygments-main/pygments/lexers/esoteric.py +1 -2
  113. data/vendor/pygments-main/pygments/lexers/ezhil.py +1 -2
  114. data/vendor/pygments-main/pygments/lexers/factor.py +3 -4
  115. data/vendor/pygments-main/pygments/lexers/fantom.py +1 -2
  116. data/vendor/pygments-main/pygments/lexers/felix.py +1 -2
  117. data/vendor/pygments-main/pygments/lexers/floscript.py +2 -3
  118. data/vendor/pygments-main/pygments/lexers/forth.py +2 -3
  119. data/vendor/pygments-main/pygments/lexers/fortran.py +9 -7
  120. data/vendor/pygments-main/pygments/lexers/foxpro.py +1 -2
  121. data/vendor/pygments-main/pygments/lexers/freefem.py +1 -2
  122. data/vendor/pygments-main/pygments/lexers/functional.py +1 -2
  123. data/vendor/pygments-main/pygments/lexers/futhark.py +111 -0
  124. data/vendor/pygments-main/pygments/lexers/gcodelexer.py +36 -0
  125. data/vendor/pygments-main/pygments/lexers/gdscript.py +1 -2
  126. data/vendor/pygments-main/pygments/lexers/go.py +3 -4
  127. data/vendor/pygments-main/pygments/lexers/grammar_notation.py +1 -2
  128. data/vendor/pygments-main/pygments/lexers/graph.py +1 -2
  129. data/vendor/pygments-main/pygments/lexers/graphics.py +4 -5
  130. data/vendor/pygments-main/pygments/lexers/graphviz.py +58 -0
  131. data/vendor/pygments-main/pygments/lexers/gsql.py +92 -0
  132. data/vendor/pygments-main/pygments/lexers/haskell.py +5 -6
  133. data/vendor/pygments-main/pygments/lexers/haxe.py +4 -5
  134. data/vendor/pygments-main/pygments/lexers/hdl.py +2 -6
  135. data/vendor/pygments-main/pygments/lexers/hexdump.py +1 -2
  136. data/vendor/pygments-main/pygments/lexers/html.py +7 -8
  137. data/vendor/pygments-main/pygments/lexers/idl.py +1 -2
  138. data/vendor/pygments-main/pygments/lexers/igor.py +1 -2
  139. data/vendor/pygments-main/pygments/lexers/inferno.py +1 -2
  140. data/vendor/pygments-main/pygments/lexers/installers.py +3 -4
  141. data/vendor/pygments-main/pygments/lexers/int_fiction.py +1 -2
  142. data/vendor/pygments-main/pygments/lexers/iolang.py +2 -3
  143. data/vendor/pygments-main/pygments/lexers/j.py +2 -3
  144. data/vendor/pygments-main/pygments/lexers/javascript.py +170 -156
  145. data/vendor/pygments-main/pygments/lexers/jslt.py +94 -0
  146. data/vendor/pygments-main/pygments/lexers/julia.py +136 -185
  147. data/vendor/pygments-main/pygments/lexers/jvm.py +433 -307
  148. data/vendor/pygments-main/pygments/lexers/kuin.py +299 -0
  149. data/vendor/pygments-main/pygments/lexers/lisp.py +25 -23
  150. data/vendor/pygments-main/pygments/lexers/make.py +3 -4
  151. data/vendor/pygments-main/pygments/lexers/markup.py +13 -16
  152. data/vendor/pygments-main/pygments/lexers/math.py +1 -2
  153. data/vendor/pygments-main/pygments/lexers/matlab.py +2666 -93
  154. data/vendor/pygments-main/pygments/lexers/meson.py +155 -0
  155. data/vendor/pygments-main/pygments/lexers/mime.py +7 -23
  156. data/vendor/pygments-main/pygments/lexers/ml.py +8 -9
  157. data/vendor/pygments-main/pygments/lexers/modeling.py +1 -2
  158. data/vendor/pygments-main/pygments/lexers/modula2.py +3 -4
  159. data/vendor/pygments-main/pygments/lexers/monte.py +1 -2
  160. data/vendor/pygments-main/pygments/lexers/mosel.py +1 -2
  161. data/vendor/pygments-main/pygments/lexers/ncl.py +1 -2
  162. data/vendor/pygments-main/pygments/lexers/nimrod.py +2 -3
  163. data/vendor/pygments-main/pygments/lexers/nit.py +1 -2
  164. data/vendor/pygments-main/pygments/lexers/nix.py +1 -2
  165. data/vendor/pygments-main/pygments/lexers/oberon.py +1 -2
  166. data/vendor/pygments-main/pygments/lexers/objective.py +6 -7
  167. data/vendor/pygments-main/pygments/lexers/ooc.py +1 -2
  168. data/vendor/pygments-main/pygments/lexers/other.py +1 -2
  169. data/vendor/pygments-main/pygments/lexers/parasail.py +1 -2
  170. data/vendor/pygments-main/pygments/lexers/parsers.py +26 -27
  171. data/vendor/pygments-main/pygments/lexers/pascal.py +1 -2
  172. data/vendor/pygments-main/pygments/lexers/pawn.py +2 -5
  173. data/vendor/pygments-main/pygments/lexers/perl.py +1 -2
  174. data/vendor/pygments-main/pygments/lexers/php.py +3 -4
  175. data/vendor/pygments-main/pygments/lexers/pointless.py +1 -2
  176. data/vendor/pygments-main/pygments/lexers/pony.py +1 -2
  177. data/vendor/pygments-main/pygments/lexers/praat.py +1 -2
  178. data/vendor/pygments-main/pygments/lexers/procfile.py +43 -0
  179. data/vendor/pygments-main/pygments/lexers/prolog.py +3 -4
  180. data/vendor/pygments-main/pygments/lexers/promql.py +2 -3
  181. data/vendor/pygments-main/pygments/lexers/python.py +38 -17
  182. data/vendor/pygments-main/pygments/lexers/qvt.py +1 -2
  183. data/vendor/pygments-main/pygments/lexers/r.py +1 -2
  184. data/vendor/pygments-main/pygments/lexers/rdf.py +1 -2
  185. data/vendor/pygments-main/pygments/lexers/rebol.py +1 -2
  186. data/vendor/pygments-main/pygments/lexers/resource.py +2 -3
  187. data/vendor/pygments-main/pygments/lexers/ride.py +1 -2
  188. data/vendor/pygments-main/pygments/lexers/rnc.py +2 -3
  189. data/vendor/pygments-main/pygments/lexers/roboconf.py +1 -2
  190. data/vendor/pygments-main/pygments/lexers/robotframework.py +1 -2
  191. data/vendor/pygments-main/pygments/lexers/ruby.py +31 -25
  192. data/vendor/pygments-main/pygments/lexers/rust.py +10 -12
  193. data/vendor/pygments-main/pygments/lexers/sas.py +1 -2
  194. data/vendor/pygments-main/pygments/lexers/scdoc.py +1 -2
  195. data/vendor/pygments-main/pygments/lexers/scripting.py +12 -13
  196. data/vendor/pygments-main/pygments/lexers/sgf.py +1 -2
  197. data/vendor/pygments-main/pygments/lexers/shell.py +15 -17
  198. data/vendor/pygments-main/pygments/lexers/sieve.py +1 -2
  199. data/vendor/pygments-main/pygments/lexers/slash.py +1 -2
  200. data/vendor/pygments-main/pygments/lexers/smalltalk.py +1 -2
  201. data/vendor/pygments-main/pygments/lexers/smithy.py +79 -0
  202. data/vendor/pygments-main/pygments/lexers/smv.py +2 -3
  203. data/vendor/pygments-main/pygments/lexers/snobol.py +1 -2
  204. data/vendor/pygments-main/pygments/lexers/solidity.py +1 -2
  205. data/vendor/pygments-main/pygments/lexers/special.py +44 -30
  206. data/vendor/pygments-main/pygments/lexers/sql.py +8 -13
  207. data/vendor/pygments-main/pygments/lexers/stata.py +1 -2
  208. data/vendor/pygments-main/pygments/lexers/supercollider.py +4 -5
  209. data/vendor/pygments-main/pygments/lexers/tcl.py +4 -5
  210. data/vendor/pygments-main/pygments/lexers/teal.py +88 -0
  211. data/vendor/pygments-main/pygments/lexers/templates.py +34 -35
  212. data/vendor/pygments-main/pygments/lexers/teraterm.py +2 -3
  213. data/vendor/pygments-main/pygments/lexers/testing.py +2 -3
  214. data/vendor/pygments-main/pygments/lexers/text.py +1 -2
  215. data/vendor/pygments-main/pygments/lexers/textedit.py +3 -4
  216. data/vendor/pygments-main/pygments/lexers/textfmts.py +1 -2
  217. data/vendor/pygments-main/pygments/lexers/theorem.py +11 -7
  218. data/vendor/pygments-main/pygments/lexers/thingsdb.py +118 -0
  219. data/vendor/pygments-main/pygments/lexers/tnt.py +26 -17
  220. data/vendor/pygments-main/pygments/lexers/trafficscript.py +2 -3
  221. data/vendor/pygments-main/pygments/lexers/typoscript.py +1 -2
  222. data/vendor/pygments-main/pygments/lexers/unicon.py +1 -2
  223. data/vendor/pygments-main/pygments/lexers/urbi.py +3 -4
  224. data/vendor/pygments-main/pygments/lexers/usd.py +1 -2
  225. data/vendor/pygments-main/pygments/lexers/varnish.py +2 -3
  226. data/vendor/pygments-main/pygments/lexers/verification.py +1 -2
  227. data/vendor/pygments-main/pygments/lexers/web.py +1 -2
  228. data/vendor/pygments-main/pygments/lexers/webassembly.py +120 -0
  229. data/vendor/pygments-main/pygments/lexers/webidl.py +1 -2
  230. data/vendor/pygments-main/pygments/lexers/webmisc.py +5 -5
  231. data/vendor/pygments-main/pygments/lexers/whiley.py +1 -2
  232. data/vendor/pygments-main/pygments/lexers/x10.py +2 -3
  233. data/vendor/pygments-main/pygments/lexers/xorg.py +1 -2
  234. data/vendor/pygments-main/pygments/lexers/yang.py +1 -2
  235. data/vendor/pygments-main/pygments/lexers/zig.py +1 -2
  236. data/vendor/pygments-main/pygments/modeline.py +1 -2
  237. data/vendor/pygments-main/pygments/plugin.py +2 -3
  238. data/vendor/pygments-main/pygments/regexopt.py +2 -3
  239. data/vendor/pygments-main/pygments/scanner.py +1 -2
  240. data/vendor/pygments-main/pygments/sphinxext.py +1 -2
  241. data/vendor/pygments-main/pygments/style.py +4 -5
  242. data/vendor/pygments-main/pygments/styles/__init__.py +5 -2
  243. data/vendor/pygments-main/pygments/styles/abap.py +1 -2
  244. data/vendor/pygments-main/pygments/styles/algol.py +1 -2
  245. data/vendor/pygments-main/pygments/styles/algol_nu.py +1 -2
  246. data/vendor/pygments-main/pygments/styles/arduino.py +1 -2
  247. data/vendor/pygments-main/pygments/styles/autumn.py +1 -2
  248. data/vendor/pygments-main/pygments/styles/borland.py +1 -2
  249. data/vendor/pygments-main/pygments/styles/bw.py +1 -2
  250. data/vendor/pygments-main/pygments/styles/colorful.py +1 -2
  251. data/vendor/pygments-main/pygments/styles/default.py +1 -2
  252. data/vendor/pygments-main/pygments/styles/emacs.py +1 -2
  253. data/vendor/pygments-main/pygments/styles/friendly.py +2 -2
  254. data/vendor/pygments-main/pygments/styles/fruity.py +1 -2
  255. data/vendor/pygments-main/pygments/styles/gruvbox.py +107 -0
  256. data/vendor/pygments-main/pygments/styles/igor.py +1 -2
  257. data/vendor/pygments-main/pygments/styles/inkpot.py +1 -2
  258. data/vendor/pygments-main/pygments/styles/lovelace.py +1 -2
  259. data/vendor/pygments-main/pygments/styles/manni.py +1 -2
  260. data/vendor/pygments-main/pygments/styles/material.py +118 -0
  261. data/vendor/pygments-main/pygments/styles/monokai.py +1 -2
  262. data/vendor/pygments-main/pygments/styles/murphy.py +1 -2
  263. data/vendor/pygments-main/pygments/styles/native.py +2 -2
  264. data/vendor/pygments-main/pygments/styles/paraiso_dark.py +1 -2
  265. data/vendor/pygments-main/pygments/styles/paraiso_light.py +1 -2
  266. data/vendor/pygments-main/pygments/styles/pastie.py +1 -2
  267. data/vendor/pygments-main/pygments/styles/perldoc.py +1 -2
  268. data/vendor/pygments-main/pygments/styles/rainbow_dash.py +1 -2
  269. data/vendor/pygments-main/pygments/styles/rrt.py +1 -2
  270. data/vendor/pygments-main/pygments/styles/sas.py +1 -2
  271. data/vendor/pygments-main/pygments/styles/solarized.py +4 -2
  272. data/vendor/pygments-main/pygments/styles/stata_dark.py +1 -2
  273. data/vendor/pygments-main/pygments/styles/stata_light.py +1 -2
  274. data/vendor/pygments-main/pygments/styles/tango.py +1 -2
  275. data/vendor/pygments-main/pygments/styles/trac.py +1 -2
  276. data/vendor/pygments-main/pygments/styles/vim.py +1 -2
  277. data/vendor/pygments-main/pygments/styles/vs.py +1 -2
  278. data/vendor/pygments-main/pygments/styles/xcode.py +1 -2
  279. data/vendor/pygments-main/pygments/styles/zenburn.py +80 -0
  280. data/vendor/pygments-main/pygments/token.py +1 -2
  281. data/vendor/pygments-main/pygments/unistring.py +1 -2
  282. data/vendor/pygments-main/pygments/util.py +2 -5
  283. metadata +48 -23
  284. data/cache-lexers.rb +0 -9
  285. data/lexers +0 -0
  286. data/vendor/pygments-main/Pygments-2.7.3.dist-info/RECORD +0 -482
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: cb7e6901e07778261de7c0a6283696d5c1593ade93565caf32b2870e11477d39
4
- data.tar.gz: 36d123e7aa363b8f50dfcd884e4d1f0721e6e75c83966c18d83f505e7bbf0b85
3
+ metadata.gz: 494fdb817ce25f9a10420c22c8dce5c725b157da060f61bad53527af80bb1dff
4
+ data.tar.gz: 5bb0321b93ea7bac8ee0675803a5bbeee4b74b3784deb0302e50bde0d4dd53e6
5
5
  SHA512:
6
- metadata.gz: 6ad9b6ac8dce86c289939ffbe3ee8c71268dd04ed3755798f08c75905cac90bf602236ae10448a44162809483ca5f88252985db7537d01818c5dcd348d60fe78
7
- data.tar.gz: 728ca37e69f29ee9c74d2804e7583fdaf2284f330b9f3096612a88c2cc58833f49ad9a642eadd63e883a36cb7ea171b7f7892a205da709be67937e698a1d49f2
6
+ metadata.gz: 363d098055a9887fa9146a2aef00cc5d04929328a55a6c63fca726a34a9b6a4f32d3c4d8f2ba9cf071db23d978fb30868fd6c5d02e2027b1f5bf5529a3394298
7
+ data.tar.gz: a80e5d794c22e8d700995346c113877b4a8440253d2482578c3393f54f4ffe57f8fcb076731f63a96d1706de19fbeb7c81d42130f9cfbe87c1e06a9783821e8c
@@ -5,11 +5,23 @@ on:
5
5
  tags-ignore: [ '**' ]
6
6
  pull_request:
7
7
  jobs:
8
+ rubocop:
9
+ runs-on: ubuntu-latest
10
+ steps:
11
+ - name: Checkout
12
+ uses: actions/checkout@v2
13
+ - name: Set up Ruby
14
+ uses: ruby/setup-ruby@v1
15
+ with:
16
+ ruby-version: '3.0'
17
+ bundler-cache: true
18
+ - name: Rubocop
19
+ run: bundle exec rubocop
8
20
  build:
9
21
  strategy:
10
22
  matrix:
11
23
  ruby: [ 'jruby-9.2', '2.3', '3.0' ]
12
- python: [ '3.5', '3.9' ]
24
+ python: [ '3.5', '3.10' ]
13
25
  platform: [ ubuntu-latest, macos-latest, windows-latest ]
14
26
  runs-on: ${{ matrix.platform }}
15
27
  steps:
data/.gitignore CHANGED
@@ -3,4 +3,3 @@
3
3
  /pkg/
4
4
  /tmp
5
5
  *.pyc
6
- /lexers
data/.rubocop.yml ADDED
@@ -0,0 +1,16 @@
1
+ Metrics/AbcSize:
2
+ Enabled: false
3
+ Metrics/BlockLength:
4
+ Enabled: false
5
+ Metrics/ClassLength:
6
+ Enabled: false
7
+ Metrics/CyclomaticComplexity:
8
+ Enabled: false
9
+ Layout/LineLength:
10
+ Max: 120
11
+ Metrics/MethodLength:
12
+ Enabled: false
13
+ Style/StructInheritance:
14
+ Enabled: false
15
+ Style/Documentation:
16
+ Enabled: false
data/CHANGELOG.adoc CHANGED
@@ -5,6 +5,25 @@
5
5
  This document provides a high-level view of the changes to the {project-name} by release.
6
6
  For a detailed view of what has changed, refer to the {uri-repo}/commits/master[commit history] on GitHub.
7
7
 
8
+ == 2.3.0 (2022-01-05) - @slonopotamus
9
+
10
+ * Add `Pygments.pygments_version` method to query underlying Pygments version ({uri-repo}/issues/226[#226])
11
+ * Update Pygments to 2.10.0 ({uri-repo}/issues/234[#234])
12
+
13
+ == 2.2.0 (2021-03-18) - @slonopotamus
14
+
15
+ * Add support for custom lexers ({uri-repo}/pull/187[#187])
16
+ * Update Pygments to 2.8.1
17
+
18
+ == 2.1.0 (2021-02-14) - @slonopotamus
19
+
20
+ * Update Pygments to 2.8.0
21
+
22
+ == 2.0.0 (2021-01-08) - @slonopotamus
23
+
24
+ * stop sending/receiving `ids` between Ruby and Python
25
+ * use `close_others` Ruby mechanism to prevent file descriptor leaking to Python
26
+
8
27
  == 2.0.0.rc3 (2021-01-08) - @slonopotamus
9
28
 
10
29
  * fix watchdog race condition leading to `ThreadError(<killed thread>)` on JRuby ({uri-repo}/pull/215[#215])
data/README.adoc CHANGED
@@ -1,9 +1,7 @@
1
1
  = {project-name}
2
2
  Ted Nyman <ted@ted.io>; Aman Gupta <aman@tmm1.net>; Marat Radchenko <marat@slonopotamus.org>
3
3
  :project-name: pygments.rb
4
- :project-handle: pygments.rb
5
4
  :slug: pygments/{project-name}
6
- :toc: preamble
7
5
  :uri-project: https://github.com/{slug}
8
6
  :uri-ci: {uri-project}/actions?query=branch%3Amaster
9
7
  :uri-gem: https://rubygems.org/gems/{project-name}
@@ -14,7 +12,7 @@ image:{uri-project}/workflows/CI/badge.svg?branch=master[Build Status,link={uri-
14
12
 
15
13
  == Introduction
16
14
 
17
- {project-name} is a Ruby wrapper for the Python {uri-pygments}[Pygments] syntax highlighter.
15
+ {project-name} is a Ruby wrapper for {uri-pygments}[Pygments] syntax highlighter.
18
16
 
19
17
  {project-name} works by talking over a simple pipe to a long-lived Python child process.
20
18
  This library replaces https://github.com/github/albino[github/albino], as well as an older version of {project-name} that used an embedded Python interpreter.
data/Rakefile CHANGED
@@ -9,8 +9,6 @@ task default: :test
9
9
  # Packaging
10
10
  # ==========================================================
11
11
 
12
- GEMSPEC = eval(File.read('pygments.rb.gemspec'))
13
-
14
12
  require 'rubygems/package_task'
15
13
 
16
14
  # ==========================================================
@@ -30,18 +28,6 @@ task :bench do
30
28
  sh 'ruby bench.rb'
31
29
  end
32
30
 
33
- # ==========================================================
34
- # Cache lexers
35
- # ==========================================================
36
-
37
- # Write all the lexers to a file for easy lookup
38
- task :lexers do
39
- sh 'ruby cache-lexers.rb'
40
- end
41
-
42
- task(:test).enhance([:lexers])
43
- task(:build).enhance([:lexers])
44
-
45
31
  # ==========================================================
46
32
  # Vendor
47
33
  # ==========================================================
data/bench.rb CHANGED
@@ -3,7 +3,6 @@
3
3
  require File.join(File.dirname(__FILE__), '/lib/pygments.rb')
4
4
  require 'benchmark'
5
5
 
6
- include Benchmark
7
6
  # number of iterations
8
7
  num = ARGV[0] ? ARGV[0].to_i : 10
9
8
 
@@ -13,11 +12,17 @@ repeats = ARGV[1] ? ARGV[1].to_i : 1
13
12
  code = File.open('test/test_pygments.rb').read.to_s * repeats
14
13
 
15
14
  puts "Benchmarking....\n"
16
- puts 'Size: ' + code.bytesize.to_s + " bytes\n"
17
- puts 'Iterations: ' + num.to_s + "\n"
15
+ puts "Size: #{code.bytesize} bytes\n"
16
+ puts "Iterations: #{num}\n"
18
17
 
19
18
  Benchmark.bm(40) do |x|
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'); } }
19
+ x.report('pygments popen ') do
20
+ (1..num).each { |_i|; Pygments.highlight(code, lexer: 'python'); }
21
+ end
22
+ x.report('pygments popen (process already started) ') do
23
+ (1..num).each { |_i|; Pygments.highlight(code, lexer: 'python'); }
24
+ end
25
+ x.report('pygments popen (process already started 2) ') do
26
+ (1..num).each { |_i|; Pygments.highlight(code, lexer: 'python'); }
27
+ end
23
28
  end
@@ -1,61 +1,14 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'singleton'
4
+
3
5
  module Pygments
4
6
  class Lexer < Struct.new(:name, :aliases, :filenames, :mimetypes)
5
- @lexers = []
6
- @index = {}
7
- @name_index = {}
8
- @alias_index = {}
9
- @extname_index = {}
10
- @mimetypes_index = {}
11
-
12
- # Internal: Create a new Lexer object
13
- #
14
- # hash - A hash of attributes
15
- #
16
- # Returns a Lexer object
17
- def self.create(hash)
18
- lexer = new(hash[:name], hash[:aliases], hash[:filenames], hash[:mimetypes])
19
-
20
- @lexers << lexer
21
-
22
- @index[lexer.name.downcase] = @name_index[lexer.name] = lexer
23
-
24
- lexer.aliases.each do |name|
25
- @alias_index[name] = lexer
26
- @index[name.downcase] ||= lexer
27
- end
28
-
29
- lexer.filenames.each do |filename|
30
- extnames = []
31
-
32
- extname = File.extname(filename)
33
- if m = extname.match(/\[(.+)\]/)
34
- m[1].scan(/./).each do |s|
35
- extnames << extname.sub(m[0], s)
36
- end
37
- elsif extname != ''
38
- extnames << extname
39
- end
40
-
41
- extnames.each do |the_extname|
42
- @extname_index[the_extname] = lexer
43
- @index[the_extname.downcase.sub(/^\./, '')] ||= lexer
44
- end
45
- end
46
-
47
- lexer.mimetypes.each do |type|
48
- @mimetypes_index[type] = lexer
49
- end
50
-
51
- lexer
52
- end
53
-
54
7
  # Public: Get all Lexers
55
8
  #
56
- # Returns an Array of Lexers
9
+ # @return [Array<Lexer>]
57
10
  def self.all
58
- @lexers
11
+ LexerCache.instance.lexers
59
12
  end
60
13
 
61
14
  # Public: Look up Lexer by name or alias.
@@ -65,12 +18,15 @@ module Pygments
65
18
  # Lexer.find('Ruby')
66
19
  # => #<Lexer name="Ruby">
67
20
  #
68
- # Returns the Lexer or nil if none was found.
21
+ # @return [Lexer, nil]
69
22
  def self.find(name)
70
- @index[name.to_s.downcase]
23
+ LexerCache.instance.index[name.to_s.downcase]
71
24
  end
72
25
 
73
26
  # Public: Alias for find.
27
+ #
28
+ # @param name [String]
29
+ # @return [Lexer, nil]
74
30
  def self.[](name)
75
31
  find(name)
76
32
  end
@@ -84,9 +40,10 @@ module Pygments
84
40
  # Lexer.find_by_name('Ruby')
85
41
  # # => #<Lexer name="Ruby">
86
42
  #
87
- # Returns the Lexer or nil if none was found.
43
+ # @param name [String]
44
+ # @return [Lexer, nil]
88
45
  def self.find_by_name(name)
89
- @name_index[name]
46
+ LexerCache.instance.name_index[name]
90
47
  end
91
48
 
92
49
  # Public: Look up Lexer by one of its aliases.
@@ -98,9 +55,10 @@ module Pygments
98
55
  # Lexer.find_by_alias('rb')
99
56
  # # => #<Lexer name="Ruby">
100
57
  #
101
- # Returns the Lexer or nil if none was found.
58
+ # @param name [String]
59
+ # @return [Lexer, nil]
102
60
  def self.find_by_alias(name)
103
- @alias_index[name]
61
+ LexerCache.instance.alias_index[name]
104
62
  end
105
63
 
106
64
  # Public: Look up Lexer by one of it's file extensions.
@@ -112,9 +70,10 @@ module Pygments
112
70
  # Lexer.find_by_extname('.rb')
113
71
  # # => #<Lexer name="Ruby">
114
72
  #
115
- # Returns the Lexer or nil if none was found.
73
+ # @param extname [String]
74
+ # @return [Lexer, nil]
116
75
  def self.find_by_extname(extname)
117
- @extname_index[extname]
76
+ LexerCache.instance.extname_index[extname]
118
77
  end
119
78
 
120
79
  # Public: Look up Lexer by one of it's mime types.
@@ -126,9 +85,10 @@ module Pygments
126
85
  # Lexer.find_by_mimetype('application/x-ruby')
127
86
  # # => #<Lexer name="Ruby">
128
87
  #
129
- # Returns the Lexer or nil if none was found.
88
+ # @param type [String]
89
+ # @return [Lexer, nil]
130
90
  def self.find_by_mimetype(type)
131
- @mimetypes_index[type]
91
+ LexerCache.instance.mimetypes_index[type]
132
92
  end
133
93
 
134
94
  # Public: Highlight syntax of text
@@ -146,5 +106,67 @@ module Pygments
146
106
  alias eql? equal?
147
107
  end
148
108
 
149
- lexers.values.each { |h| Lexer.create(h) }
109
+ class LexerCache
110
+ include Singleton
111
+
112
+ # @return [Array<Lexer>]
113
+ attr_reader(:lexers)
114
+ # @return [Map<String, Lexer>]
115
+ attr_reader(:index)
116
+ # @return [Map<String, Lexer>]
117
+ attr_reader(:name_index)
118
+ # @return [Map<String, Lexer]
119
+ attr_reader(:alias_index)
120
+ # @return [Map<String, Lexer>]
121
+ attr_reader(:extname_index)
122
+ # @return [Map<String, Lexer>]
123
+ attr_reader(:mimetypes_index)
124
+
125
+ attr_reader(:raw_lexers)
126
+
127
+ def initialize
128
+ @lexers = []
129
+ @index = {}
130
+ @name_index = {}
131
+ @alias_index = {}
132
+ @extname_index = {}
133
+ @mimetypes_index = {}
134
+ @raw_lexers = Pygments.lexers!
135
+
136
+ @raw_lexers.each_value do |hash|
137
+ lexer = Lexer.new(hash[:name], hash[:aliases], hash[:filenames], hash[:mimetypes])
138
+
139
+ @lexers << lexer
140
+
141
+ @index[lexer.name.downcase] = @name_index[lexer.name] = lexer
142
+
143
+ lexer.aliases.each do |name|
144
+ @alias_index[name] = lexer
145
+ @index[name.downcase] ||= lexer
146
+ end
147
+
148
+ lexer.filenames.each do |filename|
149
+ extnames = []
150
+
151
+ extname = File.extname(filename)
152
+ if (m = extname.match(/\[(.+)\]/))
153
+ m[1].scan(/./).each do |s|
154
+ extnames << extname.sub(m[0], s)
155
+ end
156
+ elsif extname != ''
157
+ extnames << extname
158
+ end
159
+
160
+ extnames.each do |the_extname|
161
+ @extname_index[the_extname] = lexer
162
+ @index[the_extname.downcase.sub(/^\./, '')] ||= lexer
163
+ end
164
+ end
165
+
166
+ lexer.mimetypes.each do |type|
167
+ @mimetypes_index[type] = lexer
168
+ end
169
+ end
170
+ end
171
+ end
150
172
  end
@@ -163,17 +163,19 @@ class Mentos(object):
163
163
  fmt = pygments.formatters.get_formatter_by_name(args[0], **kwargs)
164
164
  res = fmt.get_style_defs(args[1])
165
165
 
166
- elif method == 'lexer_name_for':
166
+ elif method == 'lexer_names_for':
167
167
  lexer = self.return_lexer(None, args, kwargs, text)
168
168
 
169
169
  if lexer:
170
- # We don't want the Lexer itself, just the name.
171
- # Take the first alias.
172
- res = lexer.aliases[0]
170
+ # We don't want the Lexer itself, just aliases.
171
+ res = json.dumps(list(lexer.aliases))
173
172
 
174
173
  else:
175
174
  _write_error("No lexer")
176
175
 
176
+ elif method == 'version':
177
+ res = json.dumps([pygments.__version__])
178
+
177
179
  else:
178
180
  _write_error("Invalid method " + method)
179
181
 
@@ -196,27 +198,6 @@ class Mentos(object):
196
198
  sys.stdout.buffer.write(res_bytes)
197
199
  sys.stdout.flush()
198
200
 
199
-
200
- def _get_ids(self, text):
201
- start_id = text[:8]
202
- end_id = text[-8:]
203
- return start_id, end_id
204
-
205
- def _check_and_return_text(self, text, start_id, end_id):
206
-
207
- # Sanity check.
208
- id_regex = re.compile('[A-Z]{8}')
209
-
210
- if not id_regex.match(start_id) and not id_regex.match(end_id):
211
- _write_error("ID check failed. Not an ID.")
212
-
213
- if not start_id == end_id:
214
- _write_error("ID check failed. ID's did not match.")
215
-
216
- # Passed the sanity check. Remove the id's and return
217
- text = text[10:-10]
218
- return text
219
-
220
201
  def _parse_header(self, header):
221
202
  method = header["method"]
222
203
  args = header.get("args", [])
@@ -234,7 +215,7 @@ class Mentos(object):
234
215
  pygmentized, this header will be followed by the text to be pygmentized.
235
216
 
236
217
  The header is of form:
237
- { "method": "highlight", "args": [], "kwargs": {"arg1": "v"}, "bytes": 128, "fd": "8"}
218
+ { "method": "highlight", "args": [], "kwargs": {"arg1": "v"}, "bytes": 128}
238
219
  """
239
220
 
240
221
  while True:
@@ -261,18 +242,9 @@ class Mentos(object):
261
242
  # Read up to the given number of *bytes* (not chars) (possibly 0)
262
243
  text = sys.stdin.buffer.read(_bytes).decode('utf-8')
263
244
 
264
- # Sanity check the return.
265
- if _bytes:
266
- start_id, end_id = self._get_ids(text)
267
- text = self._check_and_return_text(text, start_id, end_id)
268
-
269
245
  # Get the actual data from pygments.
270
246
  res = self.get_data(method, lexer, args, kwargs, text)
271
247
 
272
- # Put back the sanity check values.
273
- if method == "highlight":
274
- res = start_id + " " + res + " " + end_id
275
-
276
248
  self._send_data(res, method)
277
249
 
278
250
  except:
@@ -288,20 +260,6 @@ def main():
288
260
  signal.signal(signal.SIGHUP, _signal_handler)
289
261
 
290
262
  mentos = Mentos()
291
-
292
- if sys.platform != "win32":
293
- # close fd's inherited from the ruby parent
294
- import resource
295
- maxfd = resource.getrlimit(resource.RLIMIT_NOFILE)[1]
296
- if maxfd == resource.RLIM_INFINITY:
297
- maxfd = 65536
298
-
299
- for fd in range(3, maxfd):
300
- try:
301
- os.close(fd)
302
- except:
303
- pass
304
-
305
263
  mentos.start()
306
264
 
307
265
  if __name__ == "__main__":