jenkins-bot has submitted this change and it was merged. ( 
https://gerrit.wikimedia.org/r/355265 )

Change subject: Sync parserTests with core
......................................................................


Sync parserTests with core

Lots of new tests added to the blacklist from core commit
186a182a150f20475f0887cbc261d9be01dbfd98, which will be fixed
by the LanguageConverter support in Parsoid patch
https://gerrit.wikimedia.org/r/140235

One other change was made, to a Santizier test, in core commit
33e4ac5b220b0edbef6774b3d961a3313fbf76e9.  Parsoid never had the
bug which is being fixed there (<link> confused with <li>).

Change-Id: I5c61781149bb8e598ccd7b6664f63cc42a346a8c
---
M tests/parserTests-blacklist.js
M tests/parserTests.json
M tests/parserTests.txt
3 files changed, 447 insertions(+), 7 deletions(-)

Approvals:
  jenkins-bot: Verified
  Arlolra: Looks good to me, approved



diff --git a/tests/parserTests-blacklist.js b/tests/parserTests-blacklist.js
index e595334..6887613 100644
--- a/tests/parserTests-blacklist.js
+++ b/tests/parserTests-blacklist.js
@@ -115,6 +115,14 @@
 add("wt2html", "T8563: Section extraction for section suppressed by 
<includeonly>", "<meta typeof=\"mw:Includes/IncludeOnly\" 
data-parsoid='{\"src\":\"&lt;includeonly>\\n==Includeonly 
section==\\n&lt;/includeonly>\",\"dsr\":[0,52,null,null]}'/><meta 
typeof=\"mw:Includes/IncludeOnly/End\" 
data-parsoid='{\"src\":\"\",\"dsr\":[52,52,null,null]}'/>\n<h2 id=\"Section_1\" 
data-parsoid='{\"dsr\":[53,66,2,2]}'>Section 1</h2>");
 add("wt2html", "2. includeonly in html attr value", "<p 
data-parsoid='{\"dsr\":[0,155,0,0]}'><span id=\"v1\" about=\"#mwt1\" 
typeof=\"mw:ExpandedAttrs\" 
data-parsoid='{\"stx\":\"html\",\"a\":{\"id\":\"v1\"},\"sa\":{\"id\":\"&lt;noinclude>v1&lt;/noinclude>&lt;includeonly>v2&lt;/includeonly>\"},\"dsr\":[0,76,66,7]}'
 data-mw='{\"attribs\":[[{\"txt\":\"id\"},{\"html\":\"&lt;meta 
typeof=\\\"mw:Includes/NoInclude\\\" 
data-parsoid=&#39;{\\\"src\\\":\\\"&amp;lt;noinclude>\\\",\\\"dsr\\\":[10,21,null,null]}&#39;/>v1&lt;meta
 typeof=\\\"mw:Includes/NoInclude/End\\\" 
data-parsoid=&#39;{\\\"src\\\":\\\"&amp;lt;/noinclude>\\\",\\\"dsr\\\":[23,35,null,null]}&#39;/>&lt;meta
 typeof=\\\"mw:Includes/IncludeOnly\\\" 
data-parsoid=&#39;{\\\"src\\\":\\\"&amp;lt;includeonly>v2&amp;lt;/includeonly>\\\",\\\"dsr\\\":[35,64,null,null]}&#39;/>&lt;meta
 typeof=\\\"mw:Includes/IncludeOnly/End\\\" 
data-parsoid=&#39;{\\\"src\\\":\\\"\\\",\\\"dsr\\\":[64,64,null,null]}&#39;/>\"}]]}'>bar</span>\n<span
 id=\".22v1.22\" about=\"#mwt2\" typeof=\"mw:ExpandedAttrs\" 
data-parsoid='{\"stx\":\"html\",\"a\":{\"id\":\".22v1.22\"},\"sa\":{\"id\":\"&lt;noinclude>\\\"v1\\\"&lt;/noinclude>&lt;includeonly>\\\"v2\\\"&lt;/includeonly>\"},\"dsr\":[77,155,68,7]}'
 data-mw='{\"attribs\":[[{\"txt\":\"id\"},{\"html\":\"&lt;meta 
typeof=\\\"mw:Includes/NoInclude\\\" 
data-parsoid=&#39;{\\\"src\\\":\\\"&amp;lt;noinclude>\\\",\\\"dsr\\\":[86,97,null,null]}&#39;/>\\\"v1\\\"&lt;meta
 typeof=\\\"mw:Includes/NoInclude/End\\\" 
data-parsoid=&#39;{\\\"src\\\":\\\"&amp;lt;/noinclude>\\\",\\\"dsr\\\":[101,113,null,null]}&#39;/>&lt;meta
 typeof=\\\"mw:Includes/IncludeOnly\\\" 
data-parsoid=&#39;{\\\"src\\\":\\\"&amp;lt;includeonly>\\\\\\\"v2\\\\\\\"&amp;lt;/includeonly>\\\",\\\"dsr\\\":[113,144,null,null]}&#39;/>&lt;meta
 typeof=\\\"mw:Includes/IncludeOnly/End\\\" 
data-parsoid=&#39;{\\\"src\\\":\\\"\\\",\\\"dsr\\\":[144,144,null,null]}&#39;/>\"}]]}'>bar</span></p>");
 add("wt2html", "4. includeonly in table attributes", "<table 
data-parsoid='{\"dsr\":[0,77,2,2]}'>\n<tbody 
data-parsoid='{\"dsr\":[3,75,0,0]}'><tr about=\"#mwt1\" 
typeof=\"mw:ExpandedAttrs\" 
data-parsoid='{\"startTagSrc\":\"|-\",\"a\":{\"&lt;noinclude>\\n|-\\n|a\\n&lt;/noinclude>\":null},\"sa\":{\"&lt;noinclude>\\n|-\\n|a\\n&lt;/noinclude>\":\"\"},\"autoInsertedEnd\":true,\"dsr\":[3,36,33,0]}'
 data-mw='{\"attribs\":[[{\"txt\":\"a\",\"html\":\"&lt;meta 
typeof=\\\"mw:Includes/NoInclude\\\" 
data-parsoid=&#39;{\\\"src\\\":\\\"&amp;lt;noinclude>\\\",\\\"dsr\\\":[6,17,null,null]}&#39;/>\\n|-\\n|a\\n&lt;meta
 typeof=\\\"mw:Includes/NoInclude/End\\\" 
data-parsoid=&#39;{\\\"src\\\":\\\"&amp;lt;/noinclude>\\\",\\\"dsr\\\":[24,36,null,null]}&#39;/>\"},{\"html\":\"\"}]]}'></tr>\n<tr
 about=\"#mwt2\" typeof=\"mw:ExpandedAttrs\" 
data-parsoid='{\"startTagSrc\":\"|-\",\"a\":{\"&lt;includeonly>\\n|-\\n|b\\n&lt;/includeonly>\":null},\"sa\":{\"&lt;includeonly>\\n|-\\n|b\\n&lt;/includeonly>\":\"\"},\"autoInsertedEnd\":true,\"dsr\":[37,74,37,0]}'
 data-mw='{\"attribs\":[[{\"txt\":\"\",\"html\":\"&lt;meta 
typeof=\\\"mw:Includes/IncludeOnly\\\" 
data-parsoid=&#39;{\\\"src\\\":\\\"&amp;lt;includeonly>\\\\n|-\\\\n|b\\\\n&amp;lt;/includeonly>\\\",\\\"dsr\\\":[40,74,null,null]}&#39;/>&lt;meta
 typeof=\\\"mw:Includes/IncludeOnly/End\\\" 
data-parsoid=&#39;{\\\"src\\\":\\\"\\\",\\\"dsr\\\":[74,74,null,null]}&#39;/>\"},{\"html\":\"\"}]]}'></tr>\n</tbody></table>");
+add("wt2html", "Preprocessor precedence 3: language converter is rightmost 
opening", "<p about=\"#mwt1\" typeof=\"mw:Transclusion\" 
data-parsoid='{\"dsr\":[0,11,0,0],\"pi\":[[{\"k\":\"1\"}]]}' 
data-mw='{\"parts\":[{\"template\":{\"target\":{\"wt\":\"echo\",\"href\":\"./Template:Echo\"},\"params\":{\"1\":{\"wt\":\"hi\"}},\"i\":0}}]}'>hi</p>\n\n<p
 data-parsoid='{\"dsr\":[13,30,0,0]}'>{{-{R|echo|hi}}}-</p>\n\n<p 
data-parsoid='{\"dsr\":[32,45,0,0]}'>[[-{R|raw]]}-</p>");
+add("wt2html", "Preprocessor precedence 7: broken template is rightmost 
opening", "<p data-parsoid='{\"dsr\":[0,18,0,0]}'>[[Foo|{{echo|Bar]]</p>\n\n<p 
data-parsoid='{\"dsr\":[20,48,0,0]}'><a rel=\"mw:WikiLink\" href=\"./Foo\" 
title=\"Foo\" 
data-parsoid='{\"stx\":\"piped\",\"a\":{\"href\":\"./Foo\"},\"sa\":{\"href\":\"Foo\"},\"dsr\":[20,46,6,2]}'><span
 about=\"#mwt5\" typeof=\"mw:Transclusion\" 
data-parsoid='{\"pi\":[[{\"k\":\"1\"}]],\"dsr\":[26,42,null,null]}' 
data-mw='{\"parts\":[{\"template\":{\"target\":{\"wt\":\"echo\",\"href\":\"./Template:Echo\"},\"params\":{\"1\":{\"wt\":\"Bar]]-x\"}},\"i\":0}}]}'>Bar]]-x</span>-y</a>-z</p>\n\n<p
 data-parsoid='{\"dsr\":[50,128,0,0]}'>Careful: linktrails can move the end of 
the wikilink:\n<a rel=\"mw:WikiLink\" href=\"./Foo\" title=\"Foo\" 
data-parsoid='{\"stx\":\"piped\",\"a\":{\"href\":\"./Foo\"},\"sa\":{\"href\":\"Foo\"},\"dsr\":[104,128,6,3],\"tail\":\"l\"}'><span
 about=\"#mwt6\" typeof=\"mw:Transclusion\" 
data-parsoid='{\"pi\":[[{\"k\":\"1\"}]],\"dsr\":[110,124,null,null]}' 
data-mw='{\"parts\":[{\"template\":{\"target\":{\"wt\":\"echo\",\"href\":\"./Template:Echo\"},\"params\":{\"1\":{\"wt\":\"y&#39;]]a\"}},\"i\":0}}]}'>y']]a</span>ll</a></p>");
+add("wt2html", "Preprocessor precedence 10: groups of braces with leading 
dash", "<dl about=\"#mwt1\" typeof=\"mw:Transclusion\" 
data-parsoid='{\"dsr\":[0,52,null,null],\"pi\":[[{\"k\":\"1\"},{\"k\":\"2\"},{\"k\":\"3\"},{\"k\":\"4\"},{\"k\":\"5\"}]]}'
 data-mw='{\"parts\":[{\"template\":{\"target\":{\"wt\":\"Preprocessor 
precedence 
10\",\"href\":\"./Template:Preprocessor_precedence_10\"},\"params\":{\"1\":{\"wt\":\"Three\"},\"2\":{\"wt\":\"raw2\"},\"3\":{\"wt\":\"Bullet\"},\"4\":{\"wt\":\"1\"},\"5\":{\"wt\":\"2\"}},\"i\":0}}]}'><dt>1</dt><dd>
 -{R|raw}-</dd>\n<dt>2</dt><dd> -</dd></dl><ul about=\"#mwt1\"><li> 
Bar-</li></ul><span about=\"#mwt1\">\n</span><dl about=\"#mwt1\"><dt>3</dt><dd> 
-Three-</dd>\n<dt>4</dt><dd> -{raw2}-</dd>\n<dt>5</dt><dd> -</dd></dl><ul 
about=\"#mwt1\"><li> Bar-</li></ul><span about=\"#mwt1\">\n</span><dl 
about=\"#mwt1\"><dt>6</dt><dd> -Three-</dd>\n<dt>7</dt><dd> 
-{raw2}-</dd></dl>");
+add("wt2html", "Preprocessor precedence 11: found during visual diff testing", 
"<p data-parsoid='{\"dsr\":[0,40,0,0]}'><span about=\"#mwt1\" 
typeof=\"mw:Transclusion\" 
data-parsoid='{\"dsr\":[0,40,null,null],\"pi\":[[{\"k\":\"1\"}]]}' 
data-mw='{\"parts\":[{\"template\":{\"target\":{\"wt\":\"#tag:span\",\"function\":\"tag\"},\"params\":{\"1\":{\"wt\":\"-{{#tag:span|-{{echo|x}}}}\"}},\"i\":0}}]}'>-<span>-x</span></span></p>\n\n<p
 about=\"#mwt4\" typeof=\"mw:Transclusion\" 
data-parsoid='{\"dsr\":[42,72,0,0],\"pi\":[[{\"k\":\"1\"}]]}' 
data-mw='{\"parts\":[{\"template\":{\"target\":{\"wt\":\"echo\",\"href\":\"./Template:Echo\"},\"params\":{\"1\":{\"wt\":\"-{{echo|-{{echo|x}}}}\"}},\"i\":0}}]}'>--x</p>\n\n<p
 about=\"#mwt7\" typeof=\"mw:Transclusion\" 
data-parsoid='{\"dsr\":[74,94,0,0],\"pi\":[[{\"k\":\"1\"}]]}' 
data-mw='{\"parts\":[{\"template\":{\"target\":{\"wt\":\"echo\",\"href\":\"./Template:Echo\"},\"params\":{\"1\":{\"wt\":\"-{{echo|x}}\"}},\"i\":0}}]}'>-x</p>");
+add("wt2html", "Preprocessor precedence 12: broken language converter closed 
by brace.", "<p data-parsoid='{\"dsr\":[0,52,0,0]}'>This form breaks the 
template, which is unfortunate:</p>\n<ul 
data-parsoid='{\"dsr\":[53,76,0,0]}'><li data-parsoid='{\"dsr\":[53,76,1,0]}'> 
<span about=\"#mwt1\" typeof=\"mw:Transclusion\" 
data-parsoid='{\"pi\":[[{\"k\":\"1\"}]],\"dsr\":[55,76,null,null]}' 
data-mw='{\"parts\":[{\"template\":{\"target\":{\"wt\":\"echo\",\"href\":\"./Template:Echo\"},\"params\":{\"1\":{\"wt\":\"foo-{bar}bat\"}},\"i\":0}}]}'>foo-{bar}bat</span></li></ul>\n\n<p
 data-parsoid='{\"dsr\":[78,170,0,0]}'>But if the broken language converter 
markup is inside an extension\ntag, nothing bad happens:</p>\n<ul 
data-parsoid='{\"dsr\":[171,304,0,0]}'><li 
data-parsoid='{\"dsr\":[171,202,1,0]}'> <span typeof=\"mw:Nowiki\" 
data-parsoid='{\"dsr\":[173,202,8,9]}'>foo-{bar}bat</span></li>\n<li 
data-parsoid='{\"dsr\":[203,243,1,0]}'> <span typeof=\"mw:Transclusion 
mw:Nowiki\" about=\"#mwt4\" 
data-parsoid='{\"dsr\":[205,243,null,null],\"pi\":[[{\"k\":\"1\"}]]}' 
data-mw='{\"parts\":[{\"template\":{\"target\":{\"wt\":\"echo\",\"href\":\"./Template:Echo\"},\"params\":{\"1\":{\"wt\":\"&lt;nowiki>foo-{bar}bat&lt;/nowiki>\"}},\"i\":0}}]}'>foo-{bar}bat</span></li>\n<li
 data-parsoid='{\"dsr\":[244,269,1,0]}'> <pre typeof=\"mw:Extension/pre\" 
about=\"#mwt6\" data-parsoid='{\"stx\":\"html\",\"dsr\":[246,269,5,6]}' 
data-mw='{\"name\":\"pre\",\"attrs\":{},\"body\":{\"extsrc\":\"foo-{bar}bat\"}}'>foo-{bar}bat</pre></li>\n<li
 data-parsoid='{\"dsr\":[270,304,1,0]}'> <pre typeof=\"mw:Transclusion 
mw:Extension/pre\" about=\"#mwt8\" 
data-parsoid='{\"stx\":\"html\",\"dsr\":[272,304,null,null],\"pi\":[[{\"k\":\"1\"}]]}'
 
data-mw='{\"parts\":[{\"template\":{\"target\":{\"wt\":\"echo\",\"href\":\"./Template:Echo\"},\"params\":{\"1\":{\"wt\":\"&lt;pre>foo-{bar}bat&lt;/pre>\"}},\"i\":0}}]}'>foo-{bar}bat</pre></li></ul>\n\n<pre
 typeof=\"mw:Extension/tag\" about=\"#mwt11\" 
data-parsoid='{\"dsr\":[306,329,2,2]}' 
data-mw='{\"name\":\"tag\",\"attrs\":{},\"body\":{\"extsrc\":\"foo-{bar}bat\"}}'></pre>\n<pre
 typeof=\"mw:Extension/tag mw:Transclusion\" about=\"#mwt13\" 
data-parsoid='{\"pi\":[[{\"k\":\"1\"}]],\"dsr\":[330,362]}' 
data-mw='{\"parts\":[{\"template\":{\"target\":{\"wt\":\"echo\",\"href\":\"./Template:Echo\"},\"params\":{\"1\":{\"wt\":\"&lt;tag>foo-{bar}bat&lt;/tag>\"}},\"i\":0}}]}'></pre>\n");
+add("wt2html", "Preprocessor precedence, 13: broken language converter in 
external link", "<ul data-parsoid='{\"dsr\":[0,160,0,0]}'><li 
data-parsoid='{\"dsr\":[0,43,1,0]}'> <a rel=\"mw:ExtLink\" 
href=\"http://example.com/-{foo\"; 
data-parsoid='{\"targetOff\":28,\"contentOffsets\":[28,42],\"dsr\":[2,43,26,1]}'>Example
 in URL</a></li>\n<li data-parsoid='{\"dsr\":[44,97,1,0]}'> <a 
rel=\"mw:ExtLink\" href=\"http://example.com\"; 
data-parsoid='{\"targetOff\":66,\"contentOffsets\":[66,96],\"dsr\":[46,97,20,1]}'>Example
 in -{link} description</a></li>\n<li data-parsoid='{\"dsr\":[98,160,1,0]}'> <a 
rel=\"mw:ExtLink\" href=\"http://example.com/-{foo\"; about=\"#mwt1\" 
typeof=\"mw:Transclusion\" 
data-parsoid='{\"targetOff\":133,\"contentOffsets\":[133,157],\"dsr\":[100,160,null,null],\"pi\":[[{\"k\":\"1\"}]]}'
 
data-mw='{\"parts\":[{\"template\":{\"target\":{\"wt\":\"echo\",\"href\":\"./Template:Echo\"},\"params\":{\"1\":{\"wt\":\"[http://example.com/-{foo
 Breaks template, however]\"}},\"i\":0}}]}'>Breaks template, 
however</a></li></ul>");
+add("wt2html", "Preprocessor precedence, 14: broken language converter in 
comment", "<ul data-parsoid='{\"dsr\":[0,115,0,0]}'><li 
data-parsoid='{\"dsr\":[0,32,1,0]}'> <!--{{foo}}--> ...should be ok</li>\n<li 
data-parsoid='{\"dsr\":[33,66,1,0]}'> <!--&#x2D;{{foo}}--> ...extra 
dashes</li>\n<li data-parsoid='{\"dsr\":[67,115,1,0]}'> <span about=\"#mwt1\" 
typeof=\"mw:Transclusion\" 
data-parsoid='{\"pi\":[[{\"k\":\"1\"}]],\"dsr\":[69,99,null,null]}' 
data-mw='{\"parts\":[{\"template\":{\"target\":{\"wt\":\"echo\",\"href\":\"./Template:Echo\"},\"params\":{\"1\":{\"wt\":\"foo&lt;!--
 -{bar} -->bat\"}},\"i\":0}}]}'>foo</span><span about=\"#mwt1\"><!-- 
&#x2D;{bar} --></span><span about=\"#mwt1\">bat</span> ...should be 
ok</li></ul>");
+add("wt2html", "Preprocessor precedence, 15: broken brace markup in headings", 
"<meta property=\"mw:PageProp/notoc\" 
data-parsoid='{\"src\":\"__NOTOC__\",\"magicSrc\":\"__NOTOC__\",\"dsr\":[0,9,null,null]}'/>
 <meta property=\"mw:PageProp/noeditsection\" 
data-parsoid='{\"src\":\"__NOEDITSECTION__\",\"magicSrc\":\"__NOEDITSECTION__\",\"dsr\":[10,27,null,null]}'/>\n<h3
 id=\"1_foo.5Bbar_1\" data-parsoid='{\"dsr\":[28,45,3,3]}'>1 foo[bar 1</h3>\n<p 
data-parsoid='{\"dsr\":[46,47,0,0]}'>1</p>\n<h3 id=\"2_foo.5B.5Bbar_2\" 
data-parsoid='{\"dsr\":[48,66,3,3]}'>2 foo[[bar 2</h3>\n<p 
data-parsoid='{\"dsr\":[67,68,0,0]}'>2</p>\n<h3 id=\"3_foo.7Bbar_3\" 
data-parsoid='{\"dsr\":[69,86,3,3]}'>3 foo{bar 3</h3>\n<p 
data-parsoid='{\"dsr\":[87,88,0,0]}'>3</p>\n<h3 id=\"4_foo.7B.7Bbar_4\" 
data-parsoid='{\"dsr\":[89,107,3,3]}'>4 foo{{bar 4</h3>\n<p 
data-parsoid='{\"dsr\":[108,109,0,0]}'>4</p>\n<h3 id=\"5_foo.7B.7B.7Bbar_5\" 
data-parsoid='{\"dsr\":[110,129,3,3]}'>5 foo{{{bar 5</h3>\n<p 
data-parsoid='{\"dsr\":[130,131,0,0]}'>5</p>\n<h3 id=\"6_foo-.7Bbar_6\" 
data-parsoid='{\"dsr\":[132,150,3,3]}'>6 foo-{bar 6</h3>\n<p 
data-parsoid='{\"dsr\":[151,152,0,0]}'>6</p>");
 add("wt2html", "Templates: 2. Inside a block tag", "<div 
data-parsoid='{\"stx\":\"html\",\"dsr\":[0,23,5,6]}'><span about=\"#mwt1\" 
typeof=\"mw:Transclusion\" 
data-parsoid='{\"pi\":[[{\"k\":\"1\"}]],\"dsr\":[5,17,null,null]}' 
data-mw='{\"parts\":[{\"template\":{\"target\":{\"wt\":\"echo\",\"href\":\"./Template:Echo\"},\"params\":{\"1\":{\"wt\":\"Foo\"}},\"i\":0}}]}'>Foo</span></div>\n<blockquote
 data-parsoid='{\"stx\":\"html\",\"dsr\":[24,61,12,13]}'><span about=\"#mwt2\" 
typeof=\"mw:Transclusion\" 
data-parsoid='{\"pi\":[[{\"k\":\"1\"}]],\"dsr\":[36,48,null,null]}' 
data-mw='{\"parts\":[{\"template\":{\"target\":{\"wt\":\"echo\",\"href\":\"./Template:Echo\"},\"params\":{\"1\":{\"wt\":\"Foo\"}},\"i\":0}}]}'>Foo</span></blockquote>");
 add("wt2html", "Templates: HTML Tag: 2. Generation of HTML attr. value", "<div 
style=\"'color:red;'\" about=\"#mwt2\" typeof=\"mw:ExpandedAttrs\" 
data-parsoid='{\"stx\":\"html\",\"a\":{\"style\":\"&#39;color:red;&#39;\"},\"sa\":{\"style\":\"{{echo|&#39;color:red;&#39;}}\"},\"dsr\":[0,42,33,6]}'
 data-mw='{\"attribs\":[[{\"txt\":\"style\"},{\"html\":\"&lt;span 
about=\\\"#mwt1\\\" typeof=\\\"mw:Transclusion\\\" 
data-parsoid=&#39;{\\\"pi\\\":[[{\\\"k\\\":\\\"1\\\"}]],\\\"dsr\\\":[11,32,null,null]}&#39;
 
data-mw=&#39;{\\\"parts\\\":[{\\\"template\\\":{\\\"target\\\":{\\\"wt\\\":\\\"echo\\\",\\\"href\\\":\\\"./Template:Echo\\\"},\\\"params\\\":{\\\"1\\\":{\\\"wt\\\":\\\"&amp;#39;color:red;&amp;#39;\\\"}},\\\"i\\\":0}}]}&#39;>&#39;color:red;&#39;&lt;/span>\"}]]}'>foo</div>");
 add("wt2html", "Templates: HTML Tag: 3. Generation of HTML attr key and 
value", "<div style=\"'color:red;'\" about=\"#mwt3\" 
typeof=\"mw:ExpandedAttrs\" 
data-parsoid='{\"stx\":\"html\",\"a\":{\"style\":\"&#39;color:red;&#39;\"},\"sa\":{\"style\":\"{{echo|&#39;color:red;&#39;}}\"},\"dsr\":[0,51,42,6]}'
 data-mw='{\"attribs\":[[{\"txt\":\"style\",\"html\":\"&lt;span 
about=\\\"#mwt2\\\" typeof=\\\"mw:Transclusion\\\" 
data-parsoid=&#39;{\\\"pi\\\":[[{\\\"k\\\":\\\"1\\\"}]],\\\"dsr\\\":[5,19,null,null]}&#39;
 
data-mw=&#39;{\\\"parts\\\":[{\\\"template\\\":{\\\"target\\\":{\\\"wt\\\":\\\"echo\\\",\\\"href\\\":\\\"./Template:Echo\\\"},\\\"params\\\":{\\\"1\\\":{\\\"wt\\\":\\\"style\\\"}},\\\"i\\\":0}}]}&#39;>style&lt;/span>\"},{\"html\":\"&lt;span
 about=\\\"#mwt1\\\" typeof=\\\"mw:Transclusion\\\" 
data-parsoid=&#39;{\\\"pi\\\":[[{\\\"k\\\":\\\"1\\\"}]],\\\"dsr\\\":[20,41,null,null]}&#39;
 
data-mw=&#39;{\\\"parts\\\":[{\\\"template\\\":{\\\"target\\\":{\\\"wt\\\":\\\"echo\\\",\\\"href\\\":\\\"./Template:Echo\\\"},\\\"params\\\":{\\\"1\\\":{\\\"wt\\\":\\\"&amp;#39;color:red;&amp;#39;\\\"}},\\\"i\\\":0}}]}&#39;>&#39;color:red;&#39;&lt;/span>\"}]]}'>foo</div>");
@@ -202,6 +210,8 @@
 add("wt2html", "Partly disable title conversion if variant == main language 
code", "<p data-parsoid='{\"dsr\":[0,23,0,0]}'>-{T|zh-cn:CN;zh-tw:TW}-</p>");
 add("wt2html", "Partly disable title conversion if variant == main language 
code, more", "<p data-parsoid='{\"dsr\":[0,8,0,0]}'>-{T|TW}-</p>");
 add("wt2html", "Raw output of variant escape tags (R flag)", "<p 
data-parsoid='{\"dsr\":[0,32,0,0]}'>Raw: -{R|zh:China;zh-tw:Taiwan}-</p>");
+add("wt2html", "Nested markup inside raw output of variant escape tags (R 
flag)", "<p data-parsoid='{\"dsr\":[0,57,0,0]}'>Nested raw: -{R|nested 
-{zh:China;zh-tw:Taiwan}- nested}-</p>");
+add("wt2html", "Templates inside raw output of variant escape tags (R flag)", 
"<p data-parsoid='{\"dsr\":[0,46,0,0]}'>Nested raw: -{R|nested <span 
about=\"#mwt1\" typeof=\"mw:Transclusion\" 
data-parsoid='{\"pi\":[[{\"k\":\"1\"}]],\"dsr\":[23,34,null,null]}' 
data-mw='{\"parts\":[{\"template\":{\"target\":{\"wt\":\"echo\",\"href\":\"./Template:Echo\"},\"params\":{\"1\":{\"wt\":\"hi\"}},\"i\":0}}]}'>hi</span>
 templates}-</p>");
 add("wt2html", "Strings evaluating false shouldn't be ignored by Language 
converter (T51072)", "<p 
data-parsoid='{\"dsr\":[0,35,0,0]}'>-{zh-cn:0;zh-sg:1;zh-tw:2;zh-hk:3}-</p>");
 add("wt2html", "Conversion rules from [numeric-only string] to [something 
else] (T48634)", "<p 
data-parsoid='{\"dsr\":[0,95,0,0]}'>-{H|0=>zh-cn:B}--{H|0=>zh-cn:C;0=>zh-cn:D}--{H|0=>zh-hans:A}-012345-{A|zh-tw:0;zh-cn:E;}-012345</p>");
 add("wt2html", "Bidirectional converter rule entries with an empty value 
should be ignored (T53551)", "<p 
data-parsoid='{\"dsr\":[0,29,0,0]}'>-{H|zh-cn:foo;zh-tw:;}-foobar</p>");
@@ -288,6 +298,11 @@
 add("wt2wt", "T2553: link with two variables in a piped link", 
"{|\n|[[{{{1}}}<nowiki>|</nowiki>{{{2}}}]]\n|}");
 add("wt2wt", "Abort table cell attribute parsing on wikilink", "{|\n| testing 
[[one|two]]<nowiki> | three </nowiki>|| four\n| testing one two | three || 
four\n| testing=\"[[one|two]]<nowiki>\" | three </nowiki>|| four\n|}");
 add("wt2wt", "2. includeonly in html attr value", "<span 
id=\"<noinclude>v1</noinclude><includeonly>v2</includeonly>\">bar</span>\n<span 
id=\"<noinclude>&quot;v1&quot;</noinclude><includeonly>&quot;v2&quot;</includeonly>\">bar</span>\n");
+add("wt2wt", "Preprocessor precedence 1: link is rightmost opening", 
"<nowiki>{{</nowiki>[[Foo|<nowiki>bar}}</nowiki>]]\n\nBut close-brace is not a 
valid character in a link title:\n{{<nowiki>[[Foo}}|bar]]</nowiki>\n\nHowever, 
we can still tell this was handled as a link in the 
preprocessor:\n{{echo|[[Foo}}|bar]]|bat}}\n");
+add("wt2wt", "Preprocessor precedence 3: language converter is rightmost 
opening", 
"{{echo|hi}}\n\n<nowiki>{{-{R|echo|hi}}</nowiki>}-\n\n[[-{R|raw]]}-\n");
+add("wt2wt", "Preprocessor precedence 6: broken link is rightmost opening", 
"<nowiki>{{echo|[[Foo}}</nowiki>\n\n<nowiki>{{echo|[[Foo|bar|bat=baz}}</nowiki>\n");
+add("wt2wt", "Preprocessor precedence 7: broken template is rightmost 
opening", 
"<nowiki>[[Foo|{{echo|Bar]]</nowiki>\n\n[[Foo|{{echo|<nowiki>Bar]]-x</nowiki>}}-y]]-z\n\nCareful:
 linktrails can move the end of the 
wikilink:\n[[Foo|{{echo|<nowiki>y']]a</nowiki>}}l]]l\n");
+add("wt2wt", "Preprocessor precedence, 15: broken brace markup in headings", 
"__NOTOC__ __NOEDITSECTION__\n===1 foo[bar 1===\n1\n===2 foo[[bar 2===\n2\n===3 
foo{bar 3===\n3\n===<nowiki>4 foo{{bar 4</nowiki>===\n4\n===<nowiki>5 foo{{{bar 
5</nowiki>===\n5\n===6 foo-{bar 6===\n6\n");
 add("wt2wt", "1. Table tag in SOL posn. should get reparsed correctly with 
valid TSR", "{{echo|}}\n{| width=\"100%\"\n|foo\n|}");
 add("wt2wt", "Templates: HTML Tag: 2. Generation of HTML attr. value", "<div 
style=\"{{echo|'color:red;'}}\">foo</div>");
 add("wt2wt", "Templates: HTML Tag: 3. Generation of HTML attr key and value", 
"<div {{echo|style}}=\"{{echo|'color:red;'}}\">foo</div>");
@@ -416,6 +431,9 @@
 add("html2html", "Self-closed noinclude, includeonly, onlyinclude tags", "\n");
 add("html2html", "T8563: Section extraction for section shown by 
<includeonly>", "<p data-parsoid='{\"dsr\":[0,32,0,0]}'><span 
typeof=\"mw:Nowiki\" data-parsoid='{\"dsr\":[0,32,8,9]}'>==Section 
T-2==</span></p>");
 add("html2html", "T8563: Section extraction for section suppressed by 
<includeonly>", "<p data-parsoid='{\"dsr\":[0,30,0,0]}'><span 
typeof=\"mw:Nowiki\" data-parsoid='{\"dsr\":[0,30,8,9]}'>==Section 
1==</span></p>");
+add("html2html", "Preprocessor precedence 1: link is rightmost opening", "<p 
data-parsoid='{\"dsr\":[0,54,0,0]}'><span typeof=\"mw:Nowiki\" 
data-parsoid='{\"dsr\":[0,19,8,9]}'>{{</span><a rel=\"mw:WikiLink\" 
href=\"./Wiki/Foo\" title=\"Wiki/Foo\" 
data-parsoid='{\"stx\":\"piped\",\"a\":{\"href\":\"./Wiki/Foo\"},\"sa\":{\"href\":\"wiki/Foo\"},\"dsr\":[19,54,11,2]}'><span
 typeof=\"mw:Nowiki\" 
data-parsoid='{\"dsr\":[30,52,8,9]}'>bar}}</span></a></p>\n\n<p 
data-parsoid='{\"dsr\":[56,146,0,0]}'>But close-brace is not a valid character 
in a link title:\n{{<span typeof=\"mw:Nowiki\" 
data-parsoid='{\"dsr\":[116,146,8,9]}'>[[Foo}}|bar]]</span></p>\n\n<p 
data-parsoid='{\"dsr\":[148,253,0,0]}'>However, we can still tell this was 
handled as a link in the preprocessor:\n<span typeof=\"mw:Nowiki\" 
data-parsoid='{\"dsr\":[223,253,8,9]}'>[[Foo}}|bar]]</span></p>\n");
+add("html2html", "Preprocessor precedence 7: broken template is rightmost 
opening", "<p data-parsoid='{\"dsr\":[0,40,0,0]}'><a rel=\"mw:WikiLink\" 
href=\"./Wiki/Foo\" title=\"Wiki/Foo\" 
data-parsoid='{\"stx\":\"piped\",\"a\":{\"href\":\"./Wiki/Foo\"},\"sa\":{\"href\":\"wiki/Foo\"},\"dsr\":[0,40,11,2]}'><span
 typeof=\"mw:Nowiki\" 
data-parsoid='{\"dsr\":[11,38,8,9]}'>{{echo|Bar</span></a></p>\n\n<p 
data-parsoid='{\"dsr\":[42,66,0,0]}'><a rel=\"mw:WikiLink\" href=\"./Wiki/Foo\" 
title=\"Wiki/Foo\" 
data-parsoid='{\"stx\":\"piped\",\"a\":{\"href\":\"./Wiki/Foo\"},\"sa\":{\"href\":\"wiki/Foo\"},\"dsr\":[42,58,11,2]}'>Bar</a>-x-y]]-z</p>\n\n<p
 data-parsoid='{\"dsr\":[68,142,0,0]}'>Careful: linktrails can move the end of 
the wikilink:\n<a rel=\"mw:WikiLink\" href=\"./Wiki/Foo\" title=\"Wiki/Foo\" 
data-parsoid='{\"stx\":\"piped\",\"a\":{\"href\":\"./Wiki/Foo\"},\"sa\":{\"href\":\"wiki/Foo\"},\"dsr\":[122,139,11,2]}'>y'al</a>]]l</p>\n");
+add("html2html", "Preprocessor precedence 12: broken language converter closed 
by brace.", "<p data-parsoid='{\"dsr\":[0,52,0,0]}'>This form breaks the 
template, which is unfortunate:</p>\n\n<ul 
data-parsoid='{\"dsr\":[54,94,0,0]}'><li data-parsoid='{\"dsr\":[54,94,1,0]}'> 
<span typeof=\"mw:Nowiki\" 
data-parsoid='{\"dsr\":[56,94,8,9]}'>{{echo|foo-{bar}bat}}</span></li></ul>\n\n<p
 data-parsoid='{\"dsr\":[96,188,0,0]}'>But if the broken language converter 
markup is inside an extension tag, nothing bad happens:</p>\n\n<ul 
data-parsoid='{\"dsr\":[190,253,0,0]}'><li 
data-parsoid='{\"dsr\":[190,204,1,0]}'> foo-{bar}bat</li>\n<li 
data-parsoid='{\"dsr\":[205,219,1,0]}'> foo-{bar}bat</li>\n<li 
data-parsoid='{\"dsr\":[220,236,1,0]}'>  foo-{bar}bat </li>\n<li 
data-parsoid='{\"dsr\":[237,253,1,0]}'>  foo-{bar}bat </li></ul>\n\n<pre 
data-parsoid='{\"dsr\":[255,282,1,0]}'>'foo-{bar}bat'\narray (\n)</pre>\n\n<pre 
data-parsoid='{\"dsr\":[284,311,1,0]}'>'foo-{bar}bat'\narray (\n)</pre>\n");
 add("html2html", "Templates: Links: 1. Simple example", "<p 
data-parsoid='{\"dsr\":[0,16,0,0]}'><a rel=\"mw:WikiLink\" href=\"./Wiki/Foo\" 
title=\"Wiki/Foo\" 
data-parsoid='{\"stx\":\"piped\",\"a\":{\"href\":\"./Wiki/Foo\"},\"sa\":{\"href\":\"wiki/Foo\"},\"dsr\":[0,16,11,2]}'>bar</a></p>\n");
 add("html2html", "Templates: Links: 2. Generation of link href", "<p 
data-parsoid='{\"dsr\":[0,16,0,0]}'><a rel=\"mw:WikiLink\" href=\"./Wiki/Foo\" 
title=\"Wiki/Foo\" 
data-parsoid='{\"stx\":\"piped\",\"a\":{\"href\":\"./Wiki/Foo\"},\"sa\":{\"href\":\"wiki/Foo\"},\"dsr\":[0,16,11,2]}'>bar</a></p>\n");
 add("html2html", "Templates: Links: 3. Generation of part of a link href", "<p 
data-parsoid='{\"dsr\":[0,16,0,0]}'><a rel=\"mw:WikiLink\" href=\"./Wiki/Foo\" 
title=\"Wiki/Foo\" 
data-parsoid='{\"stx\":\"piped\",\"a\":{\"href\":\"./Wiki/Foo\"},\"sa\":{\"href\":\"wiki/Foo\"},\"dsr\":[0,16,11,2]}'>bar</a></p>\n\n<p
 
data-parsoid='{\"dsr\":[18,72,0,0]}'>[/index.php?title=Foobar&amp;action=edit&amp;redlink=1
 Foobar]</p>\n\n<p 
data-parsoid='{\"dsr\":[74,134,0,0]}'>[/index.php?title=Foobarbaz&amp;action=edit&amp;redlink=1
 Foobarbaz]</p>\n\n<p 
data-parsoid='{\"dsr\":[136,187,0,0]}'>[/index.php?title=Foobar&amp;action=edit&amp;redlink=1
 bar]</p>\n\n<p 
data-parsoid='{\"dsr\":[189,243,0,0]}'>[/index.php?title=Foobar&amp;action=edit&amp;redlink=1
 Foobar]</p>\n\n<p 
data-parsoid='{\"dsr\":[245,296,0,0]}'>[/index.php?title=Foobar&amp;action=edit&amp;redlink=1
 bar]</p>\n");
@@ -468,7 +486,7 @@
 add("html2html", "CSS line continuation 1", "<div style=\" \" 
data-parsoid='{\"stx\":\"html\",\"a\":{\"style\":\" \"},\"sa\":{\"style\":\"/* 
insecure input */\"},\"dsr\":[0,40,34,6]}'></div>\n");
 add("html2html", "CSS line continuation 2", "<div style=\" \" 
data-parsoid='{\"stx\":\"html\",\"a\":{\"style\":\" \"},\"sa\":{\"style\":\"/* 
invalid control char */\"},\"dsr\":[0,46,40,6]}'></div>\n");
 add("html2html", "Parser hook: nested tags", "<pre typeof=\"mw:Extension/tag\" 
about=\"#mwt3\" data-parsoid='{\"dsr\":[0,16,2,2]}' 
data-mw='{\"name\":\"tag\",\"attrs\":{},\"body\":{\"extsrc\":\"&lt;tag>\"}}'></pre><span
 typeof=\"mw:Nowiki\" data-parsoid='{\"dsr\":[16,39,8,9]}'>&lt;/tag></span>");
-add("html2html", "Sanitizer: Validating that <meta> and <link> work, but only 
for Microdata", "<div itemscope=\"\" 
data-parsoid='{\"stx\":\"html\",\"dsr\":[0,244,18,6]}'>\n\t<p 
data-parsoid='{\"dsr\":[20,141,0,0]}'>&lt;meta itemprop=\"hello\" 
content=\"world\" />\n\t&lt;meta http-equiv=\"refresh\" 
content=\"5\">\n\t&lt;meta itemprop=\"hello\" content=\"5\" /></p>\n\n\t<p 
data-parsoid='{\"dsr\":[144,237,0,0]}'><a rel=\"mw:ExtLink\" 
href=\"http://example.org\"; 
data-parsoid='{\"targetOff\":163,\"contentOffsets\":[163,163],\"dsr\":[144,164,19,1]}'></a>\n\t&lt;link
 rel=\"stylesheet\" href=\"http://example.org\";>\n\t<a rel=\"mw:ExtLink\" 
href=\"http://example.org\"; 
data-parsoid='{\"targetOff\":236,\"contentOffsets\":[236,236],\"dsr\":[217,237,19,1]}'></a></p>\n</div>\n");
+add("html2html", "Sanitizer: Validating that <meta> and <link> work, but only 
for Microdata", "<div itemscope=\"\" 
data-parsoid='{\"stx\":\"html\",\"dsr\":[0,244,18,6]}'>\n\t<p 
data-parsoid='{\"dsr\":[20,236,0,0]}'>&lt;meta itemprop=\"hello\" 
content=\"world\" />\n\t&lt;meta http-equiv=\"refresh\" 
content=\"5\">\n\t&lt;meta itemprop=\"hello\" content=\"5\" />\n\t<a 
rel=\"mw:ExtLink\" href=\"http://example.org\"; 
data-parsoid='{\"targetOff\":162,\"contentOffsets\":[162,162],\"dsr\":[143,163,19,1]}'></a>\n\t&lt;link
 rel=\"stylesheet\" href=\"http://example.org\";>\n\t<a rel=\"mw:ExtLink\" 
href=\"http://example.org\"; 
data-parsoid='{\"targetOff\":235,\"contentOffsets\":[235,235],\"dsr\":[216,236,19,1]}'></a></p>\n\n</div>\n");
 add("html2html", "HTML ordered list item with parameters oddity", "<ol 
data-parsoid='{\"dsr\":[0,5,0,0]}'><li data-parsoid='{\"dsr\":[0,5,1,0]}'> 
One</li></ol>\n");
 add("html2html", "Fuzz testing: Parser14", "<h2 id=\"onmouseover.3D\" 
data-parsoid='{\"dsr\":[0,18,2,2]}'> onmouseover= </h2>\n<p 
data-parsoid='{\"dsr\":[19,26,0,0]}'>http://</p>\n<div id=\"toc\" class=\"toc\" 
data-parsoid='{\"stx\":\"html\",\"dsr\":[27,218,26,6]}'>\n<div id=\"toctitle\" 
class=\"toctitle\" 
data-parsoid='{\"stx\":\"html\",\"dsr\":[54,112,36,6]}'>\n<h2 id=\"Contents\" 
data-parsoid='{\"dsr\":[91,105,2,2]}'> Contents </h2>\n</div>\n\n<ul 
data-parsoid='{\"dsr\":[114,210,0,0]}'><li 
data-parsoid='{\"dsr\":[114,210,1,0]}'> <a rel=\"mw:WikiLink\" 
href=\"./Main_Page#onmouseover.3D\" 
data-parsoid='{\"stx\":\"piped\",\"a\":{\"href\":\"./Main_Page#onmouseover.3D\"},\"sa\":{\"href\":\"#onmouseover.3D\"},\"dsr\":[116,210,18,2]}'><span
 class=\"tocnumber\" 
data-parsoid='{\"stx\":\"html\",\"dsr\":[134,166,24,7]}'>1</span> <span 
class=\"toctext\" 
data-parsoid='{\"stx\":\"html\",\"dsr\":[167,208,22,7]}'>onmouseover=</span></a></li></ul>\n\n</div>\n");
 add("html2html", "Special page transclusion", "<ul 
data-parsoid='{\"dsr\":[0,24,0,0]}'><li data-parsoid='{\"dsr\":[0,24,1,0]}'> <a 
rel=\"mw:WikiLink\" href=\"./Wiki/Xyzzyx\" title=\"Wiki/Xyzzyx\" 
data-parsoid='{\"stx\":\"piped\",\"a\":{\"href\":\"./Wiki/Xyzzyx\"},\"sa\":{\"href\":\"wiki/Xyzzyx\"},\"dsr\":[2,24,14,2]}'>Xyzzyx</a></li></ul>\n");
@@ -814,6 +832,20 @@
 add("html2wt", "2. includeonly in html attr value", "<span 
id=\"v1\">bar</span>\n<span id=\"v1\">bar</span>\n");
 add("html2wt", "3. includeonly in part of an attr value", "<span 
style=\"color:red;\">bar</span>\n");
 add("html2wt", "4. includeonly in table attributes", "{|\n|a\n|}\n");
+add("html2wt", "Preprocessor precedence 1: link is rightmost opening", 
"<nowiki>{{</nowiki>[[wiki/Foo|<nowiki>bar}}</nowiki>]]\n\nBut close-brace is 
not a valid character in a link 
title:\n{{<nowiki>[[Foo}}|bar]]</nowiki>\n\nHowever, we can still tell this was 
handled as a link in the preprocessor:\n<nowiki>[[Foo}}|bar]]</nowiki>\n");
+add("html2wt", "Preprocessor precedence 2: template is rightmost opening", 
"-foo}--\n");
+add("html2wt", "Preprocessor precedence 3: language converter is rightmost 
opening", "hi\n\n<nowiki>{{echo|hi}}</nowiki>\n\n<nowiki>[[raw]]</nowiki>\n");
+add("html2wt", "Preprocessor precedence 4: left-most angle bracket", "");
+add("html2wt", "Preprocessor precedence 5: tplarg takes precedence over 
template", "* Bar\n");
+add("html2wt", "Preprocessor precedence 6: broken link is rightmost opening", 
"<nowiki>{{echo|[[Foo}}</nowiki>\n\n<nowiki>{{echo|[[Foo|bar|bat=baz}}</nowiki>\n");
+add("html2wt", "Preprocessor precedence 7: broken template is rightmost 
opening", 
"[[wiki/Foo|<nowiki>{{echo|Bar</nowiki>]]\n\n[[wiki/Foo|Bar]]-x-y]]-z\n\nCareful:
 linktrails can move the end of the wikilink:\n[[wiki/Foo|y'al]]]]l\n");
+add("html2wt", "Preprocessor precedence 9: groups of braces", "; 4\n: 
{Four}\n; 5\n: \n* Bar\n; 6\n: Four\n; 7\n: {Bullet}\n");
+add("html2wt", "Preprocessor precedence 10: groups of braces with leading 
dash", "; 1\n: raw\n; 2\n: -\n* Bar-\n; 3\n: -Three-\n; 4\n: raw2\n; 5\n: -\n* 
Bar-\n; 6\n: -Three-\n; 7\n: raw2\n");
+add("html2wt", "Preprocessor precedence 11: found during visual diff testing", 
"<span>-<span>-x</span></span>\n\n--x\n\n-x\n");
+add("html2wt", "Preprocessor precedence 12: broken language converter closed 
by brace.", "This form breaks the template, which is unfortunate:\n\n* 
<nowiki>{{echo|foo-{bar}bat}}</nowiki>\n\nBut if the broken language converter 
markup is inside an extension tag, nothing bad happens:\n\n* foo-{bar}bat\n* 
foo-{bar}bat\n*  foo-{bar}bat \n*  foo-{bar}bat \n\n 'foo-{bar}bat'\n array (\n 
)\n\n 'foo-{bar}bat'\n array (\n )\n");
+add("html2wt", "Preprocessor precedence, 13: broken language converter in 
external link", "* [http://example.com/-{foo Example in URL]\n* 
[http://example.com Example in -{link} description]\n* 
<nowiki>{{echo|</nowiki>[http://example.com/-{foo Breaks template, 
however]<nowiki>}}</nowiki>\n");
+add("html2wt", "Preprocessor precedence, 14: broken language converter in 
comment", "* ...should be ok\n* ...extra dashes\n* foobat ...should be ok\n");
+add("html2wt", "Preprocessor precedence, 15: broken brace markup in headings", 
"=== 1 foo[bar 1 ===\n1\n\n=== 2 foo[[bar 2 ===\n2\n\n=== 3 foo{bar 3 
===\n3\n\n=== <nowiki>4 foo{{bar 4</nowiki> ===\n4\n\n=== <nowiki>5 foo{{{bar 
5</nowiki> ===\n5\n\n=== 6 foo-{bar 6 ===\n6\n");
 add("html2wt", "Templates: Template Name/Arg clash: 1. Use of positional 
param", "foo\n");
 add("html2wt", "Templates: Template Name/Arg clash: 2. Use of named param", 
"foo\n");
 add("html2wt", "Templates: Template Name/Arg clash: 3. Use of named param with 
empty input", "quote\n");
@@ -942,7 +974,7 @@
 add("html2wt", "Nested template calls", "(My parameter is: param)\n");
 add("html2wt", "Sanitizer: Closing of open tags", "<s></s>\n{|\n|}\n");
 add("html2wt", "Sanitizer: Closing of open but not closed tags", 
"<s>foo</s>\n");
-add("html2wt", "Sanitizer: Validating that <meta> and <link> work, but only 
for Microdata", "<div itemscope=\"\">\n\t<meta itemprop=\"hello\" 
content=\"world\" />\n\t<meta http-equiv=\"refresh\" content=\"5\">\n\t<meta 
itemprop=\"hello\" content=\"5\" />\n\n\t[http://example.org]\n\t<link 
rel=\"stylesheet\" 
href=\"http://example.org\";>\n\t[http://example.org]\n</div>\n");
+add("html2wt", "Sanitizer: Validating that <meta> and <link> work, but only 
for Microdata", "<div itemscope=\"\">\n\t<meta itemprop=\"hello\" 
content=\"world\" />\n\t<meta http-equiv=\"refresh\" content=\"5\">\n\t<meta 
itemprop=\"hello\" content=\"5\" />\n\t[http://example.org]\n\t<link 
rel=\"stylesheet\" 
href=\"http://example.org\";>\n\t[http://example.org]\n\n</div>\n");
 add("html2wt", "Language converter: output gets cut off unexpectedly (T7757)", 
"this bit is safe: }-\n\nbut if we add a conversion instance: xxx\n\nthen we 
get cut off here: }-\n\nall additional text is vanished\n");
 add("html2wt", "Self closed html pairs (T7487)", "<center><font 
id=\"bug\"></font>Centered text</center>\n<div><font id=\"bug2\"></font>In div 
text</div>");
 add("html2wt", "Punctuation: nbsp before exclamation", "C'est graveĀ !\n");
@@ -1024,6 +1056,8 @@
 add("html2wt", "Partly disable title conversion if variant == main language 
code", "ZH\n");
 add("html2wt", "Partly disable title conversion if variant == main language 
code, more", "ZH\n");
 add("html2wt", "Raw output of variant escape tags (R flag)", "Raw: 
zh:China;zh-tw:Taiwan\n");
+add("html2wt", "Nested markup inside raw output of variant escape tags (R 
flag)", "Nested raw: nested Taiwan nested\n");
+add("html2wt", "Templates inside raw output of variant escape tags (R flag)", 
"Nested raw: nested hi templates\n");
 add("html2wt", "Strings evaluating false shouldn't be ignored by Language 
converter (T51072)", "0\n");
 add("html2wt", "Conversion rules from [numeric-only string] to [something 
else] (T48634)", "D12345EE12345\n");
 add("html2wt", "Bidirectional converter rule entries with an empty value 
should be ignored (T53551)", "foobar\n");
@@ -1550,6 +1584,72 @@
 add("selser", "2. includeonly in html attr value [[4,2,[2]]]", 
"6pbenncdmszto6ryjc093xhn7xbhuxr\n<span 
id=<noinclude>\"v1\"</noinclude><includeonly>\"v2\"</includeonly>>k35cezvnuuymbo6rbar</span>");
 add("selser", "2. includeonly in html attr value [1]", "<span 
id=\"<noinclude>v1</noinclude><includeonly>v2</includeonly>\">bar</span>\n<span 
id=<noinclude>\"v1\"</noinclude><includeonly>\"v2\"</includeonly>>bar</span>");
 add("selser", "2. includeonly in html attr value [[3,0,0]]", "\n<span 
id=<noinclude>\"v1\"</noinclude><includeonly>\"v2\"</includeonly>>bar</span>");
+add("selser", "Preprocessor precedence 1: link is rightmost opening 
[[2,3],3,0,3,0]", "<nowiki>5x51vhp11yp3c8fr{{</nowiki>\n\nBut close-brace is 
not a valid character in a link title:\n{{[[Foo}}|bar]]\n\nHowever, we can 
still tell this was handled as a link in the 
preprocessor:\n{{echo|[[Foo}}|bar]]|bat}}");
+add("selser", "Preprocessor precedence 1: link is rightmost opening 
[2,0,[4],3,0]", 
"yv55io4dk4piizfr\n\n{{[[Foo|bar}}]]\n\ngop9s1t0yng919k9\n\nHowever, we can 
still tell this was handled as a link in the 
preprocessor:\n{{echo|[[Foo}}|bar]]|bat}}");
+add("selser", "Preprocessor precedence 1: link is rightmost opening 
[[0,[3]],0,2,3,1]", 
"<nowiki>{{</nowiki>[[Foo|<nowiki/>]]\n\nbe4aurss02cpu8fr\n\nBut close-brace is 
not a valid character in a link title:\n{{[[Foo}}|bar]]\n\nHowever, we can 
still tell this was handled as a link in the 
preprocessor:\n{{echo|[[Foo}}|bar]]|bat}}");
+add("selser", "Preprocessor precedence 1: link is rightmost opening 
[1,3,0,2,1]", "<nowiki>{{</nowiki>[[Foo|bar}}]]\n\nBut close-brace is not a 
valid character in a link 
title:\n{{[[Foo}}|bar]]\n\n5iuzjooswse5ewmi\n\nHowever, we can still tell this 
was handled as a link in the preprocessor:\n{{echo|[[Foo}}|bar]]|bat}}");
+add("selser", "Preprocessor precedence 1: link is rightmost opening 
[[4,[4]],2,0,0,3]", 
"0asx49kakgoxn7b9[[Foo|bxm226mzjqg833di]]\n\nyeq8audh7yv0wwmi\n\nBut 
close-brace is not a valid character in a link title:\n{{[[Foo}}|bar]]\n");
+add("selser", "Preprocessor precedence 1: link is rightmost opening 
[[0,[2]],2,2,4,3]", 
"<nowiki>{{</nowiki>[[Foo|<nowiki>7bx2qj30vfxyldibar}}</nowiki>]]\n\ni3ck683io4cuwhfr\n\n2bk1pyhwzcdz33di\n\nBut
 close-brace is not a valid character in a link 
title:\n{{[[Foo}}|bar]]\n\niyha6zs1mrt3xr\n");
+add("selser", "Preprocessor precedence 1: link is rightmost opening 
[1,3,0,4,3]", "<nowiki>{{</nowiki>[[Foo|bar}}]]\n\nBut close-brace is not a 
valid character in a link title:\n{{[[Foo}}|bar]]\n\n7davkk7pw4lpu8fr\n");
+add("selser", "Preprocessor precedence 1: link is rightmost opening 
[2,0,0,4,0]", "rtfszr70fg6kzkt9\n\n{{[[Foo|bar}}]]\n\nBut close-brace is not a 
valid character in a link title:\n{{[[Foo}}|bar]]\n\nhgrb06zj0grpb9\n\nHowever, 
we can still tell this was handled as a link in the 
preprocessor:\n{{echo|[[Foo}}|bar]]|bat}}");
+add("selser", "Preprocessor precedence 1: link is rightmost opening 
[[0,2],0,1,2,4]", "<nowiki>{{bw2p1n47eux9wwmi</nowiki>[[Foo|bar}}]]\n\nBut 
close-brace is not a valid character in a link 
title:\n{{<nowiki>[[Foo}}|bar]]</nowiki>\n\n3abgoa0n6d2t9\n\n6c1yb2qmck1n61or\n");
+add("selser", "Preprocessor precedence 1: link is rightmost opening 
[2,2,4,4,0]", 
"szqvfu39f18dj9k9\n\n{{[[Foo|bar}}]]\n\ng35u13uvv0ftj4i\n\nipp7qr6xtqs0dx6r\n\n9apeb93nqy6i529\n\nHowever,
 we can still tell this was handled as a link in the 
preprocessor:\n{{echo|[[Foo}}|bar]]|bat}}");
+add("selser", "Preprocessor precedence 1: link is rightmost opening 
[2,0,3,0,3]", "o88atqwa25tdquxr\n\n{{[[Foo|bar}}]]\n");
+add("selser", "Preprocessor precedence 1: link is rightmost opening 
[[3,[3]],2,0,3,0]", "[[Foo|<nowiki/>]]\n\n6qizjzpjtixdpldi\n\nBut close-brace 
is not a valid character in a link title:\n{{[[Foo}}|bar]]\n\nHowever, we can 
still tell this was handled as a link in the 
preprocessor:\n{{echo|[[Foo}}|bar]]|bat}}");
+add("selser", "Preprocessor precedence 1: link is rightmost opening 
[[3,1],3,0,0,4]", "[[Foo|<nowiki>bar}}</nowiki>]]\n\nBut close-brace is not a 
valid character in a link title:\n{{[[Foo}}|bar]]\n\nyy1buak9080bpgb9\n");
+add("selser", "Preprocessor precedence 1: link is rightmost opening 
[2,0,2,2,[2,0]]", 
"n2zsmdjvp5cul3di\n\n{{[[Foo|bar}}]]\n\nedq332zsqrsk0529\n\nBut close-brace is 
not a valid character in a link 
title:\n{{[[Foo}}|bar]]\n\ncvhwoyjhtnh4cxr\n\nhh6n5ql3kmaemiHowever, we can 
still tell this was handled as a link in the 
preprocessor:\n{{echo|[[Foo}}|bar]]|bat}}");
+add("selser", "Preprocessor precedence 3: language converter is rightmost 
opening [0,2,0,0,0]", 
"{{echo|hi}}\n\nva04f1gp68cnxw29\n\n{{-{R|echo|hi}}}-\n\n[[-{R|raw]]}-");
+add("selser", "Preprocessor precedence 3: language converter is rightmost 
opening [0,3,0,4,4]", 
"{{echo|hi}}\n\n{{-{R|echo|hi}}}-\n\nk3pwv1h8g7qa1yvi\n\nidkrll1su3kmaemi\n");
+add("selser", "Preprocessor precedence 3: language converter is rightmost 
opening [0,0,0,2,[3]]", 
"{{echo|hi}}\n\n{{-{R|echo|hi}}}-\n\namzr3fwi7nbz9f6r\n");
+add("selser", "Preprocessor precedence 3: language converter is rightmost 
opening [0,0,2,4,4]", 
"{{echo|hi}}\n\ngwp8q729p9tqpvi\n\n{{-{R|echo|hi}}}-\n\n4zbw3d8k476kzkt9\n\nver43507a7g2pgb9\n");
+add("selser", "Preprocessor precedence 3: language converter is rightmost 
opening [0,0,2,0,2]", 
"{{echo|hi}}\n\nf7nsj8vcses714i\n\n{{-{R|echo|hi}}}-\n\ni4km7dbzjm01kyb9\n\n[[-{R|raw]]}-");
+add("selser", "Preprocessor precedence 3: language converter is rightmost 
opening [0,4,2,0,2]", 
"{{echo|hi}}\n\nycktq3q4iusg7gb9\n\noke3c6rkyg8ehfr\n\n{{-{R|echo|hi}}}-\n\ny4kbzuv7hvuhxgvi\n\n[[-{R|raw]]}-");
+add("selser", "Preprocessor precedence 3: language converter is rightmost 
opening [0,3,2,0,[4]]", 
"{{echo|hi}}\n\nkbzyzyko463fecdi\n\n{{-{R|echo|hi}}}-\n\njbn15p5jvo647vi");
+add("selser", "Preprocessor precedence 3: language converter is rightmost 
opening [0,2,0,3,[3]]", 
"{{echo|hi}}\n\nrxecvsr74dlyds4i\n\n{{-{R|echo|hi}}}-\n");
+add("selser", "Preprocessor precedence 3: language converter is rightmost 
opening [0,0,0,0,4]", "{{echo|hi}}\n\n{{-{R|echo|hi}}}-\n\n0ber8ar2w7firudi\n");
+add("selser", "Preprocessor precedence 3: language converter is rightmost 
opening [0,3,2,2,[4]]", 
"{{echo|hi}}\n\nsfgdnrz9pjyycik9\n\n{{-{R|echo|hi}}}-\n\nmecss0mbq8flayvi\n\nuo7y8p8lkiwo2yb9");
+add("selser", "Preprocessor precedence 6: broken link is rightmost opening 
[0,0,3]", "{{echo|[[Foo}}\n");
+add("selser", "Preprocessor precedence 6: broken link is rightmost opening 
[0,3,0]", "{{echo|[[Foo}}\n\n{{echo|[[Foo|bar|bat=baz}}");
+add("selser", "Preprocessor precedence 6: broken link is rightmost opening 
[0,0,[3]]", "{{echo|[[Foo}}\n");
+add("selser", "Preprocessor precedence 6: broken link is rightmost opening 
[0,2,0]", "{{echo|[[Foo}}\n\n3s8fm3tqvqxs9k9\n\n{{echo|[[Foo|bar|bat=baz}}");
+add("selser", "Preprocessor precedence 6: broken link is rightmost opening 
[2,3,[2]]", 
"lhmyfomhbsm7vi\n\n{{echo|[[Foo}}\n\n<nowiki>f8cib7uwbx4j9k9{{echo|[[Foo|bar|bat=baz}}</nowiki>");
+add("selser", "Preprocessor precedence 6: broken link is rightmost opening 
[2,0,0]", "k8qbcipyxk7ta9k9\n\n{{echo|[[Foo}}\n\n{{echo|[[Foo|bar|bat=baz}}");
+add("selser", "Preprocessor precedence 6: broken link is rightmost opening 
[4,3,0]", "mp6b1ezl8c0g4x6r\n\n{{echo|[[Foo|bar|bat=baz}}");
+add("selser", "Preprocessor precedence 6: broken link is rightmost opening 
[2,2,3]", "m74xbbdndlgl23xr\n\n{{echo|[[Foo}}\n\nfvb31uh1grx561or\n");
+add("selser", "Preprocessor precedence 6: broken link is rightmost opening 
[2,3,[4]]", "rq5ttbrdxodbcsor\n\n{{echo|[[Foo}}\n\nevl77pvhks6k1emi");
+add("selser", "Preprocessor precedence 6: broken link is rightmost opening 
[4,0,0]", "z0bgoxxsfxb3mcxr\n\n{{echo|[[Foo|bar|bat=baz}}");
+add("selser", "Preprocessor precedence 7: broken template is rightmost opening 
[[4],3,2,0,1]", 
"edh58vxvkeobhuxr\n\n8e4a5i81nczkhuxr\n\n[[Foo|{{echo|Bar]]-x}}-y]]-z\n\nCareful:
 linktrails can move the end of the wikilink:\n[[Foo|{{echo|y']]a}}l]]l");
+add("selser", "Preprocessor precedence 7: broken template is rightmost opening 
[3,4,[2,3],0,3]", 
"jin3kku67cj9vn29\n\nqxvjam6pr3rz4cxr[[Foo|{{echo|Bar]]-x}}-y]]\n");
+add("selser", "Preprocessor precedence 7: broken template is rightmost opening 
[0,2,3,0,1]", "[[Foo|{{echo|Bar]]\n\n66hsi9jpyfd2t9\n\nCareful: linktrails can 
move the end of the wikilink:\n[[Foo|{{echo|y']]a}}l]]l");
+add("selser", "Preprocessor precedence 7: broken template is rightmost opening 
[3,2,2,4,[0,1]]", 
"z5nfl2usn24q85mi\n\no7oy7a7iz83hm2t9\n\n[[Foo|{{echo|Bar]]-x}}-y]]-z\n\nxeyy2l8w3nwgsyvi\n\nCareful:
 linktrails can move the end of the 
wikilink:\n[[Foo|{{echo|<nowiki>y']]a</nowiki>}}l]]l");
+add("selser", "Preprocessor precedence 7: broken template is rightmost opening 
[2,0,2,0,3]", 
"kys5ok5qi11qbyb9\n\n[[Foo|{{echo|Bar]]\n\nd2eeos4yk9t6s9k9\n\n[[Foo|{{echo|Bar]]-x}}-y]]-z\n");
+add("selser", "Preprocessor precedence 7: broken template is rightmost opening 
[0,0,4,3,0]", "[[Foo|{{echo|Bar]]\n\ndn50jx2qo512a9k9\n\nCareful: linktrails 
can move the end of the wikilink:\n[[Foo|{{echo|y']]a}}l]]l");
+add("selser", "Preprocessor precedence 7: broken template is rightmost opening 
[3,0,[[0,2],0],2,[4,1]]", 
"\n[[Foo|{{echo|Bar]]-x}}ynyv3ixaj2botj4i-y]]-z\n\nlx6kwc49fanyiudi\n\n2nevov39a1tw3ik9[[Foo|{{echo|<nowiki>y']]a</nowiki>}}l]]l");
+add("selser", "Preprocessor precedence 7: broken template is rightmost opening 
[1,0,[[0,4],0],3,2]", 
"<nowiki>[[Foo|{{echo|Bar]]</nowiki>\n\n[[Foo|{{echo|Bar]]-x}}3qlv3i114b249529]]-z\n\n3pklhxllsiiqw7b9\n\nCareful:
 linktrails can move the end of the wikilink:\n[[Foo|{{echo|y']]a}}l]]l");
+add("selser", "Preprocessor precedence 7: broken template is rightmost opening 
[0,2,[[0,2],2],0,1]", 
"[[Foo|{{echo|Bar]]\n\n215uh4vl7gory66r\n\n[[Foo|{{echo|<nowiki>Bar]]-x</nowiki>}}imi007dkolissjor-y]]1uh8c188rgzj8aor-z\n\nCareful:
 linktrails can move the end of the 
wikilink:\n[[Foo|{{echo|<nowiki>y']]a</nowiki>}}l]]l");
+add("selser", "Preprocessor precedence 7: broken template is rightmost opening 
[2,2,[[0,3],0],3,[4,1]]", 
"vynfc7n0bzlivn29\n\n[[Foo|{{echo|Bar]]\n\neor0mn90z3tprpb9\n\n[[Foo|{{echo|<nowiki>Bar]]-x</nowiki>}}]]-z\n\nya3il5w5s4d0lik9[[Foo|{{echo|<nowiki>y']]a</nowiki>}}l]]l");
+add("selser", "Preprocessor precedence 7: broken template is rightmost opening 
[1,3,2,3,1]", 
"<nowiki>[[Foo|{{echo|Bar]]</nowiki>\n\n7db51z58zuns714i\n\n[[Foo|{{echo|Bar]]-x}}-y]]-z\n\nCareful:
 linktrails can move the end of the wikilink:\n[[Foo|{{echo|y']]a}}l]]l");
+add("selser", "Preprocessor precedence 7: broken template is rightmost opening 
[4,0,2,0,[0,4]]", 
"r2fp677jkkyphkt9\n\nr72i2veqyg44pldi\n\n[[Foo|{{echo|Bar]]-x}}-y]]-z\n\nCareful:
 linktrails can move the end of the wikilink:\ngtaihg4vnvz08uxr\n");
+add("selser", "Preprocessor precedence 7: broken template is rightmost opening 
[1,3,2,0,3]", 
"<nowiki>[[Foo|{{echo|Bar]]</nowiki>\n\n38n6kfczp4g3nmi\n\n[[Foo|{{echo|Bar]]-x}}-y]]-z\n");
+add("selser", "Preprocessor precedence 7: broken template is rightmost opening 
[0,4,2,2,3]", 
"[[Foo|{{echo|Bar]]\n\na6f0ku7cztr19k9\n\nsmjrlr7ry60cc8fr\n\n[[Foo|{{echo|Bar]]-x}}-y]]-z\n\n2dr7kzl19bpgb9\n");
+add("selser", "Preprocessor precedence 7: broken template is rightmost opening 
[4,0,[2,0],0,2]", 
"yem8qk3jr8cfecdi\n\nudjlrn6ne14f5hfr[[Foo|{{echo|Bar]]-x}}-y]]-z\n\n49u57nhpztdibe29\n\nCareful:
 linktrails can move the end of the wikilink:\n[[Foo|{{echo|y']]a}}l]]l");
+add("selser", "Preprocessor precedence 7: broken template is rightmost opening 
[0,0,[4,0],0,3]", "[[Foo|{{echo|Bar]]\n\na97nh2udj8umcxr-z\n");
+add("selser", "Preprocessor precedence 7: broken template is rightmost opening 
[2,0,[[0,2],4],4,1]", 
"yfnjs6r4hs62yb9\n\n[[Foo|{{echo|Bar]]\n\n[[Foo|{{echo|Bar]]-x}}gctn314xxg30udi-y]]<nowiki/>e30pw3ehs93vj9k9\n\nda7imrq8f5abgldi\n\nCareful:
 linktrails can move the end of the 
wikilink:\n[[Foo|{{echo|<nowiki>y']]a</nowiki>}}l]]l");
+add("selser", "Preprocessor precedence, 15: broken brace markup in headings 
[1,3,2,2,0,3,[3],0,3,0,3,4,3,4,[2],2,2,4,[4],0,1,4,[3],0,0,4,1]", 
"__NOTOC__\n\n5uor98w6wfljif6r\n\n__NOEDITSECTION__\n\nrfqnvkh14509t3xr\n\n===1 
foo[bar 
1===\n\ndwfhbbsja5lv7vi\n\nvis9cncqlqcqsemi\n\ndknxgdgw56jhh0k93\n\nip6ipw6dhmnghkt9\n\n1gwj326dck1n61or\n\n===4
 foo{{bar 4===\n8mv6tp0zmloez5mi\n\nrt4kp29kv8wipb9\n===<nowiki>5 foo{{{bar 
5</nowiki>===\n5ae35cvzy8n0zfr\n\n===6 foo-{bar 6===\nzxgol9zcyhiod2t9\n\n6");
+add("selser", "Preprocessor precedence, 15: broken brace markup in headings 
[3,3,0,3,0,3,1,0,4,2,4,2,[2],2,[4],0,0,2,2,4,2,0,[4],3,[3],2,1]", 
"__NOEDITSECTION__\n===1 foo[bar 
1===\n1\nl8g5gsup1395dn29\n\nqwpsz89ajrf3whfr\n\nmoq1txayq5s714i\n\n7gjxzgm0nqni2j4i\n\n===fsk4d64bc1gfzuxr3
 foo{bar 3===\ns04spc17cfcx47vi\nee2y76eitd0io1or\n===4 foo{{bar 
4===\n1fwcj7vzgb40lik9\nei3qxn77g1n0cnmi\n\n4\n\na7p0g1max81zia4i\n\n2kk6wzqhg3a3jtt9\n\n===5
 foo{{{bar 5===\nqrhhqcqg6xg30udi\n===<nowiki/>===\nljngnw41y8jgu8fr\n6");
+add("selser", "Preprocessor precedence, 15: broken brace markup in headings 
[2,0,0,0,0,0,3,3,[2],0,2,2,4,3,[4],4,1,3,0,0,0,0,1,0,[2],3,1]", 
"yhf7qbrsdv3ac3di\n\n__NOTOC__ __NOEDITSECTION__\n===1 foo[bar 
1===\n===ho1830by92ievcxr2 foo[[bar 
2===\n9347i0rjpv81714i\n\n2\n\njtgrsajvqvtsatt9\n\ndby2kgs9dnxko6r\n\n66zkxdbnb445nrk9\n\n4spsb2q6qbm7k3xr\n\n===<nowiki>4
 foo{{bar 4</nowiki>===\n4\n===5 foo{{{bar 5===\n5\n===3dgmhf9b2xsqncdi6 
foo-{bar 6===\n6");
+add("selser", "Preprocessor precedence, 15: broken brace markup in headings 
[1,0,4,0,2,0,4,0,2,0,4,3,4,2,2,3,0,4,0,0,3,2,2,0,0,0,0]", "__NOTOC__ 
\n\n3j80xp6du35o2yb9\n\n06kn6ct5gh7zxgvi\n\n===1 foo[bar 
1===\nb1446nabveryhkt9\n\nix2l8aouejdims4i\n\n===2 foo[[bar 
2===\nzwsxpzx5rg5mte29\n\ndczxvpgyf52hjjor\n\nxdmbawdvk70t3xr\n\nl7i1pg78xr0pmn29\n\n3\n===4
 foo{{bar 
4===\ne3cso5k1yfaxxbt9\n\n4\n20texgim9yynwmi\n\n9nyg4vte71zto6r\n\n5\n===6 
foo-{bar 6===\n6");
+add("selser", "Preprocessor precedence, 15: broken brace markup in headings 
[0,0,0,3,1,0,4,3,0,0,0,3,[2],2,0,0,[2],3,4,0,0,4,3,4,4,0,2]", "__NOTOC__ 
__NOEDITSECTION__\n===1 foo[bar 1===\nl8yfup101thuxr\n\n===2 foo[[bar 
2===\n2\n===0r08vub7zvbzkt93 foo{bar 
3===\nomxifso8n96647vi\n3\n===<nowiki>3lvg2w8sdk21emi4 foo{{bar 
4</nowiki>===\nvk8h1yaky81o47vi\n\n===5 foo{{{bar 
5===\nlsh7qm7rg8hbyb9\n\nc5j9cfw8i1xrms4i\n\nukw1p5u6e0t138fr\n8xociq7beh0ssjor\n\n6");
+add("selser", "Preprocessor precedence, 15: broken brace markup in headings 
[0,4,2,0,1,2,2,0,1,3,0,0,2,0,3,0,[3],0,0,0,0,3,[2],4,[3],0,[3]]", 
"__NOTOC__\n\n1050drzdzq8bbj4i\n\n0c5nom553lrkvs4i\n\n__NOEDITSECTION__\n===1 
foo[bar 1===\nprgxl7f7ezdgf1or\nod3aj6zcq7kz9f6r\n\n1\n===2 foo[[bar 
2===\n2\n0sqgoe1s6475vcxr\n\n===3 foo{bar 3===\n\n===<nowiki/>===\n4\n===5 
foo{{{bar 5===\nk2dkeo1cy4cjif6r5\n\np3t3ce6t3v2w3ik9\n\n===<nowiki/>===\n");
+add("selser", "Preprocessor precedence, 15: broken brace markup in headings 
[3,0,0,3,2,4,0,0,[2],0,[3],2,2,0,2,2,4,0,1,4,0,0,4,2,4,0,0]", " 
__NOEDITSECTION__\n\nphyiwbj9o7k6s9k9\n\n===1 foo[bar 
1===\npv84tthxd1qt1emi\n\n1\n===cdjiqvhb3dzsq0k92 foo[[bar 
2===\n\nhvna4hx8vz4ims4i\n\n8emi3zjjx5qoxbt9\n\n===3 foo{bar 
3===\n2ze1cac167kwewmi\n\n3\n\nmmyunjby2hfzjjor\n\ndbfz8zdt3k81tt9\n\n4\n\nhbn6q2uxggddvx6r\n\n===5
 foo{{{bar 5===\njziu8kulus7nwmi\n\nqcyvzzgm42a10pb9\n\n0j01ch835769lik9\n\n6");
+add("selser", "Preprocessor precedence, 15: broken brace markup in headings 
[0,0,0,2,1,3,0,0,0,2,0,2,0,0,2,2,0,0,3,4,0,3,0,4,[2],0,3]", "__NOTOC__ 
__NOEDITSECTION__\n\ndea071l7z8q9qkt9\n\n===1 foo[bar 1===\n1\n===2 foo[[bar 
2===\n7203votl66layvi\n2\n\ni4rz95rxxyeyu8fr\n\n===3 foo{bar 
3===\nbqmc00xydmsa714i\n\n3\n\n94qlidk2tfrh33di\n\n===4 foo{{bar 
4===\nin7ld8bj5fmyrpb9\n\n===5 foo{{{bar 
5===\n5\n\n1ecq8jgmxc9mgqfr\n\n===tkiibalmu8up7gb96 foo-{bar 6===\n");
+add("selser", "Preprocessor precedence, 15: broken brace markup in headings 
[0,0,1,0,0,0,0,2,[3],0,2,0,2,2,[2],4,0,0,0,3,3,0,0,4,0,0,[4]]", "__NOTOC__ 
__NOEDITSECTION__\n===1 foo[bar 
1===\n1\n\n4wm0lpl7kk4t2o6r\n\n===<nowiki/>===\nf7gc7ocvykl0udi\n\n2\n\nhav9i750xpa2a9k9\n\n===3
 foo{bar 3===\nrxgohr7xrlpojemi\n6tlivosf4h4obt93\n\n7gyys1jrsbn019k9\n\n===4 
foo{{bar 4===\n4\n\n5\n\ndipv7we9er9kke29\n\n===6 foo-{bar 
6===\n45eyc9hdq7fzuxr");
+add("selser", "Preprocessor precedence, 15: broken brace markup in headings 
[0,3,0,3,0,0,3,0,1,3,0,0,[3],3,4,0,0,2,2,4,4,4,[4],0,[2],0,4]", 
"__NOTOC____NOEDITSECTION__\n===1 foo[bar 1===\n\n===2 foo[[bar 
2===\n2\n===<nowiki/>===\nf0gy9tkl4jbp4x6r\n\n===4 foo{{bar 
4===\npm87dbq4tufpqfr\njt8dmtwvwwylow29\n\n4\n\n86yk5xfylgpbvs4i\n\n4lroxj6y6s3v7vi\n\nv0livumcujo47vi\n\njrd2g4mg0hwa5rk9\n===49rxxolzt30afw296
 foo-{bar 6===\njx9o28c1ml1munmi\n");
+add("selser", "Preprocessor precedence, 15: broken brace markup in headings 
[3,4,0,0,2,0,0,0,0,0,0,0,2,4,4,3,1,0,4,2,0,0,1,2,2,2,0]", 
"mhem5jjtdzkw3ik9\n\n__NOEDITSECTION__\n\nou05e6mmasoo5hfr\n\n===1 foo[bar 
1===\n1\n===2 foo[[bar 2===\n2\n\nvt9cvmjcfke7y14i\n\n===3 foo{bar 
3===\nogxobf52rydb1emi\n\nabvml8s8pgjsjor\n\n===<nowiki>4 foo{{bar 
4</nowiki>===\neucz56asipidaemi\n\nu5me7ss5tsc92j4i\n\n===5 foo{{{bar 
5===\n5\n\nh2n0itkhisgfzuxr\n\n2zmb3pe5s960f6r\n\n===6 foo-{bar 
6===\nkpd2wt4izgn1att9\n6");
+add("selser", "Preprocessor precedence, 15: broken brace markup in headings 
[0,0,0,0,2,4,1,2,[4],0,2,4,4,2,2,2,0,4,[2],3,[4],0,0,0,1,3,0]", "__NOTOC__ 
__NOEDITSECTION__\n\n3lml5l0ffajor\n\n===1 foo[bar 
1===\nps695r2lvt8d7vi\n\n1\n\n6di8qnsukhb0529\n\n===7hpaygrsve7b9===\nsj2h0dupqzi79zfr\n\n2\n\nahcf6hmhsnp9o1or\n\nmmj0s7p5z53a0pb9\n\nn16761lrku6gk3xr\n\nc07wsubbj7pbvs4i\n\n3\n\ntfmi59i9pi6vquxr\n\n===4
 foo{{bar 
4===\nqybbayd15ekit3xr\n\nnyeyql867eukgldi4\n===2zkwj58waikvs4i===\n5\n===6 
foo-{bar 6===\n6");
+add("selser", "Preprocessor precedence, 15: broken brace markup in headings 
[4,2,0,3,1,0,0,0,0,0,3,0,2,3,[2],4,3,2,[4],0,0,4,0,2,3,0,4]", 
"noebq35loutedn29\n\nzr4nim02czg833di \n\n__NOEDITSECTION__\n===1 foo[bar 
1===\n1\n===2 foo[[bar 2===\n\n7i78pm3o291f9a4i\n\n===3 foo{bar 
3===\nc88rnazfv866flxr3\n\nxgsqfrrutx2edn29\n\nshkroli4nytit3xr\nfhekhofk6vnasjor\n===5
 foo{{{bar 
5===\nnbhsr6hga1kmx6r\n\n5\n\n1vsgh3y51rqhyqfr\n\n0xlldh6fwe6a8aor\n");
+add("selser", "Preprocessor precedence, 15: broken brace markup in headings 
[4,2,0,0,0,3,2,3,2,4,2,0,4,4,[2],0,0,3,0,0,0,0,4,3,3,0,[3]]", 
"k0xun6iy919k9\n\nt95dbzfr8t5oecdi \n\n__NOEDITSECTION__\n===1 foo[bar 
1===\nsea9fmelzg1oflxr\n\n1\n\n9550jhvdg1cbx1or\n\n===2 foo[[bar 
2===\ng2zjhur8u3bd42t9\n\n9azh69qskrjrwwmi\n\n2\n6aykxdwp2a5ah5mi\n\njcyu5xcay49ozuxr\n\nexxxe57wqo7p66r3\n===4
 foo{{bar 4===\n4\n===5 foo{{{bar 5===\n0a4dxfha26vtpgb9\n");
+add("selser", "Preprocessor precedence, 15: broken brace markup in headings 
[0,4,3,2,0,0,[3],0,0,2,[3],4,3,0,1,0,0,3,[3],0,1,2,0,4,4,0,0]", 
"__NOTOC__\n\ne4sdf53wat2wqaor\n\n4rf79s1kox9od2t9\n\n===1 foo[bar 1===\n\n===2 
foo[[bar 2===\nu6bu02g5z9w9udi\n\ntq6zuoftl9dx6r\n\n3\n===4 foo{{bar 
4===\n===<nowiki>5 foo{{{bar 
5</nowiki>===\nxzk6i81ir78k6gvi\n5\n\n5605r76ztdoq1tt9\n\nf3vse8od3e2n8kt9\n\n6");
 add("selser", "1. Table tag in SOL posn. should get reparsed correctly with 
valid TSR [0,[0,3]]", "{{echo|}}{| width = '100%'\n|}");
 add("selser", "1. Table tag in SOL posn. should get reparsed correctly with 
valid TSR [0,[0,[0,2]]]", "{{echo|}}{| width = 
'100%'\n|foo<!--7w2da44bn7idaemi-->\n|}");
 add("selser", "1. Table tag in SOL posn. should get reparsed correctly with 
valid TSR [0,1]", "{{echo|}}{| width=\"100%\" 
data-foobar=\"t98xv1gnmkhp8pvi\"\n|foo\n|}");
diff --git a/tests/parserTests.json b/tests/parserTests.json
index 3e11b75..c281459 100644
--- a/tests/parserTests.json
+++ b/tests/parserTests.json
@@ -2,8 +2,8 @@
        "parserTests.txt": {
                "repo": "/wikimedia/mediawiki/",
                "path": "tests/parser/parserTests.txt",
-               "expectedSHA1": "ce0665cff572231b0a7d5cae5ef280a4322a6377",
-               "latestCommit": "f9de807e28c5194ef4e2ddbcf31375041816fab6"
+               "expectedSHA1": "602e38c02173fda03fb799c15016b20004a708be",
+               "latestCommit": "b9280829efcb8c842b8e096e420117275cde1a45"
        },
        "citeParserTests.txt": {
                "repo": "/wikimedia/mediawiki-extensions-Cite/",
diff --git a/tests/parserTests.txt b/tests/parserTests.txt
index c2054bd..69fee30 100644
--- a/tests/parserTests.txt
+++ b/tests/parserTests.txt
@@ -11856,6 +11856,326 @@
 !!end
 
 ###
+### Preprocessor precedence tests
+### See: https://www.mediawiki.org/wiki/Preprocessor_ABNF
+###
+##{{[[-{{{{{{[[Foo|bar}}]]}-}}}}}]]
+!! test
+Preprocessor precedence 1: link is rightmost opening
+!! wikitext
+{{[[Foo|bar}}]]
+
+But close-brace is not a valid character in a link title:
+{{[[Foo}}|bar]]
+
+However, we can still tell this was handled as a link in the preprocessor:
+{{echo|[[Foo}}|bar]]|bat}}
+!! html
+<p>{{<a href="/wiki/Foo" title="Foo">bar}}</a>
+</p><p>But close-brace is not a valid character in a link title:
+{{[[Foo}}|bar]]
+</p><p>However, we can still tell this was handled as a link in the 
preprocessor:
+[[Foo}}|bar]]
+</p>
+!! end
+
+!! test
+Preprocessor precedence 2: template is rightmost opening
+!! options
+language=zh
+!! wikitext
+-{{echo|foo}-}}-
+!! html
+<p>-foo}--
+</p>
+!! end
+
+!! test
+Preprocessor precedence 3: language converter is rightmost opening
+!! options
+language=zh
+!! wikitext
+{{echo|hi}}
+
+{{-{R|echo|hi}}}-
+
+[[-{R|raw]]}-
+!! html
+<p>hi
+</p><p>{{echo|hi}}
+</p><p>[[raw]]
+</p>
+!! end
+
+!! test
+Preprocessor precedence 4: left-most angle bracket
+!! options
+language=zh
+!! wikitext
+<!--{raw}-->
+!! html
+!! end
+
+!! article
+Template:Precedence5
+!! text
+{{{{{1}}}}}
+!! endarticle
+
+!! test
+Preprocessor precedence 5: tplarg takes precedence over template
+!! wikitext
+{{Precedence5|Bullet}}
+!! html
+<ul><li> Bar</li></ul>
+
+!! end
+
+!! test
+Preprocessor precedence 6: broken link is rightmost opening
+!! wikitext
+{{echo|[[Foo}}
+
+{{echo|[[Foo|bar|bat=baz}}
+!! html
+<p>{{echo|[[Foo}}
+</p><p>{{echo|[[Foo|bar|bat=baz}}
+</p>
+!! end
+
+# This next test exposes a difference between PHP and Parsoid:
+# Given [[Foo|{{echo|Bar]]x}}y]]z:
+# 1) Both PHP and Parsoid ignore the `]]` inside the `echo` in the
+# "preprocessor" stage.  The `{{echo` extends until the `x}}`, and the
+# outer `[[Foo` extends until the `y]]`
+# 2a) But then the PHP preprocessor emits `[[Foo|Bar]]xy]]z` as an
+# intermediate result (after template expansion), and link processing
+# happens on this intermediate result, which moves the wikilink
+# boundary leftward to `[[Foo|Bar]]`
+# 2b) Parsoid works in a single step, so it's going to keep the
+# wikilink as extending to the `y]]`
+# 3a) Then PHP does linktrail processing which slurps up the trailing
+# `xy` inside the link.
+# 3b) Parsoid will do linktrail processing to slurp up the trailing
+# `z` inside the link.
+# This is "correct" behavior.  Parsoid's basic worldview is that the
+# `]]` inside the template shouldn't be allowed to leak out to affect
+# the surrounding wikilink.  PHP may match Parsoid (in the future)
+# if you use {{#balance}} (T114445).
+
+!! test
+Preprocessor precedence 7: broken template is rightmost opening
+!! wikitext
+[[Foo|{{echo|Bar]]
+
+[[Foo|{{echo|Bar]]-x}}-y]]-z
+
+Careful: linktrails can move the end of the wikilink:
+[[Foo|{{echo|y']]a}}l]]l
+!! html
+<p><a href="/wiki/Foo" title="Foo">{{echo|Bar</a>
+</p><p><a href="/wiki/Foo" title="Foo">Bar</a>-x-y]]-z
+</p><p>Careful: linktrails can move the end of the wikilink:
+<a href="/wiki/Foo" title="Foo">y'al</a>]]l
+</p>
+!! end
+
+!! test
+Preprocessor precedence 8: broken language converter is rightmost opening
+!! options
+language=zh
+!! wikitext
+[[Foo-{R|raw]]
+!! html
+<p>[[Foo-{R|raw]]
+</p>
+!! end
+
+!! article
+Template:Preprocessor_precedence_9
+!! text
+;4: {{{{1}}}}
+;5: {{{{{2}}}}}
+;6: {{{{{{3}}}}}}
+;7: {{{{{{{4}}}}}}}
+!! endarticle
+
+!! test
+Preprocessor precedence 9: groups of braces
+!! wikitext
+{{Preprocessor precedence 9|Four|Bullet|1|2}}
+!! html
+<dl><dt>4</dt>
+<dd> {Four}</dd>
+<dt>5</dt>
+<dd> </dd></dl>
+<ul><li> Bar</li></ul>
+<dl><dt>6</dt>
+<dd> Four</dd>
+<dt>7</dt>
+<dd> {Bullet}</dd></dl>
+
+!! end
+
+!! article
+Template:Preprocessor_precedence_10
+!! text
+;1: -{R|raw}-
+;2: -{{Bullet}}-
+;3: -{{{1}}}-
+;4: -{{{{2}}}}-
+;5: -{{{{{3}}}}}-
+;6: -{{{{{{4}}}}}}-
+;7: -{{{{{{{5}}}}}}}-
+!! endarticle
+
+!! test
+Preprocessor precedence 10: groups of braces with leading dash
+!! options
+language=zh
+!! wikitext
+{{Preprocessor precedence 10|Three|raw2|Bullet|1|2}}
+!! html
+<dl><dt>1</dt>
+<dd> raw</dd>
+<dt>2</dt>
+<dd> -</dd></dl>
+<ul><li> Bar-</li></ul>
+<dl><dt>3</dt>
+<dd> -Three-</dd>
+<dt>4</dt>
+<dd> raw2</dd>
+<dt>5</dt>
+<dd> -</dd></dl>
+<ul><li> Bar-</li></ul>
+<dl><dt>6</dt>
+<dd> -Three-</dd>
+<dt>7</dt>
+<dd> raw2</dd></dl>
+
+!! end
+
+!! test
+Preprocessor precedence 11: found during visual diff testing
+!! wikitext
+{{#tag:span|-{{#tag:span|-{{echo|x}}}}}}
+
+{{echo|-{{echo|-{{echo|x}}}}}}
+
+{{echo|-{{echo|x}}}}
+!! html
+<p><span>-<span>-x</span></span>
+</p><p>--x
+</p><p>-x
+</p>
+!! end
+
+!! test
+Preprocessor precedence 12: broken language converter closed by brace.
+!! wikitext
+This form breaks the template, which is unfortunate:
+* {{echo|foo-{bar}bat}}
+
+But if the broken language converter markup is inside an extension
+tag, nothing bad happens:
+* <nowiki>foo-{bar}bat</nowiki>
+* {{echo|<nowiki>foo-{bar}bat</nowiki>}}
+* <pre>foo-{bar}bat</pre>
+* {{echo|<pre>foo-{bar}bat</pre>}}
+
+<tag>foo-{bar}bat</tag>
+{{echo|<tag>foo-{bar}bat</tag>}}
+
+!! html+tidy
+<p>This form breaks the template, which is unfortunate:</p>
+<ul>
+<li>{{echo|foo-{bar}bat}}</li>
+</ul>
+<p>But if the broken language converter markup is inside an extension tag, 
nothing bad happens:</p>
+<ul>
+<li>foo-{bar}bat</li>
+<li>foo-{bar}bat</li>
+<li>
+<pre>
+foo-{bar}bat
+</pre></li>
+<li>
+<pre>
+foo-{bar}bat
+</pre></li>
+</ul>
+<pre>
+'foo-{bar}bat'
+array (
+)
+</pre>
+<pre>
+'foo-{bar}bat'
+array (
+)
+</pre>
+!! end
+
+!! test
+Preprocessor precedence, 13: broken language converter in external link
+!! wikitext
+* [http://example.com/-{foo Example in URL]
+* [http://example.com Example in -{link} description]
+* {{echo|[http://example.com/-{foo Breaks template, however]}}
+!! html+tidy
+<ul>
+<li><a rel="nofollow" class="external text" 
href="http://example.com/-{foo";>Example in URL</a></li>
+<li><a rel="nofollow" class="external text" href="http://example.com";>Example 
in -{link} description</a></li>
+<li>{{echo|<a rel="nofollow" class="external text" 
href="http://example.com/-{foo";>Breaks template, however</a>}}</li>
+</ul>
+!! end
+
+!! test
+Preprocessor precedence, 14: broken language converter in comment
+!! wikitext
+* <!--{{foo}}--> ...should be ok
+* <!---{{foo}}--> ...extra dashes
+* {{echo|foo<!-- -{bar} -->bat}} ...should be ok
+!! html+tidy
+<ul>
+<li>...should be ok</li>
+<li>...extra dashes</li>
+<li>foobat ...should be ok</li>
+</ul>
+!! end
+
+!! test
+Preprocessor precedence, 15: broken brace markup in headings
+!! wikitext
+__NOTOC__ __NOEDITSECTION__
+===1 foo[bar 1===
+1
+===2 foo[[bar 2===
+2
+===3 foo{bar 3===
+3
+===4 foo{{bar 4===
+4
+===5 foo{{{bar 5===
+5
+===6 foo-{bar 6===
+6
+!! html+tidy
+<h3><span class="mw-headline" id="1_foo.5Bbar_1">1 foo[bar 1</span></h3>
+<p>1</p>
+<h3><span class="mw-headline" id="2_foo.5B.5Bbar_2">2 foo[[bar 2</span></h3>
+<p>2</p>
+<h3><span class="mw-headline" id="3_foo.7Bbar_3">3 foo{bar 3</span></h3>
+<p>3</p>
+<h3><span class="mw-headline" id="4_foo.7B.7Bbar_4">4 foo{{bar 4</span></h3>
+<p>4</p>
+<h3><span class="mw-headline" id="5_foo.7B.7B.7Bbar_5">5 foo{{{bar 
5</span></h3>
+<p>5</p>
+<h3><span class="mw-headline" id="6_foo-.7Bbar_6">6 foo-{bar 6</span></h3>
+<p>6</p>
+!! end
+
+###
 ### Token Stream Patcher tests
 ###
 ### These tests won't always pass wt2wt and other modes because
@@ -17567,10 +17887,10 @@
 <p>    <meta itemprop="hello" content="world" />
        &lt;meta http-equiv="refresh" content="5"&gt;
        <meta itemprop="hello" content="5" />
-</p>
        <link itemprop="hello" href="http&#58;//example.org" />
        &lt;link rel="stylesheet" href="<a rel="nofollow" class="external free" 
href="http://example.org";>http://example.org</a>"&gt;
        <link itemprop="hello" href="http&#58;//example.org" />
+</p>
 </div>
 
 !! end
@@ -20961,6 +21281,28 @@
 !! end
 
 !! test
+Nested markup inside raw output of variant escape tags (R flag)
+!! options
+language=zh variant=zh-tw
+!! wikitext
+Nested raw: -{R|nested -{zh:China;zh-tw:Taiwan}- nested}-
+!! html
+<p>Nested raw: nested Taiwan nested
+</p>
+!! end
+
+!! test
+Templates inside raw output of variant escape tags (R flag)
+!! options
+language=zh variant=zh-tw
+!! wikitext
+Nested raw: -{R|nested {{echo|hi}} templates}-
+!! html
+<p>Nested raw: nested hi templates
+</p>
+!! end
+
+!! test
 Strings evaluating false shouldn't be ignored by Language converter (T51072)
 !! options
 language=zh variant=zh-cn
@@ -21127,12 +21469,10 @@
 </p>
 !! end
 
-# FIXME: This test is currently broken in the PHP parser T153761
 !! test
 T146304: Don't break template parsing if language converter markup is in the 
parameter.
 !! options
 language=sr variant=sr-ec
-disabled
 !! wikitext
 {{echo|-{R|foo}-}}
 !! html/php

-- 
To view, visit https://gerrit.wikimedia.org/r/355265
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: merged
Gerrit-Change-Id: I5c61781149bb8e598ccd7b6664f63cc42a346a8c
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/services/parsoid
Gerrit-Branch: master
Gerrit-Owner: C. Scott Ananian <canan...@wikimedia.org>
Gerrit-Reviewer: Arlolra <abrea...@wikimedia.org>
Gerrit-Reviewer: Subramanya Sastry <ssas...@wikimedia.org>
Gerrit-Reviewer: jenkins-bot <>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to