pygments.rb 1.2.1 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (386) hide show
  1. checksums.yaml +5 -5
  2. data/.github/dependabot.yml +13 -0
  3. data/.github/workflows/ci.yml +40 -0
  4. data/.github/workflows/release.yml +24 -0
  5. data/.gitignore +4 -6
  6. data/.rubocop.yml +16 -0
  7. data/CHANGELOG.adoc +137 -0
  8. data/Gemfile +3 -1
  9. data/LICENSE +1 -1
  10. data/README.adoc +159 -0
  11. data/Rakefile +8 -32
  12. data/bench.rb +14 -8
  13. data/lib/pygments.rb +16 -14
  14. data/lib/pygments/lexer.rb +87 -65
  15. data/lib/pygments/mentos.py +23 -110
  16. data/lib/pygments/popen.rb +188 -284
  17. data/lib/pygments/version.rb +2 -2
  18. data/pygments.rb.gemspec +20 -13
  19. data/test/test_pygments.rb +50 -110
  20. data/vendor/pygments-main/{AUTHORS → Pygments-2.8.1.dist-info/AUTHORS} +26 -3
  21. data/vendor/pygments-main/Pygments-2.8.1.dist-info/INSTALLER +1 -0
  22. data/vendor/pygments-main/{LICENSE → Pygments-2.8.1.dist-info/LICENSE} +1 -1
  23. data/vendor/pygments-main/Pygments-2.8.1.dist-info/METADATA +48 -0
  24. data/vendor/pygments-main/Pygments-2.8.1.dist-info/RECORD +494 -0
  25. data/vendor/pygments-main/Pygments-2.8.1.dist-info/REQUESTED +0 -0
  26. data/vendor/pygments-main/Pygments-2.8.1.dist-info/WHEEL +5 -0
  27. data/vendor/pygments-main/Pygments-2.8.1.dist-info/entry_points.txt +3 -0
  28. data/vendor/pygments-main/Pygments-2.8.1.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 -12
  31. data/vendor/pygments-main/pygments/__main__.py +17 -0
  32. data/vendor/pygments-main/pygments/cmdline.py +213 -184
  33. data/vendor/pygments-main/pygments/console.py +6 -10
  34. data/vendor/pygments-main/pygments/filter.py +4 -7
  35. data/vendor/pygments-main/pygments/filters/__init__.py +609 -22
  36. data/vendor/pygments-main/pygments/formatter.py +4 -5
  37. data/vendor/pygments-main/pygments/formatters/__init__.py +10 -10
  38. data/vendor/pygments-main/pygments/formatters/_mapping.py +1 -4
  39. data/vendor/pygments-main/pygments/formatters/bbcode.py +1 -2
  40. data/vendor/pygments-main/pygments/formatters/html.py +242 -139
  41. data/vendor/pygments-main/pygments/formatters/img.py +91 -50
  42. data/vendor/pygments-main/pygments/formatters/irc.py +39 -40
  43. data/vendor/pygments-main/pygments/formatters/latex.py +62 -33
  44. data/vendor/pygments-main/pygments/formatters/other.py +18 -17
  45. data/vendor/pygments-main/pygments/formatters/rtf.py +29 -30
  46. data/vendor/pygments-main/pygments/formatters/svg.py +40 -5
  47. data/vendor/pygments-main/pygments/formatters/terminal.py +25 -32
  48. data/vendor/pygments-main/pygments/formatters/terminal256.py +45 -14
  49. data/vendor/pygments-main/pygments/lexer.py +47 -44
  50. data/vendor/pygments-main/pygments/lexers/__init__.py +341 -0
  51. data/vendor/pygments-main/pygments/lexers/_asy_builtins.py +1644 -0
  52. data/vendor/pygments-main/pygments/lexers/_cl_builtins.py +231 -0
  53. data/vendor/pygments-main/pygments/lexers/_cocoa_builtins.py +75 -0
  54. data/vendor/pygments-main/pygments/lexers/_csound_builtins.py +1724 -0
  55. data/vendor/pygments-main/pygments/lexers/_lasso_builtins.py +5326 -0
  56. data/vendor/pygments-main/pygments/lexers/_lua_builtins.py +292 -0
  57. data/vendor/pygments-main/pygments/lexers/_mapping.py +554 -0
  58. data/vendor/pygments-main/pygments/lexers/_mql_builtins.py +1171 -0
  59. data/vendor/pygments-main/pygments/lexers/_mysql_builtins.py +1281 -0
  60. data/vendor/pygments-main/pygments/lexers/_openedge_builtins.py +2600 -0
  61. data/vendor/pygments-main/pygments/lexers/_php_builtins.py +4752 -0
  62. data/vendor/pygments-main/pygments/lexers/_postgres_builtins.py +677 -0
  63. data/vendor/pygments-main/pygments/lexers/_scilab_builtins.py +3093 -0
  64. data/vendor/pygments-main/pygments/lexers/_sourcemod_builtins.py +1160 -0
  65. data/vendor/pygments-main/pygments/lexers/_stan_builtins.py +557 -0
  66. data/vendor/pygments-main/pygments/lexers/_stata_builtins.py +457 -0
  67. data/vendor/pygments-main/pygments/lexers/_tsql_builtins.py +1003 -0
  68. data/vendor/pygments-main/pygments/lexers/_usd_builtins.py +112 -0
  69. data/vendor/pygments-main/pygments/lexers/_vbscript_builtins.py +279 -0
  70. data/vendor/pygments-main/pygments/lexers/_vim_builtins.py +1938 -0
  71. data/vendor/pygments-main/pygments/lexers/actionscript.py +244 -0
  72. data/vendor/pygments-main/pygments/lexers/agile.py +23 -0
  73. data/vendor/pygments-main/pygments/lexers/algebra.py +239 -0
  74. data/vendor/pygments-main/pygments/lexers/ambient.py +75 -0
  75. data/vendor/pygments-main/pygments/lexers/amdgpu.py +48 -0
  76. data/vendor/pygments-main/pygments/lexers/ampl.py +86 -0
  77. data/vendor/pygments-main/pygments/lexers/apl.py +100 -0
  78. data/vendor/pygments-main/pygments/lexers/archetype.py +317 -0
  79. data/vendor/pygments-main/pygments/lexers/arrow.py +116 -0
  80. data/vendor/pygments-main/pygments/lexers/asm.py +1004 -0
  81. data/vendor/pygments-main/pygments/lexers/automation.py +379 -0
  82. data/vendor/pygments-main/pygments/lexers/bare.py +103 -0
  83. data/vendor/pygments-main/pygments/lexers/basic.py +661 -0
  84. data/vendor/pygments-main/pygments/lexers/bibtex.py +159 -0
  85. data/vendor/pygments-main/pygments/lexers/boa.py +101 -0
  86. data/vendor/pygments-main/pygments/lexers/business.py +626 -0
  87. data/vendor/pygments-main/pygments/lexers/c_cpp.py +342 -0
  88. data/vendor/pygments-main/pygments/lexers/c_like.py +565 -0
  89. data/vendor/pygments-main/pygments/lexers/capnproto.py +77 -0
  90. data/vendor/pygments-main/pygments/lexers/cddl.py +190 -0
  91. data/vendor/pygments-main/pygments/lexers/chapel.py +111 -0
  92. data/vendor/pygments-main/pygments/lexers/clean.py +178 -0
  93. data/vendor/pygments-main/pygments/lexers/compiled.py +33 -0
  94. data/vendor/pygments-main/pygments/lexers/configs.py +985 -0
  95. data/vendor/pygments-main/pygments/lexers/console.py +113 -0
  96. data/vendor/pygments-main/pygments/lexers/crystal.py +366 -0
  97. data/vendor/pygments-main/pygments/lexers/csound.py +466 -0
  98. data/vendor/pygments-main/pygments/lexers/css.py +694 -0
  99. data/vendor/pygments-main/pygments/lexers/d.py +255 -0
  100. data/vendor/pygments-main/pygments/lexers/dalvik.py +124 -0
  101. data/vendor/pygments-main/pygments/lexers/data.py +697 -0
  102. data/vendor/pygments-main/pygments/lexers/devicetree.py +108 -0
  103. data/vendor/pygments-main/pygments/lexers/diff.py +164 -0
  104. data/vendor/pygments-main/pygments/lexers/dotnet.py +706 -0
  105. data/vendor/pygments-main/pygments/lexers/dsls.py +959 -0
  106. data/vendor/pygments-main/pygments/lexers/dylan.py +286 -0
  107. data/vendor/pygments-main/pygments/lexers/ecl.py +137 -0
  108. data/vendor/pygments-main/pygments/lexers/eiffel.py +64 -0
  109. data/vendor/pygments-main/pygments/lexers/elm.py +120 -0
  110. data/vendor/pygments-main/pygments/lexers/email.py +150 -0
  111. data/vendor/pygments-main/pygments/lexers/erlang.py +529 -0
  112. data/vendor/pygments-main/pygments/lexers/esoteric.py +303 -0
  113. data/vendor/pygments-main/pygments/lexers/ezhil.py +76 -0
  114. data/vendor/pygments-main/pygments/lexers/factor.py +343 -0
  115. data/vendor/pygments-main/pygments/lexers/fantom.py +249 -0
  116. data/vendor/pygments-main/pygments/lexers/felix.py +272 -0
  117. data/vendor/pygments-main/pygments/lexers/floscript.py +82 -0
  118. data/vendor/pygments-main/pygments/lexers/forth.py +177 -0
  119. data/vendor/pygments-main/pygments/lexers/fortran.py +208 -0
  120. data/vendor/pygments-main/pygments/lexers/foxpro.py +427 -0
  121. data/vendor/pygments-main/pygments/lexers/freefem.py +897 -0
  122. data/vendor/pygments-main/pygments/lexers/functional.py +20 -0
  123. data/vendor/pygments-main/pygments/lexers/futhark.py +110 -0
  124. data/vendor/pygments-main/pygments/lexers/gdscript.py +345 -0
  125. data/vendor/pygments-main/pygments/lexers/go.py +100 -0
  126. data/vendor/pygments-main/pygments/lexers/grammar_notation.py +269 -0
  127. data/vendor/pygments-main/pygments/lexers/graph.py +84 -0
  128. data/vendor/pygments-main/pygments/lexers/graphics.py +799 -0
  129. data/vendor/pygments-main/pygments/lexers/graphviz.py +57 -0
  130. data/vendor/pygments-main/pygments/lexers/haskell.py +869 -0
  131. data/vendor/pygments-main/pygments/lexers/haxe.py +935 -0
  132. data/vendor/pygments-main/pygments/lexers/hdl.py +468 -0
  133. data/vendor/pygments-main/pygments/lexers/hexdump.py +102 -0
  134. data/vendor/pygments-main/pygments/lexers/html.py +613 -0
  135. data/vendor/pygments-main/pygments/lexers/idl.py +280 -0
  136. data/vendor/pygments-main/pygments/lexers/igor.py +419 -0
  137. data/vendor/pygments-main/pygments/lexers/inferno.py +95 -0
  138. data/vendor/pygments-main/pygments/lexers/installers.py +321 -0
  139. data/vendor/pygments-main/pygments/lexers/int_fiction.py +1367 -0
  140. data/vendor/pygments-main/pygments/lexers/iolang.py +62 -0
  141. data/vendor/pygments-main/pygments/lexers/j.py +145 -0
  142. data/vendor/pygments-main/pygments/lexers/javascript.py +1536 -0
  143. data/vendor/pygments-main/pygments/lexers/julia.py +330 -0
  144. data/vendor/pygments-main/pygments/lexers/jvm.py +1739 -0
  145. data/vendor/pygments-main/pygments/lexers/lisp.py +2698 -0
  146. data/vendor/pygments-main/pygments/lexers/make.py +205 -0
  147. data/vendor/pygments-main/pygments/lexers/markup.py +762 -0
  148. data/vendor/pygments-main/pygments/lexers/math.py +20 -0
  149. data/vendor/pygments-main/pygments/lexers/matlab.py +3280 -0
  150. data/vendor/pygments-main/pygments/lexers/mime.py +225 -0
  151. data/vendor/pygments-main/pygments/lexers/ml.py +957 -0
  152. data/vendor/pygments-main/pygments/lexers/modeling.py +365 -0
  153. data/vendor/pygments-main/pygments/lexers/modula2.py +1579 -0
  154. data/vendor/pygments-main/pygments/lexers/monte.py +203 -0
  155. data/vendor/pygments-main/pygments/lexers/mosel.py +447 -0
  156. data/vendor/pygments-main/pygments/lexers/ncl.py +893 -0
  157. data/vendor/pygments-main/pygments/lexers/nimrod.py +158 -0
  158. data/vendor/pygments-main/pygments/lexers/nit.py +63 -0
  159. data/vendor/pygments-main/pygments/lexers/nix.py +135 -0
  160. data/vendor/pygments-main/pygments/lexers/oberon.py +120 -0
  161. data/vendor/pygments-main/pygments/lexers/objective.py +503 -0
  162. data/vendor/pygments-main/pygments/lexers/ooc.py +84 -0
  163. data/vendor/pygments-main/pygments/lexers/other.py +40 -0
  164. data/vendor/pygments-main/pygments/lexers/parasail.py +78 -0
  165. data/vendor/pygments-main/pygments/lexers/parsers.py +799 -0
  166. data/vendor/pygments-main/pygments/lexers/pascal.py +643 -0
  167. data/vendor/pygments-main/pygments/lexers/pawn.py +202 -0
  168. data/vendor/pygments-main/pygments/lexers/perl.py +731 -0
  169. data/vendor/pygments-main/pygments/lexers/php.py +320 -0
  170. data/vendor/pygments-main/pygments/lexers/pointless.py +70 -0
  171. data/vendor/pygments-main/pygments/lexers/pony.py +93 -0
  172. data/vendor/pygments-main/pygments/lexers/praat.py +301 -0
  173. data/vendor/pygments-main/pygments/lexers/prolog.py +305 -0
  174. data/vendor/pygments-main/pygments/lexers/promql.py +182 -0
  175. data/vendor/pygments-main/pygments/lexers/python.py +1158 -0
  176. data/vendor/pygments-main/pygments/lexers/qvt.py +151 -0
  177. data/vendor/pygments-main/pygments/lexers/r.py +190 -0
  178. data/vendor/pygments-main/pygments/lexers/rdf.py +462 -0
  179. data/vendor/pygments-main/pygments/lexers/rebol.py +430 -0
  180. data/vendor/pygments-main/pygments/lexers/resource.py +84 -0
  181. data/vendor/pygments-main/pygments/lexers/ride.py +138 -0
  182. data/vendor/pygments-main/pygments/lexers/rnc.py +66 -0
  183. data/vendor/pygments-main/pygments/lexers/roboconf.py +81 -0
  184. data/vendor/pygments-main/pygments/lexers/robotframework.py +551 -0
  185. data/vendor/pygments-main/pygments/lexers/ruby.py +523 -0
  186. data/vendor/pygments-main/pygments/lexers/rust.py +223 -0
  187. data/vendor/pygments-main/pygments/lexers/sas.py +227 -0
  188. data/vendor/pygments-main/pygments/lexers/scdoc.py +82 -0
  189. data/vendor/pygments-main/pygments/lexers/scripting.py +1283 -0
  190. data/vendor/pygments-main/pygments/lexers/sgf.py +60 -0
  191. data/vendor/pygments-main/pygments/lexers/shell.py +909 -0
  192. data/vendor/pygments-main/pygments/lexers/sieve.py +68 -0
  193. data/vendor/pygments-main/pygments/lexers/slash.py +184 -0
  194. data/vendor/pygments-main/pygments/lexers/smalltalk.py +194 -0
  195. data/vendor/pygments-main/pygments/lexers/smv.py +78 -0
  196. data/vendor/pygments-main/pygments/lexers/snobol.py +82 -0
  197. data/vendor/pygments-main/pygments/lexers/solidity.py +91 -0
  198. data/vendor/pygments-main/pygments/lexers/special.py +106 -0
  199. data/vendor/pygments-main/pygments/lexers/sql.py +832 -0
  200. data/vendor/pygments-main/pygments/lexers/stata.py +170 -0
  201. data/vendor/pygments-main/pygments/lexers/supercollider.py +94 -0
  202. data/vendor/pygments-main/pygments/lexers/tcl.py +144 -0
  203. data/vendor/pygments-main/pygments/lexers/templates.py +2263 -0
  204. data/vendor/pygments-main/pygments/lexers/teraterm.py +334 -0
  205. data/vendor/pygments-main/pygments/lexers/testing.py +206 -0
  206. data/vendor/pygments-main/pygments/lexers/text.py +25 -0
  207. data/vendor/pygments-main/pygments/lexers/textedit.py +168 -0
  208. data/vendor/pygments-main/pygments/lexers/textfmts.py +429 -0
  209. data/vendor/pygments-main/pygments/lexers/theorem.py +476 -0
  210. data/vendor/pygments-main/pygments/lexers/tnt.py +262 -0
  211. data/vendor/pygments-main/pygments/lexers/trafficscript.py +53 -0
  212. data/vendor/pygments-main/pygments/lexers/typoscript.py +218 -0
  213. data/vendor/pygments-main/pygments/lexers/unicon.py +411 -0
  214. data/vendor/pygments-main/pygments/lexers/urbi.py +145 -0
  215. data/vendor/pygments-main/pygments/lexers/usd.py +89 -0
  216. data/vendor/pygments-main/pygments/lexers/varnish.py +189 -0
  217. data/vendor/pygments-main/pygments/lexers/verification.py +113 -0
  218. data/vendor/pygments-main/pygments/lexers/web.py +23 -0
  219. data/vendor/pygments-main/pygments/lexers/webidl.py +298 -0
  220. data/vendor/pygments-main/pygments/lexers/webmisc.py +991 -0
  221. data/vendor/pygments-main/pygments/lexers/whiley.py +115 -0
  222. data/vendor/pygments-main/pygments/lexers/x10.py +68 -0
  223. data/vendor/pygments-main/pygments/lexers/xorg.py +36 -0
  224. data/vendor/pygments-main/pygments/lexers/yang.py +103 -0
  225. data/vendor/pygments-main/pygments/lexers/zig.py +123 -0
  226. data/vendor/pygments-main/pygments/modeline.py +1 -2
  227. data/vendor/pygments-main/pygments/plugin.py +4 -3
  228. data/vendor/pygments-main/pygments/regexopt.py +1 -2
  229. data/vendor/pygments-main/pygments/scanner.py +2 -3
  230. data/vendor/pygments-main/pygments/sphinxext.py +2 -5
  231. data/vendor/pygments-main/pygments/style.py +61 -25
  232. data/vendor/pygments-main/pygments/styles/__init__.py +12 -5
  233. data/vendor/pygments-main/pygments/styles/abap.py +1 -2
  234. data/vendor/pygments-main/pygments/styles/algol.py +1 -2
  235. data/vendor/pygments-main/pygments/styles/algol_nu.py +1 -2
  236. data/vendor/pygments-main/pygments/styles/arduino.py +2 -3
  237. data/vendor/pygments-main/pygments/styles/autumn.py +1 -2
  238. data/vendor/pygments-main/pygments/styles/borland.py +1 -2
  239. data/vendor/pygments-main/pygments/styles/bw.py +1 -2
  240. data/vendor/pygments-main/pygments/styles/colorful.py +1 -2
  241. data/vendor/pygments-main/pygments/styles/default.py +1 -2
  242. data/vendor/pygments-main/pygments/styles/emacs.py +1 -2
  243. data/vendor/pygments-main/pygments/styles/friendly.py +1 -2
  244. data/vendor/pygments-main/pygments/styles/fruity.py +1 -2
  245. data/vendor/pygments-main/pygments/styles/igor.py +1 -2
  246. data/vendor/pygments-main/pygments/styles/inkpot.py +66 -0
  247. data/vendor/pygments-main/pygments/styles/lovelace.py +1 -2
  248. data/vendor/pygments-main/pygments/styles/manni.py +1 -2
  249. data/vendor/pygments-main/pygments/styles/material.py +118 -0
  250. data/vendor/pygments-main/pygments/styles/monokai.py +4 -4
  251. data/vendor/pygments-main/pygments/styles/murphy.py +1 -2
  252. data/vendor/pygments-main/pygments/styles/native.py +1 -2
  253. data/vendor/pygments-main/pygments/styles/paraiso_dark.py +1 -2
  254. data/vendor/pygments-main/pygments/styles/paraiso_light.py +1 -2
  255. data/vendor/pygments-main/pygments/styles/pastie.py +1 -2
  256. data/vendor/pygments-main/pygments/styles/perldoc.py +1 -2
  257. data/vendor/pygments-main/pygments/styles/rainbow_dash.py +1 -2
  258. data/vendor/pygments-main/pygments/styles/rrt.py +1 -2
  259. data/vendor/pygments-main/pygments/styles/sas.py +1 -2
  260. data/vendor/pygments-main/pygments/styles/solarized.py +136 -0
  261. data/vendor/pygments-main/pygments/styles/stata_dark.py +40 -0
  262. data/vendor/pygments-main/pygments/styles/{stata.py → stata_light.py} +14 -16
  263. data/vendor/pygments-main/pygments/styles/tango.py +1 -2
  264. data/vendor/pygments-main/pygments/styles/trac.py +1 -2
  265. data/vendor/pygments-main/pygments/styles/vim.py +1 -2
  266. data/vendor/pygments-main/pygments/styles/vs.py +1 -2
  267. data/vendor/pygments-main/pygments/styles/xcode.py +1 -2
  268. data/vendor/pygments-main/pygments/styles/zenburn.py +80 -0
  269. data/vendor/pygments-main/pygments/token.py +1 -2
  270. data/vendor/pygments-main/pygments/unistring.py +47 -109
  271. data/vendor/pygments-main/pygments/util.py +16 -96
  272. metadata +81 -139
  273. data/CHANGELOG.md +0 -111
  274. data/README.md +0 -121
  275. data/cache-lexers.rb +0 -8
  276. data/circle.yml +0 -20
  277. data/test/test_data.c +0 -2581
  278. data/test/test_data.py +0 -514
  279. data/test/test_data_generated +0 -2582
  280. data/vendor/custom_lexers/github.py +0 -565
  281. data/vendor/pygments-main/CHANGES +0 -1186
  282. data/vendor/pygments-main/MANIFEST.in +0 -6
  283. data/vendor/pygments-main/Makefile +0 -65
  284. data/vendor/pygments-main/README.rst +0 -39
  285. data/vendor/pygments-main/REVISION +0 -1
  286. data/vendor/pygments-main/TODO +0 -12
  287. data/vendor/pygments-main/doc/Makefile +0 -153
  288. data/vendor/pygments-main/doc/_static/favicon.ico +0 -0
  289. data/vendor/pygments-main/doc/_static/logo_new.png +0 -0
  290. data/vendor/pygments-main/doc/_static/logo_only.png +0 -0
  291. data/vendor/pygments-main/doc/_templates/docssidebar.html +0 -3
  292. data/vendor/pygments-main/doc/_templates/indexsidebar.html +0 -25
  293. data/vendor/pygments-main/doc/_themes/pygments14/layout.html +0 -98
  294. data/vendor/pygments-main/doc/_themes/pygments14/static/bodybg.png +0 -0
  295. data/vendor/pygments-main/doc/_themes/pygments14/static/docbg.png +0 -0
  296. data/vendor/pygments-main/doc/_themes/pygments14/static/listitem.png +0 -0
  297. data/vendor/pygments-main/doc/_themes/pygments14/static/logo.png +0 -0
  298. data/vendor/pygments-main/doc/_themes/pygments14/static/pocoo.png +0 -0
  299. data/vendor/pygments-main/doc/_themes/pygments14/static/pygments14.css_t +0 -401
  300. data/vendor/pygments-main/doc/_themes/pygments14/theme.conf +0 -15
  301. data/vendor/pygments-main/doc/conf.py +0 -241
  302. data/vendor/pygments-main/doc/docs/api.rst +0 -354
  303. data/vendor/pygments-main/doc/docs/authors.rst +0 -4
  304. data/vendor/pygments-main/doc/docs/changelog.rst +0 -1
  305. data/vendor/pygments-main/doc/docs/cmdline.rst +0 -166
  306. data/vendor/pygments-main/doc/docs/filterdevelopment.rst +0 -71
  307. data/vendor/pygments-main/doc/docs/filters.rst +0 -41
  308. data/vendor/pygments-main/doc/docs/formatterdevelopment.rst +0 -169
  309. data/vendor/pygments-main/doc/docs/formatters.rst +0 -48
  310. data/vendor/pygments-main/doc/docs/index.rst +0 -66
  311. data/vendor/pygments-main/doc/docs/integrate.rst +0 -40
  312. data/vendor/pygments-main/doc/docs/java.rst +0 -70
  313. data/vendor/pygments-main/doc/docs/lexerdevelopment.rst +0 -728
  314. data/vendor/pygments-main/doc/docs/lexers.rst +0 -69
  315. data/vendor/pygments-main/doc/docs/moinmoin.rst +0 -39
  316. data/vendor/pygments-main/doc/docs/plugins.rst +0 -93
  317. data/vendor/pygments-main/doc/docs/quickstart.rst +0 -205
  318. data/vendor/pygments-main/doc/docs/rstdirective.rst +0 -22
  319. data/vendor/pygments-main/doc/docs/styles.rst +0 -201
  320. data/vendor/pygments-main/doc/docs/tokens.rst +0 -372
  321. data/vendor/pygments-main/doc/docs/unicode.rst +0 -58
  322. data/vendor/pygments-main/doc/download.rst +0 -41
  323. data/vendor/pygments-main/doc/faq.rst +0 -139
  324. data/vendor/pygments-main/doc/index.rst +0 -54
  325. data/vendor/pygments-main/doc/languages.rst +0 -154
  326. data/vendor/pygments-main/doc/make.bat +0 -190
  327. data/vendor/pygments-main/doc/pygmentize.1 +0 -94
  328. data/vendor/pygments-main/external/autopygmentize +0 -101
  329. data/vendor/pygments-main/external/lasso-builtins-generator-9.lasso +0 -162
  330. data/vendor/pygments-main/external/markdown-processor.py +0 -67
  331. data/vendor/pygments-main/external/moin-parser.py +0 -112
  332. data/vendor/pygments-main/external/pygments.bashcomp +0 -38
  333. data/vendor/pygments-main/external/rst-directive.py +0 -82
  334. data/vendor/pygments-main/pygmentize +0 -8
  335. data/vendor/pygments-main/requirements.txt +0 -5
  336. data/vendor/pygments-main/scripts/check_sources.py +0 -211
  337. data/vendor/pygments-main/scripts/debug_lexer.py +0 -246
  338. data/vendor/pygments-main/scripts/detect_missing_analyse_text.py +0 -33
  339. data/vendor/pygments-main/scripts/epydoc.css +0 -280
  340. data/vendor/pygments-main/scripts/get_vimkw.py +0 -74
  341. data/vendor/pygments-main/scripts/pylintrc +0 -301
  342. data/vendor/pygments-main/scripts/vim2pygments.py +0 -935
  343. data/vendor/pygments-main/setup.cfg +0 -10
  344. data/vendor/pygments-main/setup.py +0 -77
  345. data/vendor/pygments-main/tox.ini +0 -7
  346. data/vendor/simplejson/.gitignore +0 -10
  347. data/vendor/simplejson/.travis.yml +0 -5
  348. data/vendor/simplejson/CHANGES.txt +0 -291
  349. data/vendor/simplejson/LICENSE.txt +0 -19
  350. data/vendor/simplejson/MANIFEST.in +0 -5
  351. data/vendor/simplejson/README.rst +0 -19
  352. data/vendor/simplejson/conf.py +0 -179
  353. data/vendor/simplejson/index.rst +0 -628
  354. data/vendor/simplejson/scripts/make_docs.py +0 -18
  355. data/vendor/simplejson/setup.py +0 -104
  356. data/vendor/simplejson/simplejson/__init__.py +0 -510
  357. data/vendor/simplejson/simplejson/_speedups.c +0 -2745
  358. data/vendor/simplejson/simplejson/decoder.py +0 -425
  359. data/vendor/simplejson/simplejson/encoder.py +0 -567
  360. data/vendor/simplejson/simplejson/ordered_dict.py +0 -119
  361. data/vendor/simplejson/simplejson/scanner.py +0 -77
  362. data/vendor/simplejson/simplejson/tests/__init__.py +0 -67
  363. data/vendor/simplejson/simplejson/tests/test_bigint_as_string.py +0 -55
  364. data/vendor/simplejson/simplejson/tests/test_check_circular.py +0 -30
  365. data/vendor/simplejson/simplejson/tests/test_decimal.py +0 -66
  366. data/vendor/simplejson/simplejson/tests/test_decode.py +0 -83
  367. data/vendor/simplejson/simplejson/tests/test_default.py +0 -9
  368. data/vendor/simplejson/simplejson/tests/test_dump.py +0 -67
  369. data/vendor/simplejson/simplejson/tests/test_encode_basestring_ascii.py +0 -46
  370. data/vendor/simplejson/simplejson/tests/test_encode_for_html.py +0 -32
  371. data/vendor/simplejson/simplejson/tests/test_errors.py +0 -34
  372. data/vendor/simplejson/simplejson/tests/test_fail.py +0 -91
  373. data/vendor/simplejson/simplejson/tests/test_float.py +0 -19
  374. data/vendor/simplejson/simplejson/tests/test_indent.py +0 -86
  375. data/vendor/simplejson/simplejson/tests/test_item_sort_key.py +0 -20
  376. data/vendor/simplejson/simplejson/tests/test_namedtuple.py +0 -121
  377. data/vendor/simplejson/simplejson/tests/test_pass1.py +0 -76
  378. data/vendor/simplejson/simplejson/tests/test_pass2.py +0 -14
  379. data/vendor/simplejson/simplejson/tests/test_pass3.py +0 -20
  380. data/vendor/simplejson/simplejson/tests/test_recursion.py +0 -67
  381. data/vendor/simplejson/simplejson/tests/test_scanstring.py +0 -117
  382. data/vendor/simplejson/simplejson/tests/test_separators.py +0 -42
  383. data/vendor/simplejson/simplejson/tests/test_speedups.py +0 -20
  384. data/vendor/simplejson/simplejson/tests/test_tuple.py +0 -49
  385. data/vendor/simplejson/simplejson/tests/test_unicode.py +0 -109
  386. data/vendor/simplejson/simplejson/tool.py +0 -39
