pygments.rb 2.4.1 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (348) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci.yml +8 -8
  3. data/.github/workflows/release.yml +5 -5
  4. data/.gitignore +2 -0
  5. data/.rubocop.yml +1 -1
  6. data/CHANGELOG.adoc +9 -1
  7. data/README.adoc +2 -2
  8. data/lib/pygments/version.rb +1 -1
  9. data/pygments.rb.gemspec +2 -2
  10. data/vendor/pygments-main/bin/pygmentize +1 -1
  11. data/vendor/pygments-main/pygments/__init__.py +2 -2
  12. data/vendor/pygments-main/pygments/__main__.py +1 -1
  13. data/vendor/pygments-main/pygments/cmdline.py +12 -12
  14. data/vendor/pygments-main/pygments/console.py +5 -5
  15. data/vendor/pygments-main/pygments/filter.py +2 -3
  16. data/vendor/pygments-main/pygments/filters/__init__.py +4 -4
  17. data/vendor/pygments-main/pygments/formatter.py +6 -1
  18. data/vendor/pygments-main/pygments/formatters/__init__.py +7 -8
  19. data/vendor/pygments-main/pygments/formatters/_mapping.py +0 -0
  20. data/vendor/pygments-main/pygments/formatters/bbcode.py +2 -2
  21. data/vendor/pygments-main/pygments/formatters/groff.py +3 -3
  22. data/vendor/pygments-main/pygments/formatters/html.py +38 -40
  23. data/vendor/pygments-main/pygments/formatters/img.py +51 -11
  24. data/vendor/pygments-main/pygments/formatters/irc.py +1 -1
  25. data/vendor/pygments-main/pygments/formatters/latex.py +24 -27
  26. data/vendor/pygments-main/pygments/formatters/other.py +3 -4
  27. data/vendor/pygments-main/pygments/formatters/pangomarkup.py +2 -2
  28. data/vendor/pygments-main/pygments/formatters/rtf.py +228 -25
  29. data/vendor/pygments-main/pygments/formatters/svg.py +17 -20
  30. data/vendor/pygments-main/pygments/formatters/terminal.py +1 -1
  31. data/vendor/pygments-main/pygments/formatters/terminal256.py +1 -1
  32. data/vendor/pygments-main/pygments/lexer.py +51 -33
  33. data/vendor/pygments-main/pygments/lexers/__init__.py +12 -12
  34. data/vendor/pygments-main/pygments/lexers/_ada_builtins.py +1 -1
  35. data/vendor/pygments-main/pygments/lexers/_asy_builtins.py +1 -1
  36. data/vendor/pygments-main/pygments/lexers/_cl_builtins.py +1 -1
  37. data/vendor/pygments-main/pygments/lexers/_cocoa_builtins.py +2 -2
  38. data/vendor/pygments-main/pygments/lexers/_csound_builtins.py +1 -1
  39. data/vendor/pygments-main/pygments/lexers/_css_builtins.py +1 -1
  40. data/vendor/pygments-main/pygments/lexers/_julia_builtins.py +1 -1
  41. data/vendor/pygments-main/pygments/lexers/_lasso_builtins.py +1 -1
  42. data/vendor/pygments-main/pygments/lexers/_lilypond_builtins.py +1 -1
  43. data/vendor/pygments-main/pygments/lexers/_lua_builtins.py +5 -5
  44. data/vendor/pygments-main/pygments/lexers/_luau_builtins.py +62 -0
  45. data/vendor/pygments-main/pygments/lexers/_mapping.py +41 -11
  46. data/vendor/pygments-main/pygments/lexers/_mql_builtins.py +1 -1
  47. data/vendor/pygments-main/pygments/lexers/_mysql_builtins.py +3 -3
  48. data/vendor/pygments-main/pygments/lexers/_openedge_builtins.py +1 -1
  49. data/vendor/pygments-main/pygments/lexers/_php_builtins.py +3 -3
  50. data/vendor/pygments-main/pygments/lexers/_postgres_builtins.py +5 -5
  51. data/vendor/pygments-main/pygments/lexers/_qlik_builtins.py +1 -1
  52. data/vendor/pygments-main/pygments/lexers/_scheme_builtins.py +1 -1
  53. data/vendor/pygments-main/pygments/lexers/_scilab_builtins.py +4 -4
  54. data/vendor/pygments-main/pygments/lexers/_sourcemod_builtins.py +3 -3
  55. data/vendor/pygments-main/pygments/lexers/_stan_builtins.py +1 -1
  56. data/vendor/pygments-main/pygments/lexers/_stata_builtins.py +1 -1
  57. data/vendor/pygments-main/pygments/lexers/_tsql_builtins.py +1 -1
  58. data/vendor/pygments-main/pygments/lexers/_usd_builtins.py +1 -1
  59. data/vendor/pygments-main/pygments/lexers/_vbscript_builtins.py +1 -1
  60. data/vendor/pygments-main/pygments/lexers/_vim_builtins.py +1 -1
  61. data/vendor/pygments-main/pygments/lexers/actionscript.py +6 -8
  62. data/vendor/pygments-main/pygments/lexers/ada.py +3 -3
  63. data/vendor/pygments-main/pygments/lexers/agile.py +3 -1
  64. data/vendor/pygments-main/pygments/lexers/algebra.py +9 -13
  65. data/vendor/pygments-main/pygments/lexers/ambient.py +2 -3
  66. data/vendor/pygments-main/pygments/lexers/amdgpu.py +3 -3
  67. data/vendor/pygments-main/pygments/lexers/ampl.py +2 -3
  68. data/vendor/pygments-main/pygments/lexers/apdlexer.py +4 -3
  69. data/vendor/pygments-main/pygments/lexers/apl.py +2 -3
  70. data/vendor/pygments-main/pygments/lexers/archetype.py +8 -12
  71. data/vendor/pygments-main/pygments/lexers/arrow.py +2 -3
  72. data/vendor/pygments-main/pygments/lexers/arturo.py +2 -3
  73. data/vendor/pygments-main/pygments/lexers/asc.py +4 -4
  74. data/vendor/pygments-main/pygments/lexers/asm.py +28 -15
  75. data/vendor/pygments-main/pygments/lexers/asn1.py +178 -0
  76. data/vendor/pygments-main/pygments/lexers/automation.py +6 -8
  77. data/vendor/pygments-main/pygments/lexers/bare.py +2 -3
  78. data/vendor/pygments-main/pygments/lexers/basic.py +48 -57
  79. data/vendor/pygments-main/pygments/lexers/bdd.py +3 -4
  80. data/vendor/pygments-main/pygments/lexers/berry.py +4 -4
  81. data/vendor/pygments-main/pygments/lexers/bibtex.py +5 -5
  82. data/vendor/pygments-main/pygments/lexers/blueprint.py +173 -0
  83. data/vendor/pygments-main/pygments/lexers/boa.py +4 -4
  84. data/vendor/pygments-main/pygments/lexers/bqn.py +109 -0
  85. data/vendor/pygments-main/pygments/lexers/business.py +21 -22
  86. data/vendor/pygments-main/pygments/lexers/c_cpp.py +9 -4
  87. data/vendor/pygments-main/pygments/lexers/c_like.py +99 -27
  88. data/vendor/pygments-main/pygments/lexers/capnproto.py +2 -3
  89. data/vendor/pygments-main/pygments/lexers/carbon.py +10 -11
  90. data/vendor/pygments-main/pygments/lexers/cddl.py +8 -9
  91. data/vendor/pygments-main/pygments/lexers/chapel.py +2 -3
  92. data/vendor/pygments-main/pygments/lexers/clean.py +2 -1
  93. data/vendor/pygments-main/pygments/lexers/comal.py +2 -1
  94. data/vendor/pygments-main/pygments/lexers/compiled.py +2 -1
  95. data/vendor/pygments-main/pygments/lexers/configs.py +342 -108
  96. data/vendor/pygments-main/pygments/lexers/console.py +5 -5
  97. data/vendor/pygments-main/pygments/lexers/cplint.py +2 -3
  98. data/vendor/pygments-main/pygments/lexers/crystal.py +4 -5
  99. data/vendor/pygments-main/pygments/lexers/csound.py +6 -8
  100. data/vendor/pygments-main/pygments/lexers/css.py +5 -5
  101. data/vendor/pygments-main/pygments/lexers/d.py +4 -3
  102. data/vendor/pygments-main/pygments/lexers/dalvik.py +2 -3
  103. data/vendor/pygments-main/pygments/lexers/data.py +8 -12
  104. data/vendor/pygments-main/pygments/lexers/dax.py +2 -3
  105. data/vendor/pygments-main/pygments/lexers/devicetree.py +2 -3
  106. data/vendor/pygments-main/pygments/lexers/diff.py +7 -6
  107. data/vendor/pygments-main/pygments/lexers/dns.py +109 -0
  108. data/vendor/pygments-main/pygments/lexers/dotnet.py +19 -14
  109. data/vendor/pygments-main/pygments/lexers/dsls.py +24 -35
  110. data/vendor/pygments-main/pygments/lexers/dylan.py +8 -16
  111. data/vendor/pygments-main/pygments/lexers/ecl.py +2 -3
  112. data/vendor/pygments-main/pygments/lexers/eiffel.py +3 -4
  113. data/vendor/pygments-main/pygments/lexers/elm.py +3 -4
  114. data/vendor/pygments-main/pygments/lexers/elpi.py +28 -21
  115. data/vendor/pygments-main/pygments/lexers/email.py +3 -3
  116. data/vendor/pygments-main/pygments/lexers/erlang.py +22 -24
  117. data/vendor/pygments-main/pygments/lexers/esoteric.py +11 -12
  118. data/vendor/pygments-main/pygments/lexers/ezhil.py +2 -3
  119. data/vendor/pygments-main/pygments/lexers/factor.py +2 -3
  120. data/vendor/pygments-main/pygments/lexers/fantom.py +3 -3
  121. data/vendor/pygments-main/pygments/lexers/felix.py +9 -10
  122. data/vendor/pygments-main/pygments/lexers/fift.py +2 -1
  123. data/vendor/pygments-main/pygments/lexers/floscript.py +2 -3
  124. data/vendor/pygments-main/pygments/lexers/forth.py +2 -3
  125. data/vendor/pygments-main/pygments/lexers/fortran.py +6 -7
  126. data/vendor/pygments-main/pygments/lexers/foxpro.py +3 -3
  127. data/vendor/pygments-main/pygments/lexers/freefem.py +2 -3
  128. data/vendor/pygments-main/pygments/lexers/func.py +3 -1
  129. data/vendor/pygments-main/pygments/lexers/functional.py +2 -1
  130. data/vendor/pygments-main/pygments/lexers/futhark.py +6 -7
  131. data/vendor/pygments-main/pygments/lexers/gcodelexer.py +3 -3
  132. data/vendor/pygments-main/pygments/lexers/gdscript.py +2 -1
  133. data/vendor/pygments-main/pygments/lexers/go.py +3 -4
  134. data/vendor/pygments-main/pygments/lexers/grammar_notation.py +6 -9
  135. data/vendor/pygments-main/pygments/lexers/graph.py +12 -9
  136. data/vendor/pygments-main/pygments/lexers/graphics.py +13 -17
  137. data/vendor/pygments-main/pygments/lexers/graphql.py +176 -0
  138. data/vendor/pygments-main/pygments/lexers/graphviz.py +2 -3
  139. data/vendor/pygments-main/pygments/lexers/gsql.py +2 -3
  140. data/vendor/pygments-main/pygments/lexers/haskell.py +27 -32
  141. data/vendor/pygments-main/pygments/lexers/haxe.py +3 -5
  142. data/vendor/pygments-main/pygments/lexers/hdl.py +8 -7
  143. data/vendor/pygments-main/pygments/lexers/hexdump.py +3 -3
  144. data/vendor/pygments-main/pygments/lexers/html.py +34 -13
  145. data/vendor/pygments-main/pygments/lexers/idl.py +2 -3
  146. data/vendor/pygments-main/pygments/lexers/igor.py +305 -290
  147. data/vendor/pygments-main/pygments/lexers/inferno.py +2 -3
  148. data/vendor/pygments-main/pygments/lexers/installers.py +7 -9
  149. data/vendor/pygments-main/pygments/lexers/int_fiction.py +150 -162
  150. data/vendor/pygments-main/pygments/lexers/iolang.py +2 -3
  151. data/vendor/pygments-main/pygments/lexers/j.py +2 -3
  152. data/vendor/pygments-main/pygments/lexers/javascript.py +18 -19
  153. data/vendor/pygments-main/pygments/lexers/jmespath.py +2 -1
  154. data/vendor/pygments-main/pygments/lexers/jslt.py +2 -3
  155. data/vendor/pygments-main/pygments/lexers/jsonnet.py +4 -3
  156. data/vendor/pygments-main/pygments/lexers/jsx.py +75 -0
  157. data/vendor/pygments-main/pygments/lexers/julia.py +4 -5
  158. data/vendor/pygments-main/pygments/lexers/jvm.py +98 -116
  159. data/vendor/pygments-main/pygments/lexers/kuin.py +2 -3
  160. data/vendor/pygments-main/pygments/lexers/kusto.py +93 -0
  161. data/vendor/pygments-main/pygments/lexers/ldap.py +155 -0
  162. data/vendor/pygments-main/pygments/lexers/lean.py +241 -0
  163. data/vendor/pygments-main/pygments/lexers/lilypond.py +2 -3
  164. data/vendor/pygments-main/pygments/lexers/lisp.py +373 -65
  165. data/vendor/pygments-main/pygments/lexers/macaulay2.py +53 -4
  166. data/vendor/pygments-main/pygments/lexers/make.py +7 -5
  167. data/vendor/pygments-main/pygments/lexers/markup.py +242 -91
  168. data/vendor/pygments-main/pygments/lexers/math.py +2 -1
  169. data/vendor/pygments-main/pygments/lexers/matlab.py +10 -12
  170. data/vendor/pygments-main/pygments/lexers/maxima.py +2 -3
  171. data/vendor/pygments-main/pygments/lexers/meson.py +2 -3
  172. data/vendor/pygments-main/pygments/lexers/mime.py +4 -4
  173. data/vendor/pygments-main/pygments/lexers/minecraft.py +24 -27
  174. data/vendor/pygments-main/pygments/lexers/mips.py +3 -1
  175. data/vendor/pygments-main/pygments/lexers/ml.py +59 -61
  176. data/vendor/pygments-main/pygments/lexers/modeling.py +19 -22
  177. data/vendor/pygments-main/pygments/lexers/modula2.py +2 -3
  178. data/vendor/pygments-main/pygments/lexers/mojo.py +704 -0
  179. data/vendor/pygments-main/pygments/lexers/monte.py +2 -3
  180. data/vendor/pygments-main/pygments/lexers/mosel.py +3 -3
  181. data/vendor/pygments-main/pygments/lexers/ncl.py +4 -3
  182. data/vendor/pygments-main/pygments/lexers/nimrod.py +7 -8
  183. data/vendor/pygments-main/pygments/lexers/nit.py +2 -3
  184. data/vendor/pygments-main/pygments/lexers/nix.py +40 -31
  185. data/vendor/pygments-main/pygments/lexers/oberon.py +3 -3
  186. data/vendor/pygments-main/pygments/lexers/objective.py +14 -6
  187. data/vendor/pygments-main/pygments/lexers/ooc.py +2 -3
  188. data/vendor/pygments-main/pygments/lexers/openscad.py +96 -0
  189. data/vendor/pygments-main/pygments/lexers/other.py +2 -1
  190. data/vendor/pygments-main/pygments/lexers/parasail.py +2 -3
  191. data/vendor/pygments-main/pygments/lexers/parsers.py +41 -44
  192. data/vendor/pygments-main/pygments/lexers/pascal.py +6 -3
  193. data/vendor/pygments-main/pygments/lexers/pawn.py +5 -5
  194. data/vendor/pygments-main/pygments/lexers/perl.py +3 -3
  195. data/vendor/pygments-main/pygments/lexers/phix.py +2 -3
  196. data/vendor/pygments-main/pygments/lexers/php.py +4 -5
  197. data/vendor/pygments-main/pygments/lexers/pointless.py +2 -3
  198. data/vendor/pygments-main/pygments/lexers/pony.py +3 -3
  199. data/vendor/pygments-main/pygments/lexers/praat.py +2 -3
  200. data/vendor/pygments-main/pygments/lexers/procfile.py +2 -3
  201. data/vendor/pygments-main/pygments/lexers/prolog.py +23 -9
  202. data/vendor/pygments-main/pygments/lexers/promql.py +2 -1
  203. data/vendor/pygments-main/pygments/lexers/prql.py +251 -0
  204. data/vendor/pygments-main/pygments/lexers/ptx.py +119 -0
  205. data/vendor/pygments-main/pygments/lexers/python.py +24 -24
  206. data/vendor/pygments-main/pygments/lexers/q.py +5 -6
  207. data/vendor/pygments-main/pygments/lexers/qlik.py +3 -3
  208. data/vendor/pygments-main/pygments/lexers/qvt.py +5 -3
  209. data/vendor/pygments-main/pygments/lexers/r.py +8 -6
  210. data/vendor/pygments-main/pygments/lexers/rdf.py +19 -13
  211. data/vendor/pygments-main/pygments/lexers/rebol.py +7 -7
  212. data/vendor/pygments-main/pygments/lexers/resource.py +5 -6
  213. data/vendor/pygments-main/pygments/lexers/ride.py +4 -5
  214. data/vendor/pygments-main/pygments/lexers/rita.py +2 -3
  215. data/vendor/pygments-main/pygments/lexers/rnc.py +2 -3
  216. data/vendor/pygments-main/pygments/lexers/roboconf.py +5 -5
  217. data/vendor/pygments-main/pygments/lexers/robotframework.py +2 -3
  218. data/vendor/pygments-main/pygments/lexers/ruby.py +8 -13
  219. data/vendor/pygments-main/pygments/lexers/rust.py +9 -10
  220. data/vendor/pygments-main/pygments/lexers/sas.py +3 -3
  221. data/vendor/pygments-main/pygments/lexers/savi.py +131 -130
  222. data/vendor/pygments-main/pygments/lexers/scdoc.py +13 -7
  223. data/vendor/pygments-main/pygments/lexers/scripting.py +354 -42
  224. data/vendor/pygments-main/pygments/lexers/sgf.py +2 -3
  225. data/vendor/pygments-main/pygments/lexers/shell.py +107 -129
  226. data/vendor/pygments-main/pygments/lexers/sieve.py +3 -3
  227. data/vendor/pygments-main/pygments/lexers/slash.py +4 -5
  228. data/vendor/pygments-main/pygments/lexers/smalltalk.py +3 -5
  229. data/vendor/pygments-main/pygments/lexers/smithy.py +2 -3
  230. data/vendor/pygments-main/pygments/lexers/smv.py +3 -3
  231. data/vendor/pygments-main/pygments/lexers/snobol.py +3 -3
  232. data/vendor/pygments-main/pygments/lexers/solidity.py +3 -3
  233. data/vendor/pygments-main/pygments/lexers/soong.py +78 -0
  234. data/vendor/pygments-main/pygments/lexers/sophia.py +3 -4
  235. data/vendor/pygments-main/pygments/lexers/special.py +8 -3
  236. data/vendor/pygments-main/pygments/lexers/spice.py +15 -16
  237. data/vendor/pygments-main/pygments/lexers/sql.py +24 -18
  238. data/vendor/pygments-main/pygments/lexers/srcinfo.py +3 -3
  239. data/vendor/pygments-main/pygments/lexers/stata.py +2 -3
  240. data/vendor/pygments-main/pygments/lexers/supercollider.py +2 -3
  241. data/vendor/pygments-main/pygments/lexers/tact.py +303 -0
  242. data/vendor/pygments-main/pygments/lexers/tal.py +13 -10
  243. data/vendor/pygments-main/pygments/lexers/tcl.py +2 -3
  244. data/vendor/pygments-main/pygments/lexers/teal.py +2 -3
  245. data/vendor/pygments-main/pygments/lexers/templates.py +131 -72
  246. data/vendor/pygments-main/pygments/lexers/teraterm.py +2 -3
  247. data/vendor/pygments-main/pygments/lexers/testing.py +4 -5
  248. data/vendor/pygments-main/pygments/lexers/text.py +2 -1
  249. data/vendor/pygments-main/pygments/lexers/textedit.py +9 -6
  250. data/vendor/pygments-main/pygments/lexers/textfmts.py +20 -15
  251. data/vendor/pygments-main/pygments/lexers/theorem.py +41 -115
  252. data/vendor/pygments-main/pygments/lexers/thingsdb.py +50 -26
  253. data/vendor/pygments-main/pygments/lexers/tlb.py +3 -1
  254. data/vendor/pygments-main/pygments/lexers/tls.py +54 -0
  255. data/vendor/pygments-main/pygments/lexers/tnt.py +2 -3
  256. data/vendor/pygments-main/pygments/lexers/trafficscript.py +3 -3
  257. data/vendor/pygments-main/pygments/lexers/typoscript.py +6 -7
  258. data/vendor/pygments-main/pygments/lexers/typst.py +104 -0
  259. data/vendor/pygments-main/pygments/lexers/ul4.py +47 -5
  260. data/vendor/pygments-main/pygments/lexers/unicon.py +9 -7
  261. data/vendor/pygments-main/pygments/lexers/urbi.py +3 -3
  262. data/vendor/pygments-main/pygments/lexers/usd.py +6 -11
  263. data/vendor/pygments-main/pygments/lexers/varnish.py +5 -5
  264. data/vendor/pygments-main/pygments/lexers/verification.py +4 -5
  265. data/vendor/pygments-main/pygments/lexers/verifpal.py +65 -0
  266. data/vendor/pygments-main/pygments/lexers/vip.py +150 -0
  267. data/vendor/pygments-main/pygments/lexers/vyper.py +140 -0
  268. data/vendor/pygments-main/pygments/lexers/web.py +2 -1
  269. data/vendor/pygments-main/pygments/lexers/webassembly.py +2 -3
  270. data/vendor/pygments-main/pygments/lexers/webidl.py +2 -3
  271. data/vendor/pygments-main/pygments/lexers/webmisc.py +11 -15
  272. data/vendor/pygments-main/pygments/lexers/wgsl.py +6 -7
  273. data/vendor/pygments-main/pygments/lexers/whiley.py +2 -3
  274. data/vendor/pygments-main/pygments/lexers/wowtoc.py +3 -3
  275. data/vendor/pygments-main/pygments/lexers/wren.py +3 -4
  276. data/vendor/pygments-main/pygments/lexers/x10.py +6 -7
  277. data/vendor/pygments-main/pygments/lexers/xorg.py +2 -1
  278. data/vendor/pygments-main/pygments/lexers/yang.py +2 -3
  279. data/vendor/pygments-main/pygments/lexers/yara.py +69 -0
  280. data/vendor/pygments-main/pygments/lexers/zig.py +2 -1
  281. data/vendor/pygments-main/pygments/modeline.py +4 -4
  282. data/vendor/pygments-main/pygments/plugin.py +3 -19
  283. data/vendor/pygments-main/pygments/regexopt.py +1 -1
  284. data/vendor/pygments-main/pygments/scanner.py +1 -1
  285. data/vendor/pygments-main/pygments/sphinxext.py +38 -8
  286. data/vendor/pygments-main/pygments/style.py +8 -2
  287. data/vendor/pygments-main/pygments/styles/__init__.py +17 -59
  288. data/vendor/pygments-main/pygments/styles/_mapping.py +54 -0
  289. data/vendor/pygments-main/pygments/styles/abap.py +5 -1
  290. data/vendor/pygments-main/pygments/styles/algol.py +5 -1
  291. data/vendor/pygments-main/pygments/styles/algol_nu.py +5 -1
  292. data/vendor/pygments-main/pygments/styles/arduino.py +76 -72
  293. data/vendor/pygments-main/pygments/styles/autumn.py +6 -1
  294. data/vendor/pygments-main/pygments/styles/borland.py +6 -1
  295. data/vendor/pygments-main/pygments/styles/bw.py +6 -1
  296. data/vendor/pygments-main/pygments/styles/coffee.py +80 -0
  297. data/vendor/pygments-main/pygments/styles/colorful.py +6 -1
  298. data/vendor/pygments-main/pygments/styles/default.py +6 -1
  299. data/vendor/pygments-main/pygments/styles/dracula.py +68 -80
  300. data/vendor/pygments-main/pygments/styles/emacs.py +6 -1
  301. data/vendor/pygments-main/pygments/styles/friendly.py +6 -1
  302. data/vendor/pygments-main/pygments/styles/friendly_grayscale.py +6 -1
  303. data/vendor/pygments-main/pygments/styles/fruity.py +7 -1
  304. data/vendor/pygments-main/pygments/styles/gh_dark.py +7 -1
  305. data/vendor/pygments-main/pygments/styles/gruvbox.py +10 -1
  306. data/vendor/pygments-main/pygments/styles/igor.py +6 -1
  307. data/vendor/pygments-main/pygments/styles/inkpot.py +7 -2
  308. data/vendor/pygments-main/pygments/styles/lightbulb.py +110 -0
  309. data/vendor/pygments-main/pygments/styles/lilypond.py +8 -2
  310. data/vendor/pygments-main/pygments/styles/lovelace.py +16 -10
  311. data/vendor/pygments-main/pygments/styles/manni.py +7 -2
  312. data/vendor/pygments-main/pygments/styles/material.py +21 -14
  313. data/vendor/pygments-main/pygments/styles/monokai.py +16 -10
  314. data/vendor/pygments-main/pygments/styles/murphy.py +7 -2
  315. data/vendor/pygments-main/pygments/styles/native.py +10 -5
  316. data/vendor/pygments-main/pygments/styles/nord.py +9 -3
  317. data/vendor/pygments-main/pygments/styles/onedark.py +6 -2
  318. data/vendor/pygments-main/pygments/styles/paraiso_dark.py +7 -2
  319. data/vendor/pygments-main/pygments/styles/paraiso_light.py +7 -2
  320. data/vendor/pygments-main/pygments/styles/pastie.py +7 -1
  321. data/vendor/pygments-main/pygments/styles/perldoc.py +7 -1
  322. data/vendor/pygments-main/pygments/styles/rainbow_dash.py +26 -19
  323. data/vendor/pygments-main/pygments/styles/rrt.py +8 -2
  324. data/vendor/pygments-main/pygments/styles/sas.py +6 -1
  325. data/vendor/pygments-main/pygments/styles/solarized.py +9 -1
  326. data/vendor/pygments-main/pygments/styles/staroffice.py +6 -1
  327. data/vendor/pygments-main/pygments/styles/stata_dark.py +6 -2
  328. data/vendor/pygments-main/pygments/styles/stata_light.py +6 -1
  329. data/vendor/pygments-main/pygments/styles/tango.py +7 -3
  330. data/vendor/pygments-main/pygments/styles/trac.py +7 -1
  331. data/vendor/pygments-main/pygments/styles/vim.py +7 -1
  332. data/vendor/pygments-main/pygments/styles/vs.py +7 -2
  333. data/vendor/pygments-main/pygments/styles/xcode.py +6 -1
  334. data/vendor/pygments-main/pygments/styles/zenburn.py +6 -1
  335. data/vendor/pygments-main/pygments/token.py +2 -1
  336. data/vendor/pygments-main/pygments/unistring.py +5 -5
  337. data/vendor/pygments-main/pygments/util.py +13 -19
  338. data/vendor/pygments-main/{Pygments-2.15.1.dist-info → pygments-2.18.0.dist-info}/METADATA +14 -13
  339. data/vendor/pygments-main/pygments-2.18.0.dist-info/RECORD +663 -0
  340. data/vendor/pygments-main/{Pygments-2.15.1.dist-info → pygments-2.18.0.dist-info}/WHEEL +1 -2
  341. data/vendor/pygments-main/{Pygments-2.15.1.dist-info → pygments-2.18.0.dist-info/licenses}/AUTHORS +13 -0
  342. metadata +39 -15
  343. data/vendor/pygments-main/Pygments-2.15.1.dist-info/RECORD +0 -614
  344. data/vendor/pygments-main/Pygments-2.15.1.dist-info/top_level.txt +0 -1
  345. /data/vendor/pygments-main/{Pygments-2.15.1.dist-info → pygments-2.18.0.dist-info}/INSTALLER +0 -0
  346. /data/vendor/pygments-main/{Pygments-2.15.1.dist-info → pygments-2.18.0.dist-info}/REQUESTED +0 -0
  347. /data/vendor/pygments-main/{Pygments-2.15.1.dist-info → pygments-2.18.0.dist-info}/entry_points.txt +0 -0
  348. /data/vendor/pygments-main/{Pygments-2.15.1.dist-info → pygments-2.18.0.dist-info/licenses}/LICENSE +0 -0
