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.

пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
пре 11 година
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585
  1. name: basic
  2. label: a basic tag with an open and close
  3. input: "<ref></ref>"
  4. output: [TagOpenOpen(), Text(text="ref"), TagCloseOpen(padding=""), TagOpenClose(), Text(text="ref"), TagCloseClose()]
  5. ---
  6. name: basic_selfclosing
  7. label: a basic self-closing tag
  8. input: "<ref/>"
  9. output: [TagOpenOpen(), Text(text="ref"), TagCloseSelfclose(padding="")]
  10. ---
  11. name: content
  12. label: a tag with some content in the middle
  13. input: "<ref>this is a reference</ref>"
  14. output: [TagOpenOpen(), Text(text="ref"), TagCloseOpen(padding=""), Text(text="this is a reference"), TagOpenClose(), Text(text="ref"), TagCloseClose()]
  15. ---
  16. name: padded_open
  17. label: a tag with some padding in the open tag
  18. input: "<ref ></ref>"
  19. output: [TagOpenOpen(), Text(text="ref"), TagCloseOpen(padding=" "), TagOpenClose(), Text(text="ref"), TagCloseClose()]
  20. ---
  21. name: padded_close
  22. label: a tag with some padding in the close tag
  23. input: "<ref></ref >"
  24. output: [TagOpenOpen(), Text(text="ref"), TagCloseOpen(padding=""), TagOpenClose(), Text(text="ref "), TagCloseClose()]
  25. ---
  26. name: padded_selfclosing
  27. label: a self-closing tag with padding
  28. input: "<ref />"
  29. output: [TagOpenOpen(), Text(text="ref"), TagCloseSelfclose(padding=" ")]
  30. ---
  31. name: attribute
  32. label: a tag with a single attribute
  33. input: "<ref name></ref>"
  34. output: [TagOpenOpen(), Text(text="ref"), TagAttrStart(pad_first=" ", pad_before_eq="", pad_after_eq=""), Text(text="name"), TagCloseOpen(padding=""), TagOpenClose(), Text(text="ref"), TagCloseClose()]
  35. ---
  36. name: attribute_value
  37. label: a tag with a single attribute with a value
  38. input: "<ref name=foo></ref>"
  39. output: [TagOpenOpen(), Text(text="ref"), TagAttrStart(pad_first=" ", pad_before_eq="", pad_after_eq=""), Text(text="name"), TagAttrEquals(), Text(text="foo"), TagCloseOpen(padding=""), TagOpenClose(), Text(text="ref"), TagCloseClose()]
  40. ---
  41. name: attribute_quoted
  42. label: a tag with a single quoted attribute
  43. input: "<ref name="foo bar"></ref>"
  44. output: [TagOpenOpen(), Text(text="ref"), TagAttrStart(pad_first=" ", pad_before_eq="", pad_after_eq=""), Text(text="name"), TagAttrEquals(), TagAttrQuote(), Text(text="foo bar"), TagCloseOpen(padding=""), TagOpenClose(), Text(text="ref"), TagCloseClose()]
  45. ---
  46. name: attribute_hyphen
  47. label: a tag with a single attribute, containing a hyphen
  48. input: "<ref name=foo-bar></ref>"
  49. output: [TagOpenOpen(), Text(text="ref"), TagAttrStart(pad_first=" ", pad_before_eq="", pad_after_eq=""), Text(text="name"), TagAttrEquals(), Text(text="foo-bar"), TagCloseOpen(padding=""), TagOpenClose(), Text(text="ref"), TagCloseClose()]
  50. ---
  51. name: attribute_quoted_hyphen
  52. label: a tag with a single quoted attribute, containing a hyphen
  53. input: "<ref name="foo-bar"></ref>"
  54. output: [TagOpenOpen(), Text(text="ref"), TagAttrStart(pad_first=" ", pad_before_eq="", pad_after_eq=""), Text(text="name"), TagAttrEquals(), TagAttrQuote(), Text(text="foo-bar"), TagCloseOpen(padding=""), TagOpenClose(), Text(text="ref"), TagCloseClose()]
  55. ---
  56. name: attribute_selfclosing
  57. label: a self-closing tag with a single attribute
  58. input: "<ref name/>"
  59. output: [TagOpenOpen(), Text(text="ref"), TagAttrStart(pad_first=" ", pad_before_eq="", pad_after_eq=""), Text(text="name"), TagCloseSelfclose(padding="")]
  60. ---
  61. name: attribute_selfclosing_value
  62. label: a self-closing tag with a single attribute with a value
  63. input: "<ref name=foo/>"
  64. output: [TagOpenOpen(), Text(text="ref"), TagAttrStart(pad_first=" ", pad_before_eq="", pad_after_eq=""), Text(text="name"), TagAttrEquals(), Text(text="foo"), TagCloseSelfclose(padding="")]
  65. ---
  66. name: attribute_selfclosing_value_quoted
  67. label: a self-closing tag with a single quoted attribute
  68. input: "<ref name="foo"/>"
  69. output: [TagOpenOpen(), Text(text="ref"), TagAttrStart(pad_first=" ", pad_before_eq="", pad_after_eq=""), Text(text="name"), TagAttrEquals(), TagAttrQuote(), Text(text="foo"), TagCloseSelfclose(padding="")]
  70. ---
  71. name: nested_tag
  72. label: a tag nested within the attributes of another
  73. input: "<ref name=<span style="color: red;">foo</span>>citation</ref>"
  74. output: [TagOpenOpen(), Text(text="ref"), TagAttrStart(pad_first=" ", pad_before_eq="", pad_after_eq=""), Text(text="name"), TagAttrEquals(), TagOpenOpen(), Text(text="span"), TagAttrStart(pad_first=" ", pad_before_eq="", pad_after_eq=""), Text(text="style"), TagAttrEquals(), TagAttrQuote(), Text(text="color: red;"), TagCloseOpen(padding=""), Text(text="foo"), TagOpenClose(), Text(text="span"), TagCloseClose(), TagCloseOpen(padding=""), Text(text="citation"), TagOpenClose(), Text(text="ref"), TagCloseClose()]
  75. ---
  76. name: nested_tag_quoted
  77. label: a tag nested within the attributes of another, quoted
  78. input: "<ref name="<span style="color: red;">foo</span>">citation</ref>"
  79. output: [TagOpenOpen(), Text(text="ref"), TagAttrStart(pad_first=" ", pad_before_eq="", pad_after_eq=""), Text(text="name"), TagAttrEquals(), TagAttrQuote(), TagOpenOpen(), Text(text="span"), TagAttrStart(pad_first=" ", pad_before_eq="", pad_after_eq=""), Text(text="style"), TagAttrEquals(), TagAttrQuote(), Text(text="color: red;"), TagCloseOpen(padding=""), Text(text="foo"), TagOpenClose(), Text(text="span"), TagCloseClose(), TagCloseOpen(padding=""), Text(text="citation"), TagOpenClose(), Text(text="ref"), TagCloseClose()]
  80. ---
  81. name: nested_troll_tag
  82. label: a bogus tag that appears to be nested within the attributes of another
  83. input: "<ref name=</ ><//>>citation</ref>"
  84. output: [Text(text="<ref name=</ ><//>>citation</ref>")]
  85. ---
  86. name: nested_troll_tag_quoted
  87. label: a bogus tag that appears to be nested within the attributes of another, quoted
  88. input: "<ref name="</ ><//>">citation</ref>"
  89. output: [TagOpenOpen(), Text(text="ref"), TagAttrStart(pad_first=" ", pad_before_eq="", pad_after_eq=""), Text(text="name"), TagAttrEquals(), TagAttrQuote(), Text(text="</ ><//>"), TagCloseOpen(padding=""), Text(text="citation"), TagOpenClose(), Text(text="ref"), TagCloseClose()]
  90. ---
  91. name: nested_tag_selfclosing
  92. label: a tag nested within the attributes of another; outer tag implicitly self-closing
  93. input: "<li <b></b></li>"
  94. output: [TagOpenOpen(), Text(text="li"), TagAttrStart(pad_first=" ", pad_before_eq="", pad_after_eq=""), TagOpenOpen(), Text(text="b"), TagCloseOpen(padding=""), TagOpenClose(), Text(text="b"), TagCloseClose(), Text(text="</li"), TagCloseSelfclose(padding="", implicit=True)]
  95. ---
  96. name: invalid_space_begin_open
  97. label: invalid tag: a space at the beginning of the open tag
  98. input: "< ref>test</ref>"
  99. output: [Text(text="< ref>test</ref>")]
  100. ---
  101. name: invalid_space_begin_close
  102. label: invalid tag: a space at the beginning of the close tag
  103. input: "<ref>test</ ref>"
  104. output: [Text(text="<ref>test</ ref>")]
  105. ---
  106. name: valid_space_end
  107. label: valid tag: spaces at the ends of both the open and close tags
  108. input: "<ref >test</ref >"
  109. output: [TagOpenOpen(), Text(text="ref"), TagCloseOpen(padding=" "), Text(text="test"), TagOpenClose(), Text(text="ref "), TagCloseClose()]
  110. ---
  111. name: invalid_template_ends
  112. label: invalid tag: a template at the ends of both the open and close tags
  113. input: "<ref {{foo}}>test</ref {{foo}}>"
  114. output: [Text(text="<ref "), TemplateOpen(), Text(text="foo"), TemplateClose(), Text(text=">test</ref "), TemplateOpen(), Text(text="foo"), TemplateClose(), Text(text=">")]
  115. ---
  116. name: invalid_template_ends_nospace
  117. label: invalid tag: a template at the ends of both the open and close tags, without spacing
  118. input: "<ref {{foo}}>test</ref{{foo}}>"
  119. output: [Text(text="<ref "), TemplateOpen(), Text(text="foo"), TemplateClose(), Text(text=">test</ref"), TemplateOpen(), Text(text="foo"), TemplateClose(), Text(text=">")]
  120. ---
  121. name: valid_template_end_open
  122. label: valid tag: a template at the end of the open tag
  123. input: "<ref {{foo}}>test</ref>"
  124. output: [TagOpenOpen(), Text(text="ref"), TagAttrStart(pad_first=" ", pad_before_eq="", pad_after_eq=""), TemplateOpen(), Text(text="foo"), TemplateClose(), TagCloseOpen(padding=""), Text(text="test"), TagOpenClose(), Text(text="ref"), TagCloseClose()]
  125. ---
  126. name: valid_template_end_open_space_end_close
  127. label: valid tag: a template at the end of the open tag; whitespace at the end of the close tag
  128. input: "<ref {{foo}}>test</ref\n>"
  129. output: [TagOpenOpen(), Text(text="ref"), TagAttrStart(pad_first=" ", pad_before_eq="", pad_after_eq=""), TemplateOpen(), Text(text="foo"), TemplateClose(), TagCloseOpen(padding=""), Text(text="test"), TagOpenClose(), Text(text="ref\n"), TagCloseClose()]
  130. ---
  131. name: invalid_template_end_open_nospace
  132. label: invalid tag: a template at the end of the open tag, without spacing
  133. input: "<ref{{foo}}>test</ref>"
  134. output: [Text(text="<ref"), TemplateOpen(), Text(text="foo"), TemplateClose(), Text(text=">test</ref>")]
  135. ---
  136. name: invalid_template_start_close
  137. label: invalid tag: a template at the beginning of the close tag
  138. input: "<ref>test</{{foo}}ref>"
  139. output: [Text(text="<ref>test</"), TemplateOpen(), Text(text="foo"), TemplateClose(), Text(text="ref>")]
  140. ---
  141. name: invalid_template_start_open
  142. label: invalid tag: a template at the beginning of the open tag
  143. input: "<{{foo}}ref>test</ref>"
  144. output: [Text(text="<"), TemplateOpen(), Text(text="foo"), TemplateClose(), Text(text="ref>test</ref>")]
  145. ---
  146. name: unclosed_quote
  147. label: a quoted attribute that is never closed
  148. input: "<span style="foobar>stuff</span>"
  149. output: [TagOpenOpen(), Text(text="span"), TagAttrStart(pad_first=" ", pad_before_eq="", pad_after_eq=""), Text(text="style"), TagAttrEquals(), Text(text="\"foobar"), TagCloseOpen(padding=""), Text(text="stuff"), TagOpenClose(), Text(text="span"), TagCloseClose()]
  150. ---
  151. name: fake_quote
  152. label: a fake quoted attribute
  153. input: "<span style="foo"bar>stuff</span>"
  154. output: [TagOpenOpen(), Text(text="span"), TagAttrStart(pad_first=" ", pad_before_eq="", pad_after_eq=""), Text(text="style"), TagAttrEquals(), Text(text="\"foo\"bar"), TagCloseOpen(padding=""), Text(text="stuff"), TagOpenClose(), Text(text="span"), TagCloseClose()]
  155. ---
  156. name: fake_quote_complex
  157. label: a fake quoted attribute, with spaces and templates and links
  158. input: "<span style="foo {{bar}}\n[[baz]]"buzz >stuff</span>"
  159. output: [TagOpenOpen(), Text(text="span"), TagAttrStart(pad_first=" ", pad_before_eq="", pad_after_eq=""), Text(text="style"), TagAttrEquals(), Text(text="\"foo"), TagAttrStart(pad_first=" ", pad_before_eq="\n", pad_after_eq=""), TemplateOpen(), Text(text="bar"), TemplateClose(), TagAttrStart(pad_first="", pad_before_eq=" ", pad_after_eq=""), WikilinkOpen(), Text(text="baz"), WikilinkClose(), Text(text="\"buzz"), TagCloseOpen(padding=""), Text(text="stuff"), TagOpenClose(), Text(text="span"), TagCloseClose()]
  160. ---
  161. name: incomplete_lbracket
  162. label: incomplete tags: just a left bracket
  163. input: "<"
  164. output: [Text(text="<")]
  165. ---
  166. name: incomplete_lbracket_junk
  167. label: incomplete tags: just a left bracket, surrounded by stuff
  168. input: "foo<bar"
  169. output: [Text(text="foo<bar")]
  170. ---
  171. name: incomplete_unclosed_open
  172. label: incomplete tags: an unclosed open tag
  173. input: "junk <ref"
  174. output: [Text(text="junk <ref")]
  175. ---
  176. name: incomplete_unclosed_open_space
  177. label: incomplete tags: an unclosed open tag, space
  178. input: "junk <ref "
  179. output: [Text(text="junk <ref ")]
  180. ---
  181. name: incomplete_unclosed_open_unnamed_attr
  182. label: incomplete tags: an unclosed open tag, unnamed attribute
  183. input: "junk <ref name"
  184. output: [Text(text="junk <ref name")]
  185. ---
  186. name: incomplete_unclosed_open_attr_equals
  187. label: incomplete tags: an unclosed open tag, attribute, equal sign
  188. input: "junk <ref name="
  189. output: [Text(text="junk <ref name=")]
  190. ---
  191. name: incomplete_unclosed_open_attr_equals_quoted
  192. label: incomplete tags: an unclosed open tag, attribute, equal sign, quote
  193. input: "junk <ref name=""
  194. output: [Text(text="junk <ref name=\"")]
  195. ---
  196. name: incomplete_unclosed_open_attr
  197. label: incomplete tags: an unclosed open tag, attribute with a key/value
  198. input: "junk <ref name=foo"
  199. output: [Text(text="junk <ref name=foo")]
  200. ---
  201. name: incomplete_unclosed_open_attr_quoted
  202. label: incomplete tags: an unclosed open tag, attribute with a key/value, quoted
  203. input: "junk <ref name="foo""
  204. output: [Text(text="junk <ref name=\"foo\"")]
  205. ---
  206. name: incomplete_open
  207. label: incomplete tags: an open tag
  208. input: "junk <ref>"
  209. output: [Text(text="junk <ref>")]
  210. ---
  211. name: incomplete_open_unnamed_attr
  212. label: incomplete tags: an open tag, unnamed attribute
  213. input: "junk <ref name>"
  214. output: [Text(text="junk <ref name>")]
  215. ---
  216. name: incomplete_open_attr_equals
  217. label: incomplete tags: an open tag, attribute, equal sign
  218. input: "junk <ref name=>"
  219. output: [Text(text="junk <ref name=>")]
  220. ---
  221. name: incomplete_open_attr
  222. label: incomplete tags: an open tag, attribute with a key/value
  223. input: "junk <ref name=foo>"
  224. output: [Text(text="junk <ref name=foo>")]
  225. ---
  226. name: incomplete_open_attr_quoted
  227. label: incomplete tags: an open tag, attribute with a key/value, quoted
  228. input: "junk <ref name="foo">"
  229. output: [Text(text="junk <ref name=\"foo\">")]
  230. ---
  231. name: incomplete_open_text
  232. label: incomplete tags: an open tag, text
  233. input: "junk <ref>foo"
  234. output: [Text(text="junk <ref>foo")]
  235. ---
  236. name: incomplete_open_attr_text
  237. label: incomplete tags: an open tag, attribute with a key/value, text
  238. input: "junk <ref name=foo>bar"
  239. output: [Text(text="junk <ref name=foo>bar")]
  240. ---
  241. name: incomplete_open_text_lbracket
  242. label: incomplete tags: an open tag, text, left open bracket
  243. input: "junk <ref>bar<"
  244. output: [Text(text="junk <ref>bar<")]
  245. ---
  246. name: incomplete_open_text_lbracket_slash
  247. label: incomplete tags: an open tag, text, left bracket, slash
  248. input: "junk <ref>bar</"
  249. output: [Text(text="junk <ref>bar</")]
  250. ---
  251. name: incomplete_open_text_unclosed_close
  252. label: incomplete tags: an open tag, text, unclosed close
  253. input: "junk <ref>bar</ref"
  254. output: [Text(text="junk <ref>bar</ref")]
  255. ---
  256. name: incomplete_open_text_wrong_close
  257. label: incomplete tags: an open tag, text, wrong close
  258. input: "junk <ref>bar</span>"
  259. output: [Text(text="junk <ref>bar</span>")]
  260. ---
  261. name: incomplete_unclosed_close
  262. label: incomplete tags: an unclosed close tag
  263. input: "junk </"
  264. output: [Text(text="junk </")]
  265. ---
  266. name: incomplete_unclosed_close_text
  267. label: incomplete tags: an unclosed close tag, with text
  268. input: "junk </br"
  269. output: [Text(text="junk </br")]
  270. ---
  271. name: incomplete_close
  272. label: incomplete tags: a close tag
  273. input: "junk </ref>"
  274. output: [Text(text="junk </ref>")]
  275. ---
  276. name: incomplete_no_tag_name_open
  277. label: incomplete tags: no tag name within brackets; just an open
  278. input: "junk <>"
  279. output: [Text(text="junk <>")]
  280. ---
  281. name: incomplete_no_tag_name_selfclosing
  282. label: incomplete tags: no tag name within brackets; self-closing
  283. input: "junk < />"
  284. output: [Text(text="junk < />")]
  285. ---
  286. name: incomplete_no_tag_name_open_close
  287. label: incomplete tags: no tag name within brackets; open and close
  288. input: "junk <></>"
  289. output: [Text(text="junk <></>")]
  290. ---
  291. name: backslash_premature_before
  292. label: a backslash before a quote before a space
  293. input: "<foo attribute="this is\\" quoted">blah</foo>"
  294. output: [TagOpenOpen(), Text(text="foo"), TagAttrStart(pad_first=" ", pad_before_eq="", pad_after_eq=""), Text(text="attribute"), TagAttrEquals(), TagAttrQuote(), Text(text="this is\\\" quoted"), TagCloseOpen(padding=""), Text(text="blah"), TagOpenClose(), Text(text="foo"), TagCloseClose()]
  295. ---
  296. name: backslash_premature_after
  297. label: a backslash before a quote after a space
  298. input: "<foo attribute="this is \\"quoted">blah</foo>"
  299. output: [TagOpenOpen(), Text(text="foo"), TagAttrStart(pad_first=" ", pad_before_eq="", pad_after_eq=""), Text(text="attribute"), TagAttrEquals(), TagAttrQuote(), Text(text="this is \\\"quoted"), TagCloseOpen(padding=""), Text(text="blah"), TagOpenClose(), Text(text="foo"), TagCloseClose()]
  300. ---
  301. name: backslash_premature_middle
  302. label: a backslash before a quote in the middle of a word
  303. input: "<foo attribute="this i\\"s quoted">blah</foo>"
  304. output: [TagOpenOpen(), Text(text="foo"), TagAttrStart(pad_first=" ", pad_before_eq="", pad_after_eq=""), Text(text="attribute"), TagAttrEquals(), TagAttrQuote(), Text(text="this i\\\"s quoted"), TagCloseOpen(padding=""), Text(text="blah"), TagOpenClose(), Text(text="foo"), TagCloseClose()]
  305. ---
  306. name: backslash_adjacent
  307. label: escaped quotes next to unescaped quotes
  308. input: "<foo attribute="\\"this is quoted\\"">blah</foo>"
  309. output: [TagOpenOpen(), Text(text="foo"), TagAttrStart(pad_first=" ", pad_before_eq="", pad_after_eq=""), Text(text="attribute"), TagAttrEquals(), TagAttrQuote(), Text(text="\\\"this is quoted\\\""), TagCloseOpen(padding=""), Text(text="blah"), TagOpenClose(), Text(text="foo"), TagCloseClose()]
  310. ---
  311. name: backslash_endquote
  312. label: backslashes before the end quote, causing the attribute to become unquoted
  313. input: "<foo attribute="this_is quoted\\">blah</foo>"
  314. output: [TagOpenOpen(), Text(text="foo"), TagAttrStart(pad_first=" ", pad_before_eq="", pad_after_eq=""), Text(text="attribute"), TagAttrEquals(), Text(text="\"this_is"), TagAttrStart(pad_first=" ", pad_before_eq="", pad_after_eq=""), Text(text="quoted\\\""), TagCloseOpen(padding=""), Text(text="blah"), TagOpenClose(), Text(text="foo"), TagCloseClose()]
  315. ---
  316. name: backslash_double
  317. label: two adjacent backslashes, which do *not* affect the quote
  318. input: "<foo attribute="this is\\\\" quoted">blah</foo>"
  319. output: [TagOpenOpen(), Text(text="foo"), TagAttrStart(pad_first=" ", pad_before_eq="", pad_after_eq=""), Text(text="attribute"), TagAttrEquals(), TagAttrQuote(), Text(text="this is\\\\"), TagAttrStart(pad_first=" ", pad_before_eq="", pad_after_eq=""), Text(text="quoted\""), TagCloseOpen(padding=""), Text(text="blah"), TagOpenClose(), Text(text="foo"), TagCloseClose()]
  320. ---
  321. name: backslash_triple
  322. label: three adjacent backslashes, which do *not* affect the quote
  323. input: "<foo attribute="this is\\\\\\" quoted">blah</foo>"
  324. output: [TagOpenOpen(), Text(text="foo"), TagAttrStart(pad_first=" ", pad_before_eq="", pad_after_eq=""), Text(text="attribute"), TagAttrEquals(), TagAttrQuote(), Text(text="this is\\\\\\"), TagAttrStart(pad_first=" ", pad_before_eq="", pad_after_eq=""), Text(text="quoted\""), TagCloseOpen(padding=""), Text(text="blah"), TagOpenClose(), Text(text="foo"), TagCloseClose()]
  325. ---
  326. name: backslash_unaffecting
  327. label: backslashes near quotes, but not immediately adjacent, thus having no effect
  328. input: "<foo attribute="\\quote\\d" also="quote\\d\\">blah</foo>"
  329. output: [TagOpenOpen(), Text(text="foo"), TagAttrStart(pad_first=" ", pad_before_eq="", pad_after_eq=""), Text(text="attribute"), TagAttrEquals(), TagAttrQuote(), Text(text="\\quote\\d"), TagAttrStart(pad_first=" ", pad_before_eq="", pad_after_eq=""), Text(text="also"), TagAttrEquals(), Text(text="\"quote\\d\\\""), TagCloseOpen(padding=""), Text(text="blah"), TagOpenClose(), Text(text="foo"), TagCloseClose()]
  330. ---
  331. name: unparsable
  332. label: a tag that should not be put through the normal parser
  333. input: "{{t1}}<nowiki>{{t2}}</nowiki>{{t3}}"
  334. output: [TemplateOpen(), Text(text="t1"), TemplateClose(), TagOpenOpen(), Text(text="nowiki"), TagCloseOpen(padding=""), Text(text="{{t2}}"), TagOpenClose(), Text(text="nowiki"), TagCloseClose(), TemplateOpen(), Text(text="t3"), TemplateClose()]
  335. ---
  336. name: unparsable_complex
  337. label: a tag that should not be put through the normal parser; lots of stuff inside
  338. input: "{{t1}}<pre>{{t2}}\n==Heading==\nThis is some text with a [[page|link]].</pre>{{t3}}"
  339. output: [TemplateOpen(), Text(text="t1"), TemplateClose(), TagOpenOpen(), Text(text="pre"), TagCloseOpen(padding=""), Text(text="{{t2}}\n==Heading==\nThis is some text with a [[page|link]]."), TagOpenClose(), Text(text="pre"), TagCloseClose(), TemplateOpen(), Text(text="t3"), TemplateClose()]
  340. ---
  341. name: unparsable_attributed
  342. label: a tag that should not be put through the normal parser; parsed attributes
  343. input: "{{t1}}<nowiki attr=val attr2="{{val2}}">{{t2}}</nowiki>{{t3}}"
  344. output: [TemplateOpen(), Text(text="t1"), TemplateClose(), TagOpenOpen(), Text(text="nowiki"), TagAttrStart(pad_first=" ", pad_before_eq="", pad_after_eq=""), Text(text="attr"), TagAttrEquals(), Text(text="val"), TagAttrStart(pad_first=" ", pad_before_eq="", pad_after_eq=""), Text(text="attr2"), TagAttrEquals(), TagAttrQuote(), TemplateOpen(), Text(text="val2"), TemplateClose(), TagCloseOpen(padding=""), Text(text="{{t2}}"), TagOpenClose(), Text(text="nowiki"), TagCloseClose(), TemplateOpen(), Text(text="t3"), TemplateClose()]
  345. ---
  346. name: unparsable_incomplete
  347. label: a tag that should not be put through the normal parser; incomplete
  348. input: "{{t1}}<nowiki>{{t2}}{{t3}}"
  349. output: [TemplateOpen(), Text(text="t1"), TemplateClose(), Text(text="<nowiki>"), TemplateOpen(), Text(text="t2"), TemplateClose(), TemplateOpen(), Text(text="t3"), TemplateClose()]
  350. ---
  351. name: unparsable_entity
  352. label: a HTML entity inside unparsable text is still parsed
  353. input: "{{t1}}<nowiki>{{t2}}&nbsp;{{t3}}</nowiki>{{t4}}"
  354. output: [TemplateOpen(), Text(text="t1"), TemplateClose(), TagOpenOpen(), Text(text="nowiki"), TagCloseOpen(padding=""), Text(text="{{t2}}"), HTMLEntityStart(), Text(text="nbsp"), HTMLEntityEnd(), Text(text="{{t3}}"), TagOpenClose(), Text(text="nowiki"), TagCloseClose(), TemplateOpen(), Text(text="t4"), TemplateClose()]
  355. ---
  356. name: unparsable_entity_incomplete
  357. label: an incomplete HTML entity inside unparsable text
  358. input: "<nowiki>&</nowiki>"
  359. output: [TagOpenOpen(), Text(text="nowiki"), TagCloseOpen(padding=""), Text(text="&"), TagOpenClose(), Text(text="nowiki"), TagCloseClose()]
  360. ---
  361. name: unparsable_entity_incomplete_2
  362. label: an incomplete HTML entity inside unparsable text
  363. input: "<nowiki>&"
  364. output: [Text(text="<nowiki>&")]
  365. ---
  366. name: single_open_close
  367. label: a tag that supports being single; both an open and a close tag
  368. input: "foo<li>bar{{baz}}</li>"
  369. output: [Text(text="foo"), TagOpenOpen(), Text(text="li"), TagCloseOpen(padding=""), Text(text="bar"), TemplateOpen(), Text(text="baz"), TemplateClose(), TagOpenClose(), Text(text="li"), TagCloseClose()]
  370. ---
  371. name: single_open
  372. label: a tag that supports being single; just an open tag
  373. input: "foo<li>bar{{baz}}"
  374. output: [Text(text="foo"), TagOpenOpen(), Text(text="li"), TagCloseSelfclose(padding="", implicit=True), Text(text="bar"), TemplateOpen(), Text(text="baz"), TemplateClose()]
  375. ---
  376. name: single_selfclose
  377. label: a tag that supports being single; a self-closing tag
  378. input: "foo<li/>bar{{baz}}"
  379. output: [Text(text="foo"), TagOpenOpen(), Text(text="li"), TagCloseSelfclose(padding=""), Text(text="bar"), TemplateOpen(), Text(text="baz"), TemplateClose()]
  380. ---
  381. name: single_close
  382. label: a tag that supports being single; just a close tag
  383. input: "foo</li>bar{{baz}}"
  384. output: [Text(text="foo</li>bar"), TemplateOpen(), Text(text="baz"), TemplateClose()]
  385. ---
  386. name: single_only_open_close
  387. label: a tag that can only be single; both an open and a close tag
  388. input: "foo<br>bar{{baz}}</br>"
  389. output: [Text(text="foo"), TagOpenOpen(), Text(text="br"), TagCloseSelfclose(padding="", implicit=True), Text(text="bar"), TemplateOpen(), Text(text="baz"), TemplateClose(), TagOpenOpen(invalid=True), Text(text="br"), TagCloseSelfclose(padding="", implicit=True)]
  390. ---
  391. name: single_only_open
  392. label: a tag that can only be single; just an open tag
  393. input: "foo<br>bar{{baz}}"
  394. output: [Text(text="foo"), TagOpenOpen(), Text(text="br"), TagCloseSelfclose(padding="", implicit=True), Text(text="bar"), TemplateOpen(), Text(text="baz"), TemplateClose()]
  395. ---
  396. name: single_only_selfclose
  397. label: a tag that can only be single; a self-closing tag
  398. input: "foo<br/>bar{{baz}}"
  399. output: [Text(text="foo"), TagOpenOpen(), Text(text="br"), TagCloseSelfclose(padding=""), Text(text="bar"), TemplateOpen(), Text(text="baz"), TemplateClose()]
  400. ---
  401. name: single_only_close
  402. label: a tag that can only be single; just a close tag
  403. input: "foo</br>bar{{baz}}"
  404. output: [Text(text="foo"), TagOpenOpen(invalid=True), Text(text="br"), TagCloseSelfclose(padding="", implicit=True), Text(text="bar"), TemplateOpen(), Text(text="baz"), TemplateClose()]
  405. ---
  406. name: single_only_double
  407. label: a tag that can only be single; a tag with backslashes at the beginning and end
  408. input: "foo</br/>bar{{baz}}"
  409. output: [Text(text="foo"), TagOpenOpen(invalid=True), Text(text="br"), TagCloseSelfclose(padding=""), Text(text="bar"), TemplateOpen(), Text(text="baz"), TemplateClose()]
  410. ---
  411. name: single_only_close_attribute
  412. label: a tag that can only be single; presented as a close tag with an attribute
  413. input: "</br id="break">"
  414. output: [TagOpenOpen(invalid=True), Text(text="br"), TagAttrStart(pad_first=" ", pad_after_eq="", pad_before_eq=""), Text(text="id"), TagAttrEquals(), TagAttrQuote(), Text(text="break"), TagCloseSelfclose(padding="", implicit=True)]
  415. ---
  416. name: capitalization
  417. label: caps should be ignored within tag names
  418. input: "<NoWiKi>{{test}}</nOwIkI>"
  419. output: [TagOpenOpen(), Text(text="NoWiKi"), TagCloseOpen(padding=""), Text(text="{{test}}"), TagOpenClose(), Text(text="nOwIkI"), TagCloseClose()]