A Python parser for MediaWiki wikicode https://mwparserfromhell.readthedocs.io/
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

преди 12 години
преди 12 години
преди 12 години
преди 12 години
преди 12 години
преди 12 години
преди 12 години
преди 12 години
преди 12 години
преди 12 години
преди 12 години
преди 12 години
преди 12 години
преди 12 години
преди 12 години
преди 10 години
преди 12 години
преди 12 години
преди 12 години
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655
  1. name: blank
  2. label: template with no content
  3. input: "{{}}"
  4. output: [TemplateOpen(), TemplateClose()]
  5. ---
  6. name: blank_with_params
  7. label: template with no content, but pipes and equal signs
  8. input: "{{||=|}}"
  9. output: [TemplateOpen(), TemplateParamSeparator(), TemplateParamSeparator(), TemplateParamEquals(), TemplateParamSeparator(), TemplateClose()]
  10. ---
  11. name: no_params
  12. label: simplest type of template
  13. input: "{{template}}"
  14. output: [TemplateOpen(), Text(text="template"), TemplateClose()]
  15. ---
  16. name: one_param_unnamed
  17. label: basic template with one unnamed parameter
  18. input: "{{foo|bar}}"
  19. output: [TemplateOpen(), Text(text="foo"), TemplateParamSeparator(), Text(text="bar"), TemplateClose()]
  20. ---
  21. name: one_param_named
  22. label: basic template with one named parameter
  23. input: "{{foo|bar=baz}}"
  24. output: [TemplateOpen(), Text(text="foo"), TemplateParamSeparator(), Text(text="bar"), TemplateParamEquals(), Text(text="baz"), TemplateClose()]
  25. ---
  26. name: multiple_unnamed_params
  27. label: basic template with multiple unnamed parameters
  28. input: "{{foo|bar|baz|biz|buzz}}"
  29. output: [TemplateOpen(), Text(text="foo"), TemplateParamSeparator(), Text(text="bar"), TemplateParamSeparator(), Text(text="baz"), TemplateParamSeparator(), Text(text="biz"), TemplateParamSeparator(), Text(text="buzz"), TemplateClose()]
  30. ---
  31. name: multiple_named_params
  32. label: basic template with multiple named parameters
  33. input: "{{foo|bar=baz|biz=buzz|buff=baff|usr=bin}}"
  34. output: [TemplateOpen(), Text(text="foo"), TemplateParamSeparator(), Text(text="bar"), TemplateParamEquals(), Text(text="baz"), TemplateParamSeparator(), Text(text="biz"), TemplateParamEquals(), Text(text="buzz"), TemplateParamSeparator(), Text(text="buff"), TemplateParamEquals(), Text(text="baff"), TemplateParamSeparator(), Text(text="usr"), TemplateParamEquals(), Text(text="bin"), TemplateClose()]
  35. ---
  36. name: multiple_mixed_params
  37. label: basic template with multiple unnamed/named parameters
  38. input: "{{foo|bar=baz|biz|buzz=buff|usr|bin}}"
  39. output: [TemplateOpen(), Text(text="foo"), TemplateParamSeparator(), Text(text="bar"), TemplateParamEquals(), Text(text="baz"), TemplateParamSeparator(), Text(text="biz"), TemplateParamSeparator(), Text(text="buzz"), TemplateParamEquals(), Text(text="buff"), TemplateParamSeparator(), Text(text="usr"), TemplateParamSeparator(), Text(text="bin"), TemplateClose()]
  40. ---
  41. name: multiple_mixed_params2
  42. label: basic template with multiple unnamed/named parameters in another order
  43. input: "{{foo|bar|baz|biz=buzz|buff=baff|usr=bin}}"
  44. output: [TemplateOpen(), Text(text="foo"), TemplateParamSeparator(), Text(text="bar"), TemplateParamSeparator(), Text(text="baz"), TemplateParamSeparator(), Text(text="biz"), TemplateParamEquals(), Text(text="buzz"), TemplateParamSeparator(), Text(text="buff"), TemplateParamEquals(), Text(text="baff"), TemplateParamSeparator(), Text(text="usr"), TemplateParamEquals(), Text(text="bin"), TemplateClose()]
  45. ---
  46. name: nested_unnamed_param
  47. label: nested template as an unnamed parameter
  48. input: "{{foo|{{bar}}}}"
  49. output: [TemplateOpen(), Text(text="foo"), TemplateParamSeparator(), TemplateOpen(), Text(text="bar"), TemplateClose(), TemplateClose()]
  50. ---
  51. name: nested_named_param_value
  52. label: nested template as a parameter value with a named parameter
  53. input: "{{foo|bar={{baz}}}}"
  54. output: [TemplateOpen(), Text(text="foo"), TemplateParamSeparator(), Text(text="bar"), TemplateParamEquals(), TemplateOpen(), Text(text="baz"), TemplateClose(), TemplateClose()]
  55. ---
  56. name: nested_named_param_name_and_value
  57. label: nested templates as a parameter name and value
  58. input: "{{foo|{{bar}}={{baz}}}}"
  59. output: [TemplateOpen(), Text(text="foo"), TemplateParamSeparator(), TemplateOpen(), Text(text="bar"), TemplateClose(), TemplateParamEquals(), TemplateOpen(), Text(text="baz"), TemplateClose(), TemplateClose()]
  60. ---
  61. name: nested_name_start
  62. label: nested template at the beginning of a template name
  63. input: "{{{{foo}}bar}}"
  64. output: [TemplateOpen(), TemplateOpen(), Text(text="foo"), TemplateClose(), Text(text="bar"), TemplateClose()]
  65. ---
  66. name: nested_name_start_unnamed_param
  67. label: nested template at the beginning of a template name and as an unnamed parameter
  68. input: "{{{{foo}}bar|{{baz}}}}"
  69. output: [TemplateOpen(), TemplateOpen(), Text(text="foo"), TemplateClose(), Text(text="bar"), TemplateParamSeparator(), TemplateOpen(), Text(text="baz"), TemplateClose(), TemplateClose()]
  70. ---
  71. name: nested_name_start_named_param_value
  72. label: nested template at the beginning of a template name and as a parameter value with a named parameter
  73. input: "{{{{foo}}bar|baz={{biz}}}}"
  74. output: [TemplateOpen(), TemplateOpen(), Text(text="foo"), TemplateClose(), Text(text="bar"), TemplateParamSeparator(), Text(text="baz"), TemplateParamEquals(), TemplateOpen(), Text(text="biz"), TemplateClose(), TemplateClose()]
  75. ---
  76. name: nested_name_start_named_param_name_and_value
  77. label: nested template at the beginning of a template name and as a parameter name and value
  78. input: "{{{{foo}}bar|{{baz}}={{biz}}}}"
  79. output: [TemplateOpen(), TemplateOpen(), Text(text="foo"), TemplateClose(), Text(text="bar"), TemplateParamSeparator(), TemplateOpen(), Text(text="baz"), TemplateClose(), TemplateParamEquals(), TemplateOpen(), Text(text="biz"), TemplateClose(), TemplateClose()]
  80. ---
  81. name: nested_name_end
  82. label: nested template at the end of a template name
  83. input: "{{foo{{bar}}}}"
  84. output: [TemplateOpen(), Text(text="foo"), TemplateOpen(), Text(text="bar"), TemplateClose(), TemplateClose()]
  85. ---
  86. name: nested_name_end_unnamed_param
  87. label: nested template at the end of a template name and as an unnamed parameter
  88. input: "{{foo{{bar}}|{{baz}}}}"
  89. output: [TemplateOpen(), Text(text="foo"), TemplateOpen(), Text(text="bar"), TemplateClose(), TemplateParamSeparator(), TemplateOpen(), Text(text="baz"), TemplateClose(), TemplateClose()]
  90. ---
  91. name: nested_name_end_named_param_value
  92. label: nested template at the end of a template name and as a parameter value with a named parameter
  93. input: "{{foo{{bar}}|baz={{biz}}}}"
  94. output: [TemplateOpen(), Text(text="foo"), TemplateOpen(), Text(text="bar"), TemplateClose(), TemplateParamSeparator(), Text(text="baz"), TemplateParamEquals(), TemplateOpen(), Text(text="biz"), TemplateClose(), TemplateClose()]
  95. ---
  96. name: nested_name_end_named_param_name_and_value
  97. label: nested template at the end of a template name and as a parameter name and value
  98. input: "{{foo{{bar}}|{{baz}}={{biz}}}}"
  99. output: [TemplateOpen(), Text(text="foo"), TemplateOpen(), Text(text="bar"), TemplateClose(), TemplateParamSeparator(), TemplateOpen(), Text(text="baz"), TemplateClose(), TemplateParamEquals(), TemplateOpen(), Text(text="biz"), TemplateClose(), TemplateClose()]
  100. ---
  101. name: nested_name_mid
  102. label: nested template in the middle of a template name
  103. input: "{{foo{{bar}}baz}}"
  104. output: [TemplateOpen(), Text(text="foo"), TemplateOpen(), Text(text="bar"), TemplateClose(), Text(text="baz"), TemplateClose()]
  105. ---
  106. name: nested_name_mid_unnamed_param
  107. label: nested template in the middle of a template name and as an unnamed parameter
  108. input: "{{foo{{bar}}baz|{{biz}}}}"
  109. output: [TemplateOpen(), Text(text="foo"), TemplateOpen(), Text(text="bar"), TemplateClose(), Text(text="baz"), TemplateParamSeparator(), TemplateOpen(), Text(text="biz"), TemplateClose(), TemplateClose()]
  110. ---
  111. name: nested_name_mid_named_param_value
  112. label: nested template in the middle of a template name and as a parameter value with a named parameter
  113. input: "{{foo{{bar}}baz|biz={{buzz}}}}"
  114. output: [TemplateOpen(), Text(text="foo"), TemplateOpen(), Text(text="bar"), TemplateClose(), Text(text="baz"), TemplateParamSeparator(), Text(text="biz"), TemplateParamEquals(), TemplateOpen(), Text(text="buzz"), TemplateClose(), TemplateClose()]
  115. ---
  116. name: nested_name_mid_named_param_name_and_value
  117. label: nested template in the middle of a template name and as a parameter name and value
  118. input: "{{foo{{bar}}baz|{{biz}}={{buzz}}}}"
  119. output: [TemplateOpen(), Text(text="foo"), TemplateOpen(), Text(text="bar"), TemplateClose(), Text(text="baz"), TemplateParamSeparator(), TemplateOpen(), Text(text="biz"), TemplateClose(), TemplateParamEquals(), TemplateOpen(), Text(text="buzz"), TemplateClose(), TemplateClose()]
  120. ---
  121. name: nested_name_start_end
  122. label: nested template at the beginning and end of a template name
  123. input: "{{{{foo}}{{bar}}}}"
  124. output: [TemplateOpen(), TemplateOpen(), Text(text="foo"), TemplateClose(), TemplateOpen(), Text(text="bar"), TemplateClose(), TemplateClose()]
  125. ---
  126. name: nested_name_start_end_unnamed_param
  127. label: nested template at the beginning and end of a template name and as an unnamed parameter
  128. input: "{{{{foo}}{{bar}}|{{baz}}}}"
  129. output: [TemplateOpen(), TemplateOpen(), Text(text="foo"), TemplateClose(), TemplateOpen(), Text(text="bar"), TemplateClose(), TemplateParamSeparator(), TemplateOpen(), Text(text="baz"), TemplateClose(), TemplateClose()]
  130. ---
  131. name: nested_name_start_end_named_param_value
  132. label: nested template at the beginning and end of a template name and as a parameter value with a named parameter
  133. input: "{{{{foo}}{{bar}}|baz={{biz}}}}"
  134. output: [TemplateOpen(), TemplateOpen(), Text(text="foo"), TemplateClose(), TemplateOpen(), Text(text="bar"), TemplateClose(), TemplateParamSeparator(), Text(text="baz"), TemplateParamEquals(), TemplateOpen(), Text(text="biz"), TemplateClose(), TemplateClose()]
  135. ---
  136. name: nested_name_start_end_named_param_name_and_value
  137. label: nested template at the beginning and end of a template name and as a parameter name and value
  138. input: "{{{{foo}}{{bar}}|{{baz}}={{biz}}}}"
  139. output: [TemplateOpen(), TemplateOpen(), Text(text="foo"), TemplateClose(), TemplateOpen(), Text(text="bar"), TemplateClose(), TemplateParamSeparator(), TemplateOpen(), Text(text="baz"), TemplateClose(), TemplateParamEquals(), TemplateOpen(), Text(text="biz"), TemplateClose(), TemplateClose()]
  140. ---
  141. name: nested_names_multiple
  142. label: multiple nested templates within nested templates
  143. input: "{{{{{{{{foo}}bar}}baz}}biz}}"
  144. output: [TemplateOpen(), TemplateOpen(), TemplateOpen(), TemplateOpen(), Text(text="foo"), TemplateClose(), Text(text="bar"), TemplateClose(), Text(text="baz"), TemplateClose(), Text(text="biz"), TemplateClose()]
  145. ---
  146. name: nested_names_multiple_unnamed_param
  147. label: multiple nested templates within nested templates with a nested unnamed parameter
  148. input: "{{{{{{{{foo}}bar}}baz}}biz|{{buzz}}}}"
  149. output: [TemplateOpen(), TemplateOpen(), TemplateOpen(), TemplateOpen(), Text(text="foo"), TemplateClose(), Text(text="bar"), TemplateClose(), Text(text="baz"), TemplateClose(), Text(text="biz"), TemplateParamSeparator(), TemplateOpen(), Text(text="buzz"), TemplateClose(), TemplateClose()]
  150. ---
  151. name: nested_names_multiple_named_param_value
  152. label: multiple nested templates within nested templates with a nested parameter value in a named parameter
  153. input: "{{{{{{{{foo}}bar}}baz}}biz|buzz={{bin}}}}"
  154. output: [TemplateOpen(), TemplateOpen(), TemplateOpen(), TemplateOpen(), Text(text="foo"), TemplateClose(), Text(text="bar"), TemplateClose(), Text(text="baz"), TemplateClose(), Text(text="biz"), TemplateParamSeparator(), Text(text="buzz"), TemplateParamEquals(), TemplateOpen(), Text(text="bin"), TemplateClose(), TemplateClose()]
  155. ---
  156. name: nested_names_multiple_named_param_name_and_value
  157. label: multiple nested templates within nested templates with a nested parameter name and value
  158. input: "{{{{{{{{foo}}bar}}baz}}biz|{{buzz}}={{bin}}}}"
  159. output: [TemplateOpen(), TemplateOpen(), TemplateOpen(), TemplateOpen(), Text(text="foo"), TemplateClose(), Text(text="bar"), TemplateClose(), Text(text="baz"), TemplateClose(), Text(text="biz"), TemplateParamSeparator(), TemplateOpen(), Text(text="buzz"), TemplateClose(), TemplateParamEquals(), TemplateOpen(), Text(text="bin"), TemplateClose(), TemplateClose()]
  160. ---
  161. name: mixed_nested_templates
  162. label: mixed assortment of nested templates within template names, parameter names, and values
  163. input: "{{{{{{{{foo}}bar|baz=biz}}buzz}}usr|{{bin}}}}"
  164. output: [TemplateOpen(), TemplateOpen(), TemplateOpen(), TemplateOpen(), Text(text="foo"), TemplateClose(), Text(text="bar"), TemplateParamSeparator(), Text(text="baz"), TemplateParamEquals(), Text(text="biz"), TemplateClose(), Text(text="buzz"), TemplateClose(), Text(text="usr"), TemplateParamSeparator(), TemplateOpen(), Text(text="bin"), TemplateClose(), TemplateClose()]
  165. ---
  166. name: newlines_start
  167. label: a newline at the start of a template name
  168. input: "{{\nfoobar}}"
  169. output: [TemplateOpen(), Text(text="\nfoobar"), TemplateClose()]
  170. ---
  171. name: newlines_end
  172. label: a newline at the end of a template name
  173. input: "{{foobar\n}}"
  174. output: [TemplateOpen(), Text(text="foobar\n"), TemplateClose()]
  175. ---
  176. name: newlines_start_end
  177. label: a newline at the start and end of a template name
  178. input: "{{\nfoobar\n}}"
  179. output: [TemplateOpen(), Text(text="\nfoobar\n"), TemplateClose()]
  180. ---
  181. name: newlines_mid
  182. label: a newline at the middle of a template name
  183. input: "{{foo\nbar}}"
  184. output: [Text(text="{{foo\nbar}}")]
  185. ---
  186. name: newlines_start_mid
  187. label: a newline at the start and middle of a template name
  188. input: "{{\nfoo\nbar}}"
  189. output: [Text(text="{{\nfoo\nbar}}")]
  190. ---
  191. name: newlines_mid_end
  192. label: a newline at the middle and end of a template name
  193. input: "{{foo\nbar\n}}"
  194. output: [Text(text="{{foo\nbar\n}}")]
  195. ---
  196. name: newlines_start_mid_end
  197. label: a newline at the start, middle, and end of a template name
  198. input: "{{\nfoo\nbar\n}}"
  199. output: [Text(text="{{\nfoo\nbar\n}}")]
  200. ---
  201. name: newlines_unnamed_param
  202. label: newlines within an unnamed template parameter
  203. input: "{{foo|\nb\nar\n}}"
  204. output: [TemplateOpen(), Text(text="foo"), TemplateParamSeparator(), Text(text="\nb\nar\n"), TemplateClose()]
  205. ---
  206. name: newlines_enclose_template_name_unnamed_param
  207. label: newlines enclosing a template name and within an unnamed template parameter
  208. input: "{{\nfoo\n|\nb\nar\n}}"
  209. output: [TemplateOpen(), Text(text="\nfoo\n"), TemplateParamSeparator(), Text(text="\nb\nar\n"), TemplateClose()]
  210. ---
  211. name: newlines_within_template_name_unnamed_param
  212. label: newlines within a template name and within an unnamed template parameter
  213. input: "{{\nfo\no\n|\nb\nar\n}}"
  214. output: [Text(text="{{\nfo\no\n|\nb\nar\n}}")]
  215. ---
  216. name: newlines_enclose_template_name_named_param_value
  217. label: newlines enclosing a template name and within a named parameter value
  218. input: "{{\nfoo\n|1=\nb\nar\n}}"
  219. output: [TemplateOpen(), Text(text="\nfoo\n"), TemplateParamSeparator(), Text(text="1"), TemplateParamEquals(), Text(text="\nb\nar\n"), TemplateClose()]
  220. ---
  221. name: newlines_within_template_name_named_param_value
  222. label: newlines within a template name and within a named parameter value
  223. input: "{{\nf\noo\n|1=\nb\nar\n}}"
  224. output: [Text(text="{{\nf\noo\n|1=\nb\nar\n}}")]
  225. ---
  226. name: newlines_named_param_name
  227. label: newlines within a parameter name
  228. input: "{{foo|\nb\nar\n=baz}}"
  229. output: [TemplateOpen(), Text(text="foo"), TemplateParamSeparator(), Text(text="\nb\nar\n"), TemplateParamEquals(), Text(text="baz"), TemplateClose()]
  230. ---
  231. name: newlines_named_param_name_param_value
  232. label: newlines within a parameter name and within a parameter value
  233. input: "{{foo|\nb\nar\n=\nba\nz\n}}"
  234. output: [TemplateOpen(), Text(text="foo"), TemplateParamSeparator(), Text(text="\nb\nar\n"), TemplateParamEquals(), Text(text="\nba\nz\n"), TemplateClose()]
  235. ---
  236. name: newlines_enclose_template_name_named_param_name
  237. label: newlines enclosing a template name and within a parameter name
  238. input: "{{\nfoo\n|\nb\nar\n=baz}}"
  239. output: [TemplateOpen(), Text(text="\nfoo\n"), TemplateParamSeparator(), Text(text="\nb\nar\n"), TemplateParamEquals(), Text(text="baz"), TemplateClose()]
  240. ---
  241. name: newlines_enclose_template_name_named_param_name_param_value
  242. label: newlines enclosing a template name and within a parameter name and within a parameter value
  243. input: "{{\nfoo\n|\nb\nar\n=\nba\nz\n}}"
  244. output: [TemplateOpen(), Text(text="\nfoo\n"), TemplateParamSeparator(), Text(text="\nb\nar\n"), TemplateParamEquals(), Text(text="\nba\nz\n"), TemplateClose()]
  245. ---
  246. name: newlines_within_template_name_named_param_name
  247. label: newlines within a template name and within a parameter name
  248. input: "{{\nfo\no\n|\nb\nar\n=baz}}"
  249. output: [Text(text="{{\nfo\no\n|\nb\nar\n=baz}}")]
  250. ---
  251. name: newlines_within_template_name_named_param_name_param_value
  252. label: newlines within a template name and within a parameter name and within a parameter value
  253. input: "{{\nf\noo\n|\nb\nar\n=\nba\nz\n}}"
  254. output: [Text(text="{{\nf\noo\n|\nb\nar\n=\nba\nz\n}}")]
  255. ---
  256. name: newlines_wildcard
  257. label: a random, complex assortment of templates and newlines
  258. input: "{{\nfoo\n|\nb\nar\n=\nb\naz\n|\nb\nuz\n}}"
  259. output: [TemplateOpen(), Text(text="\nfoo\n"), TemplateParamSeparator(), Text(text="\nb\nar\n"), TemplateParamEquals(), Text(text="\nb\naz\n"), TemplateParamSeparator(), Text(text="\nb\nuz\n"), TemplateClose()]
  260. ---
  261. name: newlines_wildcard_redux
  262. label: an even more random and complex assortment of templates and newlines
  263. input: "{{\nfoo\n|\n{{\nbar\n|\nb\naz\n=\nb\niz\n}}\n=\nb\nuzz\n}}"
  264. output: [TemplateOpen(), Text(text="\nfoo\n"), TemplateParamSeparator(), Text(text="\n"), TemplateOpen(), Text(text="\nbar\n"), TemplateParamSeparator(), Text(text="\nb\naz\n"), TemplateParamEquals(), Text(text="\nb\niz\n"), TemplateClose(), Text(text="\n"), TemplateParamEquals(), Text(text="\nb\nuzz\n"), TemplateClose()]
  265. ---
  266. name: newlines_wildcard_redux_invalid
  267. label: a variation of the newlines_wildcard_redux test that is invalid
  268. input: "{{\nfoo\n|\n{{\nb\nar\n|\nb\naz\n=\nb\niz\n}}\n=\nb\nuzz\n}}"
  269. output: [Text(text="{{\nfoo\n|\n{{\nb\nar\n|\nb\naz\n=\nb\niz\n}}\n=\nb\nuzz\n}}")]
  270. ---
  271. name: newlines_spaces
  272. label: newlines in the middle of a template name, followed by spaces
  273. input: "{{foo\n }}"
  274. output: [TemplateOpen(), Text(text="foo\n "), TemplateClose()]
  275. ---
  276. name: newlines_spaces_param
  277. label: newlines in the middle of a template name, followed by spaces, with a parameter
  278. input: "{{foo\n |bar=baz}}"
  279. output: [TemplateOpen(), Text(text="foo\n "), TemplateParamSeparator(), Text(text="bar"), TemplateParamEquals(), Text(text="baz"), TemplateClose()]
  280. ---
  281. name: invalid_name_left_brace_middle
  282. label: invalid characters in template name: left brace in middle
  283. input: "{{foo{bar}}"
  284. output: [Text(text="{{foo{bar}}")]
  285. ---
  286. name: invalid_name_right_brace_middle
  287. label: invalid characters in template name: right brace in middle
  288. input: "{{foo}bar}}"
  289. output: [Text(text="{{foo}bar}}")]
  290. ---
  291. name: invalid_name_left_braces
  292. label: invalid characters in template name: two left braces in middle
  293. input: "{{foo{b{ar}}"
  294. output: [Text(text="{{foo{b{ar}}")]
  295. ---
  296. name: invalid_name_left_bracket_middle
  297. label: invalid characters in template name: left bracket in middle
  298. input: "{{foo[bar}}"
  299. output: [Text(text="{{foo[bar}}")]
  300. ---
  301. name: invalid_name_right_bracket_middle
  302. label: invalid characters in template name: right bracket in middle
  303. input: "{{foo]bar}}"
  304. output: [Text(text="{{foo]bar}}")]
  305. ---
  306. name: invalid_name_left_bracket_start
  307. label: invalid characters in template name: left bracket at start
  308. input: "{{[foobar}}"
  309. output: [Text(text="{{[foobar}}")]
  310. ---
  311. name: invalid_name_right_bracket_start
  312. label: invalid characters in template name: right bracket at end
  313. input: "{{foobar]}}"
  314. output: [Text(text="{{foobar]}}")]
  315. ---
  316. name: valid_name_left_brace_start
  317. label: valid characters in template name: left brace at start
  318. input: "{{{foobar}}"
  319. output: [Text(text="{"), TemplateOpen(), Text(text="foobar"), TemplateClose()]
  320. ---
  321. name: valid_unnamed_param_left_brace
  322. label: valid characters in unnamed template parameter: left brace
  323. input: "{{foo|ba{r}}"
  324. output: [TemplateOpen(), Text(text="foo"), TemplateParamSeparator(), Text(text="ba{r"), TemplateClose()]
  325. ---
  326. name: valid_unnamed_param_braces
  327. label: valid characters in unnamed template parameter: left and right braces
  328. input: "{{foo|ba{r}}}"
  329. output: [TemplateOpen(), Text(text="foo"), TemplateParamSeparator(), Text(text="ba{r"), TemplateClose(), Text(text="}")]
  330. ---
  331. name: valid_param_name_braces
  332. label: valid characters in template parameter name: left and right braces
  333. input: "{{foo|ba{r}=baz}}"
  334. output: [TemplateOpen(), Text(text="foo"), TemplateParamSeparator(), Text(text="ba{r}"), TemplateParamEquals(), Text(text="baz"), TemplateClose()]
  335. ---
  336. name: valid_param_name_brackets
  337. label: valid characters in unnamed template parameter: left and right brackets
  338. input: "{{foo|ba[r]=baz}}"
  339. output: [TemplateOpen(), Text(text="foo"), TemplateParamSeparator(), Text(text="ba[r]"), TemplateParamEquals(), Text(text="baz"), TemplateClose()]
  340. ---
  341. name: valid_param_name_double_left_brackets
  342. label: valid characters in unnamed template parameter: double left brackets
  343. input: "{{foo|bar[[in\nvalid=baz}}"
  344. output: [TemplateOpen(), Text(text="foo"), TemplateParamSeparator(), Text(text="bar[[in\nvalid"), TemplateParamEquals(), Text(text="baz"), TemplateClose()]
  345. ---
  346. name: valid_param_name_double_right_brackets
  347. label: valid characters in unnamed template parameter: double right brackets
  348. input: "{{foo|bar]]=baz}}"
  349. output: [TemplateOpen(), Text(text="foo"), TemplateParamSeparator(), Text(text="bar]]"), TemplateParamEquals(), Text(text="baz"), TemplateClose()]
  350. ---
  351. name: valid_param_name_double_brackets
  352. label: valid characters in unnamed template parameter: double left and right brackets
  353. input: "{{foo|bar[[in\nvalid]]=baz}}"
  354. output: [TemplateOpen(), Text(text="foo"), TemplateParamSeparator(), Text(text="bar[[in\nvalid]]"), TemplateParamEquals(), Text(text="baz"), TemplateClose()]
  355. ---
  356. name: invalid_param_name_double_left_braces
  357. label: invalid characters in template parameter name: double left braces
  358. input: "{{foo|bar{{in\nvalid=baz}}"
  359. output: [Text(text="{{foo|bar{{in\nvalid=baz}}")]
  360. ---
  361. name: invalid_param_name_double_braces
  362. label: invalid characters in template parameter name: double left and right braces
  363. input: "{{foo|bar{{in\nvalid}}=baz}}"
  364. output: [TemplateOpen(), Text(text="foo"), TemplateParamSeparator(), Text(text="bar{{in\nvalid"), TemplateClose(), Text(text="=baz}}")]
  365. ---
  366. name: incomplete_stub
  367. label: incomplete templates that should fail gracefully: just an opening
  368. input: "{{"
  369. output: [Text(text="{{")]
  370. ---
  371. name: incomplete_plain
  372. label: incomplete templates that should fail gracefully: no close whatsoever
  373. input: "{{stuff}} {{foobar"
  374. output: [TemplateOpen(), Text(text="stuff"), TemplateClose(), Text(text=" {{foobar")]
  375. ---
  376. name: incomplete_right_brace
  377. label: incomplete templates that should fail gracefully: only one right brace
  378. input: "{{stuff}} {{foobar}"
  379. output: [TemplateOpen(), Text(text="stuff"), TemplateClose(), Text(text=" {{foobar}")]
  380. ---
  381. name: incomplete_pipe
  382. label: incomplete templates that should fail gracefully: a pipe
  383. input: "{{stuff}} {{foobar|"
  384. output: [TemplateOpen(), Text(text="stuff"), TemplateClose(), Text(text=" {{foobar|")]
  385. ---
  386. name: incomplete_unnamed_param
  387. label: incomplete templates that should fail gracefully: an unnamed parameter
  388. input: "{{stuff}} {{foo|bar"
  389. output: [TemplateOpen(), Text(text="stuff"), TemplateClose(), Text(text=" {{foo|bar")]
  390. ---
  391. name: incomplete_unnamed_param_pipe
  392. label: incomplete templates that should fail gracefully: an unnamed parameter, then a pipe
  393. input: "{{stuff}} {{foo|bar|"
  394. output: [TemplateOpen(), Text(text="stuff"), TemplateClose(), Text(text=" {{foo|bar|")]
  395. ---
  396. name: incomplete_valueless_param
  397. label: incomplete templates that should fail gracefully: an a named parameter with no value
  398. input: "{{stuff}} {{foo|bar="
  399. output: [TemplateOpen(), Text(text="stuff"), TemplateClose(), Text(text=" {{foo|bar=")]
  400. ---
  401. name: incomplete_valueless_param_pipe
  402. label: incomplete templates that should fail gracefully: a named parameter with no value, then a pipe
  403. input: "{{stuff}} {{foo|bar=|"
  404. output: [TemplateOpen(), Text(text="stuff"), TemplateClose(), Text(text=" {{foo|bar=|")]
  405. ---
  406. name: incomplete_named_param
  407. label: incomplete templates that should fail gracefully: a named parameter with a value
  408. input: "{{stuff}} {{foo|bar=baz"
  409. output: [TemplateOpen(), Text(text="stuff"), TemplateClose(), Text(text=" {{foo|bar=baz")]
  410. ---
  411. name: incomplete_named_param_pipe
  412. label: incomplete templates that should fail gracefully: a named parameter with a value, then a paipe
  413. input: "{{stuff}} {{foo|bar=baz|"
  414. output: [TemplateOpen(), Text(text="stuff"), TemplateClose(), Text(text=" {{foo|bar=baz|")]
  415. ---
  416. name: incomplete_two_unnamed_params
  417. label: incomplete templates that should fail gracefully: two unnamed parameters
  418. input: "{{stuff}} {{foo|bar|baz"
  419. output: [TemplateOpen(), Text(text="stuff"), TemplateClose(), Text(text=" {{foo|bar|baz")]
  420. ---
  421. name: incomplete_unnamed_param_valueless_param
  422. label: incomplete templates that should fail gracefully: an unnamed parameter, then a named parameter with no value
  423. input: "{{stuff}} {{foo|bar|baz="
  424. output: [TemplateOpen(), Text(text="stuff"), TemplateClose(), Text(text=" {{foo|bar|baz=")]
  425. ---
  426. name: incomplete_unnamed_param_named_param
  427. label: incomplete templates that should fail gracefully: an unnamed parameter, then a named parameter with a value
  428. input: "{{stuff}} {{foo|bar|baz=biz"
  429. output: [TemplateOpen(), Text(text="stuff"), TemplateClose(), Text(text=" {{foo|bar|baz=biz")]
  430. ---
  431. name: incomplete_named_param_unnamed_param
  432. label: incomplete templates that should fail gracefully: a named parameter with a value, then an unnamed parameter
  433. input: "{{stuff}} {{foo|bar=baz|biz"
  434. output: [TemplateOpen(), Text(text="stuff"), TemplateClose(), Text(text=" {{foo|bar=baz|biz")]
  435. ---
  436. name: incomplete_named_param_valueless_param
  437. label: incomplete templates that should fail gracefully: a named parameter with a value, then a named parameter with no value
  438. input: "{{stuff}} {{foo|bar=baz|biz="
  439. output: [TemplateOpen(), Text(text="stuff"), TemplateClose(), Text(text=" {{foo|bar=baz|biz=")]
  440. ---
  441. name: incomplete_two_named_params
  442. label: incomplete templates that should fail gracefully: two named parameters with values
  443. input: "{{stuff}} {{foo|bar=baz|biz=buzz"
  444. output: [TemplateOpen(), Text(text="stuff"), TemplateClose(), Text(text=" {{foo|bar=baz|biz=buzz")]
  445. ---
  446. name: incomplete_nested_template_as_unnamed_param
  447. label: incomplete templates that should fail gracefully: a valid nested template as an unnamed parameter
  448. input: "{{stuff}} {{foo|{{bar}}"
  449. output: [TemplateOpen(), Text(text="stuff"), TemplateClose(), Text(text=" {{foo|"), TemplateOpen(), Text(text="bar"), TemplateClose()]
  450. ---
  451. name: incomplete_nested_template_as_param_value
  452. label: incomplete templates that should fail gracefully: a valid nested template as a parameter value
  453. input: "{{stuff}} {{foo|bar={{baz}}"
  454. output: [TemplateOpen(), Text(text="stuff"), TemplateClose(), Text(text=" {{foo|bar="), TemplateOpen(), Text(text="baz"), TemplateClose()]
  455. ---
  456. name: recursion_five_hundred_opens
  457. label: test potentially dangerous recursion: five hundred template openings, without spaces
  458. input: "{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{"
  459. output: [Text(text="{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{")]
  460. ---
  461. name: recursion_one_hundred_opens
  462. label: test potentially dangerous recursion: one hundred template openings, with spaces
  463. input: "{{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{"
  464. output: [Text(text="{{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{ {{")]
  465. ---
  466. name: recursion_opens_and_closes
  467. label: test potentially dangerous recursion: template openings and closings
  468. input: "{{|{{}}{{|{{}}{{|{{}}{{|{{}}{{|{{}}{{|{{}}{{|{{}}{{|{{}}{{|{{}}{{|{{}}{{|{{}}{{|{{}}{{|{{}}{{|{{}}"
  469. output: [Text(text="{{|"), TemplateOpen(), TemplateClose(), Text(text="{{|"), TemplateOpen(), TemplateClose(), TemplateOpen(), TemplateParamSeparator(), TemplateOpen(), TemplateClose(), Text(text="{{"), TemplateParamSeparator(), Text(text="{{"), TemplateClose(), Text(text="{{|{{}}{{|{{}}{{|{{}}{{|{{}}{{|{{}}{{|{{}}{{|{{}}{{|{{}}{{|{{}}{{|{{}}")]