@@ -4,7 +4,7 @@
4
4
 
5
5
  Lexers for interactive fiction languages.
6
6
 
7
- :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS.
7
+ :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS.
8
8
  :license: BSD, see LICENSE for details.
9
9
  """
10
10
 
@@ -22,14 +22,13 @@ __all__ = ['Inform6Lexer', 'Inform6TemplateLexer', 'Inform7Lexer',
22
22
  class Inform6Lexer(RegexLexer):
23
23
  """
24
24
  For Inform 6 source code.
25
-
26
- .. versionadded:: 2.0
27
25
  """
28
26
 
29
27
  name = 'Inform 6'
30
28
  url = 'http://inform-fiction.org/'
31
29
  aliases = ['inform6', 'i6']
32
30
  filenames = ['*.inf']
31
+ version_added = '2.0'
33
32
 
34
33
  flags = re.MULTILINE | re.DOTALL
35
34
 
@@ -45,13 +44,13 @@ class Inform6Lexer(RegexLexer):
45
44
 
46
45
  tokens = {
47
46
  'root': [
48
- (r'\A(!%%[^%s]*[%s])+' % (_newline, _newline), Comment.Preproc,
47
+ (rf'\A(!%[^{_newline}]*[{_newline}])+', Comment.Preproc,
49
48
  'directive'),
50
49
  default('directive')
51
50
  ],
52
51
  '_whitespace': [
53
52
  (r'\s+', Text),
54
- (r'![^%s]*' % _newline, Comment.Single)
53
+ (rf'![^{_newline}]*', Comment.Single)
55
54
  ],
56
55
  'default': [
57
56
  include('_whitespace'),
@@ -65,20 +64,20 @@ class Inform6Lexer(RegexLexer):
65
64
  '_expression': [
66
65
  include('_whitespace'),
67
66
  (r'(?=sp\b)', Text, '#pop'),
68
- (r'(?=[%s%s$0-9#a-zA-Z_])' % (_dquote, _squote), Text,
67
+ (rf'(?=[{_dquote}{_squote}$0-9#a-zA-Z_])', Text,
69
68
  ('#pop', 'value')),
70
- (r'\+\+|[%s]{1,2}(?!>)|~~?' % _dash, Operator),
71
- (r'(?=[()\[%s,?@{:;])' % _dash, Text, '#pop')
69
+ (rf'\+\+|[{_dash}]{{1,2}}(?!>)|~~?', Operator),
70
+ (rf'(?=[()\[{_dash},?@{{:;])', Text, '#pop')
72
71
  ],
73
72
  'expression': [
74
73
  include('_whitespace'),
75
74
  (r'\(', Punctuation, ('expression', '_expression')),
76
75
  (r'\)', Punctuation, '#pop'),
77
76
  (r'\[', Punctuation, ('#pop', 'statements', 'locals')),
78
- (r'>(?=(\s+|(![^%s]*))*[>;])' % _newline, Punctuation),
79
- (r'\+\+|[%s]{2}(?!>)' % _dash, Operator),
77
+ (rf'>(?=(\s+|(![^{_newline}]*))*[>;])', Punctuation),
78
+ (rf'\+\+|[{_dash}]{{2}}(?!>)', Operator),
80
79
  (r',', Punctuation, '_expression'),
81
- (r'&&?|\|\|?|[=~><]?=|[%s]{1,2}>?|\.\.?[&#]?|::|[<>+*/%%]' % _dash,
80
+ (rf'&&?|\|\|?|[=~><]?=|[{_dash}]{{1,2}}>?|\.\.?[&#]?|::|[<>+*/%]',
82
81
  Operator, '_expression'),
83
82
  (r'(has|hasnt|in|notin|ofclass|or|provides)\b', Operator.Word,
84
83
  '_expression'),
@@ -90,7 +89,7 @@ class Inform6Lexer(RegexLexer):
90
89
  '_assembly-expression': [
91
90
  (r'\(', Punctuation, ('#push', '_expression')),
92
91
  (r'[\[\]]', Punctuation),
93
- (r'[%s]>' % _dash, Punctuation, '_expression'),
92
+ (rf'[{_dash}]>', Punctuation, '_expression'),
94
93
  (r'sp\b', Keyword.Pseudo),
95
94
  (r';', Punctuation, '#pop:3'),
96
95
  include('expression')
@@ -117,25 +116,25 @@ class Inform6Lexer(RegexLexer):
117
116
  'value': [
118
117
  include('_whitespace'),
119
118
  # Strings
120
- (r'[%s][^@][%s]' % (_squote, _squote), String.Char, '#pop'),
121
- (r'([%s])(@\{[0-9a-fA-F]*\})([%s])' % (_squote, _squote),
119
+ (rf'[{_squote}][^@][{_squote}]', String.Char, '#pop'),
120
+ (rf'([{_squote}])(@\{{[0-9a-fA-F]*\}})([{_squote}])',
122
121
  bygroups(String.Char, String.Escape, String.Char), '#pop'),
123
- (r'([%s])(@.{2})([%s])' % (_squote, _squote),
122
+ (rf'([{_squote}])(@.{{2}})([{_squote}])',
124
123
  bygroups(String.Char, String.Escape, String.Char), '#pop'),
125
- (r'[%s]' % _squote, String.Single, ('#pop', 'dictionary-word')),
126
- (r'[%s]' % _dquote, String.Double, ('#pop', 'string')),
124
+ (rf'[{_squote}]', String.Single, ('#pop', 'dictionary-word')),
125
+ (rf'[{_dquote}]', String.Double, ('#pop', 'string')),
127
126
  # Numbers
128
- (r'\$[<>]?[+%s][0-9]*\.?[0-9]*([eE][+%s]?[0-9]+)?' % (_dash, _dash),
127
+ (rf'\$[<>]?[+{_dash}][0-9]*\.?[0-9]*([eE][+{_dash}]?[0-9]+)?',
129
128
  Number.Float, '#pop'),
130
129
  (r'\$[0-9a-fA-F]+', Number.Hex, '#pop'),
131
130
  (r'\$\$[01]+', Number.Bin, '#pop'),
132
131
  (r'[0-9]+', Number.Integer, '#pop'),
133
132
  # Values prefixed by hashes
134
- (r'(##|#a\$)(%s)' % _name, bygroups(Operator, Name), '#pop'),
135
- (r'(#g\$)(%s)' % _name,
133
+ (rf'(##|#a\$)({_name})', bygroups(Operator, Name), '#pop'),
134
+ (rf'(#g\$)({_name})',
136
135
  bygroups(Operator, Name.Variable.Global), '#pop'),
137
136
  (r'#[nw]\$', Operator, ('#pop', 'obsolete-dictionary-word')),
138
- (r'(#r\$)(%s)' % _name, bygroups(Operator, Name.Function), '#pop'),
137
+ (rf'(#r\$)({_name})', bygroups(Operator, Name.Function), '#pop'),
139
138
  (r'#', Name.Builtin, ('#pop', 'system-constant')),
140
139
  # System functions
141
140
  (words((
@@ -182,32 +181,31 @@ class Inform6Lexer(RegexLexer):
182
181
  ],
183
182
  # Strings
184
183
  'dictionary-word': [
185
- (r'[~^]+', String.Escape),
186
- (r'[^~^\\@({%s]+' % _squote, String.Single),
187
- (r'[({]', String.Single),
184
+ (rf'[~^]+|//[^{_squote}]*', String.Escape),
185
+ (rf'[^~^/\\@({{{_squote}]+', String.Single),
186
+ (r'[/({]', String.Single),
188
187
  (r'@\{[0-9a-fA-F]*\}', String.Escape),
189
188
  (r'@.{2}', String.Escape),
190
- (r'[%s]' % _squote, String.Single, '#pop')
189
+ (rf'[{_squote}]', String.Single, '#pop')
191
190
  ],
192
191
  'string': [
193
192
  (r'[~^]+', String.Escape),
194
- (r'[^~^\\@({%s]+' % _dquote, String.Double),
193
+ (rf'[^~^\\@({{{_dquote}]+', String.Double),
195
194
  (r'[({]', String.Double),
196
195
  (r'\\', String.Escape),
197
- (r'@(\\\s*[%s]\s*)*@((\\\s*[%s]\s*)*[0-9])*' %
198
- (_newline, _newline), String.Escape),
199
- (r'@(\\\s*[%s]\s*)*[({]((\\\s*[%s]\s*)*[0-9a-zA-Z_])*'
200
- r'(\\\s*[%s]\s*)*[)}]' % (_newline, _newline, _newline),
196
+ (rf'@(\\\s*[{_newline}]\s*)*@((\\\s*[{_newline}]\s*)*[0-9])*', String.Escape),
197
+ (rf'@(\\\s*[{_newline}]\s*)*[({{]((\\\s*[{_newline}]\s*)*[0-9a-zA-Z_])*'
198
+ rf'(\\\s*[{_newline}]\s*)*[)}}]',
201
199
  String.Escape),
202
- (r'@(\\\s*[%s]\s*)*.(\\\s*[%s]\s*)*.' % (_newline, _newline),
200
+ (rf'@(\\\s*[{_newline}]\s*)*.(\\\s*[{_newline}]\s*)*.',
203
201
  String.Escape),
204
- (r'[%s]' % _dquote, String.Double, '#pop')
202
+ (rf'[{_dquote}]', String.Double, '#pop')
205
203
  ],
206
204
  'plain-string': [
207
- (r'[^~^\\({\[\]%s]+' % _dquote, String.Double),
205
+ (rf'[^~^\\({{\[\]{_dquote}]+', String.Double),
208
206
  (r'[~^({\[\]]', String.Double),
209
207
  (r'\\', String.Escape),
210
- (r'[%s]' % _dquote, String.Double, '#pop')
208
+ (rf'[{_dquote}]', String.Double, '#pop')
211
209
  ],
212
210
  # Names
213
211
  '_constant': [
@@ -326,7 +324,7 @@ class Inform6Lexer(RegexLexer):
326
324
  default('#pop')
327
325
  ],
328
326
  '_object-head': [
329
- (r'[%s]>' % _dash, Punctuation),
327
+ (rf'[{_dash}]>', Punctuation),
330
328
  (r'(class|has|private|with)\b', Keyword.Declaration, '#pop'),
331
329
  include('_global')
332
330
  ],
@@ -356,7 +354,7 @@ class Inform6Lexer(RegexLexer):
356
354
  include('_whitespace'),
357
355
  (r';', Punctuation, '#pop'),
358
356
  (r'[/*]', Punctuation),
359
- (r'[%s]>' % _dash, Punctuation, 'value'),
357
+ (rf'[{_dash}]>', Punctuation, 'value'),
360
358
  (r'(noun|scope)\b', Keyword, '=routine'),
361
359
  default('_directive-keyword')
362
360
  ],
@@ -376,12 +374,12 @@ class Inform6Lexer(RegexLexer):
376
374
  # Include, Link, Message
377
375
  'diagnostic': [
378
376
  include('_whitespace'),
379
- (r'[%s]' % _dquote, String.Double, ('#pop', 'message-string')),
377
+ (rf'[{_dquote}]', String.Double, ('#pop', 'message-string')),
380
378
  default(('#pop', 'before-plain-string?', 'directive-keyword?'))
381
379
  ],
382
380
  'before-plain-string?': [
383
381
  include('_whitespace'),
384
- (r'[%s]' % _dquote, String.Double, ('#pop', 'plain-string')),
382
+ (rf'[{_dquote}]', String.Double, ('#pop', 'plain-string')),
385
383
  default('#pop')
386
384
  ],
387
385
  'message-string': [
@@ -400,7 +398,7 @@ class Inform6Lexer(RegexLexer):
400
398
  'terminating', 'time', 'topic', 'warning', 'with'), suffix=r'\b'),
401
399
  Keyword, '#pop'),
402
400
  (r'static\b', Keyword),
403
- (r'[%s]{1,2}>|[+=]' % _dash, Punctuation, '#pop')
401
+ (rf'[{_dash}]{{1,2}}>|[+=]', Punctuation, '#pop')
404
402
  ],
405
403
  '_directive-keyword': [
406
404
  include('_directive-keyword!'),
@@ -413,7 +411,7 @@ class Inform6Lexer(RegexLexer):
413
411
  'property-keyword*': [
414
412
  include('_whitespace'),
415
413
  (words(('additive', 'individual', 'long'),
416
- suffix=r'\b(?=(\s*|(![^%s]*[%s]))*[_a-zA-Z])' % (_newline, _newline)),
414
+ suffix=rf'\b(?=(\s*|(![^{_newline}]*[{_newline}]))*[_a-zA-Z])'),
417
415
  Keyword),
418
416
  default('#pop')
419
417
  ],
@@ -445,7 +443,7 @@ class Inform6Lexer(RegexLexer):
445
443
  (r'(jump|save|restore)\b', Keyword, ('default', 'label?')),
446
444
  (r'objectloop\b', Keyword,
447
445
  ('_keyword-expression', 'variable?', '(?')),
448
- (r'print(_ret)?\b|(?=[%s])' % _dquote, Keyword, 'print-list'),
446
+ (rf'print(_ret)?\b|(?=[{_dquote}])', Keyword, 'print-list'),
449
447
  (r'\.', Name.Label, 'label?'),
450
448
  (r'@', Keyword, 'opcode'),
451
449
  (r'#(?![agrnw]\$|#)', Punctuation, 'directive'),
@@ -459,9 +457,9 @@ class Inform6Lexer(RegexLexer):
459
457
  (r'(bold|fixed|from|near|off|on|reverse|roman|to|underline)\b',
460
458
  Keyword, '#pop'),
461
459
  (r'(a|A|an|address|char|name|number|object|property|string|the|'
462
- r'The)\b(?=(\s+|(![^%s]*))*\))' % _newline, Keyword.Pseudo,
460
+ rf'The)\b(?=(\s+|(![^{_newline}]*))*\))', Keyword.Pseudo,
463
461
  '#pop'),
464
- (r'%s(?=(\s+|(![^%s]*))*\))' % (_name, _newline), Name.Function,
462
+ (rf'{_name}(?=(\s+|(![^{_newline}]*))*\))', Name.Function,
465
463
  '#pop'),
466
464
  default('#pop')
467
465
  ],
@@ -490,7 +488,8 @@ class Inform6Lexer(RegexLexer):
490
488
  # Assembly
491
489
  'opcode': [
492
490
  include('_whitespace'),
493
- (r'[%s]' % _dquote, String.Double, ('operands', 'plain-string')),
491
+ (rf'[{_dquote}]', String.Double, ('operands', 'plain-string')),
492
+ (rf'[{_dash}]{{1,2}}>', Punctuation, 'operands'),
494
493
  (_name, Keyword, 'operands')
495
494
  ],
496
495
  'operands': [
@@ -543,21 +542,20 @@ class Inform6Lexer(RegexLexer):
543
542
  class Inform7Lexer(RegexLexer):
544
543
  """
