Arlolra has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/227481

Change subject: Remove smart nowikier
......................................................................

Remove smart nowikier

 * Nowikis are expected to be rare and the original use case (which
   might have been valid back in the day) of trying to reduce the
   number of nowiki wrappers is no longer relevant.

 * A bit of noise in parserTests. The one new html2html failure is for a
   test that fails html2wt.

Change-Id: I7aa00ee0020c5f69c3acb1cab069ceab77b75ab4
---
M lib/wts.escapeWikitext.js
M tests/parserTests-blacklist.js
M tests/parserTests.txt
3 files changed, 146 insertions(+), 114 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/mediawiki/services/parsoid 
refs/changes/81/227481/1

diff --git a/lib/wts.escapeWikitext.js b/lib/wts.escapeWikitext.js
index b6d73c7..7c09872 100644
--- a/lib/wts.escapeWikitext.js
+++ b/lib/wts.escapeWikitext.js
@@ -379,8 +379,9 @@
 /* ----------------------------------------------------------------
  * This function attempts to wrap smallest escapable units into
  * nowikis (which can potentially add multiple nowiki pairs in a
- * single string).  However, it does attempt to coalesce adjacent
- * nowiki segments into a single nowiki wrapper.
+ * single string).  The idea here is that since this should all be
+ * text, anything that tokenizes to another construct needs to be
+ * wrapped.
  *
  * Full-wrapping is enabled in the following cases:
  * - origText has url triggers (RFC, ISBN, etc.)
@@ -391,15 +392,13 @@
                var match = 
origText.match(/^((?:.*?|[\r\n]+[^\r\n]|[~]{3,5})*?)((?:\r?\n)*)$/);
                var text = match[1];
                var nls = match[2];
-               var nowikisAdded = false;
-
-               // console.warn("SOL: " + sol + "; text: " + text);
 
                if (fullWrap) {
                        return "<nowiki>" + text + "</nowiki>" + nls;
                } else {
                        var buf = '';
                        var inNowiki = false;
+                       var nowikisAdded = false;
                        var tokensWithoutClosingTag = new Set([
                                // These token types don't come with a closing 
tag
                                'listItem', 'td', 'tr'
@@ -414,40 +413,28 @@
                        var tokens = this.tokenizeStr(text, sol);
                        tokens.pop();
 
-                       // Add nowikis intelligently
-                       var smartNowikier = function(open, close, str, i, 
numToks) {
-                               // Max length of string that gets 
"unnecessarily"
-                               // sucked into a nowiki (40 is an arbitrary 
number)
-                               var maxExcessWrapLength = 40;
-
+                       var nowikiWrap = function(str, open, close) {
                                // If we are being asked to close a nowiki
-                               // without opening one, we open a nowiki.
+                               // without an opening one, we open it first.
                                //
                                // Ex: "</s>" will parse to an end-tag
                                if (open || (close && !inNowiki)) {
                                        if (!inNowiki) {
-                                               buf += "<nowiki>";
+                                               buf += '<nowiki>';
                                                inNowiki = true;
                                                nowikisAdded = true;
                                        }
                                }
-
                                buf += str;
-
                                if (close) {
-                                       if ((i < numToks - 1 && tokens[i + 
1].constructor === String && tokens[i + 1].length >= maxExcessWrapLength) ||
-                                               (i === numToks - 2 && tokens[i 
+ 1].constructor === String)) {
-                                               buf += "</nowiki>";
-                                               inNowiki = false;
-                                       }
+                                       buf += '</nowiki>';
+                                       inNowiki = false;
                                }
                        };
 
                        for (var i = 0, n = tokens.length; i < n; i++) {
                                var t = tokens[i];
                                var tsr = (t.dataAttribs || {}).tsr;
-
-                               // console.warn("SOL: " + sol + "; T[" + i + 
"]=" + JSON.stringify(t));
 
                                // Ignore display hacks, so text like "A : B" 
doesn't produce
                                // an unnecessary nowiki.
@@ -459,22 +446,17 @@
                                case String:
                                        if (t.length > 0) {
                                                t = escapeNowikiTags(t);
-                                               if ((sol && t.match(/^ /)) || 
t.match(/\n /)) {
-                                                       if (inNowiki) {
-                                                               
smartNowikier(true, true, t, i, n);
-                                                       } else {
-                                                               var x = 
t.split(/(^|\n) /g);
-                                                               buf += x[0];
-                                                               for (var k = 1; 
k < x.length - 1; k += 2) {
-                                                                       buf += 
x[k];
-                                                                       if (k 
!== 1 || x[k] === '\n' || sol) {
-                                                                               
buf += '<nowiki> </nowiki>';
-                                                                       } else {
-                                                                               
buf += ' ';
-                                                                       }
-                                                                       buf += 
x[k + 1];
+                                               if (!inNowiki && ((sol && 
t.match(/^ /)) || t.match(/\n /))) {
+                                                       var x = t.split(/(^|\n) 
/g);
+                                                       buf += x[0];
+                                                       for (var k = 1; k < 
x.length - 1; k += 2) {
+                                                               buf += x[k];
+                                                               if (k !== 1 || 
x[k] === '\n' || sol) {
+                                                                       
nowikiWrap(' ', true, true);
+                                                               } else {
+                                                                       buf += 
' ';
                                                                }
-                                                               nowikisAdded = 
true;
+                                                               buf += x[k + 1];
                                                        }
                                                } else {
                                                        buf += t;
@@ -496,20 +478,20 @@
                                case pd.TagTk:
                                        // Treat tokens with missing tags as 
self-closing tokens
                                        // for the purpose of minimal nowiki 
escaping
-                                       var closeNowiki = 
tokensWithoutClosingTag.has(t.name);
-                                       smartNowikier(true, closeNowiki, 
text.substring(tsr[0], tsr[1]), i, n);
+                                       var close = 
tokensWithoutClosingTag.has(t.name);
+                                       nowikiWrap(text.substring(tsr[0], 
tsr[1]), true, close);
                                        sol = false;
                                        break;
 
                                case pd.EndTagTk:
-                                       smartNowikier(false, true, 
text.substring(tsr[0], tsr[1]), i, n);
+                                       nowikiWrap(text.substring(tsr[0], 
tsr[1]), false, true);
                                        sol = false;
                                        break;
 
                                case pd.SelfclosingTagTk:
                                        if (t.name !== 'meta' || 
!/^mw:(TSRMarker|EmptyLine)$/.test(t.getAttribute('typeof'))) {
                                                // Don't bother with marker or 
empty-line metas
-                                               smartNowikier(true, true, 
text.substring(tsr[0], tsr[1]), i, n);
+                                               
nowikiWrap(text.substring(tsr[0], tsr[1]), true, true);
                                        }
                                        sol = false;
                                        break;
@@ -518,16 +500,14 @@
 
                        // close any unclosed nowikis
                        if (inNowiki) {
-                               buf += "</nowiki>";
+                               buf += '</nowiki>';
                        }
 
                        // Make sure nowiki is always added
                        // Ex: "foo]]" won't tokenize into tags at all
                        if (!nowikisAdded) {
                                buf = '';
-                               buf += "<nowiki>";
-                               buf += text;
-                               buf += "</nowiki>";
+                               nowikiWrap(text, true, true);
                        }
 
                        buf += nls;
diff --git a/tests/parserTests-blacklist.js b/tests/parserTests-blacklist.js
index e6c48b3..493087c 100644
--- a/tests/parserTests-blacklist.js
+++ b/tests/parserTests-blacklist.js
@@ -318,10 +318,6 @@
 add("wt2html", "Language parser function", "<p about=\"#mwt1\" 
typeof=\"mw:Transclusion\" data-parsoid='{\"dsr\":[0,16,0,0],\"pi\":[[]]}' 
data-mw='{\"parts\":[{\"template\":{\"target\":{\"wt\":\"#language:ar\",\"function\":\"#language\"},\"params\":{},\"i\":0}}]}'>ar</p>");
 add("wt2html", "Special parser function", "<p 
data-parsoid='{\"dsr\":[0,65,0,0]}'><span about=\"#mwt1\" 
typeof=\"mw:Transclusion\" 
data-parsoid='{\"pi\":[[]],\"dsr\":[0,23,null,null]}' 
data-mw='{\"parts\":[{\"template\":{\"target\":{\"wt\":\"#special:RandomPage\",\"function\":\"#special\"},\"params\":{},\"i\":0}}]}'>Parser
 function implementation for pf_#special missing in Parsoid.</span>\n<span 
about=\"#mwt2\" typeof=\"mw:Transclusion\" 
data-parsoid='{\"pi\":[[]],\"dsr\":[24,45,null,null]}' 
data-mw='{\"parts\":[{\"template\":{\"target\":{\"wt\":\"#special:BaDtItLe\",\"function\":\"#special\"},\"params\":{},\"i\":0}}]}'>Parser
 function implementation for pf_#special missing in Parsoid.</span>\n<span 
about=\"#mwt3\" typeof=\"mw:Transclusion\" 
data-parsoid='{\"pi\":[[]],\"dsr\":[46,65,null,null]}' 
data-mw='{\"parts\":[{\"template\":{\"target\":{\"wt\":\"#special:Foobar\",\"function\":\"#special\"},\"params\":{},\"i\":0}}]}'>Parser
 function implementation for pf_#special missing in Parsoid.</span></p>");
 add("wt2html", "1. SOL-sensitive wikitext tokens as template-args", "<p 
data-parsoid='{\"dsr\":[0,35,0,0]}'><span about=\"#mwt1\" 
typeof=\"mw:Transclusion\" 
data-parsoid='{\"pi\":[[{\"k\":\"1\",\"spc\":[\"\",\"\",\"\",\"\"]}]],\"dsr\":[0,11,null,null]}'
 
data-mw='{\"parts\":[{\"template\":{\"target\":{\"wt\":\"echo\",\"href\":\"./Template:Echo\"},\"params\":{\"1\":{\"wt\":\"*a\"}},\"i\":0}}]}'>*a</span>\n<span
 about=\"#mwt2\" typeof=\"mw:Transclusion\" 
data-parsoid='{\"pi\":[[{\"k\":\"1\",\"spc\":[\"\",\"\",\"\",\"\"]}]],\"dsr\":[12,23,null,null]}'
 
data-mw='{\"parts\":[{\"template\":{\"target\":{\"wt\":\"echo\",\"href\":\"./Template:Echo\"},\"params\":{\"1\":{\"wt\":\"#a\"}},\"i\":0}}]}'>#a</span>\n<span
 about=\"#mwt3\" typeof=\"mw:Transclusion\" 
data-parsoid='{\"pi\":[[{\"k\":\"1\",\"spc\":[\"\",\"\",\"\",\"\"]}]],\"dsr\":[24,35,null,null]}'
 
data-mw='{\"parts\":[{\"template\":{\"target\":{\"wt\":\"echo\",\"href\":\"./Template:Echo\"},\"params\":{\"1\":{\"wt\":\":a\"}},\"i\":0}}]}'>:a</span></p>");
-add("wt2html", "Headings: 6a. Heading chars in SOL context (with trailing 
spaces)", "<p data-parsoid='{\"dsr\":[0,20,0,0]}'><span typeof=\"mw:Nowiki\" 
data-parsoid='{\"dsr\":[0,20,8,9]}'>=a=</span></p>\n\n<p 
data-parsoid='{\"dsr\":[22,42,0,0]}'><span typeof=\"mw:Nowiki\" 
data-parsoid='{\"dsr\":[22,42,8,9]}'>=a=</span></p> \n\n<p 
data-parsoid='{\"dsr\":[45,65,0,0]}'><span typeof=\"mw:Nowiki\" 
data-parsoid='{\"dsr\":[45,65,8,9]}'>=a=</span></p>\t\n\n<p 
data-parsoid='{\"dsr\":[68,88,0,0]}'><span typeof=\"mw:Nowiki\" 
data-parsoid='{\"dsr\":[68,88,8,9]}'>=a=</span></p> \t");
-add("wt2html", "Headings: 6b. Heading chars in SOL context (with trailing 
newlines)", "<p data-parsoid='{\"dsr\":[0,22,0,0]}'><span typeof=\"mw:Nowiki\" 
data-parsoid='{\"dsr\":[0,22,8,9]}'>=a=\nb</span></p>\n\n<p 
data-parsoid='{\"dsr\":[24,47,0,0]}'><span typeof=\"mw:Nowiki\" 
data-parsoid='{\"dsr\":[24,47,8,9]}'>=a= \nb</span></p>\n\n<p 
data-parsoid='{\"dsr\":[49,72,0,0]}'><span typeof=\"mw:Nowiki\" 
data-parsoid='{\"dsr\":[49,72,8,9]}'>=a=\t\nb</span></p>\n\n<p 
data-parsoid='{\"dsr\":[74,98,0,0]}'><span typeof=\"mw:Nowiki\" 
data-parsoid='{\"dsr\":[74,98,8,9]}'>=a=\t \nb</span></p>");
-add("wt2html", "Headings: 6c. Heading chars in SOL context (leading newline 
break)", "<p data-parsoid='{\"dsr\":[0,22,0,0]}'>a\n<span typeof=\"mw:Nowiki\" 
data-parsoid='{\"dsr\":[2,22,8,9]}'>=b=</span></p>");
-add("wt2html", "Headings: 6d. Heading chars in SOL context (with interspersed 
comments)", "<!--c0--><p data-parsoid='{\"dsr\":[9,29,0,0]}'><span 
typeof=\"mw:Nowiki\" 
data-parsoid='{\"dsr\":[9,29,8,9]}'>=a=</span></p>\n\n<!--c1--><p 
data-parsoid='{\"dsr\":[40,60,0,0]}'><span typeof=\"mw:Nowiki\" 
data-parsoid='{\"dsr\":[40,60,8,9]}'>=a=</span></p> <!--c2-->\t <!--c3-->");
 add("wt2html", "Links 3. WikiLinks: No escapes needed", "<p 
data-parsoid='{\"dsr\":[0,31,0,0]}'>[[Foo|[Foobar]]\n<a rel=\"mw:WikiLink\" 
href=\"./Foo\" title=\"Foo\" 
data-parsoid='{\"stx\":\"piped\",\"a\":{\"href\":\"./Foo\"},\"sa\":{\"href\":\"Foo\"},\"dsr\":[16,31,6,2]}'>foo|bar</a></p>");
 add("wt2html", "1. Leading whitespace in SOL context should be escaped", "<p 
data-parsoid='{\"dsr\":[0,19,0,0]}'><span typeof=\"mw:Nowiki\" 
data-parsoid='{\"dsr\":[0,18,8,9]}'> </span>a</p>\n\n<p 
data-parsoid='{\"dsr\":[21,41,0,0]}'><span typeof=\"mw:Nowiki\" 
data-parsoid='{\"dsr\":[21,39,8,9]}'> </span> a</p>\n\n<p 
data-parsoid='{\"dsr\":[43,67,0,0]}'><span typeof=\"mw:Nowiki\" 
data-parsoid='{\"dsr\":[43,61,8,9]}'>\t</span>a(tab)</p>\n\n<p 
data-parsoid='{\"dsr\":[69,121,0,0]}'><span typeof=\"mw:Nowiki\" 
data-parsoid='{\"dsr\":[69,87,8,9]}'> </span>\ta\n<!--cmt-->\n<span 
typeof=\"mw:Nowiki\" data-parsoid='{\"dsr\":[101,119,8,9]}'> </span> 
a</p>\n\n<p data-parsoid='{\"dsr\":[123,144,0,0]}'>a\n<span 
typeof=\"mw:Nowiki\" data-parsoid='{\"dsr\":[125,143,8,9]}'> </span>b</p>\n\n<p 
data-parsoid='{\"dsr\":[146,167,0,0]}'>a\n<span typeof=\"mw:Nowiki\" 
data-parsoid='{\"dsr\":[148,166,8,9]}'>\t</span>b</p>\n\n<p 
data-parsoid='{\"dsr\":[169,191,0,0]}'>a\n<span typeof=\"mw:Nowiki\" 
data-parsoid='{\"dsr\":[171,189,8,9]}'>\t</span> b</p>");
 add("wt2html", "1. a tags", "<p data-parsoid='{\"dsr\":[0,38,0,0]}'>&lt;a 
href=\"http://google.com\";>google&lt;/a></p>");
@@ -385,7 +381,7 @@
 add("wt2wt", "Templates: HTML Tables: 5. Proper fostering of categories from 
inside", "[[Category:foo1]]<table><tr><td>foo</td></tr></table>\n<!--Two 
categories (Bug 
50330)-->\n[[Category:bar1]][[Category:bar2]]<table><tr><td>foo</td></tr></table>");
 add("wt2wt", "Allow empty links in image captions (Bug 60753)", 
"[[File:Foobar.jpg|thumb|Caption 
[[Link1]]\n<nowiki>[[]]</nowiki>\n[[Link2]]\n]]");
 add("wt2wt", "Image with multiple widths -- use last", 
"[[File:Foobar.jpg|300px|caption]]\n");
-add("wt2wt", "Render invalid page names as plain text (bug 51090)", 
"<nowiki>[[./../foo|bar]]\n[[foo�|bar]]\n[[foo/.|bar]]\n[[foo/..|bar]]\n[[foo~~~bar]]\n[[foo>bar]]\n[[foo[bar]]\n[[.]]\n[[..]]\n[[foo././bar]]</nowiki>\n\n[[{{echo|./../foo}}|bar]]\n[[{{echo|foo/.}}|bar]]\n[[{{echo|foo/..}}|bar]]\n[[{{echo|foo~~~~bar}}]]\n[[{{echo|foo>bar}}]]\n[[{{echo|foo././bar}}]]\n[[{{echo|foo{bar}}]]\n[[{{echo|foo}bar}}]]\n[[{{echo|foo[bar}}]]\n[[{{echo|foo]bar}}]]\n[[{{echo|foo<bar}}]]\n");
+add("wt2wt", "Render invalid page names as plain text (bug 51090)", 
"<nowiki>[[./../foo|bar]]</nowiki>\n<nowiki>[[foo�|bar]]</nowiki>\n<nowiki>[[foo/.|bar]]</nowiki>\n<nowiki>[[foo/..|bar]]</nowiki>\n<nowiki>[[foo~~~bar]]</nowiki>\n<nowiki>[[foo>bar]]</nowiki>\n[[foo[bar]]\n<nowiki>[[.]]</nowiki>\n<nowiki>[[..]]</nowiki>\n<nowiki>[[foo././bar]]</nowiki>\n\n[[{{echo|./../foo}}|bar]]\n[[{{echo|foo/.}}|bar]]\n[[{{echo|foo/..}}|bar]]\n[[{{echo|foo~~~~bar}}]]\n[[{{echo|foo>bar}}]]\n[[{{echo|foo././bar}}]]\n[[{{echo|foo{bar}}]]\n[[{{echo|foo}bar}}]]\n[[{{echo|foo[bar}}]]\n[[{{echo|foo]bar}}]]\n[[{{echo|foo<bar}}]]\n");
 add("wt2wt", "Handling of sections up to level 6 and beyond", "= Level 1 
Heading=\n== Level 2 Heading==\n=== Level 3 Heading===\n==== Level 4 
Heading====\n===== Level 5 Heading=====\n====== Level 6 
Heading======\n======<nowiki>= Level 7 
Heading=</nowiki>======\n======<nowiki>== Level 8 
Heading==</nowiki>======\n======<nowiki>=== Level 9 
Heading===</nowiki>======\n======<nowiki>==== Level 10 
Heading====</nowiki>======\n");
 add("wt2wt", "div with single-quoted attribute", "<div id=\"rock\">HTML 
rocks</div>");
 add("wt2wt", "div with unquoted attribute", "<div id=\"rock\">HTML 
rocks</div>");
@@ -406,7 +402,7 @@
 add("wt2wt", "Opera -o-link CSS", "<div 
title=\"&#100;&#97;&#116;&#97;&#58;&#116;&#101;&#120;&#116;&#47;&#104;&#116;&#109;&#108;&#44;&#60;&#105;&#109;&#103;&#32;&#115;&#114;&#99;&#61;&#49;&#32;&#111;&#110;&#101;&#114;&#114;&#111;&#114;&#61;&#97;&#108;&#101;&#114;&#116;&#40;&#49;&#41;&#62;\"
 style=\"-o-link:attr(title);-o-link-source:current\">X</div>");
 add("wt2wt", "Table attribute legitimate extension", "{|\n! 
style=\"<nowiki>color:blue</nowiki>\" + | status\n|}");
 add("wt2wt", "Table attribute safety", "{|\n! 
style=\"<nowiki>border-width:expression(0+alert(document.cookie))</nowiki>\" + 
| status\n|}");
-add("wt2wt", "Sanitizer: Validating that <meta> and <link> work, but only for 
Microdata", "<div itemscope=\"\">\n\t<nowiki><meta itemprop=\"hello\" 
content=\"world\">\n\t<meta http-equiv=\"refresh\" content=\"5\">\n\t<meta 
itemprop=\"hello\" http-equiv=\"refresh\" content=\"5\">\n\t<link 
itemprop=\"hello\" href=\"{{SERVER}}\">\n\t<link rel=\"stylesheet\" 
href=\"{{SERVER}}\">\n\t<link rel=\"stylesheet\" itemprop=\"hello\" 
href=\"{{SERVER}}\"></nowiki>\n</div>");
+add("wt2wt", "Sanitizer: Validating that <meta> and <link> work, but only for 
Microdata", "<div itemscope=\"\">\n\t<nowiki><meta itemprop=\"hello\" 
content=\"world\"></nowiki>\n\t<nowiki><meta http-equiv=\"refresh\" 
content=\"5\"></nowiki>\n\t<nowiki><meta itemprop=\"hello\" 
http-equiv=\"refresh\" content=\"5\"></nowiki>\n\t<nowiki><link 
itemprop=\"hello\" href=\"{{SERVER}}\"></nowiki>\n\t<nowiki><link 
rel=\"stylesheet\" href=\"{{SERVER}}\"></nowiki>\n\t<nowiki><link 
rel=\"stylesheet\" itemprop=\"hello\" href=\"{{SERVER}}\"></nowiki>\n</div>");
 add("wt2wt", "Fuzz testing: Parser13", "{|  \n| http://a|\n|}");
 add("wt2wt", "Fuzz testing: Parser14-table", "==a==\n{| 
style=\"__TOC__\"\n|}");
 add("wt2wt", "Fuzz testing: Parser16", "{|\n!https://||||||\n|}");
@@ -445,7 +441,7 @@
 add("wt2wt", "Trailing newlines in a deep dom-subtree that ends a wikitext 
line should be migrated out", 
"{|\n|<small>foo\n\nbar\n|}\n\n{|\n|<small>foo<small>\n|}");
 add("wt2wt", "Empty TD followed by TD with tpl-generated attribute", 
"{|\n|-\n|\n| {{echo|style='color:red'}} |foo\n|}");
 add("wt2wt", "Improperly nested inline or quotes tags with whitespace in 
between", "<span> <s>x</span> </s>\n''' ''x'''''<nowiki/>'' ''\n");
-add("wt2wt", "2. Ensure fostered text content is wrapped in element nodes 
(traps regressions around fostered marker on the element getting lost)", 
"<nowiki> </nowiki><nowiki>|| ||</nowiki>\n<table>\n<tr><td> a\n</table>");
+add("wt2wt", "2. Ensure fostered text content is wrapped in element nodes 
(traps regressions around fostered marker on the element getting lost)", 
"<nowiki> </nowiki><nowiki>||</nowiki> <nowiki>||</nowiki>\n<table>\n<tr><td> 
a\n</table>");
 add("wt2wt", "Table in fosterable position", "{{OpenTable}}\n<div>\n{|\n|}\n");
 add("wt2wt", "Image: upright option is ignored on inline and frame images 
(parsoid)", "[[File:Foobar.jpg|500x500px|caption]]\n");
 
@@ -464,11 +460,11 @@
 add("html2html", "<pre> with forbidden attribute (bug 3202)", "<pre 
data-parsoid='{\"dsr\":[0,22,1,0]}'>Narrow screen goodies</pre>\n");
 add("html2html", "<pre> with forbidden attribute values (bug 3202)", "<pre 
data-parsoid='{\"dsr\":[0,22,1,0]}'>Narrow screen goodies</pre>\n");
 add("html2html", "<nowiki> inside <pre> (bug 13238)", "<pre 
data-parsoid='{\"dsr\":[0,15,1,0]}'><span typeof=\"mw:Entity\" 
data-parsoid='{\"src\":\"&amp;lt;\",\"srcContent\":\"&lt;\",\"dsr\":[1,5,null,null]}'>&lt;</span>nowiki<span
 typeof=\"mw:Entity\" 
data-parsoid='{\"src\":\"&amp;gt;\",\"srcContent\":\">\",\"dsr\":[11,15,null,null]}'>></span></pre>\n\n
 <p data-parsoid='{\"dsr\":[18,18,0,0]}'><br 
data-parsoid='{\"dsr\":[18,18,0,0]}'/></p>\n\n<pre 
data-parsoid='{\"dsr\":[20,53,1,0]}'><span typeof=\"mw:Entity\" 
data-parsoid='{\"src\":\"&amp;lt;\",\"srcContent\":\"&lt;\",\"dsr\":[21,25,null,null]}'>&lt;</span>nowiki<span
 typeof=\"mw:Entity\" 
data-parsoid='{\"src\":\"&amp;gt;\",\"srcContent\":\">\",\"dsr\":[31,35,null,null]}'>></span>Foo<span
 typeof=\"mw:Entity\" 
data-parsoid='{\"src\":\"&amp;lt;\",\"srcContent\":\"&lt;\",\"dsr\":[38,42,null,null]}'>&lt;</span>/nowiki<span
 typeof=\"mw:Entity\" 
data-parsoid='{\"src\":\"&amp;gt;\",\"srcContent\":\">\",\"dsr\":[49,53,null,null]}'>></span></pre>\n");
+add("html2html", "<nowiki> and <pre> preference (first one wins)", "<pre 
data-parsoid='{\"stx\":\"html\",\"strippedNL\":true,\"dsr\":[0,21,5,6]}'>&lt;nowiki>\n</pre>\n<p
 data-parsoid='{\"dsr\":[22,38,0,0]}'><span typeof=\"mw:Placeholder\" 
data-parsoid='{\"src\":\"&lt;/nowiki>\",\"dsr\":[22,31,null,0]}'>&lt;/nowiki></span>\n&lt;/pre></p>\n\n<p
 data-parsoid='{\"dsr\":[40,93,0,0]}'><span typeof=\"mw:Nowiki\" 
data-parsoid='{\"dsr\":[40,86,8,9]}'>\n&lt;pre>\n<span typeof=\"mw:Entity\" 
data-parsoid='{\"src\":\"&amp;lt;\",\"srcContent\":\"&lt;\",\"dsr\":[55,59,null,null]}'>&lt;</span>nowiki<span
 typeof=\"mw:Entity\" 
data-parsoid='{\"src\":\"&amp;gt;\",\"srcContent\":\">\",\"dsr\":[65,69,null,null]}'>></span>\n&lt;/pre>\n</span>\n&lt;/pre></p>\n");
 add("html2html", "Templates: Other wikitext in parameter names (bug 67657)", 
"<p about=\"#mwt1\" typeof=\"mw:Transclusion\" 
data-parsoid='{\"dsr\":[0,20,0,0],\"pi\":[[{\"k\":\"&#39;&#39;1&#39;&#39;\",\"named\":true}]]}'
 
data-mw='{\"parts\":[{\"template\":{\"target\":{\"wt\":\"echo\",\"href\":\"./Template:Echo\"},\"params\":{\"&#39;&#39;1&#39;&#39;\":{\"wt\":\"foo\"}},\"i\":0}}]}'>foo</p>");
 add("html2html", "3c. Indent-Pre and block tags (pre-content on separate 
line)", "\n<p data-parsoid='{\"dsr\":[1,22,0,0]}'><span typeof=\"mw:Nowiki\" 
data-parsoid='{\"dsr\":[1,19,8,9]}'> </span>foo</p>\n\n<div 
data-parsoid='{\"stx\":\"html\",\"dsr\":[24,42,5,6]}'>\n<pre 
data-parsoid='{\"dsr\":[30,34,1,0]}'>foo</pre>\n\n</div>\n<center 
data-parsoid='{\"stx\":\"html\",\"dsr\":[43,67,8,9]}'>\n<pre 
data-parsoid='{\"dsr\":[52,56,1,0]}'>foo</pre>\n\n</center>\n<blockquote 
data-parsoid='{\"stx\":\"html\",\"dsr\":[68,100,12,13]}'>\n<p 
data-parsoid='{\"dsr\":[81,85,0,0]}'> foo</p>\n\n</blockquote>\n<blockquote 
data-parsoid='{\"stx\":\"html\",\"dsr\":[101,133,12,13]}'>\n<p 
data-parsoid='{\"dsr\":[114,118,0,0]}'> foo</p>\n\n</blockquote>\n<table 
data-parsoid='{\"dsr\":[134,147,2,2]}'>\n<tbody 
data-parsoid='{\"dsr\":[137,145,0,0]}'><tr 
data-parsoid='{\"autoInsertedEnd\":true,\"autoInsertedStart\":true,\"dsr\":[137,143,0,0]}'><td
 data-parsoid='{\"autoInsertedEnd\":true,\"dsr\":[137,143,1,0]}'>\n<pre 
data-parsoid='{\"dsr\":[139,143,1,0]}'>foo</pre></td></tr>\n\n</tbody></table>\n<ul
 data-parsoid='{\"dsr\":[148,154,0,0]}'><li 
data-parsoid='{\"dsr\":[148,154,1,0]}'>  foo</li></ul>\n");
 add("html2html", "4. Indent-Pre and extension tags", "<p 
data-parsoid='{\"dsr\":[0,1,0,0]}'>a</p>\n\n<ul 
data-parsoid='{\"dsr\":[3,220,0,0]}'><li 
data-parsoid='{\"dsr\":[3,220,1,0]}'><div style=\"width: 155px\" 
data-parsoid='{\"stx\":\"html\",\"dsr\":[4,220,26,6]}'> <div class=\"thumb\" 
style=\"width: 150px;\" 
data-parsoid='{\"stx\":\"html\",\"dsr\":[31,181,41,6]}'> <div 
style=\"margin:68px auto;\" 
data-parsoid='{\"stx\":\"html\",\"dsr\":[73,174,31,6]}'><img 
src=\"http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg\"; 
alt=\"120px-Foobar.jpg\" rel=\"mw:externalImage\" 
data-parsoid='{\"dsr\":[104,168,null,null]}'/></div> </div> <div 
class=\"gallerytext\" 
data-parsoid='{\"stx\":\"html\",\"dsr\":[182,213,25,6]}'></div> 
</div></li></ul>\n");
 add("html2html", "5a. White-space in indent-pre", "<pre 
data-parsoid='{\"dsr\":[0,13,1,0]}'>a<br 
data-parsoid='{\"stx\":\"html\",\"noClose\":true,\"dsr\":[2,8,4,null]}'/>\n\n\nb</pre>\n");
-add("html2html", "HTML-pre: 3: other wikitext", "<pre 
data-parsoid='{\"dsr\":[0,71,1,0]}'>* foo\n<span typeof=\"mw:Nowiki\" 
data-parsoid='{\"dsr\":[8,71,8,9]}'># bar\n = no-h =\n '' no-italic ''\n [[ 
NoLink ]]</span></pre>\n");
 add("html2html", "Definition list with wikilink containing colon", "<dl 
data-parsoid='{\"dsr\":[0,95,0,0]}'><dt data-parsoid='{\"dsr\":[0,24,1,0]}'> 
[/index.php?title=Help</dt><dd 
data-parsoid='{\"stx\":\"row\",\"dsr\":[24,60,1,0]}'>FAQ&amp;action=edit&amp;redlink=1
 Help:FAQ]</dd>\n<dd data-parsoid='{\"dsr\":[61,95,1,0]}'> The least-read page 
on Wikipedia</dd></dl>\n");
 add("html2html", "Definition lists: colon in HTML attribute", "<dl 
data-parsoid='{\"dsr\":[0,12,0,0]}'><dt data-parsoid='{\"dsr\":[0,12,1,0]}'> <b 
data-parsoid='{\"dsr\":[2,12,3,3]}'>bold</b></dt></dl>\n");
 add("html2html", "Definition Lists: Nesting: Multi-level (Parsoid only)", 
"\n<dl data-parsoid='{\"dsr\":[1,116,0,0]}'><dt 
data-parsoid='{\"dsr\":[1,6,1,0]}'> t1 </dt>\n<dd 
data-parsoid='{\"dsr\":[7,17,1,0]}'> d1      </dd>\n<dt 
data-parsoid='{\"dsr\":[18,116,1,0]}'><dl 
data-parsoid='{\"dsr\":[19,116,0,0]}'><dt data-parsoid='{\"dsr\":[19,24,1,0]}'> 
t2 </dt>\n<dd data-parsoid='{\"dsr\":[25,62,2,0]}'> <span typeof=\"mw:Nowiki\" 
data-parsoid='{\"dsr\":[28,48,8,9]}'>:d2</span>              </dd>\n<dt 
data-parsoid='{\"dsr\":[63,116,2,0]}'><dl 
data-parsoid='{\"dsr\":[65,116,0,0]}'><dt data-parsoid='{\"dsr\":[65,70,1,0]}'> 
t3 </dt>\n<dd data-parsoid='{\"dsr\":[71,116,3,0]}'> <span typeof=\"mw:Nowiki\" 
data-parsoid='{\"dsr\":[75,96,8,9]}'>::d3</span>                    
</dd></dl></dt></dl></dt></dl>\n");
@@ -564,7 +560,7 @@
 add("html2html", "Image: caption containing a table", "<figure 
typeof=\"mw:Image/Thumb\" 
data-parsoid='{\"optList\":[{\"ck\":\"thumbnail\",\"ak\":\"thumb\"},{\"ck\":\"width\",\"ak\":\"200x200px\"},{\"ck\":\"bogus\",\"ak\":\"This
 is an example image thumbnail caption with a 
table\\n{\"},{\"ck\":\"bogus\",\"ak\":\"\\n\\n!Foo 
!Bar\\n\"},{\"ck\":\"bogus\",\"ak\":\"-\\n\"},{\"ck\":\"bogus\",\"ak\":\"Foo1 
\\n\"},{\"ck\":\"bogus\",\"ak\":\"Bar1\"},{\"ck\":\"caption\",\"ak\":\"}\\nand 
some more text.\"}],\"dsr\":[0,143,2,2]}'><a href=\"./File:Foobar.jpg\" 
data-parsoid='{\"a\":{\"href\":\"./File:Foobar.jpg\"},\"sa\":{},\"dsr\":[2,null,null,null]}'><img
 resource=\"./File:Foobar.jpg\" 
src=\"//example.com/images/thumb/3/3a/Foobar.jpg/200px-Foobar.jpg\" 
data-file-width=\"1941\" data-file-height=\"220\" data-file-type=\"bitmap\" 
height=\"23\" width=\"200\" 
data-parsoid='{\"a\":{\"resource\":\"./File:Foobar.jpg\",\"height\":\"23\",\"width\":\"200\"},\"sa\":{\"resource\":\"File:Foobar.jpg\"}}'/></a><figcaption
 data-parsoid='{\"dsr\":[null,141,null,null]}'>}\nand some more 
text.</figcaption></figure>\n");
 add("html2html", "Subpage link", "<p data-parsoid='{\"dsr\":[0,38,0,0]}'><a 
rel=\"mw:WikiLink\" href=\"./Wiki/Subpage_test/subpage\" title=\"Wiki/Subpage 
test/subpage\" 
data-parsoid='{\"stx\":\"piped\",\"a\":{\"href\":\"./Wiki/Subpage_test/subpage\"},\"sa\":{\"href\":\"wiki/Subpage
 test/subpage\"},\"dsr\":[0,38,28,2]}'>/subpage</a></p>\n");
 add("html2html", "Subpage noslash link", "<p 
data-parsoid='{\"dsr\":[0,37,0,0]}'><a rel=\"mw:WikiLink\" 
href=\"./Wiki/Subpage_test/subpage\" title=\"Wiki/Subpage test/subpage\" 
data-parsoid='{\"stx\":\"piped\",\"a\":{\"href\":\"./Wiki/Subpage_test/subpage\"},\"sa\":{\"href\":\"wiki/Subpage
 test/subpage\"},\"dsr\":[0,37,28,2]}'>subpage</a></p>\n");
-add("html2html", "Render invalid page names as plain text (bug 51090)", "<p 
data-parsoid='{\"dsr\":[0,141,0,0]}'><span typeof=\"mw:Nowiki\" 
data-parsoid='{\"dsr\":[0,141,8,9]}'>[[./../foo|bar]]\n[[foo�|bar]]\n[[foo/.|bar]]\n[[foo/..|bar]]\n[[foo~~~bar]]\n[[foo>bar]]\n[[foo[bar]]\n[[.]]\n[[..]]\n[[foo././bar]]</span></p>\n\n<p
 data-parsoid='{\"dsr\":[143,389,0,0]}'>[[<span about=\"#mwt34\" 
typeof=\"mw:Transclusion\" 
data-parsoid='{\"pi\":[[{\"k\":\"1\",\"spc\":[\"\",\"\",\"\",\"\"]}]],\"dsr\":[145,162,null,null]}'
 
data-mw='{\"parts\":[{\"template\":{\"target\":{\"wt\":\"echo\",\"href\":\"./Template:Echo\"},\"params\":{\"1\":{\"wt\":\"./../foo\"}},\"i\":0}}]}'>./../foo</span>|bar]]\n[[<span
 about=\"#mwt35\" typeof=\"mw:Transclusion\" 
data-parsoid='{\"pi\":[[{\"k\":\"1\",\"spc\":[\"\",\"\",\"\",\"\"]}]],\"dsr\":[171,185,null,null]}'
 
data-mw='{\"parts\":[{\"template\":{\"target\":{\"wt\":\"echo\",\"href\":\"./Template:Echo\"},\"params\":{\"1\":{\"wt\":\"foo/.\"}},\"i\":0}}]}'>foo/.</span>|bar]]\n[[<span
 about=\"#mwt36\" typeof=\"mw:Transclusion\" 
data-parsoid='{\"pi\":[[{\"k\":\"1\",\"spc\":[\"\",\"\",\"\",\"\"]}]],\"dsr\":[194,209,null,null]}'
 
data-mw='{\"parts\":[{\"template\":{\"target\":{\"wt\":\"echo\",\"href\":\"./Template:Echo\"},\"params\":{\"1\":{\"wt\":\"foo/..\"}},\"i\":0}}]}'>foo/..</span>|bar]]\n[[<span
 about=\"#mwt37\" typeof=\"mw:Transclusion\" 
data-parsoid='{\"pi\":[[{\"k\":\"1\",\"spc\":[\"\",\"\",\"\",\"\"]}]],\"dsr\":[218,237,null,null]}'
 
data-mw='{\"parts\":[{\"template\":{\"target\":{\"wt\":\"echo\",\"href\":\"./Template:Echo\"},\"params\":{\"1\":{\"wt\":\"foo~~~~bar\"}},\"i\":0}}]}'>foo~~~~bar</span>]]\n[[<span
 about=\"#mwt38\" typeof=\"mw:Transclusion\" 
data-parsoid='{\"pi\":[[{\"k\":\"1\",\"spc\":[\"\",\"\",\"\",\"\"]}]],\"dsr\":[242,258,null,null]}'
 
data-mw='{\"parts\":[{\"template\":{\"target\":{\"wt\":\"echo\",\"href\":\"./Template:Echo\"},\"params\":{\"1\":{\"wt\":\"foo>bar\"}},\"i\":0}}]}'>foo>bar</span>]]\n[[<span
 about=\"#mwt39\" typeof=\"mw:Transclusion\" 
data-parsoid='{\"pi\":[[{\"k\":\"1\",\"spc\":[\"\",\"\",\"\",\"\"]}]],\"dsr\":[263,282,null,null]}'
 
data-mw='{\"parts\":[{\"template\":{\"target\":{\"wt\":\"echo\",\"href\":\"./Template:Echo\"},\"params\":{\"1\":{\"wt\":\"foo././bar\"}},\"i\":0}}]}'>foo././bar</span>]]\n[[<span
 about=\"#mwt40\" typeof=\"mw:Transclusion\" 
data-parsoid='{\"pi\":[[{\"k\":\"1\",\"spc\":[\"\",\"\",\"\",\"\"]}]],\"dsr\":[287,303,null,null]}'
 
data-mw='{\"parts\":[{\"template\":{\"target\":{\"wt\":\"echo\",\"href\":\"./Template:Echo\"},\"params\":{\"1\":{\"wt\":\"foo{bar\"}},\"i\":0}}]}'>foo{bar</span>]]\n[[<span
 about=\"#mwt41\" typeof=\"mw:Transclusion\" 
data-parsoid='{\"pi\":[[{\"k\":\"1\",\"spc\":[\"\",\"\",\"\",\"\"]}]],\"dsr\":[308,324,null,null]}'
 
data-mw='{\"parts\":[{\"template\":{\"target\":{\"wt\":\"echo\",\"href\":\"./Template:Echo\"},\"params\":{\"1\":{\"wt\":\"foo}bar\"}},\"i\":0}}]}'>foo}bar</span>]]\n[[<span
 about=\"#mwt42\" typeof=\"mw:Transclusion\" 
data-parsoid='{\"pi\":[[{\"k\":\"1\",\"spc\":[\"\",\"\",\"\",\"\"]}]],\"dsr\":[329,345,null,null]}'
 
data-mw='{\"parts\":[{\"template\":{\"target\":{\"wt\":\"echo\",\"href\":\"./Template:Echo\"},\"params\":{\"1\":{\"wt\":\"foo[bar\"}},\"i\":0}}]}'>foo[bar</span>]]\n[[<span
 about=\"#mwt43\" typeof=\"mw:Transclusion\" 
data-parsoid='{\"pi\":[[{\"k\":\"1\",\"spc\":[\"\",\"\",\"\",\"\"]}]],\"dsr\":[350,366,null,null]}'
 
data-mw='{\"parts\":[{\"template\":{\"target\":{\"wt\":\"echo\",\"href\":\"./Template:Echo\"},\"params\":{\"1\":{\"wt\":\"foo]bar\"}},\"i\":0}}]}'>foo]bar</span>]]\n[[<span
 about=\"#mwt44\" typeof=\"mw:Transclusion\" 
data-parsoid='{\"pi\":[[{\"k\":\"1\",\"spc\":[\"\",\"\",\"\",\"\"]}]],\"dsr\":[371,387,null,null]}'
 
data-mw='{\"parts\":[{\"template\":{\"target\":{\"wt\":\"echo\",\"href\":\"./Template:Echo\"},\"params\":{\"1\":{\"wt\":\"foo&lt;bar\"}},\"i\":0}}]}'>foo&lt;bar</span>]]</p>\n");
+add("html2html", "Render invalid page names as plain text (bug 51090)", "<p 
data-parsoid='{\"dsr\":[0,277,0,0]}'><span typeof=\"mw:Nowiki\" 
data-parsoid='{\"dsr\":[0,33,8,9]}'>[[./../foo|bar]]</span>\n<span 
typeof=\"mw:Nowiki\" 
data-parsoid='{\"dsr\":[34,63,8,9]}'>[[foo�|bar]]</span>\n<span 
typeof=\"mw:Nowiki\" 
data-parsoid='{\"dsr\":[64,94,8,9]}'>[[foo/.|bar]]</span>\n<span 
typeof=\"mw:Nowiki\" 
data-parsoid='{\"dsr\":[95,126,8,9]}'>[[foo/..|bar]]</span>\n<span 
typeof=\"mw:Nowiki\" 
data-parsoid='{\"dsr\":[127,157,8,9]}'>[[foo~~~bar]]</span>\n<span 
typeof=\"mw:Nowiki\" 
data-parsoid='{\"dsr\":[158,186,8,9]}'>[[foo>bar]]</span>\n[[foo[bar]]\n<span 
typeof=\"mw:Nowiki\" data-parsoid='{\"dsr\":[199,221,8,9]}'>[[.]]</span>\n<span 
typeof=\"mw:Nowiki\" 
data-parsoid='{\"dsr\":[222,245,8,9]}'>[[..]]</span>\n<span 
typeof=\"mw:Nowiki\" 
data-parsoid='{\"dsr\":[246,277,8,9]}'>[[foo././bar]]</span></p>\n\n<p 
data-parsoid='{\"dsr\":[279,525,0,0]}'>[[<span about=\"#mwt34\" 
typeof=\"mw:Transclusion\" 
data-parsoid='{\"pi\":[[{\"k\":\"1\",\"spc\":[\"\",\"\",\"\",\"\"]}]],\"dsr\":[281,298,null,null]}'
 
data-mw='{\"parts\":[{\"template\":{\"target\":{\"wt\":\"echo\",\"href\":\"./Template:Echo\"},\"params\":{\"1\":{\"wt\":\"./../foo\"}},\"i\":0}}]}'>./../foo</span>|bar]]\n[[<span
 about=\"#mwt35\" typeof=\"mw:Transclusion\" 
data-parsoid='{\"pi\":[[{\"k\":\"1\",\"spc\":[\"\",\"\",\"\",\"\"]}]],\"dsr\":[307,321,null,null]}'
 
data-mw='{\"parts\":[{\"template\":{\"target\":{\"wt\":\"echo\",\"href\":\"./Template:Echo\"},\"params\":{\"1\":{\"wt\":\"foo/.\"}},\"i\":0}}]}'>foo/.</span>|bar]]\n[[<span
 about=\"#mwt36\" typeof=\"mw:Transclusion\" 
data-parsoid='{\"pi\":[[{\"k\":\"1\",\"spc\":[\"\",\"\",\"\",\"\"]}]],\"dsr\":[330,345,null,null]}'
 
data-mw='{\"parts\":[{\"template\":{\"target\":{\"wt\":\"echo\",\"href\":\"./Template:Echo\"},\"params\":{\"1\":{\"wt\":\"foo/..\"}},\"i\":0}}]}'>foo/..</span>|bar]]\n[[<span
 about=\"#mwt37\" typeof=\"mw:Transclusion\" 
data-parsoid='{\"pi\":[[{\"k\":\"1\",\"spc\":[\"\",\"\",\"\",\"\"]}]],\"dsr\":[354,373,null,null]}'
 
data-mw='{\"parts\":[{\"template\":{\"target\":{\"wt\":\"echo\",\"href\":\"./Template:Echo\"},\"params\":{\"1\":{\"wt\":\"foo~~~~bar\"}},\"i\":0}}]}'>foo~~~~bar</span>]]\n[[<span
 about=\"#mwt38\" typeof=\"mw:Transclusion\" 
data-parsoid='{\"pi\":[[{\"k\":\"1\",\"spc\":[\"\",\"\",\"\",\"\"]}]],\"dsr\":[378,394,null,null]}'
 
data-mw='{\"parts\":[{\"template\":{\"target\":{\"wt\":\"echo\",\"href\":\"./Template:Echo\"},\"params\":{\"1\":{\"wt\":\"foo>bar\"}},\"i\":0}}]}'>foo>bar</span>]]\n[[<span
 about=\"#mwt39\" typeof=\"mw:Transclusion\" 
data-parsoid='{\"pi\":[[{\"k\":\"1\",\"spc\":[\"\",\"\",\"\",\"\"]}]],\"dsr\":[399,418,null,null]}'
 
data-mw='{\"parts\":[{\"template\":{\"target\":{\"wt\":\"echo\",\"href\":\"./Template:Echo\"},\"params\":{\"1\":{\"wt\":\"foo././bar\"}},\"i\":0}}]}'>foo././bar</span>]]\n[[<span
 about=\"#mwt40\" typeof=\"mw:Transclusion\" 
data-parsoid='{\"pi\":[[{\"k\":\"1\",\"spc\":[\"\",\"\",\"\",\"\"]}]],\"dsr\":[423,439,null,null]}'
 
data-mw='{\"parts\":[{\"template\":{\"target\":{\"wt\":\"echo\",\"href\":\"./Template:Echo\"},\"params\":{\"1\":{\"wt\":\"foo{bar\"}},\"i\":0}}]}'>foo{bar</span>]]\n[[<span
 about=\"#mwt41\" typeof=\"mw:Transclusion\" 
data-parsoid='{\"pi\":[[{\"k\":\"1\",\"spc\":[\"\",\"\",\"\",\"\"]}]],\"dsr\":[444,460,null,null]}'
 
data-mw='{\"parts\":[{\"template\":{\"target\":{\"wt\":\"echo\",\"href\":\"./Template:Echo\"},\"params\":{\"1\":{\"wt\":\"foo}bar\"}},\"i\":0}}]}'>foo}bar</span>]]\n[[<span
 about=\"#mwt42\" typeof=\"mw:Transclusion\" 
data-parsoid='{\"pi\":[[{\"k\":\"1\",\"spc\":[\"\",\"\",\"\",\"\"]}]],\"dsr\":[465,481,null,null]}'
 
data-mw='{\"parts\":[{\"template\":{\"target\":{\"wt\":\"echo\",\"href\":\"./Template:Echo\"},\"params\":{\"1\":{\"wt\":\"foo[bar\"}},\"i\":0}}]}'>foo[bar</span>]]\n[[<span
 about=\"#mwt43\" typeof=\"mw:Transclusion\" 
data-parsoid='{\"pi\":[[{\"k\":\"1\",\"spc\":[\"\",\"\",\"\",\"\"]}]],\"dsr\":[486,502,null,null]}'
 
data-mw='{\"parts\":[{\"template\":{\"target\":{\"wt\":\"echo\",\"href\":\"./Template:Echo\"},\"params\":{\"1\":{\"wt\":\"foo]bar\"}},\"i\":0}}]}'>foo]bar</span>]]\n[[<span
 about=\"#mwt44\" typeof=\"mw:Transclusion\" 
data-parsoid='{\"pi\":[[{\"k\":\"1\",\"spc\":[\"\",\"\",\"\",\"\"]}]],\"dsr\":[507,523,null,null]}'
 
data-mw='{\"parts\":[{\"template\":{\"target\":{\"wt\":\"echo\",\"href\":\"./Template:Echo\"},\"params\":{\"1\":{\"wt\":\"foo&lt;bar\"}},\"i\":0}}]}'>foo&lt;bar</span>]]</p>\n");
 add("html2html", "Disabled subpages", "<p 
data-parsoid='{\"dsr\":[0,58,0,0]}'>[/index.php?title=/subpage&amp;action=edit&amp;redlink=1
 /subpage]</p>\n");
 add("html2html", "BUG 561: {{/Subpage}}", "<p 
data-parsoid='{\"dsr\":[0,66,0,0]}'>[/index.php?title=Page/Subpage&amp;action=edit&amp;redlink=1
 Page/Subpage]</p>\n");
 add("html2html", "Link to category", "<p 
data-parsoid='{\"dsr\":[0,72,0,0]}'><a rel=\"mw:WikiLink\" 
href=\"./Wiki/Category:MediaWiki_User's_Guide\" title=\"Wiki/Category:MediaWiki 
User's Guide\" 
data-parsoid='{\"stx\":\"piped\",\"a\":{\"href\":\"./Wiki/Category:MediaWiki_User&#39;s_Guide\"},\"sa\":{\"href\":\"wiki/Category:MediaWiki
 User&#39;s Guide\"},\"dsr\":[0,72,39,2]}'>Category:MediaWiki User's 
Guide</a></p>\n");
@@ -610,8 +606,6 @@
 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\":\"/* 
insecure input */\"},\"dsr\":[0,40,34,6]}'></div>\n");
 add("html2html", "Parser hook: nested tags", "<pre 
data-parsoid='{\"dsr\":[0,28,1,0]}'>'&lt;tag>'\narray (\n)\n&lt;/tag></pre>\n<p 
data-parsoid='{\"dsr\":[29,35,0,0]}'>&lt;/tag></p>\n");
-add("html2html", "Parser hook: basic arguments", "<pre 
data-parsoid='{\"dsr\":[0,120,1,0]}'><span typeof=\"mw:Nowiki\" 
data-parsoid='{\"dsr\":[1,120,8,9]}'>''\n array (\n   'width' => '200',\n   
'height' => '100',\n   'depth' => '50',\n   'square' => 'square',\n 
)</span></pre>\n");
-add("html2html", "Parser hook: argument containing a forward slash (bug 
5344)", "<pre data-parsoid='{\"dsr\":[0,61,1,0]}'><span typeof=\"mw:Nowiki\" 
data-parsoid='{\"dsr\":[1,61,8,9]}'>''\n array (\n   'filename' => 
'/tmp/bla',\n )</span></pre>\n");
 add("html2html", "Parser hook: empty input using terminated empty elements 
(bug 2374)", "<pre data-parsoid='{\"dsr\":[0,36,1,0]}'>NULL\narray (\n  'foo' 
=> 'bar',\n)</pre>\n<p data-parsoid='{\"dsr\":[37,41,0,0]}'>text</p>\n");
 add("html2html", "Parser hook: static parser hook inside a comment", "\n");
 add("html2html", "Sanitizer: Validating that <meta> and <link> work, but only 
for Microdata", "<div itemscope=\"itemscope\" 
data-parsoid='{\"stx\":\"html\",\"dsr\":[0,253,27,6]}'>\n\t<p 
data-parsoid='{\"dsr\":[29,150,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\":[153,246,0,0]}'><a rel=\"mw:ExtLink\" 
href=\"http://example.org\"; 
data-parsoid='{\"targetOff\":172,\"contentOffsets\":[172,172],\"dsr\":[153,173,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\":245,\"contentOffsets\":[245,245],\"dsr\":[226,246,19,1]}'></a></p>\n</div>\n");
@@ -701,10 +695,6 @@
 add("html2html", "References: 5. ref tags in references should be processed 
while ignoring all other content", "<p data-parsoid='{\"dsr\":[0,44,0,0]}'>A 
<span about=\"#mwt2\" class=\"mw-ref\" id=\"cite_ref-a_1-0\" 
rel=\"dc:references\" typeof=\"mw:Extension/ref\" 
data-parsoid='{\"dsr\":[2,18,16,0]}' 
data-mw='{\"name\":\"ref\",\"attrs\":{\"name\":\"a\"}}'><a 
href=\"#cite_note-a-1\" style=\"counter-reset: mw-Ref 1;\"><span 
class=\"mw-reflink-text\">[1]</span></a></span>\nB <span about=\"#mwt4\" 
class=\"mw-ref\" id=\"cite_ref-b_2-0\" rel=\"dc:references\" 
typeof=\"mw:Extension/ref\" data-parsoid='{\"dsr\":[21,44,14,6]}' 
data-mw='{\"name\":\"ref\",\"body\":{\"id\":\"mw-reference-text-cite_note-b-2\"},\"attrs\":{\"name\":\"b\"}}'><a
 href=\"#cite_note-b-2\" style=\"counter-reset: mw-Ref 2;\"><span 
class=\"mw-reflink-text\">[2]</span></a></span></p>\n\n<ol 
class=\"mw-references\" typeof=\"mw:Extension/references\" about=\"#mwt6\" 
data-parsoid='{\"dsr\":[46,96,2,2]}' 
data-mw='{\"name\":\"references\",\"body\":{\"extsrc\":\"&lt;ref 
name=\\\"a\\\">foo&lt;/ref>\",\"html\":\"\\n&lt;span about=\\\"#mwt8\\\" 
class=\\\"mw-ref\\\" rel=\\\"dc:references\\\" typeof=\\\"mw:Extension/ref\\\" 
data-parsoid=&#39;{\\\"dsr\\\":[59,82,14,6]}&#39; 
data-mw=&#39;{\\\"name\\\":\\\"ref\\\",\\\"body\\\":{\\\"id\\\":\\\"mw-reference-text-cite_note-a-1\\\"},\\\"attrs\\\":{\\\"name\\\":\\\"a\\\"}}&#39;>&lt;a
 href=\\\"#cite_note-a-1\\\" style=\\\"counter-reset: mw-Ref 1;\\\">&lt;span 
class=\\\"mw-reflink-text\\\">[1]&lt;/span>&lt;/a>&lt;/span>\\n\"},\"attrs\":{}}'><li
 about=\"#cite_note-a-1\" id=\"cite_note-a-1\"><a href=\"#cite_ref-a_1-0\" 
rel=\"mw:referencedBy\"><span class=\"mw-linkback-text\">↑ </span></a> <span 
id=\"mw-reference-text-cite_note-a-1\" class=\"mw-reference-text\" 
data-parsoid=\"{}\">foo</span></li><li about=\"#cite_note-b-2\" 
id=\"cite_note-b-2\"><a href=\"#cite_ref-b_2-0\" rel=\"mw:referencedBy\"><span 
class=\"mw-linkback-text\">↑ </span></a> <span 
id=\"mw-reference-text-cite_note-b-2\" class=\"mw-reference-text\" 
data-parsoid=\"{}\">bar</span></li></ol>");
 add("html2html", "Entities in ref name", "<p 
data-parsoid='{\"dsr\":[0,38,0,0]}'><span about=\"#mwt2\" class=\"mw-ref\" 
id=\"cite_ref-test_.26amp.3B_me_1-0\" rel=\"dc:references\" 
typeof=\"mw:Extension/ref\" data-parsoid='{\"dsr\":[0,38,30,6]}' 
data-mw='{\"name\":\"ref\",\"body\":{\"id\":\"mw-reference-text-cite_note-test_.26amp.3B_me-1\"},\"attrs\":{\"name\":\"test
 &amp;amp;amp; me\"}}'><a href=\"#cite_note-test_.26amp.3B_me-1\" 
style=\"counter-reset: mw-Ref 1;\"><span 
class=\"mw-reflink-text\">[1]</span></a></span></p>\n<ol 
class=\"mw-references\" typeof=\"mw:Extension/references\" about=\"#mwt4\" 
data-parsoid='{\"dsr\":[39,53,2,2]}' 
data-mw='{\"name\":\"references\",\"attrs\":{}}'><li 
about=\"#cite_note-test_.26amp.3B_me-1\" 
id=\"cite_note-test_.26amp.3B_me-1\"><a 
href=\"#cite_ref-test_.26amp.3B_me_1-0\" rel=\"mw:referencedBy\"><span 
class=\"mw-linkback-text\">↑ </span></a> <span 
id=\"mw-reference-text-cite_note-test_.26amp.3B_me-1\" 
class=\"mw-reference-text\" data-parsoid=\"{}\">hi</span></li></ol>");
 add("html2html", "Empty LI and TR nodes should not be stripped from top-level 
content", "<ul data-parsoid='{\"dsr\":[0,9,0,0]}'><li 
data-parsoid='{\"dsr\":[0,3,1,0]}'> a</li>\n<li 
data-parsoid='{\"dsr\":[4,5,1,0]}'></li>\n<li 
data-parsoid='{\"dsr\":[6,9,1,0]}'> b</li></ul>\n\n<table 
data-parsoid='{\"dsr\":[11,26,2,2]}'>\n\n<tbody 
data-parsoid='{\"dsr\":[15,24,0,0]}'><tr 
data-parsoid='{\"startTagSrc\":\"|-\",\"autoInsertedEnd\":true,\"dsr\":[15,22,2,0]}'>\n<td
 
data-parsoid='{\"autoInsertedEnd\":true,\"dsr\":[18,22,1,0]}'>foo</td></tr>\n\n</tbody></table>\n");
-add("html2html", "Headings: 6a. Heading chars in SOL context (with trailing 
spaces)", "<p data-parsoid='{\"dsr\":[0,20,0,0]}'><span typeof=\"mw:Nowiki\" 
data-parsoid='{\"dsr\":[0,20,8,9]}'>=a=</span></p>\n\n<p 
data-parsoid='{\"dsr\":[22,42,0,0]}'><span typeof=\"mw:Nowiki\" 
data-parsoid='{\"dsr\":[22,42,8,9]}'>=a=</span></p> \n\n<p 
data-parsoid='{\"dsr\":[45,65,0,0]}'><span typeof=\"mw:Nowiki\" 
data-parsoid='{\"dsr\":[45,65,8,9]}'>=a=</span></p>\t\n\n<p 
data-parsoid='{\"dsr\":[68,88,0,0]}'><span typeof=\"mw:Nowiki\" 
data-parsoid='{\"dsr\":[68,88,8,9]}'>=a=</span></p> \t\n");
-add("html2html", "Headings: 6b. Heading chars in SOL context (with trailing 
newlines)", "<p data-parsoid='{\"dsr\":[0,22,0,0]}'><span typeof=\"mw:Nowiki\" 
data-parsoid='{\"dsr\":[0,22,8,9]}'>=a=\nb</span></p>\n\n<p 
data-parsoid='{\"dsr\":[24,47,0,0]}'><span typeof=\"mw:Nowiki\" 
data-parsoid='{\"dsr\":[24,47,8,9]}'>=a= \nb</span></p>\n\n<p 
data-parsoid='{\"dsr\":[49,72,0,0]}'><span typeof=\"mw:Nowiki\" 
data-parsoid='{\"dsr\":[49,72,8,9]}'>=a=\t\nb</span></p>\n\n<p 
data-parsoid='{\"dsr\":[74,98,0,0]}'><span typeof=\"mw:Nowiki\" 
data-parsoid='{\"dsr\":[74,98,8,9]}'>=a=\t \nb</span></p>\n");
-add("html2html", "Headings: 6c. Heading chars in SOL context (leading newline 
break)", "<p data-parsoid='{\"dsr\":[0,22,0,0]}'>a\n<span typeof=\"mw:Nowiki\" 
data-parsoid='{\"dsr\":[2,22,8,9]}'>=b=</span></p>\n");
-add("html2html", "Headings: 6d. Heading chars in SOL context (with 
interspersed comments)", "<!--c0--><p data-parsoid='{\"dsr\":[9,29,0,0]}'><span 
typeof=\"mw:Nowiki\" 
data-parsoid='{\"dsr\":[9,29,8,9]}'>=a=</span></p>\n\n<!--c1--><p 
data-parsoid='{\"dsr\":[40,60,0,0]}'><span typeof=\"mw:Nowiki\" 
data-parsoid='{\"dsr\":[40,60,8,9]}'>=a=</span></p> <!--c2-->\t <!--c3-->\n");
 add("html2html", "Links 3. WikiLinks: No escapes needed", "<p 
data-parsoid='{\"dsr\":[0,31,0,0]}'>[[Foo|[Foobar]]\n<a rel=\"mw:WikiLink\" 
href=\"./Foo\" title=\"Foo\" 
data-parsoid='{\"stx\":\"piped\",\"a\":{\"href\":\"./Foo\"},\"sa\":{\"href\":\"Foo\"},\"dsr\":[16,31,6,2]}'>foo|bar</a></p>\n");
 add("html2html", "1. Leading whitespace in SOL context should be escaped", "<p 
data-parsoid='{\"dsr\":[0,19,0,0]}'><span typeof=\"mw:Nowiki\" 
data-parsoid='{\"dsr\":[0,18,8,9]}'> </span>a</p>\n\n<p 
data-parsoid='{\"dsr\":[21,41,0,0]}'><span typeof=\"mw:Nowiki\" 
data-parsoid='{\"dsr\":[21,39,8,9]}'> </span> a</p>\n\n<p 
data-parsoid='{\"dsr\":[43,50,0,0]}'>\ta(tab)</p>\n\n<pre 
data-parsoid='{\"dsr\":[52,55,1,0]}'>\ta</pre>\n\n<!--cmt--><p 
data-parsoid='{\"dsr\":[67,87,0,0]}'><span typeof=\"mw:Nowiki\" 
data-parsoid='{\"dsr\":[67,85,8,9]}'> </span> a</p>\n\n<p 
data-parsoid='{\"dsr\":[89,110,0,0]}'>a\n<span typeof=\"mw:Nowiki\" 
data-parsoid='{\"dsr\":[91,109,8,9]}'> </span>b</p>\n\n<p 
data-parsoid='{\"dsr\":[112,116,0,0]}'>a\n\tb</p>\n\n<p 
data-parsoid='{\"dsr\":[118,123,0,0]}'>a\n\t b</p>\n");
 add("html2html", "1. a tags", "<p data-parsoid='{\"dsr\":[0,38,0,0]}'>&lt;a 
href=\"http://google.com\";>google&lt;/a></p>");
@@ -731,9 +721,6 @@
 add("html2wt", "Non-word characters don't terminate tag names + tidy", 
"<blockquote|>a\n\n<b→> doesn't terminate </b→>\n\n<bä> doesn't terminate 
</bä>\n\n<boo> doesn't terminate </boo>\n\n<s.foo> doesn't terminate 
</s.foo>\n\n<sub-ID#1>\n");
 add("html2wt", "Non-word characters are valid in extension tags (T19663)", " 
'tåg'\n array (\n )\n");
 add("html2wt", "Bare pipe character from a template (bug 52363)", "|\n");
-add("html2wt", "<nowiki> unordered list", "<nowiki>*</nowiki> This is not an 
unordered list item.\n");
-add("html2wt", "<nowiki> spacing", "Lorem ipsum dolor\nsed abit.\n<nowiki> 
</nowiki> sed nullum.\n<nowiki>:</nowiki>and a colon\n");
-add("html2wt", "nowiki 3", ": There is not nowiki.\n: There is nowiki.\n# 
There is not nowiki.\n# There is nowiki.\n* There is not nowiki.\n* There is 
nowiki.\n");
 add("html2wt", "Entities inside <nowiki>", "<\n");
 add("html2wt", "T71950: 2. Put nowiki as close to cause as possible, after ' 
:'", "This text : L<nowiki>''</nowiki>[[Foo]]\n");
 add("html2wt", "Comments and Indent-Pre", " asdf\n\n asdf\n\n asdf\n\nxyz\n\n 
asdf\n xyz\n");
@@ -765,7 +752,7 @@
 add("html2wt", "Entities inside <pre>", " <\n");
 add("html2wt", "<pre> with forbidden attribute values (bug 3202)", " Narrow 
screen goodies\n");
 add("html2wt", "<nowiki> inside <pre> (bug 13238)", " &lt;nowiki&gt;\n\n \n\n 
&lt;nowiki&gt;Foo&lt;/nowiki&gt;\n");
-add("html2wt", "<nowiki> and <pre> preference (first one wins)", " 
&lt;nowiki&gt;\n\n&lt;/nowiki&gt;\n</pre>\n\n<nowiki><pre>\n<nowiki>\n</pre>\n\n</pre></nowiki>\n");
+add("html2wt", "<nowiki> and <pre> preference (first one wins)", 
"<pre>\n<nowiki>\n</pre>\n</nowiki>\n</pre>\n\n<nowiki>\n<pre>\n&lt;nowiki&gt;\n</pre>\n</nowiki>\n</pre>\n");
 add("html2wt", "</pre> inside nowiki", "</pre>\n");
 add("html2wt", "HTML pre followed by indent-pre", " foo\n\n bar\n");
 add("html2wt", "Templates: Indent-Pre: 1a. Templates that break a line should 
suppress <pre>", "");
@@ -794,7 +781,6 @@
 add("html2wt", "5a. White-space in indent-pre", " a<br>\n \n \n b\n");
 add("html2wt", "6. Pre-blocks should extend across lines with leading WS even 
when there is no wrappable content", " a\n \n b\n\n c\n \n\nd\n");
 add("html2wt", "HTML-pre: 2: indented text", "  foo\n");
-add("html2wt", "HTML-pre: 3: other wikitext", " * foo\n <nowiki># bar\n = no-h 
=\n '' no-italic ''\n [[ NoLink ]]</nowiki>\n");
 add("html2wt", "Simple definition", "; name \n: Definition\n");
 add("html2wt", "Definition list with no space", "; name\n: Definition\n");
 add("html2wt", "Definition list with URL link", "; http://example.com/ \n: 
definition\n");
@@ -1145,7 +1131,7 @@
 add("html2wt", "Parsoid-specific image handling - caption with a template in 
it", "[[File:Foobar.jpg|thumb|200x200px|This caption has a 
{{echo|transclusion}} in it.]]\n");
 add("html2wt", "Subpage link", "[[wiki/Subpage test/subpage|/subpage]]\n");
 add("html2wt", "Subpage noslash link", "[[wiki/Subpage 
test/subpage|subpage]]\n");
-add("html2wt", "Render invalid page names as plain text (bug 51090)", 
"<nowiki>[[./../foo|bar]]\n[[foo�|bar]]\n[[foo/.|bar]]\n[[foo/..|bar]]\n[[foo~~~bar]]\n[[foo>bar]]\n[[foo[bar]]\n[[.]]\n[[..]]\n[[foo././bar]]</nowiki>\n\n[[{{echo|./../foo}}|bar]]\n[[{{echo|foo/.}}|bar]]\n[[{{echo|foo/..}}|bar]]\n[[{{echo|foo~~~~bar}}]]\n[[{{echo|foo>bar}}]]\n[[{{echo|foo././bar}}]]\n[[{{echo|foo{bar}}]]\n[[{{echo|foo}bar}}]]\n[[{{echo|foo[bar}}]]\n[[{{echo|foo]bar}}]]\n[[{{echo|foo<bar}}]]\n");
+add("html2wt", "Render invalid page names as plain text (bug 51090)", 
"<nowiki>[[./../foo|bar]]</nowiki>\n<nowiki>[[foo�|bar]]</nowiki>\n<nowiki>[[foo/.|bar]]</nowiki>\n<nowiki>[[foo/..|bar]]</nowiki>\n<nowiki>[[foo~~~bar]]</nowiki>\n<nowiki>[[foo>bar]]</nowiki>\n[[foo[bar]]\n<nowiki>[[.]]</nowiki>\n<nowiki>[[..]]</nowiki>\n<nowiki>[[foo././bar]]</nowiki>\n\n[[{{echo|./../foo}}|bar]]\n[[{{echo|foo/.}}|bar]]\n[[{{echo|foo/..}}|bar]]\n[[{{echo|foo~~~~bar}}]]\n[[{{echo|foo>bar}}]]\n[[{{echo|foo././bar}}]]\n[[{{echo|foo{bar}}]]\n[[{{echo|foo}bar}}]]\n[[{{echo|foo[bar}}]]\n[[{{echo|foo]bar}}]]\n[[{{echo|foo<bar}}]]\n");
 add("html2wt", "Disabled subpages", 
"[/index.php?title=/subpage&action=edit&redlink=1 /subpage]\n");
 add("html2wt", "BUG 561: {{/Subpage}}", 
"[/index.php?title=Page/Subpage&action=edit&redlink=1 Page/Subpage]\n");
 add("html2wt", "Link to category", "[[wiki/Category:MediaWiki User's 
Guide|Category:MediaWiki User's Guide]]\n");
@@ -1233,8 +1219,8 @@
 add("html2wt", "Parser hook: case insensitive", " 'input'\n array (\n )\n");
 add("html2wt", "Parser hook: case insensitive, redux", " 'input'\n array (\n 
)\n");
 add("html2wt", "Parser hook: nested tags", " '<tag>'\n array (\n )\n 
</tag>\n</tag>\n");
-add("html2wt", "Parser hook: basic arguments", " <nowiki>''\n array (\n   
'width' => '200',\n   'height' => '100',\n   'depth' => '50',\n   'square' => 
'square',\n )</nowiki>\n");
-add("html2wt", "Parser hook: argument containing a forward slash (bug 5344)", 
" <nowiki>''\n array (\n   'filename' => '/tmp/bla',\n )</nowiki>\n");
+add("html2wt", "Parser hook: basic arguments", " <nowiki>''</nowiki>\n array 
(\n <nowiki> </nowiki> 'width' => '200',\n <nowiki> </nowiki> 'height' => 
'100',\n <nowiki> </nowiki> 'depth' => '50',\n <nowiki> </nowiki> 'square' => 
'square',\n )\n");
+add("html2wt", "Parser hook: argument containing a forward slash (bug 5344)", 
" <nowiki>''</nowiki>\n array (\n <nowiki> </nowiki> 'filename' => 
'/tmp/bla',\n )\n");
 add("html2wt", "Parser hook: empty input using terminated empty elements (bug 
2374)", " NULL\n array (\n   'foo' => 'bar',\n )\ntext\n");
 add("html2wt", "Parser hook: basic arguments using terminated empty elements 
(bug 2374)", " NULL\n array (\n   'width' => '200',\n   'height' => '100',\n   
'depth' => '50',\n   'square' => 'square',\n )\n\nother stuff\n</tag>\n");
 add("html2wt", "Parser hook: static parser hook not inside a comment", "hello, 
world\n");
@@ -1947,7 +1933,7 @@
 add("selser", "Render invalid page names as plain text (bug 51090) [0,0,1]", 
"[[./../foo|bar]]\n[[foo�|bar]]\n[[foo/.|bar]]\n[[foo/..|bar]]\n[[foo~~~bar]]\n[[foo>bar]]\n[[foo[bar]]\n[[.]]\n[[..]]\n[[foo././bar]]\n\n[[{{echo|./../foo}}|bar]]\n[[{{echo|foo/.}}|bar]]\n[[{{echo|foo/..}}|bar]]\n[[{{echo|foo~~~~bar}}]]\n[[{{echo|foo>bar}}]]\n[[{{echo|foo././bar}}]]\n[[{{echo|foo{bar}}]]\n[[{{echo|foo}bar}}]]\n[[{{echo|foo[bar}}]]\n[[{{echo|foo]bar}}]]\n[[{{echo|foo<bar}}]]");
 add("selser", "Render invalid page names as plain text (bug 51090) 
[2,2,[3,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0]]", 
"pwgl4v8r9af6flxr\n\n[[./../foo|bar]]\n[[foo�|bar]]\n[[foo/.|bar]]\n[[foo/..|bar]]\n[[foo~~~bar]]\n[[foo>bar]]\n[[foo[bar]]\n[[.]]\n[[..]]\n[[foo././bar]]\n\nhtc0s57znl9v0a4i\n\n{{echo|./../foo}}{{echo|foo/.}}|bar]]\n[[{{echo|foo/..}}|bar]]\n[[{{echo|foo~~~~bar}}]]\n[[{{echo|foo>bar}}]]\n[[{{echo|foo././bar}}]]\n[[{{echo|foo{bar}}]]\n[[{{echo|foo}bar}}]]\n[[{{echo|foo[bar}}{{echo|foo]bar}}]]\n[[{{echo|foo<bar}}]]");
 add("selser", "Render invalid page names as plain text (bug 51090) [0,3,2]", 
"[[./../foo|bar]]\n[[foo�|bar]]\n[[foo/.|bar]]\n[[foo/..|bar]]\n[[foo~~~bar]]\n[[foo>bar]]\n[[foo[bar]]\n[[.]]\n[[..]]\n[[foo././bar]]\n\ngkfu6gduolqmpldi\n\n[[{{echo|./../foo}}|bar]]\n[[{{echo|foo/.}}|bar]]\n[[{{echo|foo/..}}|bar]]\n[[{{echo|foo~~~~bar}}]]\n[[{{echo|foo>bar}}]]\n[[{{echo|foo././bar}}]]\n[[{{echo|foo{bar}}]]\n[[{{echo|foo}bar}}]]\n[[{{echo|foo[bar}}]]\n[[{{echo|foo]bar}}]]\n[[{{echo|foo<bar}}]]");
-add("selser", "Render invalid page names as plain text (bug 51090) 
[[2],0,[4,0,2,0,0,0,2,0,0,0,0,0,0,0,4,0,0,0,0,0,4,0,3]]", 
"8sctlarbskfswcdi<nowiki>[[./../foo|bar]]\n[[foo�|bar]]\n[[foo/.|bar]]\n[[foo/..|bar]]\n[[foo~~~bar]]\n[[foo>bar]]\n[[foo[bar]]\n[[.]]\n[[..]]\n[[foo././bar]]</nowiki>\n\nfxzu21euibpgb9{{echo|./../foo}}k3i4gi7d5yst6gvi|bar]]\n[[{{echo|foo/.}}|bar]]\n[[{{echo|foo/..}}<nowiki>7zyih9glwodmquxr|bar]]\n[[</nowiki>{{echo|foo~~~~bar}}]]\n[[{{echo|foo>bar}}]]\n[[{{echo|foo././bar}}]]\n[[{{echo|foo{bar}}3e27dqprn1k2zkt9{{echo|foo}bar}}]]\n[[{{echo|foo[bar}}]]\n[[{{echo|foo]bar}}xof8d4gk7hw7b9{{echo|foo<bar}}\n");
+add("selser", "Render invalid page names as plain text (bug 51090) 
[[2],0,[4,0,2,0,0,0,2,0,0,0,0,0,0,0,4,0,0,0,0,0,4,0,3]]", 
"8sctlarbskfswcdi<nowiki>[[./../foo|bar]]</nowiki>\n<nowiki>[[foo�|bar]]</nowiki>\n<nowiki>[[foo/.|bar]]</nowiki>\n<nowiki>[[foo/..|bar]]</nowiki>\n<nowiki>[[foo~~~bar]]</nowiki>\n<nowiki>[[foo>bar]]</nowiki>\n[[foo[bar]]\n<nowiki>[[.]]</nowiki>\n<nowiki>[[..]]</nowiki>\n<nowiki>[[foo././bar]]</nowiki>\n\nfxzu21euibpgb9{{echo|./../foo}}k3i4gi7d5yst6gvi|bar]]\n[[{{echo|foo/.}}|bar]]\n[[{{echo|foo/..}}<nowiki>7zyih9glwodmquxr|bar]]\n[[</nowiki>{{echo|foo~~~~bar}}]]\n[[{{echo|foo>bar}}]]\n[[{{echo|foo././bar}}]]\n[[{{echo|foo{bar}}3e27dqprn1k2zkt9{{echo|foo}bar}}]]\n[[{{echo|foo[bar}}]]\n[[{{echo|foo]bar}}xof8d4gk7hw7b9{{echo|foo<bar}}\n");
 add("selser", "Render invalid page names as plain text (bug 51090) [0,0,4]", 
"[[./../foo|bar]]\n[[foo�|bar]]\n[[foo/.|bar]]\n[[foo/..|bar]]\n[[foo~~~bar]]\n[[foo>bar]]\n[[foo[bar]]\n[[.]]\n[[..]]\n[[foo././bar]]\n\n5cifaj4uowyaatt9\n");
 add("selser", "Render invalid page names as plain text (bug 51090) [0,0,2]", 
"[[./../foo|bar]]\n[[foo�|bar]]\n[[foo/.|bar]]\n[[foo/..|bar]]\n[[foo~~~bar]]\n[[foo>bar]]\n[[foo[bar]]\n[[.]]\n[[..]]\n[[foo././bar]]\n\nff48sg2pipqwu3di\n\n[[{{echo|./../foo}}|bar]]\n[[{{echo|foo/.}}|bar]]\n[[{{echo|foo/..}}|bar]]\n[[{{echo|foo~~~~bar}}]]\n[[{{echo|foo>bar}}]]\n[[{{echo|foo././bar}}]]\n[[{{echo|foo{bar}}]]\n[[{{echo|foo}bar}}]]\n[[{{echo|foo[bar}}]]\n[[{{echo|foo]bar}}]]\n[[{{echo|foo<bar}}]]");
 add("selser", "Render invalid page names as plain text (bug 51090) 
[[4],3,[0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,0,4,0,0,0,0,0,2]]", 
"a8exokpi7bricnmi\n\n[[{{echo|./../foo}}<nowiki>yjmnkmy2satt9|bar]]\n[[</nowiki>{{echo|foo/.}}|bar]]\n[[{{echo|foo/..}}|bar]]\n[[{{echo|foo~~~~bar}}]]\n[[{{echo|foo>bar}}<nowiki>naobmwo11fnipb9]]\n[[</nowiki>{{echo|foo././bar}}]]\n[[{{echo|foo{bar}}]]\n[[{{echo|foo}bar}}rksixalimh392j4i{{echo|foo[bar}}]]\n[[{{echo|foo]bar}}]]\n[[{{echo|foo<bar}}<nowiki>xmch4v09b9m2huxr]]</nowiki>");
@@ -2088,16 +2074,16 @@
 add("selser", "Table attribute safety [[0,[2,0]]]", 
"{|\n<!--hopuq8owdrv8to6r-->!+ 
style=\"<nowiki>border-width:expression(0+alert(document.cookie))</nowiki>\"| 
status\n|}");
 add("selser", "Table attribute safety [[0,[0,3]]]", "{|\n!+ 
style=\"<nowiki>border-width:expression(0+alert(document.cookie))</nowiki>\"| 
status\n|}");
 add("selser", "Table attribute safety [[0,[1,2]]]", "{|\n!+ 
style=\"<nowiki>border-width:expression(0+alert(document.cookie))</nowiki>\"| 
status<!--skyjeiq2kwr0be29-->\n|}");
-add("selser", "Sanitizer: Validating that <meta> and <link> work, but only for 
Microdata [[0,1,4]]", "<div itemscope>\n\t<nowiki><meta itemprop=\"hello\" 
content=\"world\">\n\t<meta http-equiv=\"refresh\" content=\"5\">\n\t<meta 
itemprop=\"hello\" http-equiv=\"refresh\" content=\"5\">\n\t<link 
itemprop=\"hello\" href=\"{{SERVER}}\">\n\t<link rel=\"stylesheet\" 
href=\"{{SERVER}}\">\n\t<link rel=\"stylesheet\" itemprop=\"hello\" 
href=\"{{SERVER}}\"></nowiki>\n9lxnoixxq085b3xr</div>");
+add("selser", "Sanitizer: Validating that <meta> and <link> work, but only for 
Microdata [[0,1,4]]", "<div itemscope>\n\t<nowiki><meta itemprop=\"hello\" 
content=\"world\"></nowiki>\n\t<nowiki><meta http-equiv=\"refresh\" 
content=\"5\"></nowiki>\n\t<nowiki><meta itemprop=\"hello\" 
http-equiv=\"refresh\" content=\"5\"></nowiki>\n\t<nowiki><link 
itemprop=\"hello\" href=\"{{SERVER}}\"></nowiki>\n\t<nowiki><link 
rel=\"stylesheet\" href=\"{{SERVER}}\"></nowiki>\n\t<nowiki><link 
rel=\"stylesheet\" itemprop=\"hello\" 
href=\"{{SERVER}}\"></nowiki>\n9lxnoixxq085b3xr</div>");
 add("selser", "Sanitizer: Validating that <meta> and <link> work, but only for 
Microdata [[2,0,2]]", "<div itemscope>1tq4nuxaexcu9pb9\n\t<meta 
itemprop=\"hello\" content=\"world\">\n\t<meta http-equiv=\"refresh\" 
content=\"5\">\n\t<meta itemprop=\"hello\" http-equiv=\"refresh\" 
content=\"5\">\n\t<link itemprop=\"hello\" href=\"{{SERVER}}\">\n\t<link 
rel=\"stylesheet\" href=\"{{SERVER}}\">\n\t<link rel=\"stylesheet\" 
itemprop=\"hello\" href=\"{{SERVER}}\">\nkcbq6pis8m2t9\n</div>");
 add("selser", "Sanitizer: Validating that <meta> and <link> work, but only for 
Microdata [2]", "rcydl379jopkqpvi<div itemscope>\n\t<meta itemprop=\"hello\" 
content=\"world\">\n\t<meta http-equiv=\"refresh\" content=\"5\">\n\t<meta 
itemprop=\"hello\" http-equiv=\"refresh\" content=\"5\">\n\t<link 
itemprop=\"hello\" href=\"{{SERVER}}\">\n\t<link rel=\"stylesheet\" 
href=\"{{SERVER}}\">\n\t<link rel=\"stylesheet\" itemprop=\"hello\" 
href=\"{{SERVER}}\">\n</div>");
-add("selser", "Sanitizer: Validating that <meta> and <link> work, but only for 
Microdata [[0,[2],2]]", "<div itemscope>\n\t047cgm8enksrwwmi<nowiki><meta 
itemprop=\"hello\" content=\"world\">\n\t<meta http-equiv=\"refresh\" 
content=\"5\">\n\t<meta itemprop=\"hello\" http-equiv=\"refresh\" 
content=\"5\">\n\t<link itemprop=\"hello\" href=\"{{SERVER}}\">\n\t<link 
rel=\"stylesheet\" href=\"{{SERVER}}\">\n\t<link rel=\"stylesheet\" 
itemprop=\"hello\" href=\"{{SERVER}}\"></nowiki>\n4pny61gu2tx7ds4i\n</div>");
-add("selser", "Sanitizer: Validating that <meta> and <link> work, but only for 
Microdata [[4,1,0]]", "<div itemscope>spu0tptv3lwka9k9\n<nowiki><meta 
itemprop=\"hello\" content=\"world\">\n\t<meta http-equiv=\"refresh\" 
content=\"5\">\n\t<meta itemprop=\"hello\" http-equiv=\"refresh\" 
content=\"5\">\n\t<link itemprop=\"hello\" href=\"{{SERVER}}\">\n\t<link 
rel=\"stylesheet\" href=\"{{SERVER}}\">\n\t<link rel=\"stylesheet\" 
itemprop=\"hello\" href=\"{{SERVER}}\"></nowiki>\n</div>");
+add("selser", "Sanitizer: Validating that <meta> and <link> work, but only for 
Microdata [[0,[2],2]]", "<div itemscope>\n\t047cgm8enksrwwmi<nowiki><meta 
itemprop=\"hello\" content=\"world\"></nowiki>\n\t<nowiki><meta 
http-equiv=\"refresh\" content=\"5\"></nowiki>\n\t<nowiki><meta 
itemprop=\"hello\" http-equiv=\"refresh\" 
content=\"5\"></nowiki>\n\t<nowiki><link itemprop=\"hello\" 
href=\"{{SERVER}}\"></nowiki>\n\t<nowiki><link rel=\"stylesheet\" 
href=\"{{SERVER}}\"></nowiki>\n\t<nowiki><link rel=\"stylesheet\" 
itemprop=\"hello\" href=\"{{SERVER}}\"></nowiki>\n4pny61gu2tx7ds4i\n</div>");
+add("selser", "Sanitizer: Validating that <meta> and <link> work, but only for 
Microdata [[4,1,0]]", "<div itemscope>spu0tptv3lwka9k9\n<nowiki><meta 
itemprop=\"hello\" content=\"world\"></nowiki>\n\t<nowiki><meta 
http-equiv=\"refresh\" content=\"5\"></nowiki>\n\t<nowiki><meta 
itemprop=\"hello\" http-equiv=\"refresh\" 
content=\"5\"></nowiki>\n\t<nowiki><link itemprop=\"hello\" 
href=\"{{SERVER}}\"></nowiki>\n\t<nowiki><link rel=\"stylesheet\" 
href=\"{{SERVER}}\"></nowiki>\n\t<nowiki><link rel=\"stylesheet\" 
itemprop=\"hello\" href=\"{{SERVER}}\"></nowiki>\n</div>");
 add("selser", "Sanitizer: Validating that <meta> and <link> work, but only for 
Microdata [[4,[3],0]]", "<div itemscope>99wejgddgaybke29\n</div>");
 add("selser", "Sanitizer: Validating that <meta> and <link> work, but only for 
Microdata [[0,0,4]]", "<div itemscope>\n\t<meta itemprop=\"hello\" 
content=\"world\">\n\t<meta http-equiv=\"refresh\" content=\"5\">\n\t<meta 
itemprop=\"hello\" http-equiv=\"refresh\" content=\"5\">\n\t<link 
itemprop=\"hello\" href=\"{{SERVER}}\">\n\t<link rel=\"stylesheet\" 
href=\"{{SERVER}}\">\n\t<link rel=\"stylesheet\" itemprop=\"hello\" 
href=\"{{SERVER}}\">\new3jgq2guzhncdi</div>");
-add("selser", "Sanitizer: Validating that <meta> and <link> work, but only for 
Microdata [[2,1,0]]", "<div itemscope>px2m4ecth1qyqfr\n\t<nowiki><meta 
itemprop=\"hello\" content=\"world\">\n\t<meta http-equiv=\"refresh\" 
content=\"5\">\n\t<meta itemprop=\"hello\" http-equiv=\"refresh\" 
content=\"5\">\n\t<link itemprop=\"hello\" href=\"{{SERVER}}\">\n\t<link 
rel=\"stylesheet\" href=\"{{SERVER}}\">\n\t<link rel=\"stylesheet\" 
itemprop=\"hello\" href=\"{{SERVER}}\"></nowiki>\n</div>");
-add("selser", "Sanitizer: Validating that <meta> and <link> work, but only for 
Microdata [[0,1,0]]", "<div itemscope>\n\t<nowiki><meta itemprop=\"hello\" 
content=\"world\">\n\t<meta http-equiv=\"refresh\" content=\"5\">\n\t<meta 
itemprop=\"hello\" http-equiv=\"refresh\" content=\"5\">\n\t<link 
itemprop=\"hello\" href=\"{{SERVER}}\">\n\t<link rel=\"stylesheet\" 
href=\"{{SERVER}}\">\n\t<link rel=\"stylesheet\" itemprop=\"hello\" 
href=\"{{SERVER}}\"></nowiki>\n</div>");
-add("selser", "Sanitizer: Validating that <meta> and <link> work, but only for 
Microdata [[0,[2],0]]", "<div itemscope>\n\tx3hbyea8xovtpgb9<nowiki><meta 
itemprop=\"hello\" content=\"world\">\n\t<meta http-equiv=\"refresh\" 
content=\"5\">\n\t<meta itemprop=\"hello\" http-equiv=\"refresh\" 
content=\"5\">\n\t<link itemprop=\"hello\" href=\"{{SERVER}}\">\n\t<link 
rel=\"stylesheet\" href=\"{{SERVER}}\">\n\t<link rel=\"stylesheet\" 
itemprop=\"hello\" href=\"{{SERVER}}\"></nowiki>\n</div>");
+add("selser", "Sanitizer: Validating that <meta> and <link> work, but only for 
Microdata [[2,1,0]]", "<div itemscope>px2m4ecth1qyqfr\n\t<nowiki><meta 
itemprop=\"hello\" content=\"world\"></nowiki>\n\t<nowiki><meta 
http-equiv=\"refresh\" content=\"5\"></nowiki>\n\t<nowiki><meta 
itemprop=\"hello\" http-equiv=\"refresh\" 
content=\"5\"></nowiki>\n\t<nowiki><link itemprop=\"hello\" 
href=\"{{SERVER}}\"></nowiki>\n\t<nowiki><link rel=\"stylesheet\" 
href=\"{{SERVER}}\"></nowiki>\n\t<nowiki><link rel=\"stylesheet\" 
itemprop=\"hello\" href=\"{{SERVER}}\"></nowiki>\n</div>");
+add("selser", "Sanitizer: Validating that <meta> and <link> work, but only for 
Microdata [[0,1,0]]", "<div itemscope>\n\t<nowiki><meta itemprop=\"hello\" 
content=\"world\"></nowiki>\n\t<nowiki><meta http-equiv=\"refresh\" 
content=\"5\"></nowiki>\n\t<nowiki><meta itemprop=\"hello\" 
http-equiv=\"refresh\" content=\"5\"></nowiki>\n\t<nowiki><link 
itemprop=\"hello\" href=\"{{SERVER}}\"></nowiki>\n\t<nowiki><link 
rel=\"stylesheet\" href=\"{{SERVER}}\"></nowiki>\n\t<nowiki><link 
rel=\"stylesheet\" itemprop=\"hello\" href=\"{{SERVER}}\"></nowiki>\n</div>");
+add("selser", "Sanitizer: Validating that <meta> and <link> work, but only for 
Microdata [[0,[2],0]]", "<div itemscope>\n\tx3hbyea8xovtpgb9<nowiki><meta 
itemprop=\"hello\" content=\"world\"></nowiki>\n\t<nowiki><meta 
http-equiv=\"refresh\" content=\"5\"></nowiki>\n\t<nowiki><meta 
itemprop=\"hello\" http-equiv=\"refresh\" 
content=\"5\"></nowiki>\n\t<nowiki><link itemprop=\"hello\" 
href=\"{{SERVER}}\"></nowiki>\n\t<nowiki><link rel=\"stylesheet\" 
href=\"{{SERVER}}\"></nowiki>\n\t<nowiki><link rel=\"stylesheet\" 
itemprop=\"hello\" href=\"{{SERVER}}\"></nowiki>\n</div>");
 add("selser", "Sanitizer: Validating that <meta> and <link> work, but only for 
Microdata [1]", "<div itemscope=\"\" data-foobar=\"q8adwgvp6owjc3di\">\n\t<meta 
itemprop=\"hello\" content=\"world\">\n\t<meta http-equiv=\"refresh\" 
content=\"5\">\n\t<meta itemprop=\"hello\" http-equiv=\"refresh\" 
content=\"5\">\n\t<link itemprop=\"hello\" href=\"{{SERVER}}\">\n\t<link 
rel=\"stylesheet\" href=\"{{SERVER}}\">\n\t<link rel=\"stylesheet\" 
itemprop=\"hello\" href=\"{{SERVER}}\">\n</div>");
 add("selser", "Sanitizer: Validating that <meta> and <link> work, but only for 
Microdata [[2,2,0]]", "<div itemscope>tphlnpjbn019k9\n\tzfr328x4l016pqfr\n<meta 
itemprop=\"hello\" content=\"world\">\n\t<meta http-equiv=\"refresh\" 
content=\"5\">\n\t<meta itemprop=\"hello\" http-equiv=\"refresh\" 
content=\"5\">\n\t<link itemprop=\"hello\" href=\"{{SERVER}}\">\n\t<link 
rel=\"stylesheet\" href=\"{{SERVER}}\">\n\t<link rel=\"stylesheet\" 
itemprop=\"hello\" href=\"{{SERVER}}\">\n</div>");
 add("selser", "Sanitizer: Validating that <meta> and <link> work, but only for 
Microdata [[3,0,4]]", "<div itemscope>\n<meta itemprop=\"hello\" 
content=\"world\">\n\t<meta http-equiv=\"refresh\" content=\"5\">\n\t<meta 
itemprop=\"hello\" http-equiv=\"refresh\" content=\"5\">\n\t<link 
itemprop=\"hello\" href=\"{{SERVER}}\">\n\t<link rel=\"stylesheet\" 
href=\"{{SERVER}}\">\n\t<link rel=\"stylesheet\" itemprop=\"hello\" 
href=\"{{SERVER}}\">\naqpwsr7leatyy14i</div>");
@@ -2504,7 +2490,7 @@
 add("selser", "Improperly nested inline or quotes tags with whitespace in 
between [[[0,3],[3],0,3,0]]", "<span> </span></s>\n ''");
 add("selser", "Improperly nested inline or quotes tags with whitespace in 
between [[[2,1],[3],3,[0,3],0]]", "<span>i9p8te7ufdmquxr <s 
data-foobar=\"xoximjgruc95dn29\">x</span></s>''' ''' ''");
 add("selser", "2. Ensure fostered text content is wrapped in element nodes 
(traps regressions around fostered marker on the element getting lost) 
[0,4,[2,[[4],2]]]", 
"\n\neyvglbq1wiykfbt9<table><!--yjj7q4l8vy22o6r-->\n<tr><td>c2kzihajh6oxyldi</td><!--u6dd8p15d8guv7vi-->\n</table>");
-add("selser", "2. Ensure fostered text content is wrapped in element nodes 
(traps regressions around fostered marker on the element getting lost) 
[1,3,[2,[[4],3]]]", "<nowiki> </nowiki><nowiki>|| 
||</nowiki><table><!--07pdt8u7nxvcmcxr-->\n<tr><td>w6cuullrqw0wl8fr</td>\n</table>");
+add("selser", "2. Ensure fostered text content is wrapped in element nodes 
(traps regressions around fostered marker on the element getting lost) 
[1,3,[2,[[4],3]]]", "<nowiki> </nowiki><nowiki>||</nowiki> 
<nowiki>||</nowiki><table><!--07pdt8u7nxvcmcxr-->\n<tr><td>w6cuullrqw0wl8fr</td>\n</table>");
 add("selser", "2. Ensure fostered text content is wrapped in element nodes 
(traps regressions around fostered marker on the element getting lost) 
[3,2,2]", "r7yvmnw0lwstt9\njvym2daxe28adcxr<table>\n<tr> || ||\n<td> 
a\n</table>");
 add("selser", "2. Ensure fostered text content is wrapped in element nodes 
(traps regressions around fostered marker on the element getting lost) 
[3,2,1]", "mk36x4nnqo7p66r\n<table data-foobar=\"j76ebe3ig8u59udi\">\n<tr> || 
||\n<td> a\n</table>");
 add("selser", "2. Ensure fostered text content is wrapped in element nodes 
(traps regressions around fostered marker on the element getting lost) 
[0,3,[2,2]]", "<table><!--20ybuhlylvnjc3di-->\n<!--ia2m4awxfye97ldi--><tr><td> 
a\n</table>");
@@ -2516,7 +2502,7 @@
 add("selser", "2. Ensure fostered text content is wrapped in element nodes 
(traps regressions around fostered marker on the element getting lost) 
[0,3,4]", "\n\n9k078dwzmb6e0zfr\n");
 add("selser", "2. Ensure fostered text content is wrapped in element nodes 
(traps regressions around fostered marker on the element getting lost) 
[[3],0,2]", "\n79u7w8mk0qyc766r<table>\n<tr> || ||\n<td> a\n</table>");
 add("selser", "2. Ensure fostered text content is wrapped in element nodes 
(traps regressions around fostered marker on the element getting lost) 
[0,0,2]", "\n17g7ad7yjq1zia4i<table>\n<tr> || ||\n<td> a\n</table>");
-add("selser", "2. Ensure fostered text content is wrapped in element nodes 
(traps regressions around fostered marker on the element getting lost) 
[1,0,1]", "<nowiki> </nowiki><nowiki>|| ||</nowiki>\n<table 
data-foobar=\"734xmyt3rp5jyvi\">\n<tr> || ||\n<td> a\n</table>");
+add("selser", "2. Ensure fostered text content is wrapped in element nodes 
(traps regressions around fostered marker on the element getting lost) 
[1,0,1]", "<nowiki> </nowiki><nowiki>||</nowiki> <nowiki>||</nowiki>\n<table 
data-foobar=\"734xmyt3rp5jyvi\">\n<tr> || ||\n<td> a\n</table>");
 add("selser", "2. Ensure fostered text content is wrapped in element nodes 
(traps regressions around fostered marker on the element getting lost) 
[2,0,[0,3]]", "z8xg0t8oxy8k6gvi\n\n\n<table></table>");
 add("selser", "2. Ensure fostered text content is wrapped in element nodes 
(traps regressions around fostered marker on the element getting lost) 
[2,2,[2,[3,2]]]", 
"4p9b5ylwp6gpsyvi\n\n\n\n52u735k3ah96n7b9\n<table><!--u4n4phdgngffxbt9-->\n<!--ox538fcmtef2bj4i-->\n</table>");
 add("selser", "Table in fosterable position 5", 
"{{OpenTable}}\n<div>\n{|\n|}\n");
diff --git a/tests/parserTests.txt b/tests/parserTests.txt
index 47d4134..43717ce 100644
--- a/tests/parserTests.txt
+++ b/tests/parserTests.txt
@@ -1367,9 +1367,11 @@
 <nowiki> unordered list
 !! wikitext
 <nowiki>* This is not an unordered list item.</nowiki>
-!! html
+!! html/php
 <p>* This is not an unordered list item.
 </p>
+!! html/parsoid
+<p><span typeof="mw:Nowiki">* This is not an unordered list item.</span></p>
 !! end
 
 !! test
@@ -1382,7 +1384,7 @@
 
 :and a colon
 </nowiki>
-!! html
+!! html/php
 <p>Lorem ipsum dolor
 
 sed abit.
@@ -1391,6 +1393,14 @@
 :and a colon
 
 </p>
+!! html/parsoid
+<p><span typeof="mw:Nowiki">Lorem ipsum dolor
+
+sed abit.
+  sed nullum.
+
+:and a colon
+</span></p>
 !! end
 
 !! test
@@ -1404,7 +1414,7 @@
 
 *There is not nowiki.
 *There is <nowiki>nowiki</nowiki>.
-!! html
+!! html/php
 <dl><dd>There is not nowiki.</dd>
 <dd>There is nowiki.</dd></dl>
 <ol><li>There is not nowiki.</li>
@@ -1412,6 +1422,15 @@
 <ul><li>There is not nowiki.</li>
 <li>There is nowiki.</li></ul>
 
+!! html/parsoid
+<dl><dd data-parsoid='{}'>There is not nowiki.</dd>
+<dd data-parsoid='{}'>There is <span 
typeof="mw:Nowiki">nowiki</span>.</dd></dl>
+
+<ol><li data-parsoid='{}'>There is not nowiki.</li>
+<li data-parsoid='{}'>There is <span 
typeof="mw:Nowiki">nowiki</span>.</li></ol>
+
+<ul><li data-parsoid='{}'>There is not nowiki.</li>
+<li data-parsoid='{}'>There is <span 
typeof="mw:Nowiki">nowiki</span>.</li></ul>
 !! end
 
 !! test
@@ -1440,7 +1459,7 @@
 !! html
 <p>* &lt;/nowiki&gt; tag</p>
 !! wikitext
-<nowiki>* &lt;/nowiki&gt;</nowiki> tag
+<nowiki>*</nowiki> <nowiki>&lt;/nowiki&gt;</nowiki> tag
 !! end
 
 !! test
@@ -2227,7 +2246,7 @@
 </nowiki>
 </pre>
 
-!! html
+!! html/php
 <pre>
 &lt;nowiki&gt;
 </pre>
@@ -2240,6 +2259,18 @@
 
 &lt;/pre&gt;
 </p>
+!! html/parsoid
+<pre data-parsoid='{"stx":"html","strippedNL":true}'>&lt;nowiki>
+</pre>
+<p><span typeof="mw:Placeholder" 
data-parsoid='{"src":"&lt;/nowiki>"}'>&lt;/nowiki></span>
+&lt;/pre></p>
+
+<p><span typeof="mw:Nowiki">
+&lt;pre>
+&lt;nowiki>
+&lt;/pre>
+</span>
+&lt;/pre></p>
 !! end
 
 !! test
@@ -3401,7 +3432,7 @@
 '' no-italic ''
 [[ NoLink ]]
 </pre>
-!! html
+!! html/php
 <pre>
 * foo
 # bar
@@ -3410,6 +3441,13 @@
 [[ NoLink ]]
 </pre>
 
+!! html/parsoid
+<pre data-parsoid='{"stx":"html","strippedNL":true}'>* foo
+# bar
+= no-h =
+'' no-italic ''
+[[ NoLink ]]
+</pre>
 !!end
 
 ###
@@ -21606,8 +21644,6 @@
 
 !! test
 Headings: 6a. Heading chars in SOL context (with trailing spaces)
-!! options
-parsoid
 !! wikitext
 <nowiki>=a=</nowiki>
 
@@ -21616,17 +21652,24 @@
 <nowiki>=a=</nowiki>   
 
 <nowiki>=a=</nowiki>   
-!! html
-<p>=a=</p>
-<p>=a= </p>
-<p>=a= </p>
-<p>=a=         </p>
+!! html/php
+<p>=a=
+</p><p>=a= 
+</p><p>=a=     
+</p><p>=a=     
+</p>
+!! html/parsoid
+<p><span typeof="mw:Nowiki">=a=</span></p>
+
+<p><span typeof="mw:Nowiki">=a=</span></p> 
+
+<p><span typeof="mw:Nowiki">=a=</span></p>     
+
+<p><span typeof="mw:Nowiki">=a=</span></p>     
 !!end
 
 !! test
 Headings: 6b. Heading chars in SOL context (with trailing newlines)
-!! options
-parsoid
 !! wikitext
 <nowiki>=a=
 b</nowiki>
@@ -21639,48 +21682,65 @@
 
 <nowiki>=a=     
 b</nowiki>
-!! html
+!! html/php
 <p>=a=
-b</p>
-<p>=a= 
-b</p>
-<p>=a= 
-b</p>
-<p>=a=  
-b</p>
+b
+</p><p>=a= 
+b
+</p><p>=a=     
+b
+</p><p>=a=      
+b
 </p>
+!! html/parsoid
+<p><span typeof="mw:Nowiki">=a=
+b</span></p>
+
+<p><span typeof="mw:Nowiki">=a= 
+b</span></p>
+
+<p><span typeof="mw:Nowiki">=a=        
+b</span></p>
+
+<p><span typeof="mw:Nowiki">=a=         
+b</span></p>
 !!end
 
 !! test
 Headings: 6c. Heading chars in SOL context (leading newline break)
-!! options
-parsoid
 !! wikitext
 a
 <nowiki>=b=</nowiki>
-!! html
+!! html/php
 <p>a
-=b=</p>
+=b=
+</p>
+!! html/parsoid
+<p>a
+<span typeof="mw:Nowiki">=b=</span>
 !!end
 
 !! test
 Headings: 6d. Heading chars in SOL context (with interspersed comments)
-!! options
-parsoid
 !! wikitext
 <!--c0--><nowiki>=a=</nowiki>
 
 <!--c1--><nowiki>=a=</nowiki> <!--c2-->         <!--c3-->
-!! html
-<p><!--c0-->=a=</p>
-<p><!--c1-->=a= <!--c2-->       <!--c3--></p>
+!! html/php
+<p>=a=
+</p><p>=a=      
+</p>
+!! html/parsoid
+<!--c0--><p><span typeof="mw:Nowiki">=a=</span></p>
+
+<!--c1--><p><span typeof="mw:Nowiki">=a=</span></p> <!--c2-->   <!--c3-->
 !!end
 
 !! test
 Headings: 6d. Heading chars in SOL context (No escaping needed)
 !! options
 parsoid=html2wt
-!! html
+!! html/parsoid
 =a=<div>b</div>
 !! wikitext
 =a=<div>b</div>
@@ -21690,11 +21750,11 @@
 Headings: 7. Insert a newline between new content and headings
 !! options
 parsoid=html2wt
-!! html
+!! html/parsoid
 <h2>NEW</h2>
 <p>new</p>
-<h2 data-parsoid='{"dsr":[0,5,2,2]}'>A</h2>
-<p data-parsoid='{"dsr":[6,7,0,0]}'>a</p>
+<h2 data-parsoid='{}'>A</h2>
+<p data-parsoid='{}'>a</p>
 !! wikitext
 == NEW ==
 new
@@ -21723,11 +21783,17 @@
 <nowiki>#</nowiki>foo
 
 <nowiki>;Foo:</nowiki>bar
-!! html
+!! html/php
 <p>*foo
 </p><p>#foo
 </p><p>;Foo:bar
 </p>
+!! html/parsoid
+<p><span typeof="mw:Nowiki">*</span>foo</p>
+
+<p><span typeof="mw:Nowiki">#</span>foo</p>
+
+<p><span typeof="mw:Nowiki">;Foo:</span>bar</p>
 !!end
 
 !! test

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

Gerrit-MessageType: newchange
Gerrit-Change-Id: I7aa00ee0020c5f69c3acb1cab069ceab77b75ab4
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/services/parsoid
Gerrit-Branch: master
Gerrit-Owner: Arlolra <[email protected]>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to