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
@@ -1,11 +1,10 @@
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-2020 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
 
@@ -63,7 +62,7 @@ def _get_ttype_class(ttype):
63
62
  CSSFILE_TEMPLATE = '''\
64
63
  /*
65
64
  generated by Pygments <https://pygments.org/>
66
- Copyright 2006-2020 by the Pygments team.
65
+ Copyright 2006-2021 by the Pygments team.
67
66
  Licensed under the BSD license, see LICENSE for details.
68
67
  */
69
68
  %(styledefs)s
@@ -74,7 +73,7 @@ DOC_HEADER = '''\
74
73
  "http://www.w3.org/TR/html4/strict.dtd">
75
74
  <!--
76
75
  generated by Pygments <https://pygments.org/>
77
- Copyright 2006-2020 by the Pygments team.
76
+ Copyright 2006-2021 by the Pygments team.
78
77
  Licensed under the BSD license, see LICENSE for details.
79
78
  -->
80
79
  <html>
@@ -273,7 +272,9 @@ class HtmlFormatter(Formatter):
273
272
  125%``).
274
273
 
275
274
  `hl_lines`
276
- Specify a list of lines to be highlighted.
275
+ Specify a list of lines to be highlighted. The line numbers are always
276
+ relative to the input (i.e. the first line is line 1) and are
277
+ independent of `linenostart`.
277
278
 
278
279
  .. versionadded:: 0.11
279
280
 
@@ -304,7 +305,7 @@ class HtmlFormatter(Formatter):
304
305
 
305
306
  `lineanchors`
306
307
  If set to a nonempty string, e.g. ``foo``, the formatter will wrap each
307
- output line in an anchor tag with a ``name`` of ``foo-linenumber``.
308
+ output line in an anchor tag with an ``id`` (and `name`) of ``foo-linenumber``.
308
309
  This allows easy linking to certain lines.
309
310
 
310
311
  .. versionadded:: 0.9
@@ -336,7 +337,9 @@ class HtmlFormatter(Formatter):
336
337
 
337
338
  `filename`
338
339
  A string used to generate a filename when rendering ``<pre>`` blocks,
339
- for example if displaying source code.
340
+ for example if displaying source code. If `linenos` is set to
341
+ ``'table'`` then the filename will be rendered in an initial row
342
+ containing a single `<th>` which spans both columns.
340
343
 
341
344
  .. versionadded:: 2.1
342
345
 
@@ -457,20 +460,20 @@ class HtmlFormatter(Formatter):
457
460
  return ''
458
461
 
459
462
  def _get_css_classes(self, ttype):
460
- """Generate the opening <span> tag for a given token type using CSS classes."""
463
+ """Return the CSS classes of this token type prefixed with the classprefix option."""
461
464
  cls = self._get_css_class(ttype)
462
465
  while ttype not in STANDARD_TYPES:
463
466
  ttype = ttype.parent
464
467
  cls = self._get_css_class(ttype) + ' ' + cls
465
- return cls and '<span class="%s">' % cls or ''
468
+ return cls or ''
466
469
 
467
470
  def _get_css_inline_styles(self, ttype):
468
- """Generate the opening <span> tag for a given token type using inline CSS styles."""
471
+ """Return the inline CSS styles for this token type."""
469
472
  cclass = self.ttype2class.get(ttype)
470
473
  while cclass is None:
471
474
  ttype = ttype.parent
472
475
  cclass = self.ttype2class.get(ttype)
473
- return cclass and '<span style="%s">' % self.class2style[cclass][0] or ''
476
+ return cclass or ''
474
477
 
475
478
  def _create_stylesheet(self):
476
479
  t2c = self.ttype2class = {Token: ''}
@@ -553,9 +556,9 @@ class HtmlFormatter(Formatter):
553
556
  def get_linenos_style_defs(self):