545
544
  For Inform 7 source code.
546
-
547
- .. versionadded:: 2.0
548
545
  """
549
546
 
550
547
  name = 'Inform 7'
551
548
  url = 'http://inform7.com/'
552
549
  aliases = ['inform7', 'i7']
553
550
  filenames = ['*.ni', '*.i7x']
551
+ version_added = '2.0'
554
552
 
555
553
  flags = re.MULTILINE | re.DOTALL
556
554
 
557
555
  _dash = Inform6Lexer._dash
558
556
  _dquote = Inform6Lexer._dquote
559
557
  _newline = Inform6Lexer._newline
560
- _start = r'\A|(?<=[%s])' % _newline
558
+ _start = rf'\A|(?<=[{_newline}])'
561
559
 
562
560
  # There are three variants of Inform 7, differing in how to
563
561
  # interpret at signs and braces in I6T. In top-level inclusions, at
@@ -571,47 +569,46 @@ class Inform7Lexer(RegexLexer):
571
569
  tokens[level] = {
572
570
  '+i6-root': list(Inform6Lexer.tokens['root']),
573
571
  '+i6t-root': [ # For Inform6TemplateLexer
574
- (r'[^%s]*' % Inform6Lexer._newline, Comment.Preproc,
572
+ (rf'[^{Inform6Lexer._newline}]*', Comment.Preproc,
575
573
  ('directive', '+p'))
576
574
  ],
577
575
  'root': [
578
576
  (r'(\|?\s)+', Text),
579
577
  (r'\[', Comment.Multiline, '+comment'),
580
- (r'[%s]' % _dquote, Generic.Heading,
578
+ (rf'[{_dquote}]', Generic.Heading,
581
579
  ('+main', '+titling', '+titling-string')),
582
580
  default(('+main', '+heading?'))
583
581
  ],
584
582
  '+titling-string': [
585
- (r'[^%s]+' % _dquote, Generic.Heading),
586
- (r'[%s]' % _dquote, Generic.Heading, '#pop')
583
+ (rf'[^{_dquote}]+', Generic.Heading),
584
+ (rf'[{_dquote}]', Generic.Heading, '#pop')
587
585
  ],
588
586
  '+titling': [
589
587
  (r'\[', Comment.Multiline, '+comment'),
590
- (r'[^%s.;:|%s]+' % (_dquote, _newline), Generic.Heading),
591
- (r'[%s]' % _dquote, Generic.Heading, '+titling-string'),
592
- (r'[%s]{2}|(?<=[\s%s])\|[\s%s]' % (_newline, _dquote, _dquote),
588
+ (rf'[^{_dquote}.;:|{_newline}]+', Generic.Heading),
589
+ (rf'[{_dquote}]', Generic.Heading, '+titling-string'),
590
+ (rf'[{_newline}]{{2}}|(?<=[\s{_dquote}])\|[\s{_dquote}]',
593
591
  Text, ('#pop', '+heading?')),
594
- (r'[.;:]|(?<=[\s%s])\|' % _dquote, Text, '#pop'),
595
- (r'[|%s]' % _newline, Generic.Heading)
592
+ (rf'[.;:]|(?<=[\s{_dquote}])\|', Text, '#pop'),
593
+ (rf'[|{_newline}]', Generic.Heading)
596
594
  ],
597
595
  '+main': [
598
- (r'(?i)[^%s:a\[(|%s]+' % (_dquote, _newline), Text),
599
- (r'[%s]' % _dquote, String.Double, '+text'),
596
+ (rf'(?i)[^{_dquote}:a\[(|{_newline}]+', Text),
597
+ (rf'[{_dquote}]', String.Double, '+text'),
600
598
  (r':', Text, '+phrase-definition'),
601
599
  (r'(?i)\bas\b', Text, '+use-option'),
602
600
  (r'\[', Comment.Multiline, '+comment'),
603
- (r'(\([%s])(.*?)([%s]\))' % (_dash, _dash),
601
+ (rf'(\([{_dash}])(.*?)([{_dash}]\))',
604
602
  bygroups(Punctuation,
605
603
  using(this, state=('+i6-root', 'directive'),
606
604
  i6t='+i6t-not-inline'), Punctuation)),
607
- (r'(%s|(?<=[\s;:.%s]))\|\s|[%s]{2,}' %
608
- (_start, _dquote, _newline), Text, '+heading?'),
609
- (r'(?i)[a(|%s]' % _newline, Text)
605
+ (rf'({_start}|(?<=[\s;:.{_dquote}]))\|\s|[{_newline}]{{2,}}', Text, '+heading?'),
606
+ (rf'(?i)[a(|{_newline}]', Text)
610
607
  ],
611
608
  '+phrase-definition': [
612
609
  (r'\s+', Text),
613
610
  (r'\[', Comment.Multiline, '+comment'),
614
- (r'(\([%s])(.*?)([%s]\))' % (_dash, _dash),
611
+ (rf'(\([{_dash}])(.*?)([{_dash}]\))',
615
612
  bygroups(Punctuation,
616
613
  using(this, state=('+i6-root', 'directive',
617
614
  'default', 'statements'),
@@ -621,7 +618,7 @@ class Inform7Lexer(RegexLexer):
621
618
  '+use-option': [
622
619
  (r'\s+', Text),
623
620
  (r'\[', Comment.Multiline, '+comment'),
624
- (r'(\([%s])(.*?)([%s]\))' % (_dash, _dash),
621
+ (rf'(\([{_dash}])(.*?)([{_dash}]\))',
625
622
  bygroups(Punctuation,
626
623
  using(this, state=('+i6-root', 'directive'),
627
624
  i6t='+i6t-use-option'), Punctuation), '#pop'),
@@ -633,16 +630,16 @@ class Inform7Lexer(RegexLexer):
633
630
  (r'\]', Comment.Multiline, '#pop')
634
631
  ],
635
632
  '+text': [
636
- (r'[^\[%s]+' % _dquote, String.Double),
633
+ (rf'[^\[{_dquote}]+', String.Double),
637
634
  (r'\[.*?\]', String.Interpol),
638
- (r'[%s]' % _dquote, String.Double, '#pop')
635
+ (rf'[{_dquote}]', String.Double, '#pop')
639
636
  ],
640
637
  '+heading?': [
641
638
  (r'(\|?\s)+', Text),
642
639
  (r'\[', Comment.Multiline, '+comment'),
643
- (r'[%s]{4}\s+' % _dash, Text, '+documentation-heading'),
644
- (r'[%s]{1,3}' % _dash, Text),
645
- (r'(?i)(volume|book|part|chapter|section)\b[^%s]*' % _newline,
640
+ (rf'[{_dash}]{{4}}\s+', Text, '+documentation-heading'),
641
+ (rf'[{_dash}]{{1,3}}', Text),
642
+ (rf'(?i)(volume|book|part|chapter|section)\b[^{_newline}]*',
646
643
  Generic.Heading, '#pop'),
647
644
  default('#pop')
648
645
  ],
@@ -655,25 +652,24 @@ class Inform7Lexer(RegexLexer):
655
652
  '+documentation-heading2': [
656
653
  (r'\s+', Text),
657
654
  (r'\[', Comment.Multiline, '+comment'),
658
- (r'[%s]{4}\s' % _dash, Text, '+documentation'),
655
+ (rf'[{_dash}]{{4}}\s', Text, '+documentation'),
659
656
  default('#pop:2')
660
657
  ],
661
658
  '+documentation': [
662
- (r'(?i)(%s)\s*(chapter|example)\s*:[^%s]*' %
663
- (_start, _newline), Generic.Heading),
664
- (r'(?i)(%s)\s*section\s*:[^%s]*' % (_start, _newline),
659
+ (rf'(?i)({_start})\s*(chapter|example)\s*:[^{_newline}]*', Generic.Heading),
660
+ (rf'(?i)({_start})\s*section\s*:[^{_newline}]*',
665
661
  Generic.Subheading),
666
- (r'((%s)\t.*?[%s])+' % (_start, _newline),
662
+ (rf'(({_start})\t.*?[{_newline}])+',
667
663
  using(this, state='+main')),
668
- (r'[^%s\[]+|[%s\[]' % (_newline, _newline), Text),
664
+ (rf'[^{_newline}\[]+|[{_newline}\[]', Text),
669
665
  (r'\[', Comment.Multiline, '+comment'),
670
666
  ],
671
667
  '+i6t-not-inline': [
672
- (r'(%s)@c( .*?)?([%s]|\Z)' % (_start, _newline),
668
+ (rf'({_start})@c( .*?)?([{_newline}]|\Z)',
673
669
  Comment.Preproc),
674
- (r'(%s)@([%s]+|Purpose:)[^%s]*' % (_start, _dash, _newline),
670
+ (rf'({_start})@([{_dash}]+|Purpose:)[^{_newline}]*',
675
671
  Comment.Preproc),
676
- (r'(%s)@p( .*?)?([%s]|\Z)' % (_start, _newline),
672
+ (rf'({_start})@p( .*?)?([{_newline}]|\Z)',
677
673
  Generic.Heading, '+p')
678
674
  ],
679
675
  '+i6t-use-option': [
@@ -686,12 +682,12 @@ class Inform7Lexer(RegexLexer):
686
682
  Punctuation))
687
683
  ],
688
684
  '+i6t': [
689
- (r'(\{[%s])(![^}]*)(\}?)' % _dash,
685
+ (rf'(\{{[{_dash}])(![^}}]*)(\}}?)',
690
686
  bygroups(Punctuation, Comment.Single, Punctuation)),
691
- (r'(\{[%s])(lines)(:)([^}]*)(\}?)' % _dash,
687
+ (rf'(\{{[{_dash}])(lines)(:)([^}}]*)(\}}?)',
692
688
  bygroups(Punctuation, Keyword, Punctuation, Text,
693
689
  Punctuation), '+lines'),
694
- (r'(\{[%s])([^:}]*)(:?)([^}]*)(\}?)' % _dash,
690
+ (rf'(\{{[{_dash}])([^:}}]*)(:?)([^}}]*)(\}}?)',
695
691
  bygroups(Punctuation, Keyword, Punctuation, Text,
696
692
  Punctuation)),
697
693
  (r'(\(\+)(.*?)(\+\)|\Z)',
@@ -700,25 +696,25 @@ class Inform7Lexer(RegexLexer):
700
696
  ],
701
697
  '+p': [
702
698
  (r'[^@]+', Comment.Preproc),
703
- (r'(%s)@c( .*?)?([%s]|\Z)' % (_start, _newline),
699
+ (rf'({_start})@c( .*?)?([{_newline}]|\Z)',
704
700
  Comment.Preproc, '#pop'),
705
- (r'(%s)@([%s]|Purpose:)' % (_start, _dash), Comment.Preproc),
706
- (r'(%s)@p( .*?)?([%s]|\Z)' % (_start, _newline),
701
+ (rf'({_start})@([{_dash}]|Purpose:)', Comment.Preproc),
702
+ (rf'({_start})@p( .*?)?([{_newline}]|\Z)',
707
703
  Generic.Heading),
708
704
  (r'@', Comment.Preproc)
709
705
  ],
710
706
  '+lines': [
711
- (r'(%s)@c( .*?)?([%s]|\Z)' % (_start, _newline),
707
+ (rf'({_start})@c( .*?)?([{_newline}]|\Z)',
712
708
  Comment.Preproc),
713
- (r'(%s)@([%s]|Purpose:)[^%s]*' % (_start, _dash, _newline),
709
+ (rf'({_start})@([{_dash}]|Purpose:)[^{_newline}]*',
714
710
  Comment.Preproc),
715
- (r'(%s)@p( .*?)?([%s]|\Z)' % (_start, _newline),
711
+ (rf'({_start})@p( .*?)?([{_newline}]|\Z)',
716
712
  Generic.Heading, '+p'),
717
- (r'(%s)@\w*[ %s]' % (_start, _newline), Keyword),
718
- (r'![^%s]*' % _newline, Comment.Single),
719
- (r'(\{)([%s]endlines)(\})' % _dash,
713
+ (rf'({_start})@\w*[ {_newline}]', Keyword),
714
+ (rf'![^{_newline}]*', Comment.Single),
715
+ (rf'(\{{)([{_dash}]endlines)(\}})',
720
716
  bygroups(Punctuation, Keyword, Punctuation), '#pop'),
721
- (r'[^@!{]+?([%s]|\Z)|.' % _newline, Text)
717
+ (rf'[^@!{{]+?([{_newline}]|\Z)|.', Text)
722
718
  ]
723
719
  }
724
720
  # Inform 7 can include snippets of Inform 6 template language,
@@ -747,13 +743,12 @@ class Inform7Lexer(RegexLexer):
747
743
  class Inform6TemplateLexer(Inform7Lexer):
748
744
  """