@@ -1,29 +1,28 @@
1
- # -*- coding: utf-8 -*-
2
1
  """
3
2
  pygments.formatter
4
3
  ~~~~~~~~~~~~~~~~~~
5
4
 
6
5
  Base formatter class.
7
6
 
8
- :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
7
+ :copyright: Copyright 2006-2021 by the Pygments team, see AUTHORS.
9
8
  :license: BSD, see LICENSE for details.
10
9
  """
11
10
 
12
11
  import codecs
13
12
 
14
- from pygments.util import get_bool_opt, string_types
13
+ from pygments.util import get_bool_opt
15
14
  from pygments.styles import get_style_by_name
16
15
 
17
16
  __all__ = ['Formatter']
18
17
 
19
18
 
20
19
  def _lookup_style(style):
21
- if isinstance(style, string_types):
20
+ if isinstance(style, str):
22
21
  return get_style_by_name(style)
23
22
  return style
24
23
 
25
24
 
26
- class Formatter(object):
25
+ class Formatter:
27
26
  """
28
27
  Converts a token stream to text.
29
28
 
@@ -1,11 +1,10 @@
1
- # -*- coding: utf-8 -*-
2
1
  """
3
2
  pygments.formatters
4
3
  ~~~~~~~~~~~~~~~~~~~