554
557
  lines = [
555
558
  'pre { %s }' % self._pre_style,
556
- 'td.linenos pre { %s }' % self._linenos_style,
559
+ 'td.linenos .normal { %s }' % self._linenos_style,
557
560
  'span.linenos { %s }' % self._linenos_style,
558
- 'td.linenos pre.special { %s }' % self._linenos_special_style,
561
+ 'td.linenos .special { %s }' % self._linenos_special_style,
559
562
  'span.linenos.special { %s }' % self._linenos_special_style,
560
563
  ]
561
564
 
@@ -628,7 +631,7 @@ class HtmlFormatter(Formatter):
628
631
  with open(cssfilename, "w") as cf:
629
632
  cf.write(CSSFILE_TEMPLATE %
630
633
  {'styledefs': self.get_style_defs('body')})
631
- except IOError as err:
634
+ except OSError as err:
632
635
  err.strerror = 'Error writing CSS file: ' + err.strerror
633
636
  raise
634
637
 
@@ -683,7 +686,7 @@ class HtmlFormatter(Formatter):
683
686
  if special_line:
684
687
  style = ' class="special"'
685
688
  else:
686
- style = ''
689
+ style = ' class="normal"'
687
690
 
688
691
  if style:
689
692
  line = '<span%s>%s</span>' % (style, line)
@@ -692,11 +695,20 @@ class HtmlFormatter(Formatter):
692
695
 
693
696
  ls = '\n'.join(lines)
694
697
 
698
+ # If a filename was specified, we can't put it into the code table as it
699
+ # would misalign the line numbers. Hence we emit a separate row for it.
700
+ filename_tr = ""
701
+ if self.filename:
702
+ filename_tr = (
703
+ '<tr><th colspan="2" class="filename"><div class="highlight">'
704
+ '<span class="filename">' + self.filename + '</span></div>'
705
+ '</th></tr>')
706
+
695
707
  # in case you wonder about the seemingly redundant <div> here: since the
696
708
  # content in the other cell also is wrapped in a div, some browsers in
697
709
  # some configurations seem to mess up the formatting...
698
710
  yield 0, (
699
- '<table class="%stable">' % self.cssclass +
711
+ '<table class="%stable">' % self.cssclass + filename_tr +
700
712
  '<tr><td class="linenos"><div class="linenodiv"><pre>' +
701
713
  ls + '</pre></div></td><td class="code">'
702
714
  )
@@ -710,6 +722,8 @@ class HtmlFormatter(Formatter):
710
722
  st = self.linenostep
711
723
  num = self.linenostart
712
724
  mw = len(str(len(inner_lines) + num - 1))
725
+ la = self.lineanchors
726
+ aln = self.anchorlinenos
713
727
  nocls = self.noclasses
714
728
 
715
729
  for _, inner_line in inner_lines:
@@ -733,9 +747,15 @@ class HtmlFormatter(Formatter):
733
747
  style = ' class="linenos"'
734
748
 
735
749
  if style:
736
- yield 1, '<span%s>%s</span>' % (style, line) + inner_line
750
+ linenos = '<span%s>%s</span>' % (style, line)
737
751
  else:
738
- yield 1, line + inner_line
752
+ linenos = line
753
+
754
+ if aln:
755
+ yield 1, ('<a href="#%s-%d">%s</a>' % (la, num, linenos) +
756
+ inner_line)
757
+ else:
758
+ yield 1, linenos + inner_line
739
759
  num += 1
740
760
 
741
761
  def _wrap_lineanchors(self, inner):
@@ -745,7 +765,7 @@ class HtmlFormatter(Formatter):
745
765
  for t, line in inner:
746
766
  if t:
747
767
  i += 1
748
- yield 1, '<a name="%s-%d"></a>' % (s, i) + line
768
+ yield 1, '<a id="%s-%d" name="%s-%d"></a>' % (s, i, s, i) + line
749
769
  else:
750
770
  yield 0, line
751
771
 
@@ -781,7 +801,7 @@ class HtmlFormatter(Formatter):
781
801
  style.append(self._pre_style)
782
802
  style = '; '.join(style)
783
803
 
784
- if self.filename:
804
+ if self.filename and self.linenos != 1:
785
805
  yield 0, ('<span class="filename">' + self.filename + '</span>')
786
806
 
787
807
  # the empty span here is to keep leading empty lines from being
@@ -816,9 +836,12 @@ class HtmlFormatter(Formatter):
816
836
  cspan = self.span_element_openers[ttype]
817
837
  except KeyError:
818
838
  if nocls:
819
- cspan = self.span_element_openers[ttype] = self._get_css_inline_styles(ttype)
839
+ css_style = self._get_css_inline_styles(ttype)
840
+ cspan = css_style and '<span style="%s">' % self.class2style[css_style][0] or ''
820
841
  else:
821
- cspan = self.span_element_openers[ttype] = self._get_css_classes(ttype)
842
+ css_class = self._get_css_classes(ttype)
843
+ cspan = css_class and '<span class="%s">' % css_class or ''
844
+ self.span_element_openers[ttype] = cspan
822
845
 
823
846
  parts = self._translate_parts(value)
824
847
 
@@ -867,7 +890,7 @@ class HtmlFormatter(Formatter):
867
890
 
868
891
  def _lookup_ctag(self, token):
869
892
  entry = ctags.TagEntry()
870
- if self._ctags.find(entry, token, 0):
893
+ if self._ctags.find(entry, token.encode(), 0):
871
894
  return entry['file'], entry['lineNumber']
872
895
  else:
873
896
  return None, None
@@ -920,11 +943,16 @@ class HtmlFormatter(Formatter):
920
943
  linewise, e.g. line number generators.
921
944
  """
922
945
  source = self._format_lines(tokensource)
946
+
947
+ # As a special case, we wrap line numbers before line highlighting
948
+ # so the line numbers get wrapped in the highlighting tag.
949
+ if not self.nowrap and self.linenos == 2:
950
+ source = self._wrap_inlinelinenos(source)
951
+
923
952
  if self.hl_lines:
924
953
  source = self._highlight_lines(source)
954
+
925
955
  if not self.nowrap:
926
- if self.linenos == 2:
927
- source = self._wrap_inlinelinenos(source)
928
956
  if self.lineanchors:
929
957
  source = self._wrap_lineanchors(source)
930
958
  if self.linespans:
@@ -1,11 +1,10 @@
1
- # -*- coding: utf-8 -*-
2
1
  """
3
2
  pygments.formatters.img
4
3
  ~~~~~~~~~~~~~~~~~~~~~~~
5
4
 
6
5
  Formatter for Pixmap output.
7
6
 
8
- :copyright: Copyright 2006-2020 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
 
@@ -156,7 +155,7 @@ class FontManager:
156
155
  valname = '%s%s%s' % (basename, style and ' '+style, suffix)
157
156
  val, _ = _winreg.QueryValueEx(key, valname)
158
157
  return val
159
- except EnvironmentError:
158
+ except OSError:
160
159
  continue
161
160
  else:
162
161
  if fail:
@@ -190,7 +189,7 @@ class FontManager:
190
189
  lookuperror = err
191
190
  finally:
192
191
  _winreg.CloseKey(key)
193
- except EnvironmentError:
192
+ except OSError:
194
193
  pass
195
194
  else:
196
195
  # If we get here, we checked all registry keys and had no luck
@@ -453,6 +452,16 @@ class ImageFormatter(Formatter):
453
452
  fill = '#000'
454
453
  return fill
455
454
 
455
+ def _get_text_bg_color(self, style):
456
+ """
457
+ Get the correct background color for the token from the style.
458
+ """
459
+ if style['bgcolor'] is not None:
460
+ bg_color = '#' + style['bgcolor']
461
+ else:
462
+ bg_color = None
463
+ return bg_color
464
+
456
465
  def _get_style_font(self, style):
457
466
  """
458
467
  Get the correct font for the style.
@@ -475,14 +484,15 @@ class ImageFormatter(Formatter):
475
484
  str(lineno).rjust(self.line_number_chars),
476
485
  font=self.fonts.get_font(self.line_number_bold,
477
486
  self.line_number_italic),
478
- fill=self.line_number_fg,
487
+ text_fg=self.line_number_fg,
488
+ text_bg=None,
479
489
  )
480
490
 
481
- def _draw_text(self, pos, text, font, **kw):
491
+ def _draw_text(self, pos, text, font, text_fg, text_bg):
482
492
  """
483
493
  Remember a single drawable tuple to paint later.
484
494
  """
485
- self.drawables.append((pos, text, font, kw))
495
+ self.drawables.append((pos, text, font, text_fg, text_bg))
486
496
 
487
497
  def _create_drawables(self, tokensource):
488
498
  """
@@ -507,7 +517,8 @@ class ImageFormatter(Formatter):
507
517
  self._get_text_pos(linelength, lineno),
508
518
  temp,
509
519
  font = self._get_style_font(style),
510
- fill = self._get_text_color(style)
520
+ text_fg = self._get_text_color(style),
521
+ text_bg = self._get_text_bg_color(style),
511
522
  )
512
523
  temp_width, temp_hight = self.fonts.get_text_size(temp)
513
524
  linelength += temp_width
@@ -577,8 +588,11 @@ class ImageFormatter(Formatter):
577
588
  y = self._get_line_y(linenumber - 1)
578
589
  draw.rectangle([(x, y), (x + rectw, y + recth)],
579
590
  fill=self.hl_color)
580
- for pos, value, font, kw in self.drawables:
581
- draw.text(pos, value, font=font, **kw)
591
+ for pos, value, font, text_fg, text_bg in self.drawables:
592
+ if text_bg:
593
+ text_size = draw.textsize(text=value, font=font)
594
+ draw.rectangle([pos[0], pos[1], pos[0] + text_size[0], pos[1] + text_size[1]], fill=text_bg)
595
+ draw.text(pos, value, font=font, fill=text_fg)
582
596
  im.save(outfile, self.image_format.upper())
583
597
 
584
598
 
@@ -1,11 +1,10 @@
1
- # -*- coding: utf-8 -*-
2
1
  """
3
2
  pygments.formatters.irc
4
3
  ~~~~~~~~~~~~~~~~~~~~~~~
5
4
 
6
5
  Formatter for IRC output
7
6
 
8
- :copyright: Copyright 2006-2020 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,11 +1,10 @@
1
- # -*- coding: utf-8 -*-
2
1
  """
3
2
  pygments.formatters.latex
4
3
  ~~~~~~~~~~~~~~~~~~~~~~~~~
5
4
 
6
5
  Formatter for LaTeX fancyvrb output.
7
6
 
8
- :copyright: Copyright 2006-2020 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
 
@@ -300,13 +299,13 @@ class LatexFormatter(Formatter):
300
299
  cmndef += (r'\def\$$@tc##1{\textcolor[rgb]{%s}{##1}}' %
301
300
  rgbcolor(ndef['color']))
302
301
  if ndef['border']:
