jenkins-bot has submitted this change and it was merged.

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.

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

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



diff --git a/lib/wts.escapeWikitext.js b/lib/wts.escapeWikitext.js
index 9ec7c2c..e60eb82 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,22 @@
                        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;
-
-                               // If we are being asked to close a nowiki
-                               // without opening one, we open a nowiki.
-                               //
-                               // Ex: "</s>" will parse to an end-tag
-                               if (open || (close && !inNowiki)) {
-                                       if (!inNowiki) {
-                                               buf += "<nowiki>";
-                                               inNowiki = true;
-                                               nowikisAdded = true;
-                                       }
+                       var nowikiWrap = function(str, close) {
+                               if (!inNowiki) {
+                                       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 +440,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);
+                                                               } else {
+                                                                       buf += 
' ';
                                                                }
-                                                               nowikisAdded = 
true;
+                                                               buf += x[k + 1];
                                                        }
                                                } else {
                                                        buf += t;
@@ -496,20 +472,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]), 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]), 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);
                                        }
                                        sol = false;
                                        break;
@@ -518,16 +494,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);
                        }
 
                        buf += nls;
diff --git a/tests/parserTests-blacklist.js b/tests/parserTests-blacklist.js
index 99855e0..bfafb55 100644
--- a/tests/parserTests-blacklist.js
+++ b/tests/parserTests-blacklist.js
@@ -370,7 +370,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>");
@@ -391,7 +391,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|}");
@@ -430,7 +430,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");
 
@@ -549,7 +549,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");
@@ -1118,7 +1118,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");
@@ -1910,7 +1910,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>");
@@ -2051,16 +2051,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>");
@@ -2467,7 +2467,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>");
@@ -2479,7 +2479,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 8f7cedf..94e7268 100644
--- a/tests/parserTests.txt
+++ b/tests/parserTests.txt
@@ -1459,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

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

Gerrit-MessageType: merged
Gerrit-Change-Id: I7aa00ee0020c5f69c3acb1cab069ceab77b75ab4
Gerrit-PatchSet: 4
Gerrit-Project: mediawiki/services/parsoid
Gerrit-Branch: master
Gerrit-Owner: Arlolra <abrea...@wikimedia.org>
Gerrit-Reviewer: Arlolra <abrea...@wikimedia.org>
Gerrit-Reviewer: Cscott <canan...@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