5
4
 
6
5
  Pygments formatters.
7
6
 
8
- :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
7
+ :copyright: Copyright 2006-2021 by the Pygments team, see AUTHORS.
9
8
  :license: BSD, see LICENSE for details.
10
9
  """
11
10
 
@@ -17,7 +16,7 @@ from os.path import basename
17
16
 
18
17
  from pygments.formatters._mapping import FORMATTERS
19
18
  from pygments.plugin import find_plugin_formatters
20
- from pygments.util import ClassNotFound, itervalues
19
+ from pygments.util import ClassNotFound
21
20
 
22
21
  __all__ = ['get_formatter_by_name', 'get_formatter_for_filename',
23
22
  'get_all_formatters', 'load_formatter_from_file'] + list(FORMATTERS)
@@ -45,7 +44,7 @@ def _load_formatters(module_name):
45
44
  def get_all_formatters():
46
45
  """Return a generator for all formatter classes."""
47
46
  # NB: this returns formatter classes, not info like get_all_lexers().
48
- for info in itervalues(FORMATTERS):
47
+ for info in FORMATTERS.values():
49
48
  if info[1] not in _formatter_cache:
50
49
  _load_formatters(info[0])
51
50
  yield _formatter_cache[info[1]]
@@ -58,7 +57,7 @@ def find_formatter_class(alias):
58
57
 
59
58
  Returns None if not found.
60
59
  """