749
745
  For Inform 6 template code.
750
-
751
- .. versionadded:: 2.0
752
746
  """
753
747
 
754
748
  name = 'Inform 6 template'
755
749
  aliases = ['i6t']
756
750
  filenames = ['*.i6t']
751
+ version_added = '2.0'
757
752
 
758
753
  def get_tokens_unprocessed(self, text, stack=('+i6t-root',)):
759
754
  return Inform7Lexer.get_tokens_unprocessed(self, text, stack)
@@ -767,6 +762,8 @@ class Tads3Lexer(RegexLexer):
767
762
  name = 'TADS 3'
768
763
  aliases = ['tads3']
769
764
  filenames = ['*.t']
765
+ url = 'https://www.tads.org'
766
+ version_added = ''
770
767
 
771
768
  flags = re.DOTALL | re.MULTILINE
772
769
 
@@ -778,55 +775,50 @@ class Tads3Lexer(RegexLexer):
778
775
  _no_quote = r'(?=\s|\\?>)'
779
776
  _operator = (r'(?:&&|\|\||\+\+|--|\?\?|::|[.,@\[\]~]|'
780
777
  r'(?:[=+\-*/%!&|^]|<<?|>>?>?)=?)')
781
- _ws = r'(?:\\|\s|%s|%s)' % (_comment_single, _comment_multiline)
782
- _ws_pp = r'(?:\\\n|[^\S\n]|%s|%s)' % (_comment_single, _comment_multiline)
778
+ _ws = rf'(?:\\|\s|{_comment_single}|{_comment_multiline})'
779
+ _ws_pp = rf'(?:\\\n|[^\S\n]|{_comment_single}|{_comment_multiline})'
783
780
 
784
781
  def _make_string_state(triple, double, verbatim=None, _escape=_escape):
785
782
  if verbatim:
786
- verbatim = ''.join(['(?:%s|%s)' % (re.escape(c.lower()),
787
- re.escape(c.upper()))
783
+ verbatim = ''.join([f'(?:{re.escape(c.lower())}|{re.escape(c.upper())})'
788
784
  for c in verbatim])
789
785
  char = r'"' if double else r"'"
790
786
  token = String.Double if double else String.Single
791
- escaped_quotes = r'+|%s(?!%s{2})' % (char, char) if triple else r''
792
- prefix = '%s%s' % ('t' if triple else '', 'd' if double else 's')
793
- tag_state_name = '%sqt' % prefix
787
+ escaped_quotes = rf'+|{char}(?!{char}{{2}})' if triple else r''
788
+ prefix = '{}{}'.format('t' if triple else '', 'd' if double else 's')
789
+ tag_state_name = f'{prefix}qt'
794
790
  state = []
795
791
  if triple:
796
792
  state += [
797
- (r'%s{3,}' % char, token, '#pop'),
798
- (r'\\%s+' % char, String.Escape),
793
+ (rf'{char}{{3,}}', token, '#pop'),
794
+ (rf'\\{char}+', String.Escape),
799
795
  (char, token)
800
796
  ]
801
797
  else:
802
798
  state.append((char, token, '#pop'))
803
799
  state += [
804
800
  include('s/verbatim'),
805
- (r'[^\\<&{}%s]+' % char, token)
801
+ (rf'[^\\<&{{}}{char}]+', token)
806
802
  ]
807
803
  if verbatim:
808
804
  # This regex can't use `(?i)` because escape sequences are
809
805
  # case-sensitive. `<\XMP>` works; `<\xmp>` doesn't.
810
- state.append((r'\\?<(/|\\\\|(?!%s)\\)%s(?=[\s=>])' %
811
- (_escape, verbatim),
812
- Name.Tag, ('#pop', '%sqs' % prefix, tag_state_name)))
806
+ state.append((rf'\\?<(/|\\\\|(?!{_escape})\\){verbatim}(?=[\s=>])',
807
+ Name.Tag, ('#pop', f'{prefix}qs', tag_state_name)))
813
808
  else:
814
809
  state += [
815
- (r'\\?<!([^><\\%s]|<(?!<)|\\%s%s|%s|\\.)*>?' %
816
- (char, char, escaped_quotes, _escape), Comment.Multiline),
810
+ (rf'\\?<!([^><\\{char}]|<(?!<)|\\{char}{escaped_quotes}|{_escape}|\\.)*>?', Comment.Multiline),
817
811
  (r'(?i)\\?<listing(?=[\s=>]|\\>)', Name.Tag,
818
- ('#pop', '%sqs/listing' % prefix, tag_state_name)),
812
+ ('#pop', f'{prefix}qs/listing', tag_state_name)),
819
813
  (r'(?i)\\?<xmp(?=[\s=>]|\\>)', Name.Tag,
820
- ('#pop', '%sqs/xmp' % prefix, tag_state_name)),
821
- (r'\\?<([^\s=><\\%s]|<(?!<)|\\%s%s|%s|\\.)*' %
822
- (char, char, escaped_quotes, _escape), Name.Tag,
814
+ ('#pop', f'{prefix}qs/xmp', tag_state_name)),
815
+ (rf'\\?<([^\s=><\\{char}]|<(?!<)|\\{char}{escaped_quotes}|{_escape}|\\.)*', Name.Tag,
823
816
  tag_state_name),
824
817
  include('s/entity')
825
818
  ]
826
819
  state += [
827
820
  include('s/escape'),
828
- (r'\{([^}<\\%s]|<(?!<)|\\%s%s|%s|\\.)*\}' %
829
- (char, char, escaped_quotes, _escape), String.Interpol),
821
+ (rf'\{{([^}}<\\{char}]|<(?!<)|\\{char}{escaped_quotes}|{_escape}|\\.)*\}}', String.Interpol),
830
822
  (r'[\\&{}<]', token)
831
823
  ]
832
824
  return state
@@ -834,22 +826,20 @@ class Tads3Lexer(RegexLexer):
834
826
  def _make_tag_state(triple, double, _escape=_escape):
835
827
  char = r'"' if double else r"'"
836
828
  quantifier = r'{3,}' if triple else r''
837
- state_name = '%s%sqt' % ('t' if triple else '', 'd' if double else 's')
829
+ state_name = '{}{}qt'.format('t' if triple else '', 'd' if double else 's')
838
830
  token = String.Double if double else String.Single
839
- escaped_quotes = r'+|%s(?!%s{2})' % (char, char) if triple else r''
831
+ escaped_quotes = rf'+|{char}(?!{char}{{2}})' if triple else r''
840
832
  return [
841
- (r'%s%s' % (char, quantifier), token, '#pop:2'),
833
+ (rf'{char}{quantifier}', token, '#pop:2'),
842
834
  (r'(\s|\\\n)+', Text),
843
835
  (r'(=)(\\?")', bygroups(Punctuation, String.Double),
844
- 'dqs/%s' % state_name),
836
+ f'dqs/{state_name}'),
845
837
  (r"(=)(\\?')", bygroups(Punctuation, String.Single),
846
- 'sqs/%s' % state_name),
847
- (r'=', Punctuation, 'uqs/%s' % state_name),
838
+ f'sqs/{state_name}'),
839
+ (r'=', Punctuation, f'uqs/{state_name}'),
848
840
  (r'\\?>', Name.Tag, '#pop'),
849
- (r'\{([^}<\\%s]|<(?!<)|\\%s%s|%s|\\.)*\}' %
850
- (char, char, escaped_quotes, _escape), String.Interpol),
851
- (r'([^\s=><\\%s]|<(?!<)|\\%s%s|%s|\\.)+' %
852
- (char, char, escaped_quotes, _escape), Name.Attribute),
841
+ (rf'\{{([^}}<\\{char}]|<(?!<)|\\{char}{escaped_quotes}|{_escape}|\\.)*\}}', String.Interpol),
842
+ (rf'([^\s=><\\{char}]|<(?!<)|\\{char}{escaped_quotes}|{_escape}|\\.)+', Name.Attribute),
853
843
  include('s/escape'),
854
844
  include('s/verbatim'),
855
845
  include('s/entity'),
@@ -863,16 +853,15 @@ class Tads3Lexer(RegexLexer):
863
853
  host_char = r'"' if host_double else r"'"
864
854
  host_quantifier = r'{3,}' if host_triple else r''
865
855
  host_token = String.Double if host_double else String.Single
866
- escaped_quotes = (r'+|%s(?!%s{2})' % (host_char, host_char)
856
+ escaped_quotes = (rf'+|{host_char}(?!{host_char}{{2}})'
867
857
  if host_triple else r'')
868
858
  return [
869
- (r'%s%s' % (host_char, host_quantifier), host_token, '#pop:3'),
870
- (r'%s%s' % (r'' if token is String.Other else r'\\?', terminator),
859
+ (rf'{host_char}{host_quantifier}', host_token, '#pop:3'),
860
+ (r'{}{}'.format(r'' if token is String.Other else r'\\?', terminator),
871
861
  token, '#pop'),
872
862
  include('s/verbatim'),
873
863
  include('s/entity'),
874
- (r'\{([^}<\\%s]|<(?!<)|\\%s%s|%s|\\.)*\}' %
875
- (host_char, host_char, escaped_quotes, _escape), String.Interpol),
864
+ (rf'\{{([^}}<\\{host_char}]|<(?!<)|\\{host_char}{escaped_quotes}|{_escape}|\\.)*\}}', String.Interpol),
876
865
  (r'([^\s"\'<%s{}\\&])+' % (r'>' if token is String.Other else r''),
877
866
  token),
878
867
  include('s/escape'),
@@ -888,7 +877,7 @@ class Tads3Lexer(RegexLexer):
888
877
  r'delegated|do|else|for|foreach|finally|goto|if|inherited|'
889
878
  r'invokee|local|nil|new|operator|replaced|return|self|switch|'
890
879
  r'targetobj|targetprop|throw|true|try|while)\b)', Text, 'block'),
891
- (r'(%s)(%s*)(\()' % (_name, _ws),
880
+ (rf'({_name})({_ws}*)(\()',
892
881
  bygroups(Name.Function, using(this, state='whitespace'),
893
882
  Punctuation),
894
883
  ('block?/root', 'more/parameters', 'main/parameters')),
@@ -911,24 +900,24 @@ class Tads3Lexer(RegexLexer):
911
900
  (r'\{', Punctuation, '#push'),
912
901
  (r'\}', Punctuation, '#pop'),
913
902
  (r':', Punctuation, ('classes', 'class')),
914
- (r'(%s?)(%s*)(\()' % (_name, _ws),
903
+ (rf'({_name}?)({_ws}*)(\()',
915
904
  bygroups(Name.Function, using(this, state='whitespace'),
916
905
  Punctuation),
917
906
  ('block?', 'more/parameters', 'main/parameters')),
918
- (r'(%s)(%s*)(\{)' % (_name, _ws),
907
+ (rf'({_name})({_ws}*)(\{{)',
919
908
  bygroups(Name.Function, using(this, state='whitespace'),
920
909
  Punctuation), 'block'),
921
- (r'(%s)(%s*)(:)' % (_name, _ws),
910
+ (rf'({_name})({_ws}*)(:)',
922
911
  bygroups(Name.Variable, using(this, state='whitespace'),
923
912
  Punctuation),
924
913
  ('object-body/no-braces', 'classes', 'class')),
925
914
  include('whitespace'),
926
- (r'->|%s' % _operator, Punctuation, 'main'),
915
+ (rf'->|{_operator}', Punctuation, 'main'),
927
916
  default('main/object-body')
928
917
  ],
929
918
  'main/object-body': [
930
919
  include('main/basic'),
931
- (r'(%s)(%s*)(=?)' % (_name, _ws),
920
+ (rf'({_name})({_ws}*)(=?)',
932
921
  bygroups(Name.Variable, using(this, state='whitespace'),
933
922
  Punctuation), ('#pop', 'more', 'main')),
934
923
  default('#pop:2')
@@ -951,7 +940,7 @@ class Tads3Lexer(RegexLexer):
951
940
  (r'\{', Punctuation, '#push'),
952
941
  (r'\}', Punctuation, '#pop'),
953
942
  (r'default\b', Keyword.Reserved),
954
- (r'(%s)(%s*)(:)' % (_name, _ws),
943
+ (rf'({_name})({_ws}*)(:)',
955
944
  bygroups(Name.Label, using(this, state='whitespace'),
956
945
  Punctuation)),
957
946
  include('whitespace')
@@ -986,23 +975,23 @@ class Tads3Lexer(RegexLexer):
986
975
  (r'R"', String.Regex, ('#pop', 'dqr')),
987
976
  (r"R'", String.Regex, ('#pop', 'sqr')),
988
977
  # Two-token keywords
989
- (r'(extern)(%s+)(object\b)' % _ws,
978
+ (rf'(extern)({_ws}+)(object\b)',
990
979
  bygroups(Keyword.Reserved, using(this, state='whitespace'),
991
980
  Keyword.Reserved)),
992
- (r'(function|method)(%s*)(\()' % _ws,
981
+ (rf'(function|method)({_ws}*)(\()',
993
982
  bygroups(Keyword.Reserved, using(this, state='whitespace'),
994
983
  Punctuation),
995
984
  ('#pop', 'block?', 'more/parameters', 'main/parameters')),
996
- (r'(modify)(%s+)(grammar\b)' % _ws,
985
+ (rf'(modify)({_ws}+)(grammar\b)',
997
986
  bygroups(Keyword.Reserved, using(this, state='whitespace'),
998
987
  Keyword.Reserved),
999
988
  ('#pop', 'object-body/no-braces', ':', 'grammar')),
1000
- (r'(new)(%s+(?=(?:function|method)\b))' % _ws,
989
+ (rf'(new)({_ws}+(?=(?:function|method)\b))',
1001
990
  bygroups(Keyword.Reserved, using(this, state='whitespace'))),
1002
- (r'(object)(%s+)(template\b)' % _ws,
991
+ (rf'(object)({_ws}+)(template\b)',
1003
992
  bygroups(Keyword.Reserved, using(this, state='whitespace'),
1004
993
  Keyword.Reserved), ('#pop', 'template')),
1005
- (r'(string)(%s+)(template\b)' % _ws,
994
+ (rf'(string)({_ws}+)(template\b)',
1006
995
  bygroups(Keyword, using(this, state='whitespace'),
1007
996
  Keyword.Reserved), ('#pop', 'function-name')),
1008
997
  # Keywords
@@ -1039,7 +1028,7 @@ class Tads3Lexer(RegexLexer):
1039
1028
  (r'self\b', Name.Builtin.Pseudo, '#pop'),
1040
1029
  (r'template\b', Keyword.Reserved, ('#pop', 'template')),
1041
1030
  # Operators
1042
- (r'(__objref|defined)(%s*)(\()' % _ws,
1031
+ (rf'(__objref|defined)({_ws}*)(\()',
1043
1032
  bygroups(Operator.Word, using(this, state='whitespace'),
1044
1033
  Operator), ('#pop', 'more/__objref', 'main')),
1045
1034
  (r'delegated\b', Operator.Word),
@@ -1065,7 +1054,7 @@ class Tads3Lexer(RegexLexer):
1065
1054
  include('whitespace'),
1066
1055
  (_operator, Operator, 'main'),
1067
1056
  (r'\?', Operator, ('main', 'more/conditional', 'main')),
1068
- (r'(is|not)(%s+)(in\b)' % _ws,
1057
+ (rf'(is|not)({_ws}+)(in\b)',
1069
1058
  bygroups(Operator.Word, using(this, state='whitespace'),
1070
1059
  Operator.Word)),
1071
1060
  (r'[^\s!"%-_a-z{-~]+', Error) # Averts an infinite loop
@@ -1112,9 +1101,9 @@ class Tads3Lexer(RegexLexer):
1112
1101
  ],
1113
1102
  # Parameter list
1114
1103
  'main/parameters': [
1115
- (r'(%s)(%s*)(?=:)' % (_name, _ws),
1104
+ (rf'({_name})({_ws}*)(?=:)',
1116
1105
  bygroups(Name.Variable, using(this, state='whitespace')), '#pop'),
1117
- (r'(%s)(%s+)(%s)' % (_name, _ws, _name),
1106
+ (rf'({_name})({_ws}+)({_name})',
1118
1107
  bygroups(Name.Class, using(this, state='whitespace'),
1119
1108
  Name.Variable), '#pop'),
1120
1109
  (r'\[+', Punctuation),
@@ -1123,7 +1112,7 @@ class Tads3Lexer(RegexLexer):
1123
1112
  default('#pop')
1124
1113
  ],
1125
1114
  'more/parameters': [
1126
- (r'(:)(%s*(?=[?=,:)]))' % _ws,
1115
+ (rf'(:)({_ws}*(?=[?=,:)]))',
1127
1116
  bygroups(Punctuation, using(this, state='whitespace'))),
1128
1117
  (r'[?\]]+', Punctuation),
1129
1118
  (r'[:)]', Punctuation, ('#pop', 'multimethod?')),
@@ -1181,10 +1170,10 @@ class Tads3Lexer(RegexLexer):
1181
1170
  'grammar-rules': [
1182
1171
  include('string'),
1183
1172
  include('whitespace'),
1184
- (r'(\[)(%s*)(badness)' % _ws,
1173
+ (rf'(\[)({_ws}*)(badness)',
1185
1174
  bygroups(Punctuation, using(this, state='whitespace'), Keyword),
1186
1175
  'main'),
1187
- (r'->|%s|[()]' % _operator, Punctuation),
1176
+ (rf'->|{_operator}|[()]', Punctuation),
1188
1177
  (_name, Name.Constant),
1189
1178
  default('#pop:2')
1190
1179
  ],
@@ -1193,7 +1182,7 @@ class Tads3Lexer(RegexLexer):
1193
1182
  ],
1194
1183
  'function-name': [
1195
1184
  (r'(<<([^>]|>>>|>(?!>))*>>)+', String.Interpol),
1196
- (r'(?=%s?%s*[({])' % (_name, _ws), Text, '#pop'),
1185
+ (rf'(?={_name}?{_ws}*[({{])', Text, '#pop'),
1197
1186
  (_name, Name.Function, '#pop'),
1198
1187
  include('whitespace')
1199
1188
  ],
@@ -1219,7 +1208,7 @@ class Tads3Lexer(RegexLexer):
1219
1208
  include('string'),
1220
1209
  (r'inherited\b', Keyword.Reserved),
1221
1210
  include('whitespace'),
1222
- (r'->|\?|%s' % _operator, Punctuation),
1211
+ (rf'->|\?|{_operator}', Punctuation),
1223
1212
  (_name, Name.Variable)
1224
1213
  ],
1225
1214
 
@@ -1259,11 +1248,11 @@ class Tads3Lexer(RegexLexer):
1259
1248
 
1260
1249
  # Whitespace and comments
1261
1250
  'whitespace': [
1262
- (r'^%s*#(%s|[^\n]|(?<=\\)\n)*\n?' % (_ws_pp, _comment_multiline),
1251
+ (rf'^{_ws_pp}*#({_comment_multiline}|[^\n]|(?<=\\)\n)*\n?',
1263
1252
  Comment.Preproc),
1264
1253
  (_comment_single, Comment.Single),
1265
1254
  (_comment_multiline, Comment.Multiline),
1266
- (r'\\+\n+%s*#?|\n+|([^\S\n]|\\)+' % _ws_pp, Text)
1255
+ (rf'\\+\n+{_ws_pp}*#?|\n+|([^\S\n]|\\)+', Text)
1267
1256
  ],
1268
1257
 
1269
1258
  # Strings
@@ -1274,15 +1263,15 @@ class Tads3Lexer(RegexLexer):
1274
1263
  (r"'", String.Single, 'sqs')
1275
1264
  ],
1276
1265
  's/escape': [
1277
- (r'\{\{|\}\}|%s' % _escape, String.Escape)
1266
+ (rf'\{{\{{|\}}\}}|{_escape}', String.Escape)
1278
1267
  ],
1279
1268
  's/verbatim': [
1280
1269
  (r'<<\s*(as\s+decreasingly\s+likely\s+outcomes|cycling|else|end|'
1281
1270
  r'first\s+time|one\s+of|only|or|otherwise|'
1282
1271
  r'(sticky|(then\s+)?(purely\s+)?at)\s+random|stopping|'
1283
1272
  r'(then\s+)?(half\s+)?shuffled|\|\|)\s*>>', String.Interpol),
1284
- (r'<<(%%(_(%s|\\?.)|[\-+ ,#]|\[\d*\]?)*\d*\.?\d*(%s|\\?.)|'
1285
- r'\s*((else|otherwise)\s+)?(if|unless)\b)?' % (_escape, _escape),
1273
+ (rf'<<(%(_({_escape}|\\?.)|[\-+ ,#]|\[\d*\]?)*\d*\.?\d*({_escape}|\\?.)|'
1274
+ r'\s*((else|otherwise)\s+)?(if|unless)\b)?',
1286
1275
  String.Interpol, ('block/embed', 'more/embed', 'main'))
1287
1276
  ],
1288
1277
  's/entity': [
@@ -1345,23 +1334,22 @@ class Tads3Lexer(RegexLexer):
1345
1334
  }
1346
1335
 
1347
1336
  def get_tokens_unprocessed(self, text, **kwargs):
1348
- pp = r'^%s*#%s*' % (self._ws_pp, self._ws_pp)
1337
+ pp = rf'^{self._ws_pp}*#{self._ws_pp}*'
1349
1338
  if_false_level = 0
1350
1339
  for index, token, value in (
1351
1340
  RegexLexer.get_tokens_unprocessed(self, text, **kwargs)):
1352
1341
  if if_false_level == 0: # Not in a false #if
1353
1342
  if (token is Comment.Preproc and
1354
- re.match(r'%sif%s+(0|nil)%s*$\n?' %
1355
- (pp, self._ws_pp, self._ws_pp), value)):
1343
+ re.match(rf'{pp}if{self._ws_pp}+(0|nil){self._ws_pp}*$\n?', value)):
1356
1344
  if_false_level = 1
1357
1345
  else: # In a false #if
1358
1346
  if token is Comment.Preproc:
1359
1347
  if (if_false_level == 1 and
1360
- re.match(r'%sel(if|se)\b' % pp, value)):
1348
+ re.match(rf'{pp}el(if|se)\b', value)):
1361
1349
  if_false_level = 0
1362
- elif re.match(r'%sif' % pp, value):
1350
+ elif re.match(rf'{pp}if', value):
1363
1351
  if_false_level += 1
1364
- elif re.match(r'%sendif\b' % pp, value):
1352
+ elif re.match(rf'{pp}endif\b', value):
1365
1353
  if_false_level -= 1
1366
1354
  else:
1367
1355
  token = Comment