303
- cmndef += (r'\def\$$@bc##1{\setlength{\fboxsep}{0pt}'
304
- r'\fcolorbox[rgb]{%s}{%s}{\strut ##1}}' %
302
+ cmndef += (r'\def\$$@bc##1{{\setlength{\fboxsep}{\string -\fboxrule}'
303
+ r'\fcolorbox[rgb]{%s}{%s}{\strut ##1}}}' %
305
304
  (rgbcolor(ndef['border']),
306
305
  rgbcolor(ndef['bgcolor'])))
307
306
  elif ndef['bgcolor']:
308
- cmndef += (r'\def\$$@bc##1{\setlength{\fboxsep}{0pt}'
309
- r'\colorbox[rgb]{%s}{\strut ##1}}' %
307
+ cmndef += (r'\def\$$@bc##1{{\setlength{\fboxsep}{0pt}'
308
+ r'\colorbox[rgb]{%s}{\strut ##1}}}' %
310
309
  rgbcolor(ndef['bgcolor']))
311
310
  if cmndef == '':
312
311
  continue
@@ -322,8 +321,7 @@ class LatexFormatter(Formatter):
322
321
  cp = self.commandprefix
323
322
  styles = []
324
323
  for name, definition in self.cmd2def.items():
325
- styles.append(r'\expandafter\def\csname %s@tok@%s\endcsname{%s}' %
326
- (cp, name, definition))
324
+ styles.append(r'\@namedef{%s@tok@%s}{%s}' % (cp, name, definition))
327
325
  return STYLE_TEMPLATE % {'cp': self.commandprefix,
328
326
  'styles': '\n'.join(styles)}
329
327
 
@@ -343,7 +341,8 @@ class LatexFormatter(Formatter):
343
341
  (start and ',firstnumber=%d' % start or '') +
344
342
  (step and ',stepnumber=%d' % step or ''))
345
343
  if self.mathescape or self.texcomments or self.escapeinside:
346
- outfile.write(',codes={\\catcode`\\$=3\\catcode`\\^=7\\catcode`\\_=8}')
344
+ outfile.write(',codes={\\catcode`\\$=3\\catcode`\\^=7'
345
+ '\\catcode`\\_=8\\relax}')
347
346
  if self.verboptions:
348
347
  outfile.write(',' + self.verboptions)
349
348
  outfile.write(']\n')
@@ -1,11 +1,10 @@
1
- # -*- coding: utf-8 -*-
2
1
  """
3
2
  pygments.formatters.other
4
3
  ~~~~~~~~~~~~~~~~~~~~~~~~~
5
4
 
6
5
  Other formatters: NullFormatter, RawTokenFormatter.
7
6
 
8
- :copyright: Copyright 2006-2020 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
 
@@ -88,34 +87,32 @@ class RawTokenFormatter(Formatter):
88
87
  import gzip
89
88
  outfile = gzip.GzipFile('', 'wb', 9, outfile)
90
89
 
91
- def write(text):
92
- outfile.write(text.encode())
93
- flush = outfile.flush
90
+ write = outfile.write
91
+ flush = outfile.close
94
92
  elif self.compress == 'bz2':
95
93
  import bz2
96
94
  compressor = bz2.BZ2Compressor(9)
97
95
 
98
96
  def write(text):
99
- outfile.write(compressor.compress(text.encode()))
97
+ outfile.write(compressor.compress(text))
100
98
 
101
99
  def flush():
102
100
  outfile.write(compressor.flush())
103
101
  outfile.flush()
104
102
  else:
105
- def write(text):
106
- outfile.write(text.encode())
103
+ write = outfile.write
107
104
  flush = outfile.flush
108
105
 
109
106
  if self.error_color:
110
107
  for ttype, value in tokensource:
111
- line = "%s\t%r\n" % (ttype, value)
108
+ line = b"%r\t%r\n" % (ttype, value)
112
109
  if ttype is Token.Error:
113
110
  write(colorize(self.error_color, line))
114
111
  else:
115
112
  write(line)
116
113
  else:
117
114
  for ttype, value in tokensource:
118
- write("%s\t%r\n" % (ttype, value))
115
+ write(b"%r\t%r\n" % (ttype, value))
119
116
  flush()
120
117
 
121
118
 
@@ -0,0 +1,83 @@
1
+ """
2
+ pygments.formatters.pangomarkup
3
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
4
+
5
+ Formatter for Pango markup output.
6
+
7
+ :copyright: Copyright 2006-2021 by the Pygments team, see AUTHORS.
8
+ :license: BSD, see LICENSE for details.
9
+ """
10
+
11
+ from pygments.formatter import Formatter
12
+
13
+
14
+ __all__ = ['PangoMarkupFormatter']
15
+
16
+
17
+ _escape_table = {
18
+ ord('&'): '&amp;',
19
+ ord('<'): '&lt;',
20
+ }
21
+
22
+
23
+ def escape_special_chars(text, table=_escape_table):
24
+ """Escape & and < for Pango Markup."""
25
+ return text.translate(table)
26
+
27
+
28
+ class PangoMarkupFormatter(Formatter):
29
+ """
30
+ Format tokens as Pango Markup code. It can then be rendered to an SVG.
31
+
32
+ .. versionadded:: 2.9
33
+ """
34
+
35
+ name = 'Pango Markup'
36
+ aliases = ['pango', 'pangomarkup']
37
+ filenames = []
38
+
39
+ def __init__(self, **options):
40
+ Formatter.__init__(self, **options)
41
+
42
+ self.styles = {}
43
+
44
+ for token, style in self.style:
45
+ start = ''
46
+ end = ''
47
+ if style['color']:
48
+ start += '<span fgcolor="#%s">' % style['color']
49
+ end = '</span>' + end
50
+ if style['bold']:
51
+ start += '<b>'
52
+ end = '</b>' + end
53
+ if style['italic']:
54
+ start += '<i>'
55
+ end = '</i>' + end
56
+ if style['underline']:
57
+ start += '<u>'
58
+ end = '</u>' + end
59
+ self.styles[token] = (start, end)
60
+
61
+ def format_unencoded(self, tokensource, outfile):
62
+ lastval = ''
63
+ lasttype = None
64
+
65
+ outfile.write('<tt>')
66
+
67
+ for ttype, value in tokensource:
68
+ while ttype not in self.styles:
69
+ ttype = ttype.parent
70
+ if ttype == lasttype:
71
+ lastval += escape_special_chars(value)
72
+ else:
73
+ if lastval:
74
+ stylebegin, styleend = self.styles[lasttype]
75
+ outfile.write(stylebegin + lastval + styleend)
76
+ lastval = escape_special_chars(value)
77
+ lasttype = ttype
78
+
79
+ if lastval:
80
+ stylebegin, styleend = self.styles[lasttype]
81
+ outfile.write(stylebegin + lastval + styleend)
82
+
83
+ outfile.write('</tt>')
@@ -1,11 +1,10 @@
1
- # -*- coding: utf-8 -*-
2
1
  """
3
2
  pygments.formatters.rtf
4
3
  ~~~~~~~~~~~~~~~~~~~~~~~
5
4
 
6
5
  A formatter that generates RTF files.
7
6
 
8
- :copyright: Copyright 2006-2020 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,11 +1,10 @@
1
- # -*- coding: utf-8 -*-
2
1
  """
3
2
  pygments.formatters.svg
4
3
  ~~~~~~~~~~~~~~~~~~~~~~~
5
4
 
6
5
  Formatter for SVG output.
7
6
 
8
- :copyright: Copyright 2006-2020 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
 
@@ -141,7 +140,8 @@ class SvgFormatter(Formatter):
141
140
 
142
141
  if self.linenos:
143
142
  if counter % counter_step == 0:
144
- outfile.write('<text x="%s" y="%s" %s text-anchor="end">%s</text>' % (x+self.linenowidth,y,counter_style,counter))
143
+ outfile.write('<text x="%s" y="%s" %s text-anchor="end">%s</text>' %
144
+ (x+self.linenowidth,y,counter_style,counter))
145
145
  line_x += self.linenowidth + self.ystep
146
146
  counter += 1
147
147
 
@@ -159,7 +159,8 @@ class SvgFormatter(Formatter):
159
159
  y += self.ystep
160
160
  outfile.write('</text>\n')
161
161
  if self.linenos and counter % counter_step == 0:
162
- outfile.write('<text x="%s" y="%s" text-anchor="end" %s>%s</text>' % (x+self.linenowidth,y,counter_style,counter))
162
+ outfile.write('<text x="%s" y="%s" text-anchor="end" %s>%s</text>' %
163
+ (x+self.linenowidth,y,counter_style,counter))
163
164
 
164
165
  counter += 1
165
166
  outfile.write('<text x="%s" y="%s" ' 'xml:space="preserve">' % (line_x,y))
@@ -1,11 +1,10 @@
1
- # -*- coding: utf-8 -*-
2
1
  """
3
2
  pygments.formatters.terminal
4
3
  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
5
4
 
6
5
  Formatter for terminal output with ANSI sequences.
7
6
 
8
- :copyright: Copyright 2006-2020 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,4 +1,3 @@
1
- # -*- coding: utf-8 -*-
2
1
  """
3
2
  pygments.formatters.terminal256
4
3
  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -11,7 +10,7 @@
11
10
 
12
11
  Formatter version 1.
13
12
 
14
- :copyright: Copyright 2006-2020 by the Pygments team, see AUTHORS.
13
+ :copyright: Copyright 2006-2021 by the Pygments team, see AUTHORS.
15
14
  :license: BSD, see LICENSE for details.
16
15
  """
17
16
 
@@ -126,6 +125,10 @@ class Terminal256Formatter(Formatter):
126
125
  `style`
127
126
  The style to use, can be a string or a Style subclass (default:
128
127
  ``'default'``).
128
+
129
+ `linenos`
130
+ Set to ``True`` to have line numbers on the terminal output as well
131
+ (default: ``False`` = no line numbers).
129
132
  """
130
133
  name = 'Terminal256'
131
134
  aliases = ['terminal256', 'console256', '256']
@@ -145,6 +148,9 @@ class Terminal256Formatter(Formatter):
145
148
  self._build_color_table() # build an RGB-to-256 color conversion table
146
149
  self._setup_styles() # convert selected style's colors to term. colors
147
150
 
151
+ self.linenos = options.get('linenos', False)
152
+ self._lineno = 0
153
+
148
154
  def _build_color_table(self):
149
155
  # colors 0..15: 16 basic colors
150
156
 
@@ -238,10 +244,17 @@ class Terminal256Formatter(Formatter):
238
244
  self.style_string[str(ttype)] = (escape.color_string(),
239
245
  escape.reset_string())
240
246
 
247
+ def _write_lineno(self, outfile):
248
+ self._lineno += 1
249
+ outfile.write("%s%04d: " % (self._lineno != 1 and '\n' or '', self._lineno))
250
+
241
251
  def format(self, tokensource, outfile):
242
252
  return Formatter.format(self, tokensource, outfile)
243
253
 
244
254
  def format_unencoded(self, tokensource, outfile):
255
+ if self.linenos:
256
+ self._write_lineno(outfile)
257
+
245
258
  for ttype, value in tokensource:
246
259
  not_found = True
247
260
  while ttype and not_found:
@@ -255,7 +268,11 @@ class Terminal256Formatter(Formatter):
255
268
  for line in spl[:-1]:
256
269
  if line:
257
270
  outfile.write(on + line + off)
258
- outfile.write('\n')
271
+ if self.linenos:
272
+ self._write_lineno(outfile)
273
+ else:
274
+ outfile.write('\n')
275
+
259
276
  if spl[-1]:
260
277
  outfile.write(on + spl[-1] + off)
261
278
 
@@ -270,6 +287,10 @@ class Terminal256Formatter(Formatter):
270
287
  if not_found:
271
288
  outfile.write(value)
272
289
 
290
+ if self.linenos:
291
+ outfile.write("\n")
292
+
293
+
273
294
 
274
295
  class TerminalTrueColorFormatter(Terminal256Formatter):
275
296
  r"""