61
- for module_name, name, aliases, _, _ in itervalues(FORMATTERS):
60
+ for module_name, name, aliases, _, _ in FORMATTERS.values():
62
61
  if alias in aliases:
63
62
  if name not in _formatter_cache:
64
63
  _load_formatters(module_name)
@@ -98,7 +97,8 @@ def load_formatter_from_file(filename, formattername="CustomFormatter",
98
97
  try:
99
98
  # This empty dict will contain the namespace for the exec'd file
100
99
  custom_namespace = {}
101
- exec(open(filename, 'rb').read(), custom_namespace)
100
+ with open(filename, 'rb') as f:
101
+ exec(f.read(), custom_namespace)
102
102
  # Retrieve the class `formattername` from that namespace
103
103
  if formattername not in custom_namespace:
104
104
  raise ClassNotFound('no valid %s class found in %s' %
@@ -106,9 +106,9 @@ def load_formatter_from_file(filename, formattername="CustomFormatter",
106
106
  formatter_class = custom_namespace[formattername]
107
107
  # And finally instantiate it with the options
108
108
  return formatter_class(**options)
109
- except IOError as err:
110
- raise ClassNotFound('cannot read %s' % filename)
111
- except ClassNotFound as err:
109
+ except OSError as err:
110
+ raise ClassNotFound('cannot read %s: %s' % (filename, err))
111
+ except ClassNotFound:
112
112
  raise
113
113
  except Exception as err:
114
114
  raise ClassNotFound('error when loading custom formatter: %s' % err)
@@ -120,7 +120,7 @@ def get_formatter_for_filename(fn, **options):
120
120
  Raises ClassNotFound if not found.
121
121
  """
122
122
  fn = basename(fn)
123
- for modname, name, _, filenames, _ in itervalues(FORMATTERS):
123
+ for modname, name, _, filenames, _ in FORMATTERS.values():
124
124
  for filename in filenames:
125
125
  if _fn_matches(fn, filename):
126
126
  if name not in _formatter_cache:
@@ -1,4 +1,3 @@
1
- # -*- coding: utf-8 -*-
2
1
  """
3
2
  pygments.formatters._mapping
4
3
  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -9,12 +8,10 @@
9
8
 
10
9
  Do not alter the FORMATTERS dictionary by hand.
11
10
 
12
- :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
11
+ :copyright: Copyright 2006-2021 by the Pygments team, see AUTHORS.
13
12
  :license: BSD, see LICENSE for details.
14
13
  """
15
14
 
16
- from __future__ import print_function
17
-
18
15
  FORMATTERS = {
19
16
  'BBCodeFormatter': ('pygments.formatters.bbcode', 'BBCode', ('bbcode', 'bb'), (), 'Format tokens with BBcodes. These formatting codes are used by many bulletin boards, so you can highlight your sourcecode with pygments before posting it there.'),
20
17
  'BmpImageFormatter': ('pygments.formatters.img', 'img_bmp', ('bmp', 'bitmap'), ('*.bmp',), 'Create a bitmap image from source code. This uses the Python Imaging Library to generate a pixmap from the source code.'),
@@ -1,11 +1,10 @@
1
- # -*- coding: utf-8 -*-
2
1
  """
3
2
  pygments.formatters.bbcode
4
3
  ~~~~~~~~~~~~~~~~~~~~~~~~~~
5
4
 
6
5
  BBcode formatter.
7
6
 
8
- :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
7
+ :copyright: Copyright 2006-2021 by the Pygments team, see AUTHORS.
9
8
  :license: BSD, see LICENSE for details.
10
9
  """
11
10
 
@@ -1,24 +1,22 @@
1
- # -*- coding: utf-8 -*-
2
1
  """
3
2
  pygments.formatters.html
4
3
  ~~~~~~~~~~~~~~~~~~~~~~~~
5
4
 
6
5
  Formatter for HTML output.
7
6
 
8
- :copyright: Copyright 2006-2017 by the Pygments team, see AUTHORS.
7
+ :copyright: Copyright 2006-2021 by the Pygments team, see AUTHORS.
9
8
  :license: BSD, see LICENSE for details.
10
9
  """
11
10
 
12
- from __future__ import print_function
13
-
11
+ import functools
14
12
  import os
15
13
  import sys
16
14
  import os.path
15
+ from io import StringIO
17
16
 
18
17
  from pygments.formatter import Formatter
19
18
  from pygments.token import Token, Text, STANDARD_TYPES
20
- from pygments.util import get_bool_opt, get_int_opt, get_list_opt, \
21
- StringIO, string_types, iteritems
19
+ from pygments.util import get_bool_opt, get_int_opt, get_list_opt
22
20
 
23
21
  try:
24
22
  import ctags
@@ -29,11 +27,11 @@ __all__ = ['HtmlFormatter']
29
27
 
30
28
 
31
29
  _escape_html_table = {
32
- ord('&'): u'&',
33
- ord('<'): u'&lt;',
34
- ord('>'): u'&gt;',
35
- ord('"'): u'&quot;',
36
- ord("'"): u'&#39;',
30
+ ord('&'): '&amp;',
31
+ ord('<'): '&lt;',
32
+ ord('>'): '&gt;',
33
+ ord('"'): '&quot;',
34
+ ord("'"): '&#39;',
37
35
  }
38
36
 
39
37
 
@@ -42,6 +40,13 @@ def escape_html(text, table=_escape_html_table):
42
40
  return text.translate(table)
43
41
 
44
42
 
43
+ def webify(color):
44
+ if color.startswith('calc') or color.startswith('var'):
45
+ return color
46
+ else:
47
+ return '#' + color
48
+
49
+
45
50
  def _get_ttype_class(ttype):
46
51
  fname = STANDARD_TYPES.get(ttype)
47
52
  if fname:
@@ -55,16 +60,22 @@ def _get_ttype_class(ttype):
55
60
 
56
61
 
57
62
  CSSFILE_TEMPLATE = '''\
58
- td.linenos { background-color: #f0f0f0; padding-right: 10px; }
59
- span.lineno { background-color: #f0f0f0; padding: 0 5px 0 5px; }
60
- pre { line-height: 125%%; }
63
+ /*
64
+ generated by Pygments <https://pygments.org/>
65
+ Copyright 2006-2021 by the Pygments team.
66
+ Licensed under the BSD license, see LICENSE for details.
67
+ */
61
68
  %(styledefs)s
62
69
  '''
63
70
 
64
71
  DOC_HEADER = '''\
65
72
  <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"
66
73
  "http://www.w3.org/TR/html4/strict.dtd">
67
-
74
+ <!--
75
+ generated by Pygments <https://pygments.org/>
76
+ Copyright 2006-2021 by the Pygments team.
77
+ Licensed under the BSD license, see LICENSE for details.
78
+ -->
68
79
  <html>
69
80
  <head>
70
81
  <title>%(title)s</title>
@@ -194,9 +205,10 @@ class HtmlFormatter(Formatter):
194
205
  `cssfile` exists.
195
206
 
196
207
  `noclasses`
197
- If set to true, token ``<span>`` tags will not use CSS classes, but
198
- inline styles. This is not recommended for larger pieces of code since
199
- it increases output size by quite a bit (default: ``False``).
208
+ If set to true, token ``<span>`` tags (as well as line number elements)
209
+ will not use CSS classes, but inline styles. This is not recommended
210
+ for larger pieces of code since it increases output size by quite a bit
211
+ (default: ``False``).
200
212
 
201
213
  `classprefix`
202
214
  Since the token types use relatively short class names, they may clash
@@ -322,11 +334,17 @@ class HtmlFormatter(Formatter):
322
334
  .. versionadded:: 1.6
323
335
 
324
336
  `filename`
325
- A string used to generate a filename when rendering <pre> blocks,
337
+ A string used to generate a filename when rendering ``<pre>`` blocks,
326
338
  for example if displaying source code.
327
339
 
328
340
  .. versionadded:: 2.1
329
341
 
342
+ `wrapcode`
343
+ Wrap the code inside ``<pre>`` blocks using ``<code>``, as recommended
344
+ by the HTML5 specification.
345
+
346
+ .. versionadded:: 2.4
347
+
330
348
 
331
349
  **Subclassing the HTML formatter**
332
350
 
@@ -395,6 +413,8 @@ class HtmlFormatter(Formatter):
395
413
  self.tagsfile = self._decodeifneeded(options.get('tagsfile', ''))
396
414
  self.tagurlformat = self._decodeifneeded(options.get('tagurlformat', ''))
397
415
  self.filename = self._decodeifneeded(options.get('filename', ''))
416
+ self.wrapcode = get_bool_opt(options, 'wrapcode', False)
417
+ self.span_element_openers = {}
398
418
 
399
419
  if self.tagsfile:
400
420
  if not ctags:
@@ -417,7 +437,7 @@ class HtmlFormatter(Formatter):
417
437
  self.lineseparator = options.get('lineseparator', '\n')
418
438
  self.lineanchors = options.get('lineanchors', '')
419
439
  self.linespans = options.get('linespans', '')
420
- self.anchorlinenos = options.get('anchorlinenos', False)
440
+ self.anchorlinenos = get_bool_opt(options, 'anchorlinenos', False)
421
441
  self.hl_lines = set()
422
442
  for lineno in get_list_opt(options, 'hl_lines', []):
423
443
  try:
@@ -436,13 +456,20 @@ class HtmlFormatter(Formatter):
436
456
  return ''
437
457
 
438
458
  def _get_css_classes(self, ttype):
439
- """Return the css classes of this token type prefixed with
440
- the classprefix option."""
459
+ """Return the CSS classes of this token type prefixed with the classprefix option."""
441
460
  cls = self._get_css_class(ttype)
442
461
  while ttype not in STANDARD_TYPES:
443
462
  ttype = ttype.parent
444
463
  cls = self._get_css_class(ttype) + ' ' + cls
445
- return cls
464
+ return cls or ''
465
+
466
+ def _get_css_inline_styles(self, ttype):
467
+ """Return the inline CSS styles for this token type."""
468
+ cclass = self.ttype2class.get(ttype)
469
+ while cclass is None:
470
+ ttype = ttype.parent
471
+ cclass = self.ttype2class.get(ttype)
472
+ return cclass or ''
446
473
 
447
474
  def _create_stylesheet(self):
448
475
  t2c = self.ttype2class = {Token: ''}
@@ -451,7 +478,7 @@ class HtmlFormatter(Formatter):
451
478
  name = self._get_css_class(ttype)
452
479
  style = ''
453
480
  if ndef['color']:
454
- style += 'color: #%s; ' % ndef['color']
481
+ style += 'color: %s; ' % webify(ndef['color'])
455
482
  if ndef['bold']:
456
483
  style += 'font-weight: bold; '
457
484
  if ndef['italic']:
@@ -459,9 +486,9 @@ class HtmlFormatter(Formatter):
459
486
  if ndef['underline']:
460
487
  style += 'text-decoration: underline; '
461
488
  if ndef['bgcolor']:
462
- style += 'background-color: #%s; ' % ndef['bgcolor']
489
+ style += 'background-color: %s; ' % webify(ndef['bgcolor'])
463
490
  if ndef['border']:
464
- style += 'border: 1px solid #%s; ' % ndef['border']
491
+ style += 'border: 1px solid %s; ' % webify(ndef['border'])
465
492
  if style:
466
493
  t2c[ttype] = name
467
494
  # save len(ttype) to enable ordering the styles by
@@ -474,9 +501,69 @@ class HtmlFormatter(Formatter):
474
501
  highlighting style. ``arg`` can be a string or list of selectors to
475
502
  insert before the token type classes.
476
503
  """
504
+ style_lines = []
505
+
506
+ style_lines.extend(self.get_linenos_style_defs())
507
+ style_lines.extend(self.get_background_style_defs(arg))
508
+ style_lines.extend(self.get_token_style_defs(arg))
509
+
510
+ return '\n'.join(style_lines)
511
+
512
+ def get_token_style_defs(self, arg=None):
513
+ prefix = self.get_css_prefix(arg)
514
+
515
+ styles = [
516
+ (level, ttype, cls, style)
517
+ for cls, (style, ttype, level) in self.class2style.items()
518
+ if cls and style
519
+ ]
520
+ styles.sort()
521
+
522
+ lines = [
523
+ '%s { %s } /* %s */' % (prefix(cls), style, repr(ttype)[6:])
524
+ for (level, ttype, cls, style) in styles
525
+ ]
526
+
527
+ return lines
528
+
529
+ def get_background_style_defs(self, arg=None):
530
+ prefix = self.get_css_prefix(arg)
531
+ bg_color = self.style.background_color
532
+ hl_color = self.style.highlight_color
533
+
534
+ lines = []
535
+
536
+ if arg and not self.nobackground and bg_color is not None:
537
+ text_style = ''
538
+ if Text in self.ttype2class:
539
+ text_style = ' ' + self.class2style[self.ttype2class[Text]][0]
540
+ lines.insert(
541
+ 0, '%s{ background: %s;%s }' % (
542
+ prefix(''), bg_color, text_style
543
+ )
544
+ )
545
+ if hl_color is not None:
546
+ lines.insert(
547
+ 0, '%s { background-color: %s }' % (prefix('hll'), hl_color)
548
+ )
549
+
550
+ return lines
551
+
552
+ def get_linenos_style_defs(self):
553
+ lines = [
554
+ 'pre { %s }' % self._pre_style,
555
+ 'td.linenos .normal { %s }' % self._linenos_style,
556
+ 'span.linenos { %s }' % self._linenos_style,
557
+ 'td.linenos .special { %s }' % self._linenos_special_style,
558
+ 'span.linenos.special { %s }' % self._linenos_special_style,
559
+ ]
560
+
561
+ return lines
562
+
563
+ def get_css_prefix(self, arg):
477
564
  if arg is None:
478
565
  arg = ('cssclass' in self.options and '.'+self.cssclass or '')
479
- if isinstance(arg, string_types):
566
+ if isinstance(arg, str):
480
567
  args = [arg]
481
568
  else:
482
569
  args = list(arg)
@@ -489,23 +576,25 @@ class HtmlFormatter(Formatter):
489
576
  tmp.append((arg and arg + ' ' or '') + cls)
490
577
  return ', '.join(tmp)
491
578
 
492
- styles = [(level, ttype, cls, style)
493
- for cls, (style, ttype, level) in iteritems(self.class2style)
494
- if cls and style]
495
- styles.sort()
496
- lines = ['%s { %s } /* %s */' % (prefix(cls), style, repr(ttype)[6:])
497
- for (level, ttype, cls, style) in styles]
498
- if arg and not self.nobackground and \
499
- self.style.background_color is not None:
500
- text_style = ''
501
- if Text in self.ttype2class:
502
- text_style = ' ' + self.class2style[self.ttype2class[Text]][0]
503
- lines.insert(0, '%s { background: %s;%s }' %
504
- (prefix(''), self.style.background_color, text_style))
505
- if self.style.highlight_color is not None:
506
- lines.insert(0, '%s.hll { background-color: %s }' %
507
- (prefix(''), self.style.highlight_color))
508
- return '\n'.join(lines)
579
+ return prefix
580
+
581
+ @property
582
+ def _pre_style(self):
583
+ return 'line-height: 125%;'
584
+
585
+ @property
586
+ def _linenos_style(self):
587
+ return 'color: %s; background-color: %s; padding-left: 5px; padding-right: 5px;' % (
588
+ self.style.line_number_color,
589
+ self.style.line_number_background_color
590
+ )
591
+
592
+ @property
593
+ def _linenos_special_style(self):
594
+ return 'color: %s; background-color: %s; padding-left: 5px; padding-right: 5px;' % (
595
+ self.style.line_number_special_color,
596
+ self.style.line_number_special_background_color
597
+ )
509
598
 
510
599
  def _decodeifneeded(self, value):
511
600
  if isinstance(value, bytes):
@@ -535,11 +624,10 @@ class HtmlFormatter(Formatter):
535
624
  # write CSS file only if noclobber_cssfile isn't given as an option.
536
625
  try:
537
626
  if not os.path.exists(cssfilename) or not self.noclobber_cssfile:
538
- cf = open(cssfilename, "w")
539
- cf.write(CSSFILE_TEMPLATE %
540
- {'styledefs': self.get_style_defs('body')})
541
- cf.close()
542
- except IOError as err:
627
+ with open(cssfilename, "w") as cf:
628
+ cf.write(CSSFILE_TEMPLATE %
629
+ {'styledefs': self.get_style_defs('body')})
630
+ except OSError as err:
543
631
  err.strerror = 'Error writing CSS file: ' + err.strerror
544
632
  raise
545
633
 
@@ -553,8 +641,7 @@ class HtmlFormatter(Formatter):
553
641
  styledefs=self.get_style_defs('body'),
554
642
  encoding=self.encoding))
555
643
 
556
- for t, line in inner:
557
- yield t, line
644
+ yield from inner
558
645
  yield 0, DOC_FOOTER
559
646
 
560
647
  def _wrap_tablelinenos(self, inner):
@@ -572,88 +659,91 @@ class HtmlFormatter(Formatter):
572
659
  la = self.lineanchors
573
660
  aln = self.anchorlinenos
574
661
  nocls = self.noclasses
575
- if sp:
576
- lines = []
577
-
578
- for i in range(fl, fl+lncount):
579
- if i % st == 0:
580
- if i % sp == 0:
581
- if aln:
582
- lines.append('<a href="#%s-%d" class="special">%*d</a>' %
583
- (la, i, mw, i))
584
- else:
585
- lines.append('<span class="special">%*d</span>' % (mw, i))
586
- else:
587
- if aln:
588
- lines.append('<a href="#%s-%d">%*d</a>' % (la, i, mw, i))
589
- else:
590
- lines.append('%*d' % (mw, i))
662
+
663
+ lines = []
664
+
665
+ for i in range(fl, fl+lncount):
666
+ print_line = i % st == 0
667
+ special_line = sp and i % sp == 0
668
+
669
+ if print_line:
670
+ line = '%*d' % (mw, i)
671
+ if aln:
672
+ line = '<a href="#%s-%d">%s</a>' % (la, i, line)
673
+ else:
674
+ line = ' ' * mw
675
+
676
+ if nocls:
677
+ if special_line:
678
+ style = ' style="%s"' % self._linenos_special_style
591
679
  else:
592
- lines.append('')
593
- ls = '\n'.join(lines)
594
- else:
595
- lines = []
596
- for i in range(fl, fl+lncount):
597
- if i % st == 0:
598
- if aln:
599
- lines.append('<a href="#%s-%d">%*d</a>' % (la, i, mw, i))
600
- else:
601
- lines.append('%*d' % (mw, i))
680
+ style = ' style="%s"' % self._linenos_style
681
+ else:
682
+ if special_line:
683
+ style = ' class="special"'
602
684
  else:
603
- lines.append('')
604
- ls = '\n'.join(lines)
685
+ style = ' class="normal"'
686
+
687
+ if style:
688
+ line = '<span%s>%s</span>' % (style, line)
689
+
690
+ lines.append(line)
691
+
692
+ ls = '\n'.join(lines)
605
693
 
606
694
  # in case you wonder about the seemingly redundant <div> here: since the
607
695
  # content in the other cell also is wrapped in a div, some browsers in
608
696
  # some configurations seem to mess up the formatting...
609
- if nocls:
610
- yield 0, ('<table class="%stable">' % self.cssclass +
611
- '<tr><td><div class="linenodiv" '
612
- 'style="background-color: #f0f0f0; padding-right: 10px">'
613
- '<pre style="line-height: 125%">' +
614
- ls + '</pre></div></td><td class="code">')
615
- else:
616
- yield 0, ('<table class="%stable">' % self.cssclass +
617
- '<tr><td class="linenos"><div class="linenodiv"><pre>' +
618
- ls + '</pre></div></td><td class="code">')
697
+ yield 0, (
698
+ '<table class="%stable">' % self.cssclass +
699
+ '<tr><td class="linenos"><div class="linenodiv"><pre>' +
700
+ ls + '</pre></div></td><td class="code">'
701
+ )
619
702
  yield 0, dummyoutfile.getvalue()
620
703
  yield 0, '</td></tr></table>'
621
704
 
622
705
  def _wrap_inlinelinenos(self, inner):
623
706
  # need a list of lines since we need the width of a single number :(
624
- lines = list(inner)
707
+ inner_lines = list(inner)
625
708
  sp = self.linenospecial
626
709
  st = self.linenostep
627
710
  num = self.linenostart
628
- mw = len(str(len(lines) + num - 1))
711
+ mw = len(str(len(inner_lines) + num - 1))
712
+ la = self.lineanchors
713
+ aln = self.anchorlinenos
714
+ nocls = self.noclasses
629
715
 
630
- if self.noclasses:
631
- if sp:
632
- for t, line in lines:
633
- if num % sp == 0:
634
- style = 'background-color: #ffffc0; padding: 0 5px 0 5px'
635
- else:
636
- style = 'background-color: #f0f0f0; padding: 0 5px 0 5px'
637
- yield 1, '<span style="%s">%*s </span>' % (
638
- style, mw, (num % st and ' ' or num)) + line
639
- num += 1
716
+ for _, inner_line in inner_lines:
717
+ print_line = num % st == 0
718
+ special_line = sp and num % sp == 0
719
+
720
+ if print_line:
721
+ line = '%*d' % (mw, num)
640
722
  else:
641
- for t, line in lines:
642
- yield 1, ('<span style="background-color: #f0f0f0; '
643
- 'padding: 0 5px 0 5px">%*s </span>' % (
644
- mw, (num % st and ' ' or num)) + line)
645
- num += 1
646
- elif sp:
647
- for t, line in lines:
648
- yield 1, '<span class="lineno%s">%*s </span>' % (
649
- num % sp == 0 and ' special' or '', mw,
650
- (num % st and ' ' or num)) + line
651
- num += 1
652
- else:
653
- for t, line in lines:
654
- yield 1, '<span class="lineno">%*s </span>' % (
655
- mw, (num % st and ' ' or num)) + line
656
- num += 1
723
+ line = ' ' * mw
724
+
725
+ if nocls:
726
+ if special_line:
727
+ style = ' style="%s"' % self._linenos_special_style
728
+ else:
729
+ style = ' style="%s"' % self._linenos_style
730
+ else:
731
+ if special_line:
732
+ style = ' class="linenos special"'
733
+ else:
734
+ style = ' class="linenos"'
735
+
736
+ if style:
737
+ linenos = '<span%s>%s</span>' % (style, line)
738
+ else:
739
+ linenos = line
740
+
741
+ if aln:
742
+ yield 1, ('<a href="#%s-%d">%s</a>' % (la, num, linenos) +
743
+ inner_line)
744
+ else:
745
+ yield 1, linenos + inner_line
746
+ num += 1
657
747
 
658
748
  def _wrap_lineanchors(self, inner):
659
749
  s = self.lineanchors
@@ -687,8 +777,7 @@ class HtmlFormatter(Formatter):
687
777
 
688
778
  yield 0, ('<div' + (self.cssclass and ' class="%s"' % self.cssclass) +
689
779
  (style and (' style="%s"' % style)) + '>')
690
- for tup in inner:
691
- yield tup
780
+ yield from inner
692
781
  yield 0, '</div>\n'
693
782
 
694
783
  def _wrap_pre(self, inner):
@@ -696,7 +785,7 @@ class HtmlFormatter(Formatter):
696
785
  if self.prestyles:
697
786
  style.append(self.prestyles)
698
787
  if self.noclasses:
699
- style.append('line-height: 125%')
788
+ style.append(self._pre_style)
700
789
  style = '; '.join(style)
701
790
 
702
791
  if self.filename:
@@ -705,10 +794,19 @@ class HtmlFormatter(Formatter):
705
794
  # the empty span here is to keep leading empty lines from being
706
795
  # ignored by HTML parsers
707
796
  yield 0, ('<pre' + (style and ' style="%s"' % style) + '><span></span>')
708
- for tup in inner:
709
- yield tup
797
+ yield from inner
710
798
  yield 0, '</pre>'
711
799
 
800
+ def _wrap_code(self, inner):
801
+ yield 0, '<code>'
802
+ yield from inner
803
+ yield 0, '</code>'
804
+
805
+ @functools.lru_cache(maxsize=100)
806
+ def _translate_parts(self, value):
807
+ """HTML-escape a value and split it by newlines."""
808
+ return value.translate(_escape_html_table).split('\n')
809
+
712
810
  def _format_lines(self, tokensource):
713
811
  """
714
812
  Just format the tokens, without any wrapping tags.
@@ -716,26 +814,23 @@ class HtmlFormatter(Formatter):
716
814
  """
717
815
  nocls = self.noclasses
718
816
  lsep = self.lineseparator
719
- # for <span style=""> lookup only
720
- getcls = self.ttype2class.get
721
- c2s = self.class2style
722
- escape_table = _escape_html_table
723
817
  tagsfile = self.tagsfile
724
818
 
725
819
  lspan = ''
726
820
  line = []
727
821
  for ttype, value in tokensource:
728
- if nocls:
729
- cclass = getcls(ttype)
730
- while cclass is None:
731
- ttype = ttype.parent
732
- cclass = getcls(ttype)
733
- cspan = cclass and '<span style="%s">' % c2s[cclass][0] or ''
734
- else:
735
- cls = self._get_css_classes(ttype)
736
- cspan = cls and '<span class="%s">' % cls or ''
822
+ try:
823
+ cspan = self.span_element_openers[ttype]
824
+ except KeyError:
825
+ if nocls:
826
+ css_style = self._get_css_inline_styles(ttype)
827
+ cspan = css_style and '<span style="%s">' % self.class2style[css_style][0] or ''
828
+ else:
829
+ css_class = self._get_css_classes(ttype)
830
+ cspan = css_class and '<span class="%s">' % css_class or ''
831
+ self.span_element_openers[ttype] = cspan
737
832
 
738
- parts = value.translate(escape_table).split('\n')
833
+ parts = self._translate_parts(value)
739
834
 
740
835
  if tagsfile and ttype in Token.Name:
741
836
  filename, linenumber = self._lookup_ctag(value)
@@ -815,7 +910,10 @@ class HtmlFormatter(Formatter):
815
910
  individual lines, in custom generators. See docstring
816
911
  for `format`. Can be overridden.
817
912
  """
818
- return self._wrap_div(self._wrap_pre(source))
913
+ if self.wrapcode:
914
+ return self._wrap_div(self._wrap_pre(self._wrap_code(source)))
915
+ else:
916
+ return self._wrap_div(self._wrap_pre(source))
819
917
 
820
918
  def format_unencoded(self, tokensource, outfile):
821
919
  """
@@ -832,11 +930,16 @@ class HtmlFormatter(Formatter):
832
930
  linewise, e.g. line number generators.
833
931
  """
834
932
  source = self._format_lines(tokensource)
933
+
934
+ # As a special case, we wrap line numbers before line highlighting
935
+ # so the line numbers get wrapped in the highlighting tag.
936
+ if not self.nowrap and self.linenos == 2:
937
+ source = self._wrap_inlinelinenos(source)
938
+
835
939
  if self.hl_lines:
836
940
  source = self._highlight_lines(source)
941
+
837
942
  if not self.nowrap:
838
- if self.linenos == 2:
839
- source = self._wrap_inlinelinenos(source)
840
943
  if self.lineanchors:
841
944
  source = self._wrap_lineanchors(source)
842
945
  if self.linespans: