Subramanya Sastry has uploaded a new change for review.

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

Change subject: DOMDiff: Get rid of 'modified' diff marker
......................................................................

DOMDiff: Get rid of 'modified' diff marker

* This was an awkward flag anyway and turns out, it was being
  added redundantly.

* If a diff between node OLD and node NEW wasn't found (even with
  deep lookaheads in both doms), we were advancing the pointer in
  the old dom without advancing the pointer in the new dom. This
  ensured that we'll check for shallow node compares and find
  improved diffs. In the end, if we run off the end of all siblings
  in the old dom, we mark all the new nodes as "inserted".

  The 'modified' flag adding no new information, but when encountered,
  pushed selser into a conservative mode.

* By removing the flag, it turns out selser is more accurate as
  shown all the "newly failing" selser tests. I verified about
  3 or 4 of these, and in all cases, the selser output is more
  accurate than before (less dirtying).

* Also did some minor comment cleanup.

Change-Id: I14d2aaced1f50ed6867448fd38e5d95d67b79f54
---
M lib/mediawiki.DOMDiff.js
M lib/mediawiki.DOMUtils.js
M lib/mediawiki.WikitextSerializer.js
M tests/parserTests-blacklist.js
4 files changed, 53 insertions(+), 46 deletions(-)


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

diff --git a/lib/mediawiki.DOMDiff.js b/lib/mediawiki.DOMDiff.js
index c3e26d7..ba8eeb1 100644
--- a/lib/mediawiki.DOMDiff.js
+++ b/lib/mediawiki.DOMDiff.js
@@ -32,17 +32,6 @@
        // SSS FIXME: Why are we cloning??
        var workNode = node.cloneNode(true);
 
-       // SSS FIXME: Is this required?
-       //
-       // First do a quick check on the top-level nodes themselves
-       // FIXME gwicke: Disabled for now as the VE seems to drop data-parsoid 
on
-       // the body and the serializer does not respect a 'modified' flag on the
-       // body. This also assumes that we always diff on the body element.
-       //  if (!this.treeEquals(this.env.page.dom, workNode, false)) {
-       //      this.markNode(workNode, 'modified');
-       //      return { isEmpty: false, dom: workNode };
-       //  }
-
        // The root nodes are equal, call recursive differ
        this.debug('ORIG:\n', this.env.page.dom.outerHTML, '\nNEW :\n', 
workNode.outerHTML);
        var foundChange = this.doDOMDiff(this.env.page.dom, workNode);
@@ -162,7 +151,7 @@
 };
 
 /**
- * Test if two DOM nodes are equal without testing subtrees
+ * Test if two DOM nodes are equal
  */
 DDP.treeEquals = function(nodeA, nodeB, deep) {
        if (nodeA.nodeType !== nodeB.nodeType) {
@@ -315,7 +304,7 @@
                                } else if (savedNewNode.nodeName === 
baseNode.nodeName &&
                                        DU.getDataParsoid(savedNewNode).stx === 
DU.getDataParsoid(baseNode).stx) {
                                        // Identical wrapper-type, but modified.
-                                       // Mark as modified, and recurse.
+                                       // Mark modified-wrapper, and recurse.
                                        this.debug("--found diff: 
modified-wrapper--");
                                        this.markNode(savedNewNode, 
'modified-wrapper');
                                        if 
(!DU.isTplOrExtToplevelNode(baseNode) &&
@@ -324,19 +313,13 @@
                                                this.doDOMDiff(baseNode, 
savedNewNode);
                                        }
                                } else {
-                                       // Mark the sub-tree as modified since
-                                       // we have two entirely different nodes 
here
-                                       this.debug("--found diff: modified--");
-                                       this.markNode(savedNewNode, 'modified');
-
-                                       // If the two subtree are drastically 
different, clearly,
-                                       // there were deletions in the new 
subtree before 'savedNewNode'.
-                                       // Add a deletion marker since this is 
important for accurate
-                                       // separator handling in selser.
-                                       this.markNode(savedNewNode, 'deleted', 
DU.isBlockNodeWithVisibleWT(baseNode));
-
                                        // We now want to compare current 
newNode with the next baseNode.
                                        dontAdvanceNewNode = true;
+
+                                       // Since we are advancing in an old DOM 
without advancing
+                                       // in the new DOM, there were 
deletions. Add a deletion marker
+                                       // since this is important for accurate 
separator handling in selser.
+                                       this.markNode(savedNewNode, 'deleted', 
DU.isBlockNodeWithVisibleWT(baseNode));
                                }
                        }
 
@@ -365,7 +348,7 @@
                }
        }
 
-       // mark extra new nodes as modified
+       // mark extra new nodes as inserted
        while (newNode) {
                this.debug("--found trailing new node: inserted--");
                this.markNode(newNode, 'inserted');
diff --git a/lib/mediawiki.DOMUtils.js b/lib/mediawiki.DOMUtils.js
index 1938901..7981f5f 100644
--- a/lib/mediawiki.DOMUtils.js
+++ b/lib/mediawiki.DOMUtils.js
@@ -998,11 +998,9 @@
                return dmark && dmark.diff.indexOf('children-changed') !== -1;
        },
 
-       hasInsertedOrModifiedDiffMark: function(node, env) {
+       hasInsertedDiffMark: function(node, env) {
                var diffMark = this.currentDiffMark(node, env);
-               return diffMark &&
-                       (diffMark.diff.indexOf('modified') >= 0 ||
-                               diffMark.diff.indexOf('inserted') >= 0);
+               return diffMark && diffMark.diff.indexOf('inserted') >= 0;
        },
 
        /**
diff --git a/lib/mediawiki.WikitextSerializer.js 
b/lib/mediawiki.WikitextSerializer.js
index 64864e8..b659938 100644
--- a/lib/mediawiki.WikitextSerializer.js
+++ b/lib/mediawiki.WikitextSerializer.js
@@ -914,7 +914,7 @@
 
                // If previous sibling is unmodified, nothing to worry about.
                if (!DU.isMarkerMeta(prev, "mw:DiffMarker") &&
-                       !DU.hasInsertedOrModifiedDiffMark(prev, state.env)) {
+                       !DU.hasInsertedDiffMark(prev, state.env)) {
                        return true;
                }
 
@@ -948,7 +948,7 @@
                // If a previous sibling was modified, we can't reuse the start 
dsr.
                while (prev) {
                        if (DU.isMarkerMeta(prev, 'mw:DiffMarker') ||
-                               DU.hasInsertedOrModifiedDiffMark(prev, 
state.env)
+                               DU.hasInsertedDiffMark(prev, state.env)
                        ) {
                                return false;
                        }
@@ -1132,7 +1132,7 @@
                                if (domHandler && domHandler.handle) {
                                        // DOM-based serialization
                                        try {
-                                               if (state.selserMode && 
DU.hasInsertedOrModifiedDiffMark(node, this.env)) {
+                                               if (state.selserMode && 
DU.hasInsertedDiffMark(node, this.env)) {
                                                        state.inModifiedContent 
= true;
                                                        nextNode = 
domHandler.handle(node, state, cb, wrapperUnmodified);
                                                        state.inModifiedContent 
= false;
diff --git a/tests/parserTests-blacklist.js b/tests/parserTests-blacklist.js
index 6d56c79..30dd794 100644
--- a/tests/parserTests-blacklist.js
+++ b/tests/parserTests-blacklist.js
@@ -1454,12 +1454,14 @@
 add("selser", "Parsoid only: Quote balancing context should be restricted to 
td/th cells on the same wikitext line\n(Requires tidy for PHP parser output to 
be fixed up) [[0,[[4,2,3,0,2],0]]]", 
"{|\n!4hvneujbci0be29\n!dlmqv8ltd9lfpqfr!!''b\n|''a\n|1pz8cymf9xm9529||''b\n|}");
 add("selser", "Parsoid only: Quote balancing context should be restricted to 
td/th cells on the same wikitext line\n(Requires tidy for PHP parser output to 
be fixed up) [[0,[[1,2,0,1,[[2]]],0]]]", "{|\n! data-foobar=\"t5yzsleh3tprpb9\" 
|''a\n!39y1a3cg7nyrdx6r!!''b\n| data-foobar=\"e4eryq6zjlaexw29\" 
|''a||''ud4ocn5ppv3rf6rb''\n|}");
 add("selser", "Parsoid only: Quote balancing context should be restricted to 
td/th cells on the same wikitext line\n(Requires tidy for PHP parser output to 
be fixed up) [[0,[1,4]]]", 
"{|\n!''a!!''b\n|''a||''b<!--kstn821po5cgcik9-->\n|}");
+add("selser", "Parsoid only: Quote balancing context should be restricted to 
td/th cells on the same wikitext line\n(Requires tidy for PHP parser output to 
be fixed up) [[3,[2,4]]]", 
"{|<!--nqj6st564egkfbt9-->\n!''a!!''b\n|''a||''b<!--mbdymwqqr02uik9-->\n|}");
 add("selser", "Parsoid only: Quote balancing context should be restricted to 
td/th cells on the same wikitext line\n(Requires tidy for PHP parser output to 
be fixed up) [[4,1]]", "{|<!--etpqkkwhhxhl4n29-->\n!''a!!''b\n|''a||''b\n|}");
 add("selser", "Non-word characters don't terminate tag names (bug 17663, 
40670, 52022) 5", "<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("selser", "Non-word characters don't terminate tag names + tidy 5", 
"<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("selser", "Empty lines between lines with block tags 
[0,0,0,0,4,[4],0,4,2,4,2,0,0,3,3,0,0,[4]]", 
"<div></div>\n\n\n0jr2knw69qode7b9\n\nak4f0xoun9bv5cdi\n\n4us29365j9f9lik9\n\n3sh6psvknz3hm2t9\n\n8z2ywhrg9wl8fr\n\nz7s9at3qyq2xogvi\n\nb\n\n<div>b</div>\n<div>h2r4miiukcoez5mi</div>");
 add("selser", "Empty lines between lines with block tags 
[0,4,2,2,0,4,0,[2],0,[4],3,0,0,0,0,2,3,0]", 
"<div></div>g72sdt9b9996bt9\n\nau765cdgwcsg7gb9\n\n\n\nqhrfek8hsgkz9f6r\n<div></div>rw83ofcbk55vzpvi\n\nvky2au8c7nmnp14ib\n<div>eu25mfmjxi0sh5mi</div>\n\n<div>b</div>d\n\nvxxu49npeng66r\n\n<div>e</div>");
 add("selser", "<nowiki> inside <pre> (bug 13238) [4,2,2,0,0]", 
"ptjux9vq9zarlik9\n\ny7rebotz1jo1dcxr\nnb7mtl9jj0jm7vi<pre>\n<nowiki></nowiki>\n</pre>\n<pre><nowiki><nowiki></nowiki>Foo<nowiki></nowiki></nowiki></pre>");
+add("selser", "<nowiki> inside <pre> (bug 13238) [0,3,1,0,3]", 
"<pre>\n<nowiki>\n</pre><pre 
data-foobar=\"d4vv2qk2d3wel8fr\">\n\n<nowiki></nowiki>\n</pre>\n");
 add("selser", "<nowiki> inside <pre> (bug 13238) [3,0,3,3,2]", 
"\np32i6amoddb9y66r<pre><nowiki><nowiki></nowiki>Foo<nowiki></nowiki></nowiki></pre>");
 add("selser", "<nowiki> inside <pre> (bug 13238) [0,3,3,0,2]", 
"<pre>\n<nowiki>\n</pre>\nf1s3by12sbw97ldi<pre><nowiki><nowiki></nowiki>Foo<nowiki></nowiki></nowiki></pre>");
 add("selser", "<nowiki> inside <pre> (bug 13238) [[3],0,[0,3],3,[4,0,1,2]]", 
"<pre></pre>\n<pre>\n\n<nowiki></nowiki></pre><pre>8snncrntp84ims4iFoo<nowiki></nowiki>vdl3ymz68paurf6r</nowiki></pre>");
@@ -1470,6 +1472,7 @@
 add("selser", "<nowiki> and <pre> preference (first one wins) 
[[4],0,3,0,0,0]", 
"<pre>\nhtov4vvjzewdygb9</pre>\n\n<nowiki>\n<pre>\n<nowiki>\n</pre>\n</nowiki>\n</pre>\n");
 add("selser", "<nowiki> and <pre> preference (first one wins) [3,4,3,0,2,0]", 
"u20jle5jk0hvkj4i\n\nn067pn35sxjsv2t9\n\n<nowiki>\n<pre>\n<nowiki>\n</pre>\n</nowiki>\n</pre>\n");
 add("selser", "<nowiki> and <pre> preference (first one wins) 
[[2],0,1,0,2,4]", 
"<pre>\n8ko393dqfxxvquxr<nowiki>\n</pre>\n</nowiki>\n</pre>\n\nmgac8wudaavy4x6r\n\n<nowiki>\n<pre>\n<nowiki>\n</pre>\n</nowiki>\n</pre>\n\n1js1f9r56vl5wmi\n");
+add("selser", "<nowiki> and <pre> preference (first one wins) 
[[4],0,1,3,1,0]", 
"<pre>\nbv7gok2svqntgldi</pre>\n</nowiki>\n</pre>\n\n<nowiki>\n<pre>\n<nowiki>\n</pre>\n</nowiki>\n</pre>\n");
 add("selser", "<nowiki> and <pre> preference (first one wins) 
[4,0,2,0,[0,4],4]", 
"tdqftxhs7bsxlxr\n\nup3ot7cx78sq0k9\n\n</nowiki>\n</pre>\n\n<nowiki>\n<pre>\n<nowiki>\n</pre>\n</nowiki>57nnl6navsmaq0k9\n\nops9m7gl3ee1att9\n");
 add("selser", "<nowiki> and <pre> preference (first one wins) 
[0,0,[2,2],0,2,0]", 
"<pre>\n<nowiki>\n</pre>\nayl0rt9j2rvvlsor</nowiki>ku5wz6d4oixjemi\n</pre>\n\naoia6vijp7722o6r\n\n<nowiki>\n<pre>\n<nowiki>\n</pre>\n</nowiki>\n</pre>\n");
 add("selser", "Templates: Indent-Pre: 1f: Wrapping should be based on expanded 
content [0,4,0,0,0,0,0,3,0,0,0,4,0,0,[3]]", "{{echo| 
}}axyuf8omjvhxv42t9{{echo|\n }}a\n\n{{echo|\n b}}\n{{echo|a\n 
}}b\nrnjrx8un9rvsra4i{{echo|a\n}} ");
@@ -1562,23 +1565,23 @@
 add("selser", "External links: wiki links within external link (Bug 3695) 
[[0,2,0]]", "[http://example.com [[wikilink]] embedded in ext 
link]pj9l2glwx6sf9a4i\n");
 add("selser", "External links: wiki links within external link (Bug 3695) 
[[0,4,0]]", "[http://example.com [[wikilink]] embedded in ext 
link]2zzejaf2y9nc23xr\n");
 add("selser", "External links: wiki links within external link (Bug 3695) 
[[3,2,0]]", "0uk611ztql8wu3di\n");
-add("selser", "Bug 2702: Mismatched <i>, <b> and <a> tags are invalid 
[[3,0,[2],0,3,4,3,[0,[0,[1]],4],0,1]]", "\n[http://example.com 
4n2162e1fd730udi'''text''']'''rgd08hyitua0pb9''Something [http://example.com 
mixed''''', even bold''''']l55strlralri19k9''\n'''''Now [http://example.com 
both'''''<nowiki/>''''']'''''");
+add("selser", "Bug 2702: Mismatched <i>, <b> and <a> tags are invalid 
[[3,0,[2],0,3,4,3,[0,[0,[1]],4],0,1]]", "\n[http://example.com 
4n2162e1fd730udi'''text]'''rgd08hyitua0pb9''Something [http://example.com 
mixed''''', even bold''''']l55strlralri19k9''\n'''''Now [http://example.com 
both''''']'''");
 add("selser", "Bug 2702: Mismatched <i>, <b> and <a> tags are invalid [1]", 
"''[http://example.com text'']\n[http://example.com '''text]'''\n''Something 
[http://example.com in italic'']\n''Something [http://example.com mixed''''', 
even bold]'''\n'''''Now [http://example.com both''''']");
 add("selser", "Bug 2702: Mismatched <i>, <b> and <a> tags are invalid [2]", 
"ypjgrwin4revcxr\n\n''[http://example.com text'']\n[http://example.com 
'''text]'''\n''Something [http://example.com in italic'']\n''Something 
[http://example.com mixed''''', even bold]'''\n'''''Now [http://example.com 
both''''']");
 add("selser", "Bug 2702: Mismatched <i>, <b> and <a> tags are invalid 
[[[[0,1]],0,3,1,4,1,3,[0,[0,[[3]]],3],4,3]]", "''[http://example.com 
text''<nowiki/>'']''\n'''<nowiki/>'''7qwqa9229ey7gb9''Something 
[http://example.com in italic'']Something [http://example.com 
mixed'''''<nowiki/>''''']''counvgra3151xlxr\n");
-add("selser", "Bug 2702: Mismatched <i>, <b> and <a> tags are invalid 
[[2,0,4,4,2,1,0,3,0,4]]", "fxsbmxalr8f9wwmi''[http://example.com 
text'']\ng1cxmyk709vygb9kr3b7p92rmg0t3xrc6f6w79eiwfjemi\n''Something 
[http://example.com in italic''<nowiki/>'']''\n\nxqwjvsy7ltvgqfr\n");
+add("selser", "Bug 2702: Mismatched <i>, <b> and <a> tags are invalid 
[[2,0,4,4,2,1,0,3,0,4]]", "fxsbmxalr8f9wwmi''[http://example.com 
text'']\ng1cxmyk709vygb9kr3b7p92rmg0t3xrc6f6w79eiwfjemi\n''Something 
[http://example.com in italic'']''\n\nxqwjvsy7ltvgqfr\n");
 add("selser", "Bug 2702: Mismatched <i>, <b> and <a> tags are invalid 
[[4,0,0,0,0,4,4,4,0,[3]]]", "0zdw3pkk57hnnrk9\n[http://example.com 
'''text]'''\nizanpf6huff20529vfp1wv58jce1xlxry331mymvx0cc8fr\n'''<nowiki/>'''");
 add("selser", "Bug 2702: Mismatched <i>, <b> and <a> tags are invalid 
[[1,3,2,2,0,1,4,[0,3,0],0,[4]]]", "''[http://example.com 
text'']''9ois0yoxiebfbt9[http://example.com 
'''text]saoppxketkic0udi'''\n''Something [http://example.com in 
italic'']''o0hyqnpaq38cwhfr''Something '<nowiki/>''\n'''hyq0ggqn4hzadcxr'''");
-add("selser", "Bug 2702: Mismatched <i>, <b> and <a> tags are invalid 
[[3,0,3,3,4,[3,[4,0]],0,[0,1,3],0,[[3,[0,2]]]]]", 
"\nsjft3sgyl0i9t3xr''[http://example.com 
spz6gumbba84zpvi''<nowiki/>'']''\n''Something [http://example.com mixed''''', 
even bold]''\n'''''[http://example.com 
bothi78rcmgoegtoi529'''''<nowiki/>''''']'''''");
+add("selser", "Bug 2702: Mismatched <i>, <b> and <a> tags are invalid 
[[3,0,3,3,4,[3,[4,0]],0,[0,1,3],0,[[3,[0,2]]]]]", 
"\nsjft3sgyl0i9t3xr''[http://example.com spz6gumbba84zpvi'']''\n''Something 
[http://example.com mixed''''', even bold]''\n'''''[http://example.com 
bothi78rcmgoegtoi529''''']'''''");
 add("selser", "Bug 2702: Mismatched <i>, <b> and <a> tags are invalid 
[[[3],0,[2],0,4,1,0,4,3,3]]", "''<nowiki/>''\n[http://example.com 
rgkc3a28h38cwhfr'''text]'''fuoqrsdna64dkj4i''Something [http://example.com in 
italic'']''\nmsb55932ah7rdx6r\n");
-add("selser", "Bug 2702: Mismatched <i>, <b> and <a> tags are invalid 
[[3,0,3,1,0,2,4,3,3,[[0,[0,1]]]]]", 
"\n'''<nowiki/>'''\nz032w7z1kdo0f6r''Something [http://example.com in 
italic'']o88q9qaoc6ljif6r'''''Now [http://example.com 
both'''''<nowiki/>''''']'''''");
+add("selser", "Bug 2702: Mismatched <i>, <b> and <a> tags are invalid 
[[3,0,3,1,0,2,4,3,3,[[0,[0,1]]]]]", 
"\n'''<nowiki/>'''\nz032w7z1kdo0f6r''Something [http://example.com in 
italic'']o88q9qaoc6ljif6r'''''Now [http://example.com both'''''''']'''''");
 add("selser", "Bug 2702: Mismatched <i>, <b> and <a> tags are invalid 
[[2,2,[2],1,0,[3,0],3,[3,[0,[[4]]],0],0,3]]", 
"o9nab4h230tnvcxr''[http://example.com 
text'']u5sfhyznivd3g14i\n[http://example.com 
isdro1map7qa1yvi'''text]'''<nowiki/>'''\n''[http://example.com in 
italic''][http://example.com mixed'''''o08ug21d18h3erk9''''']'<nowiki/>''\n");
 add("selser", "Bug 2702: Mismatched <i>, <b> and <a> tags are invalid 
[[[2],4,[[4]],0,4,[0,4],2,2,3,[4]]]", "''kndlu276kxz5b3xr[http://example.com 
text'']''66fz4jk56gtd42t9[http://example.com 
'''hbtqecdqt5oecdi''']'''sr9o6vidsk5u3di''Something 
81gi1py5yann4s4i''i1h0s35lu287iudi\nr1c3unvdylanhfr''Something 
[http://example.com mixed''''', even bold]''''''cwiw4wazt6kfn7b9'''");
 add("selser", "Bug 2702: Mismatched <i>, <b> and <a> tags are invalid 
[[2,0,3,0,3,2,0,[3,2,0],2,[3]]]", "rxaa2sxf4o8yqfr''[http://example.com 
text'']\n'''mtebxw1xl4x11yvi''Something [http://example.com in 
italic'']\n''vt2hxx23uta3v7vi[http://example.com mixed''''', even 
bold]'''fr3tlqbb4piizfr\n'''<nowiki/>'''");
 add("selser", "Bug 2702: Mismatched <i>, <b> and <a> tags are invalid 
[[4,2,0,0,4,[2,[4,1]],0,1,2,1]]", 
"uypp3nxnupst6gvi5lixlomwktb4vx6r\n[http://example.com 
'''text]'''1euo2nqbj6mvx6r''s5ucqw1bludz33diSomething [http://example.com 
iqi27jd7nxoxyldi''<nowiki/>'']''\n''Something [http://example.com mixed''''', 
even bold]'''3rrma1jx3c70hpvi\n'''''Now [http://example.com both''''']'''");
 add("selser", "Bug 2702: Mismatched <i>, <b> and <a> tags are invalid 
[[3,2,[4],0,0,1,2,3,4,[3]]]", "8co7ywkausb81tt9\n[http://example.com 
85zbd3drbz8pk3xr]'''\n''Something [http://example.com in 
italic'']''kce2gq57vem9ggb9\ni16rg8p39nj6ecdi'''<nowiki/>'''");
 add("selser", "Bug 2702: Mismatched <i>, <b> and <a> tags are invalid 
[[0,3,[4],2,0,[0,[0,1]],0,[3,[3,4],3],2,[[0,4]]]]", "''[http://example.com 
text''][http://example.com utcl2r0fq8lac3di]3qd60yxh5otakyb9'''\n''Something 
[http://example.com in italic''<nowiki/>'']''\n''[http://example.com 
dc0yjx5wecvaq0k9]''gbmw7avnratf0f6r\n'''''Now ozt1j409a2d42t9'''''");
-add("selser", "Bug 2702: Mismatched <i>, <b> and <a> tags are invalid 
[[2,4,0,4,0,1,2,1,0,2]]", "pv9ge46otv86w29''[http://example.com 
text'']t24xqdq7y0la0pb9[http://example.com '''text]10amjvk8ra1nhfr\n''Something 
[http://example.com in italic''<nowiki/>'']''l4tfdpdshpqilik9\n''Something 
[http://example.com mixed''''', even bold]'''\nziz3awxqv8lu9pb9'''''Now 
[http://example.com both''''']");
+add("selser", "Bug 2702: Mismatched <i>, <b> and <a> tags are invalid 
[[2,4,0,4,0,1,2,1,0,2]]", "pv9ge46otv86w29''[http://example.com 
text'']t24xqdq7y0la0pb9[http://example.com '''text]10amjvk8ra1nhfr\n''Something 
[http://example.com in italic'']''l4tfdpdshpqilik9\n''Something 
[http://example.com mixed''''', even bold]'''\nziz3awxqv8lu9pb9'''''Now 
[http://example.com both''''']");
 add("selser", "Bug 2702: Mismatched <i>, <b> and <a> tags are invalid 
[[0,0,4,4,0,[3,4],0,[4,[4,0],0],2,3]]", "''[http://example.com 
text'']\nxh33ebkbpr639pb9ikqa3l7jkhrdlsor\n''h327flpc5pbsxlxr''\n''3icsd821v6de7b9[http://example.com
 2cukbor10uanhfr''''', even bold]'''3cf3j98c7sfnipb9\n");
 add("selser", "External link containing double-single-quotes with no space 
separating the url from text in italics [[0,1,1]]", 
"[http://www.musee-picasso.fr/pages/page_id18528_u1l2.htm''La muerte de 
Casagemas'' (1901) en el sitio de [[Museo Picasso (París)|Museo 
Picasso]].][[Museo Picasso (París)|Museo Picasso]]<span 
data-foobar=\"w3fg9p5998n3tyb9\">.</span>\n");
 add("selser", "External link containing double-single-quotes with no space 
separating the url from text in italics [2]", 
"pl3umz8dotsdobt9\n\n[http://www.musee-picasso.fr/pages/page_id18528_u1l2.htm''La
 muerte de Casagemas'' (1901) en el sitio de [[Museo Picasso (París)|Museo 
Picasso]].]");
@@ -1601,17 +1604,18 @@
 add("selser", "Unclosed and unmatched quotes 
[[1],0,[1],0,[3],0,[2,2],0,4,0,4,2,4,0,3,0,4,0,[[0,[4]],0,3],0,4]", "'''''Bold 
italic text '''with bold deactivated''' in between.'''''\n\n'''''Bold italic 
text ''with italic deactivated'' in between.'''''\n\ny4h85lgdrtacerk9..spanning 
two paragraphs (should not 
work).3gnmqbeuuymbo6r'''\n\n3m9bvegcf03sor\n\nskw0gib981xde7b9\n\ndjjwoysazbvgqfr\n\nqcokvvv9z09kke29\n\nvmtyprts14m9rudi\n\n''Tom'''1qr9kmif90ox0f6r'''''<nowiki/>'''Susan'''\n\n5e2ez0in4um78pvi\n");
 add("selser", "Unclosed and unmatched quotes 
[[[3,0,[3]]],0,[1],0,2,2,3,0,[4],4,[4],0,0,3,0,4,[2,3,3,4,3,0],0,4,2,[0,3,4]]", 
"''with bold deactivated'''<nowiki/>'''''\n\n'''''Bold italic text ''with 
italic deactivated'' in between.'''''\n\nuimy0isfyrykfbt9\n\n'''Bold 
text..\n\nhl888wghmewxw29\n\n4yq4z49x86ywrk9\n\nomsddcwsglihehfr\n\nmumepxtpar0vbo6r\n\nNormal
 text.\n\n<!-- Unmatching number of opening, closing tags: 
-->dska41gwjbwyu8fr\n\n508yy8ogfxd8ia4i'''This 
year''''0o13pli3vxojq0k9s.\n\n12et9k2znm5wb3xr\n\nl97w0g61j6rvbo6r\n\nPlain 
iahdy1xbdbjwz5mi");
 add("selser", "Unclosed and unmatched quotes 
[4,0,3,0,2,0,0,2,4,0,[4],2,[4],2,4,0,[0,0,2,0,0,0],4,1,0,[0,2,0]]", 
"p51yt1t1l2rfi529\n\nrhoigk26dmkg9zfr\n\n'''Bold text..\n\n..spanning two 
paragraphs (should not 
work).'''\n\n0d622p6w2fenrk9\n\nurr17dfxaytd42t9\n\nt29ejiu69b0jatt9\n\nimupp3pckiq9f6r\n\n92qds57sy49ozuxr\n\nueel0927jmo8yqfr\n\nngdgm7xfofg8pvi\n\n'''This
 year'<nowiki/>'''s election cx7g7aolgz4a38fr''should'' beat '''last 
year''''s.\n\n5swpjnt4bod5nrk9\n\n''Tom'''s car is bigger than 
'''''<nowiki/>'''Susan'''s.\n\nPlain bktidt0kwhr529''italic'''s plain");
-add("selser", "Unclosed and unmatched quotes 
[[1],4,[2],3,3,3,1,2,2,0,2,0,2,3,4,2,[[2],3,3,0,[4],2],0,3,3,[0,4,0]]", 
"'''''Bold italic text '''with bold deactivated''' in 
between.'''''\n\npvym8fwuqk1hh0k9\n\nqxfz5g7yx7ehr529'''''Bold italic text 
''with italic deactivated'' in between.'''''\n\n..spanning two paragraphs 
(should not 
work).'''<nowiki/>'''\n\nimm43yv5xicw61or\n\nqf82msyi498me7b9\n\n'''Bold tag 
left open\n\nh20k7bi0nzdgf1or\n\n''Italic tag left 
open\n\n4bg7ac36siztzkt9\n\nNormal 
text.\n\nvo6dn3vgrv0a4i\n\newzcuf80f1l6usor\n\n'''tbfhcj88z2w97ldiThis year'''' 
beat '''m3gmfr9sp4cjif6r'''npe02pgi9a8rrudis.\n\nPlain lg1x7859rhdrt3xrs 
plain");
+add("selser", "Unclosed and unmatched quotes 
[[1],4,[2],3,3,3,1,2,2,0,2,0,2,3,4,2,[[2],3,3,0,[4],2],0,3,3,[0,4,0]]", 
"'''''Bold italic text '''with bold deactivated''' in 
between.'''''\n\npvym8fwuqk1hh0k9\n\nqxfz5g7yx7ehr529'''''Bold italic text 
''with italic deactivated'' in between.'''''\n\n..spanning two paragraphs 
(should not work).'''\n\nimm43yv5xicw61or\n\nqf82msyi498me7b9\n\n'''Bold tag 
left open\n\nh20k7bi0nzdgf1or\n\n''Italic tag left 
open\n\n4bg7ac36siztzkt9\n\nNormal 
text.\n\nvo6dn3vgrv0a4i\n\newzcuf80f1l6usor\n\n'''tbfhcj88z2w97ldiThis year'''' 
beat '''m3gmfr9sp4cjif6r'''npe02pgi9a8rrudis.\n\nPlain lg1x7859rhdrt3xrs 
plain");
 add("selser", "Unclosed and unmatched quotes 
[4,2,2,2,4,4,[0,1],0,1,2,2,0,3,0,0,0,[1,0,1,0,3,3],3,3,4,4]", 
"sxp631t0lu4pwrk9\n\nuiov8qw0vsegsyvi\n\ns5pdb3gqeq5pcik9\n\n'''''Bold italic 
text ''with italic deactivated'' in 
between.'''''\n\n0im0vx321sv2t9\n\nw84opzg7rvpwrk9\n\na10san19w6a8aor\n\n..spanning
 two paragraphs (should not work).'''<nowiki/>'''\n\n'''Bold tag left 
open'''\n\nzmakc4arcm78pvi\n\nskau1bd5191qncdi\n\n''Italic tag left 
open\n\n\n<!-- Unmatching number of opening, closing tags: -->'''This year''''s 
election ''should'' beat \n\nfg0el0revo5el8fr\n\n29zcwcjdje0fi529\n");
 add("selser", "Unclosed and unmatched quotes 
[[[0,4,[2]]],4,[[3,0,1]],0,3,2,0,0,[[3]],3,3,3,0,0,0,0,3,0,[3,[4],0],0,2]", 
"'''''Bold italic text '''frylpuwwxz9kvs4i'''si2oklqrxelmobt9 in 
between.'''''\n\n4b0fwpx8i4yousor\n\n'''with italic deactivated'' in 
between.'''''\n\n4y74tj37ci7fogvi\n\n..spanning two paragraphs (should not 
work).'''\n\n'''<nowiki/>'''\n\nNormal text.\n\n<!-- Unmatching number of 
opening, closing tags: 
-->\n'''955t9gdexkbdfgvi'''s.\n\n7vsge66w9ew2ke29\n\nPlain ''italic'''s plain");
 add("selser", "Unclosed and unmatched quotes 
[[[[4],0,0]],0,1,0,2,4,[0,1],0,2,4,4,2,0,0,0,0,[[3],3,0,0,[3],3],0,2,2,3]", 
"'''''g25w0ee1muat6gvi'''with bold deactivated''' in between.'''''\n\n'''''Bold 
italic text ''with italic deactivated'' in 
between.'''''\n\n978osfsmlz9tfbt9\n\n'''Bold 
text..\n\n6va1z48gd8wipb9\n\n..spanning two paragraphs (should not 
work).'''<nowiki/>'''\n\npap02f80lg8yf1or\n\n'''Bold tag left 
open\n\nrc9woq2unjnhfr\n\nvwn5ww762sft7qfr\n\n4tvj8y1sqzg2e29\n\nNormal 
text.\n\n<!-- Unmatching number of opening, closing tags: 
-->\n'''<nowiki/>'''''should'' beat 
'''<nowiki/>'''\n\ngo0uih65ed841jor\n\n''Tom'''s car is bigger than 
''Susan'''s.\n\ngxolomlzomtsatt9\n");
-add("selser", "Unclosed and unmatched quotes 
[[1],2,3,3,0,0,2,0,[[2]],0,[3],0,3,3,0,0,1,0,[3,0,4],4,3]", "'''''Bold italic 
text '''with bold deactivated''' in 
between.'''''\n\no48k8kitkr8dunmi\n\n'''Bold 
text..\n\njg529j0bl3c2qpvi\n\n..spanning two paragraphs (should not 
work).'''\n\n'''86igisuev2sjdcxrBold tag left open'''\n\n\n<!-- Unmatching 
number of opening, closing tags: -->'''This year'<nowiki/>'''s election 
''should'' beat '''last 
year''''s.\n\nSusan'''9gtumj4ocnomvx6r\n\nprfakduhs9gousor\n");
+add("selser", "Unclosed and unmatched quotes 
[[1],2,3,3,0,0,2,0,[[2]],0,[3],0,3,3,0,0,1,0,[3,0,4],4,3]", "'''''Bold italic 
text '''with bold deactivated''' in 
between.'''''\n\no48k8kitkr8dunmi\n\n'''Bold 
text..\n\njg529j0bl3c2qpvi\n\n..spanning two paragraphs (should not 
work).'''\n\n'''86igisuev2sjdcxrBold tag left open'''\n\n\n<!-- Unmatching 
number of opening, closing tags: -->'''This year''''s election ''should'' beat 
'''last year''''s.\n\nSusan'''9gtumj4ocnomvx6r\n\nprfakduhs9gousor\n");
+add("selser", "Unclosed and unmatched quotes 
[2,0,[[2,2,[3]]],3,1,3,3,0,3,4,[[4]],2,4,4,2,0,3,0,1,2,[3,4,3]]", 
"pw5zq7ljhfy4aemi\n\n'''''Bold italic text '''with bold deactivated''' in 
between.'''''\n\n'''fbtby3wxdli0be29''Bold italic text ''hosaxi984a9n3ik9with 
italic deactivated''<nowiki/>'''''\n\n'''Bold 
text..\n\nc74033tc8r529\n\n''crya5qg6h10mgqfr''\n\n97y6epfwllsaif6r\n\nv4ny06vgjpvkuik9\n\npybvt95p8bzqia4i\n\nf4w0i3lwoafez5mi<!--
 Unmatching number of opening, closing tags: -->\n\n''Tom'''s car is bigger 
than '''''<nowiki/>'''Susan'''s.\n\n35ggkj027wuerk9\n\n5akp3n5k0fk9y66r");
 add("selser", "Unclosed and unmatched quotes 
[2,0,[1],0,[2],0,[3,0],0,0,2,3,4,[2],2,0,3,[2,3,4,0,[4],0],0,3,3,[3,1,0]]", 
"z4argjbmeescq5mi\n\n'''''Bold italic text '''with bold deactivated''' in 
between.'''''\n\n'''''Bold italic text ''with italic deactivated'' in 
between.'''''\n\n947x1e69qode7b9'''Bold text..\n\n'''\n\n'''Bold tag left 
open\n\n3ki8ayg0o64xi529\n\n79eq5ijnx56rbe29\n\ndxlh1ogra88jv2t9Normal 
text.\n\nxi7td8h5z9pv6lxr\n\n<!-- Unmatching number of opening, closing tags: 
-->23dgn6ecyq281tt9'''This year''''39sqeg7p7m0a4i beat 
'''oiu6lbk4gnrn3ik9'''s.\n\n''italic'''s plain");
-add("selser", "Unclosed and unmatched quotes 
[[2],0,4,3,[2],3,3,4,[[2]],0,0,2,3,4,0,0,4,2,[[3,[4]],2,0],3,2]", 
"4yw4wxjunjtw3ik9'''''Bold italic text '''with bold deactivated''' in 
between.'''''\n\nis7cyalf54su4n29\n\nmpbxmb8jpqlg14i'''Bold 
text..'''\n\nalbr13x2jt273nmi\n\n'''6g5d8o738wave7b9Bold tag left 
open'''\n\n''Italic tag left open\n\nteulxe8k1ma0dx6r\n\nxou6as0vzir7ldi\n<!-- 
Unmatching number of opening, closing tags: 
-->\nujbw98y12pxecdi\n\nis2fqvz346byy14i\n\n'''''kzqmouenkvz8semi'''''9tj86gikh3j1c3di'''Susan'''s.\n\ni4wvgq117adobt9\n\nPlain
 ''italic'''s plain");
+add("selser", "Unclosed and unmatched quotes 
[[2],0,4,3,[2],3,3,4,[[2]],0,0,2,3,4,0,0,4,2,[[3,[4]],2,0],3,2]", 
"4yw4wxjunjtw3ik9'''''Bold italic text '''with bold deactivated''' in 
between.'''''\n\nis7cyalf54su4n29\n\nmpbxmb8jpqlg14i'''Bold 
text..\n\nalbr13x2jt273nmi\n\n'''6g5d8o738wave7b9Bold tag left 
open'''\n\n''Italic tag left open\n\nteulxe8k1ma0dx6r\n\nxou6as0vzir7ldi\n<!-- 
Unmatching number of opening, closing tags: 
-->\nujbw98y12pxecdi\n\nis2fqvz346byy14i\n\n'''''kzqmouenkvz8semi'''''9tj86gikh3j1c3di'''Susan'''s.\n\ni4wvgq117adobt9\n\nPlain
 ''italic'''s plain");
 add("selser", "Unclosed and unmatched quotes 
[[[0,4,[4]]],4,[[[3],0,0]],3,4,2,[0,3],0,2,4,1,3,0,3,0,2,[3,2,[4],0,2,0],0,3,0,2]",
 "'''''Bold italic text 
'''75o98j53ggyqr529'''dy2un1421co0qkt9'''''\n\nambk3df76pfrbe29\n\n'''''<nowiki/>''with
 italic deactivated'' in 
between.'''''\n\nmlan2o9gwrx2bj4i\n\n5ad1bsnc7xrvbo6r\n\n..spanning two 
paragraphs (should not work).\n\n7rqyhyinmtqvkj4i\n\n'''Bold tag left 
open\n\n6e1728i1rre019k9\n\n''Italic tag left open''\n\nNormal text.\n\n<!-- 
Unmatching number of opening, closing tags: 
-->yrma779mh822csor\n\nzowg8vddfmxcg14is election ''bpl4hu1cvunmi'' beat 
mqxj0davy046xbt9'''last year''''s.\n\nsrp1nabhht7ta9k9\n\nPlain ''italic'''s 
plain");
 add("selser", "Unclosed and unmatched quotes 
[[[1,0,1]],3,[4],2,2,0,0,2,0,0,3,2,0,2,0,0,[[2],0,[3],3,0,4],0,[1,0,0],0,4]", 
"'''''Bold italic text '''with bold deactivated''' in 
between.'''''\n\n44b370raypmk7qfr\n\ni211swg0nbpam7vi\n\nvavmabtdw75jyvi\n\n'''Bold
 text..\n\n..spanning two paragraphs (should not 
work).'''\n\n4p1evrnwbqd26gvi\n\n'''Bold tag left 
open\n\newqyg6brwjmrt3xr\n\nNormal text.\n\nah55m0efoatnjyvi\n\n<!-- Unmatching 
number of opening, closing tags: -->\n'''o7plzsqaknmte29This year'<nowiki/>'''s 
election ''<nowiki/>'''''last year'<nowiki/>'''2yo5fdbdlipy14i\n\n''Tom'''s car 
is bigger than '''''<nowiki/>'''Susan'''s.\n\nllfjggl4suhgds4i\n");
 add("selser", "Unclosed and unmatched quotes 
[[3],0,[1],0,3,2,1,4,4,4,4,3,[2],0,0,0,3,0,3,2,[4,3,3]]", "\n\n'''''Bold italic 
text ''with italic deactivated'' in 
between.'''''\n\nx1xcylcyh7gphkt9\n\n..spanning two paragraphs (should not 
work).'''\n\nnf1j27vv64unmi\n\n8gq7zshkmb49529\n\nequpikb2dtj1nhfr\n\n9qkbw2p05e6a8aor\n\nxmkojfga7ja1c3diNormal
 text.\n\n<!-- Unmatching number of opening, closing tags: 
-->\nrmvdbh91k72xzuxr\n\n2mzfijueenq4zpvi");
-add("selser", "Unclosed and unmatched quotes 
[3,0,[2],0,[[2]],3,[3,0],0,4,4,0,0,3,2,0,3,[[4],2,4,0,3,0],2,3,3,[3,3,0]]", 
"\nt6n1bkvx9wq7u8fr'''''Bold italic text ''with italic deactivated'' in 
between.'''''\n\n'''mdiwcalkyki6bt9Bold 
text..'''\n\n'''<nowiki/>'''\n\n1il337h4ozu84cxr\n\nowkwkmpgu45z5mi\n\n''Italic 
tag left open\n\n0jlauri2d7gjsjor\n\n<!-- Unmatching number of opening, closing 
tags: -->'''xapa2a5a6cdw8kt9'''lc002uv6d1dzpvis election fik23fdz9d89qkt9 beat 
s.\n\n8ykwjs7kuwg0hpvi\n\ns plain");
+add("selser", "Unclosed and unmatched quotes 
[3,0,[2],0,[[2]],3,[3,0],0,4,4,0,0,3,2,0,3,[[4],2,4,0,3,0],2,3,3,[3,3,0]]", 
"\nt6n1bkvx9wq7u8fr'''''Bold italic text ''with italic deactivated'' in 
between.'''''\n\n'''mdiwcalkyki6bt9Bold 
text..'''\n\n'''\n\n1il337h4ozu84cxr\n\nowkwkmpgu45z5mi\n\n''Italic tag left 
open\n\n0jlauri2d7gjsjor\n\n<!-- Unmatching number of opening, closing tags: 
-->'''xapa2a5a6cdw8kt9'''lc002uv6d1dzpvis election fik23fdz9d89qkt9 beat 
s.\n\n8ykwjs7kuwg0hpvi\n\ns plain");
 add("selser", "Unclosed and unmatched quotes 
[2,4,3,0,2,0,1,0,[3],0,[2],0,2,0,0,2,[2,2,4,0,1,0],2,4,3,4]", 
"re6gnnkhd1tnjyvi\n\n'''''Bold italic text '''with bold deactivated''' in 
between.'''''\n\nbdwnekfnkxei2j4i\n\nva244jbhttpdgqfr\n\n'''Bold 
text..\n\n..spanning two paragraphs (should not 
work).'''\n\nlrd6syi4ygugzaor''Italic tag left 
open\n\nknfaulivfgca0pb9\n\nNormal text.\n\n<!-- Unmatching number of opening, 
closing tags: -->h8w8s0eci66tuik9\n\nu9daa8hfmgm5z5mi'''This 
year'<nowiki/>'''s4k3bfthkfq1tt9s election am5ar352e2ltbj4i beat '''last 
year''''s.\n\nrgsn8f7qx23p7gb9\n\nlhg77py8ot21emi\n\n7h6jcsa4wmzsq0k9\n");
 add("selser", "Unclosed and unmatched quotes 
[[1],2,4,0,[4],0,[4,0],0,[[2]],3,2,0,2,0,0,2,[0,2,2,0,1,0],0,1,0,2]", 
"'''''Bold italic text '''with bold deactivated''' in 
between.'''''\n\n91y6zy5s4079zfr\n\nmkyoq2vkvt0jatt9\n\n8yeajt4jwaru23xr\n\nn2z6ghxy6lp7gb9'''<nowiki/>'''\n\n'''9c8lhwf3v6zgp66rBold
 tag left open'''\n\nootbfqoaxawi2j4i\n\n''Italic tag left 
open\n\nvv89fig83pst6gvi\n\nNormal text.\n\n<!-- Unmatching number of opening, 
closing tags: -->73vckpnoy6s3v7vi\n\n'''This year'<nowiki/>'''eedgwt17jt9be29s 
election gqta5jrflissjor''should'' beat '''last year''''s.\n\n''Tom'''s car is 
bigger than '''''<nowiki/>'''Susan'''s.\n\nz1mgwtgr2xjhh0k9\n\nPlain 
''italic'''s plain");
 add("selser", "A table with captions with non-default spaced attributes and a 
table row [[3,2,3,[4],4,[2,4]]]", "{|<!--90q42mbx340a4i-->\n|+style=\"color: 
red;\"|caption2\n|+ style=\"color: red;\" 
|68x5dnp2q5xw29<!--msaci0wnxchgds4i--><!--fhl1z8tl9txu5wmi-->\n|-\n| 
foo<!--z5tecc0c7ynwmi-->\n|}");
@@ -1630,6 +1634,7 @@
 add("selser", "Table td-cell syntax variations [2]", "sbzhcg70xtq8semi\n{|\n| 
foo bar foo | baz\n| foo bar foo || baz\n| style='color:red;' | baz\n| 
style='color:red;' || baz\n|}");
 add("selser", "Table td-cell syntax variations [[4,[1,4]]]", 
"{|<!--27awwjo3287iudi-->\n| foo bar foo | baz\n| foo bar foo || baz\n| 
style='color:red;' | baz\n| style='color:red;' || 
baz<!--jkw3iop5lpcfpqfr-->\n|}");
 add("selser", "Table td-cell syntax variations [1]", "{| 
data-foobar=\"ripzux1o66crf6r\"\n| foo bar foo | baz\n| foo bar foo || baz\n| 
style='color:red;' | baz\n| style='color:red;' || baz\n|}");
+add("selser", "Table td-cell syntax variations [[3,[2,0]]]", 
"{|<!--aerzm44cpngynwmi-->\n| foo bar foo | baz\n| foo bar foo || baz\n| 
style='color:red;' | baz\n| style='color:red;' || baz\n|}");
 add("selser", "Table td-cell syntax variations 
[[4,[[2,0,2,[3],4,0,3,[3],1],2]]]", 
"{|<!--mz3xyunmkehwu3di-->\n|w4c4887c9phnnrk9\n| foo bar foo | 
baz\n|l0hmwng5zji9hpvi\n| foo bar foo ||\n|si4mhwzz7p919k9\n| 
style='color:red;' | baz\n||| data-foobar=\"kxxz57fxsgbq33di\" | 
baz<!--ekzrdkkb8xopf1or-->\n|}");
 add("selser", "Table td-cell syntax variations [[0,[[4,0,0,1,0,0,0,4,4],0]]]", 
"{|\n|juve1nh5fs4kuik9\n| foo bar foo || data-foobar=\"v00hdvjl3int57b9\" | 
baz\n| style='color:red;' | baz\n|6x3dng4d2qehfr\n|eow57cf1pgmn29\n|}");
 add("selser", "Table td-cell syntax variations [[0,[1,4]]]", "{|\n| foo bar 
foo | baz\n| foo bar foo || baz\n| style='color:red;' | baz\n| 
style='color:red;' || baz<!--tthr988c8d9ara4i-->\n|}");
@@ -1650,13 +1655,13 @@
 add("selser", "Table rowspan [[0,[1,0,2,0]]]", "{| border=1\n| Cell 1, row 
1\n|rowspan=2| Cell 2, row 1 (and 2)\n| Cell 3, row 
1\n<!--esqo19m7kv620529-->|-\n| Cell 1, row 2\n| Cell 3, row 2\n|}");
 add("selser", "Table rowspan [[2,2]]", "{| 
border=1<!--c9eo96nqfmjthuxr-->\n<!--mdmpc8uzbgoxn7b9-->| Cell 1, row 
1\n|rowspan=2| Cell 2, row 1 (and 2)\n| Cell 3, row 1\n|-\n| Cell 1, row 2\n| 
Cell 3, row 2\n|}");
 add("selser", "Table rowspan [[0,[1,0,2,2]]]", "{| border=1\n| Cell 1, row 
1\n|rowspan=2| Cell 2, row 1 (and 2)\n| Cell 3, row 
1\n<!--f24m9zom9d2kpgb9-->|-\n| Cell 1, row 2\n| Cell 3, row 
2<!--houk9s548i3pu8fr-->\n|}");
-add("selser", "Table rowspan [[3,[1,0,[0,2,0,4],2]]]", "{| border=1\n| Cell 1, 
row 1\n| rowspan=\"2\" | Cell 2, row 1 (and 2)\n| Cell 3, row 
1\n|-\n|gsp7c59fnpadobt9\n| Cell 1, row 
2\n|bwzd1d95wa7wg66r<!--68bu9hd9zl37syvi-->\n|}");
+add("selser", "Table rowspan [[3,[1,0,[0,2,0,4],2]]]", "{| border=1\n| Cell 1, 
row 1\n|rowspan=2| Cell 2, row 1 (and 2)\n| Cell 3, row 
1\n|-\n|gsp7c59fnpadobt9\n| Cell 1, row 
2\n|bwzd1d95wa7wg66r<!--68bu9hd9zl37syvi-->\n|}");
 add("selser", "Table rowspan [[0,[[4,0,4,0,1],0,1,2]]]", "{| 
border=1\n|aspxhnaofiqf47vi\n|73fyijt65nuerk9\n| 
data-foobar=\"t7trqii8bukp4x6r\" | Cell 3, row 1\n|- 
data-foobar=\"1pkfpcn5xq6t7qfr\"\n| Cell 1, row 2\n| Cell 3, row 
2<!--sebb2ix3zzzadcxr-->\n|}");
 add("selser", "Table rowspan [[0,4]]", "{| 
border=1\n<!--1gqzmb9oym34n29-->|}");
 add("selser", "Table rowspan [[4,1]]", "{| border=1<!--df20a6ug11ao47vi-->\n| 
Cell 1, row 1\n|rowspan=2| Cell 2, row 1 (and 2)\n| Cell 3, row 1\n|-\n| Cell 
1, row 2\n| Cell 3, row 2\n|}");
 add("selser", "Table rowspan [[0,[2,0,4,0]]]", "{| 
border=1\n<!--bz2zkuwgtbotj4i-->| Cell 1, row 1\n|rowspan=2| Cell 2, row 1 (and 
2)\n| Cell 3, row 1\n<!--hynk9y1byaw6ogvi-->\n|}");
 add("selser", "Table rowspan [[2,1]]", "{| border=1<!--kn5vfku6oyumobt9-->\n| 
Cell 1, row 1\n| rowspan=\"2\" | Cell 2, row 1 (and 2)\n| Cell 3, row 1\n|-\n| 
Cell 1, row 2\n| Cell 3, row 2\n|}");
-add("selser", "Table rowspan [[3,[1,0,[0,1,0,2],4]]]", "{| border=1\n| Cell 1, 
row 1\n| rowspan=\"2\" | Cell 2, row 1 (and 2)\n| Cell 3, row 1\n|-\n| 
data-foobar=\"gzbtsmzgf46g8pvi\" | Cell 1, row 2\n|gdz7sc5bs1xg8pvi\n| Cell 3, 
row 2<!--kjwr2bchfhqto6r-->\n|}");
+add("selser", "Table rowspan [[3,[1,0,[0,1,0,2],4]]]", "{| border=1\n| Cell 1, 
row 1\n|rowspan=2| Cell 2, row 1 (and 2)\n| Cell 3, row 1\n|-\n| 
data-foobar=\"gzbtsmzgf46g8pvi\" | Cell 1, row 2\n|gdz7sc5bs1xg8pvi\n| Cell 3, 
row 2<!--kjwr2bchfhqto6r-->\n|}");
 add("selser", "Nested table [[0,[1,4]]]", "{| border=1\n| &alpha;\n|\n{| 
bgcolor=#ABCDEF border=2\n|nested\n|-\n|table\n|}\n|the original table 
again<!--t5nreiu3qsxuhaor-->\n|}");
 add("selser", "Nested table [[0,2]]", "{| border=1\n<!--262ep7u743gqr529-->| 
&alpha;\n|\n{| bgcolor=#ABCDEF border=2\n|nested\n|-\n|table\n|}\n|the original 
table again\n|}");
 add("selser", "Nested table [2]", "y38000xvz4vg3nmi\n{| border=1\n| 
&alpha;\n|\n{| bgcolor=#ABCDEF border=2\n|nested\n|-\n|table\n|}\n|the original 
table again\n|}");
@@ -1668,7 +1673,7 @@
 add("selser", "Nested table [[2,1]]", "{| border=1<!--35nkwvkg96ls1yvi-->\n| 
&alpha;\n|\n{| bgcolor=\"#ABCDEF\" border=\"2\"\n|nested\n|-\n|table\n|}\n|the 
original table again\n|}");
 add("selser", "Nested table [[3,[3,0]]]", "{| border=1\n|}");
 add("selser", "Nested table [[0,[[[4,0],0,4,2,1],3]]]", "{| 
border=1\n|nnqydx4felt2zkt9&alpha;\n|krzzwsokfqen4s4i\n|crl4tbkmgl9xusor\n| 
data-foobar=\"hezkv4q5eb9ms4i\" |the original table again\n|}");
-add("selser", "Nested table [[3,[1,4]]]", "{| border=1\n| &alpha;\n|\n{| 
bgcolor=\"#ABCDEF\" border=\"2\"\n|nested\n|-\n|table\n|}\n|the original table 
again<!--xoe21j7jau62bj4i-->\n|}");
+add("selser", "Nested table [[3,[1,4]]]", "{| border=1\n| &alpha;\n|\n{| 
bgcolor=#ABCDEF border=2\n|nested\n|-\n|table\n|}\n|the original table 
again<!--xoe21j7jau62bj4i-->\n|}");
 add("selser", "Nested table [[0,4]]", "{| 
border=1\n<!--1si3ih2ugqkqehfr-->|}");
 add("selser", "Nested table [[0,[[1,2,[3,4],0,4],2]]]", "{| border=1\n| 
data-foobar=\"rvxj3ybmjcl680k9\" | 
&alpha;\n|hk2lwgso9gvz33di\n|nqxaiu7b5cngsyvi\n|ymx715n666j62yb9<!--qegrhh8kob76i529-->\n|}");
 add("selser", "Nested table [[0,[1,2]]]", "{| border=1\n| &alpha;\n|\n{| 
bgcolor=#ABCDEF border=2\n|nested\n|-\n|table\n|}\n|the original table 
again<!--4p9ui8hhwjy5vcxr-->\n|}");
@@ -1695,6 +1700,8 @@
 add("selser", "Build table with {{!}} [[4,2]]", "{{{!}} 
class=\"wikitable\"<!--wa7mbefsy7nfjemi--><!--8sf0msj7spmbo6r-->\n! header\n! 
second header\n{{!}}- style=\"color:red;\"\n{{!}} data {{!}}{{!}} 
style=\"color:red;\" {{!}} second data\n{{!}}}");
 add("selser", "Build table with {{!}} [[2,2]]", "{{{!}} 
class=\"wikitable\"<!--hbgluiuyj95asjor-->\n<!--xss2k4vz6txd2t9-->! header\n! 
second header\n{{!}}- style=\"color:red;\"\n{{!}} data {{!}}{{!}} 
style=\"color:red;\" {{!}} second data\n{{!}}}");
 add("selser", "Build table with {{!}} [[4,1]]", "{{{!}} 
class=\"wikitable\"<!--q4x91ifb5ku766r-->\n! header\n! second header\n{{!}}- 
style=\"color:red;\"\n{{!}} data {{!}}{{!}} style=\"color:red;\" {{!}} second 
data\n{{!}}}");
+add("selser", "Build table with {{!}} [[3,1]]", "{{{!}} class=\"wikitable\"\n! 
header\n! second header\n{{!}}- style=\"color:red;\"\n{{!}} data {{!}}{{!}} 
style=\"color:red;\" {{!}} second data\n{{!}}}");
+add("selser", "Build table with pipe as data 
[[4,[[[3],4,[2]],4,1,3,1,0,[2,[3],0],3]]]", "{| 
class=\"wikitable\"<!--gy83oqmogj1hsemi-->\n!\n!6ou7558lo31ve7b9\n!x3v452l2sgcfpqfr
 second header<!--thydh4qgecy58kt9-->\n|- style=\"color:red;\" 
data-foobar=\"dswqscim49xjemi\"\n| data || style=\"color:red;\" | second 
data\n|- data-foobar=\"fdr26qqobkj1nhfr\"\n| style=\"color:red;\" | data with | 
|| style=\"color:red;\" | second data with |\n|-\n|2tdvd6j4qhy0t3xr\n||||| 
second data with |\n|}");
 add("selser", "Build table with pipe as data [[4,2]]", "{| 
class=\"wikitable\"<!--edau2tsedygb9--><!--v3k9certcyx03sor-->\n! header\n! 
second header\n|- style=\"color:red;\"\n| data || style=\"color:red;\" | second 
data\n|-\n| style=\"color:red;\" | data with | || style=\"color:red;\" | second 
data with |\n|-\n|| data with | ||| second data with |\n|}");
 add("selser", "Build table with pipe as data [[3,2]]", "{| 
class=\"wikitable\"<!--0g4x735w6hcl3di-->\n! header\n! second header\n|- 
style=\"color:red;\"\n| data || style=\"color:red;\" | second data\n|-\n| 
style=\"color:red;\" | data with | || style=\"color:red;\" | second data with 
|\n|-\n|| data with | ||| second data with |\n|}");
 add("selser", "Build table with pipe as data [2]", "lmhnucjqwqctmx6r\n{| 
class=\"wikitable\"\n! header\n! second header\n|- style=\"color:red;\"\n| data 
|| style=\"color:red;\" | second data\n|-\n| style=\"color:red;\" | data with | 
|| style=\"color:red;\" | second data with |\n|-\n|| data with | ||| second 
data with |\n|}");
@@ -1780,6 +1787,7 @@
 add("selser", "Nested lists 6 (both elements empty) [[2]]", "* 
tmc5x74vyp7m0a4i\n*\n**");
 add("selser", "Test the li-hack\n(The PHP parser relies on Tidy for the hack) 
[[2,0,4,0,0,3,2,3],3,2]", "* a2sete5kqgmbo6r\n* foo\n* llnzbl3rhrnklnmi\n* 
{{echo|<li>templated li-hack}}* jhdcjklsub84obt9\n* <!--foo--> 
\ne5gkponwwotakyb9<ul>\n<li><li>not a li-hack\n</li>\n</ul>");
 add("selser", "Unbalanced closing non-block tags don't break a list\n(php 
parser relies on Tidy to fix up) [[4],0,[[4,4],3,2]]", 
"390h6pqo24y22o6r\n*o41tgyrxzloko6rkhwclpkbqgsqbyb9\n* 
x920d3kit2c323xr\n*b</span>");
+add("selser", "Unbalanced closing non-block tags don't break a list\n(php 
parser relies on Tidy to fix up) [3,0,1]", "*a</span><span>\n*b</span>");
 add("selser", "Unbalanced closing non-block tags don't break a list\n(php 
parser relies on Tidy to fix up) [[1],0,1]", "<span 
data-foobar=\"gmykdz3f6s2fyldi\">\n*a</span><span>\n*b</span>");
 add("selser", "Unbalanced closing non-block tags don't break a list\n(php 
parser relies on Tidy to fix up) [2,4,2]", 
"p5zfzj30o8g833di\n\n<span>\n\nf07i3koy7pqtzkt9\n\nzkrsmqi20yynwmi\n*a</span><span>\n*b</span>");
 add("selser", "Unbalanced closing non-block tags don't break a list\n(php 
parser relies on Tidy to fix up) [0,3,[[0,2],0,2]]", 
"<span>\n*a9ox9e692g6s3v7vi<span>\n* ksgt5bqr6cpaatt9\n*b</span>");
@@ -1830,6 +1838,7 @@
 add("selser", "Template with invalid target containing unclosed tag [1]", 
"<nowiki>{{</nowiki>a<b>|{{echo|foo}}|{{echo|a}}={{echo|b}}|a = b}}");
 add("selser", "Template with invalid target containing unclosed tag [[0,1]]", 
"<nowiki>{{</nowiki>a<b 
data-foobar=\"ah4i6emv4j6pqfr\">|{{echo|foo}}|{{echo|a}}={{echo|b}}|a =b}}");
 add("selser", "Template with invalid target containing unclosed tag [[4,2]]", 
"d7d6vni91sfez5mio7di35eq9ubd42t9<b>|{{echo|foo}}|{{echo|a}}={{echo|b}}|a = 
b}}");
+add("selser", "Template with invalid target containing unclosed tag 
[[3,[0,0,4,0,3,0,0]]]", "<b>|{{echo|foo}}f3j5exmxvo0f6r{{echo|a}}{{echo|b}}|a 
=b}}");
 add("selser", "Template with invalid target containing unclosed tag 
[[0,[4,0,0,0,3,0,0]]]", 
"<nowiki>{{</nowiki>a<b>n6rra5yl19i442t9{{echo|foo}}|{{echo|a}}{{echo|b}}|a 
=b}}");
 add("selser", "Template with invalid target containing unclosed tag 
[[3,[4,0,0,0,0,0,0]]]", 
"<b>98je9r0hl43u9pb9{{echo|foo}}|{{echo|a}}={{echo|b}}|a =b}}");
 add("selser", "Template with invalid target containing unclosed tag [2]", 
"n9yqgp0xjbf647vi\n\n{{a<b>|{{echo|foo}}|{{echo|a}}={{echo|b}}|a = b}}");
@@ -1847,15 +1856,19 @@
 add("selser", "BUG 553: link with two variables in a piped link [[0,[0,4]]]", 
"{|\n|[[{{{1}}}|{{{2}}}]]<!--5luam4tixnbl0udi-->\n|}");
 add("selser", "BUG 553: link with two variables in a piped link [[0,[2,2]]]", 
"{|\n<!--2l9bvsosq2iq9f6r-->|[[{{{1}}}|{{{2}}}]]<!--f21xzcxsl9iwl8fr-->\n|}");
 add("selser", "BUG 553: link with two variables in a piped link [[0,[2,0]]]", 
"{|\n<!--ekt298jbktjoflxr-->|[[{{{1}}}|{{{2}}}]]\n|}");
+add("selser", "BUG 553: link with two variables in a piped link [[3,1]]", 
"{|\n|[[{{{1}}}|{{{2}}}]]\n|}");
 add("selser", "BUG 553: link with two variables in a piped link [2]", 
"riybxbthicfskyb9\n{|\n|[[{{{1}}}|{{{2}}}]]\n|}");
 add("selser", "BUG 553: link with two variables in a piped link [[0,2]]", 
"{|\n<!--z79xd4wgjxphw7b9-->|[[{{{1}}}|{{{2}}}]]\n|}");
 add("selser", "Template with targets containing wikilinks [4,0,1,2,1]", 
"p8pza9iyg3yaxlxr\n\n<nowiki>{{</nowiki>[[{{echo|foo}}]]}}\n\ndf60zk0z1v8ia4i\n\n{{{{echo|[[foo}}]]}}");
 add("selser", "Template with targets containing wikilinks 
[[2,1,0],0,[0,0,2],0,0]", 
"h2hv5x8klgom9529<nowiki>{{</nowiki>[[foo]]}}\n\n<nowiki>{{</nowiki>[[{{echo|foo}}]]<nowiki/>ncfzvzzr3mzpvi<nowiki>}}</nowiki>\n\n{{{{echo|[[foo}}]]}}");
 add("selser", "Template with targets containing wikilinks [0,3,2,0,2]", 
"{{[[foo]]}}\n\n8rx6djpk76ojq0k9\n\n{{[[{{echo|foo}}]]}}\n\n5oa9tnlujuivn29\n\n{{{{echo|[[foo}}]]}}");
+add("selser", "Template with targets containing wikilinks [4,3,1,3,4]", 
"tj6nwlghdk5ljtt9\n\n<nowiki>{{</nowiki>[[{{echo|foo}}]]}}\n\nz57gp6q7znuvunmi\n");
 add("selser", "Template with targets containing wikilinks [[4,0,4],0,1,2,4]", 
"340gvnbe2k7nl8fr[[foo]]<nowiki/>s33i9adwhcd9ggb9\n\n<nowiki>{{</nowiki>[[{{echo|foo}}]]}}\n\ny20i831f0qkt9\n\nbj9cw1q9ft6b6gvi\n");
+add("selser", "Template with targets containing wikilinks [[2,0,2],3,1,0,4]", 
"10ghh1t5f8ddkj4i<nowiki>{{</nowiki>[[foo]]86q8c3ty61l6usor<nowiki>}}</nowiki>\n\n<nowiki>{{</nowiki>[[{{echo|foo}}]]}}\n\n52q3lpdqrn7sc3di\n");
 add("selser", "Template with targets containing wikilinks 
[[0,[3],0],0,0,2,2]", 
"<nowiki>{{</nowiki>[[foo|<nowiki/>]]}}\n\n{{[[{{echo|foo}}]]}}\n\n1z50cb7dcf28olxr\n\n1ituto223xxenrk9\n\n{{{{echo|[[foo}}]]}}");
 add("selser", "Template with targets containing wikilinks [[0,2,0],0,2,0,0]", 
"<nowiki>{{</nowiki>htu2qmdkzjkedn29[[foo]]}}\n\nfejf3xvsleopqfr\n\n{{[[{{echo|foo}}]]}}\n\n{{{{echo|[[foo}}]]}}");
 add("selser", "Template with targets containing wikilinks [1,4,0,2,0]", 
"<nowiki>{{</nowiki>[[foo]]}}\n\n1cd1vr2c1t9be29\n\n{{[[{{echo|foo}}]]}}\n\nkjsr70qifjx4unmi\n\n{{{{echo|[[foo}}]]}}");
+add("selser", "Template with targets containing wikilinks [3,0,1,0,4]", 
"\n<nowiki>{{</nowiki>[[{{echo|foo}}]]}}\n\nnjip1d7tubz6ko6r\n");
 add("selser", "Template with targets containing wikilinks [[3,4,0],0,2,0,3]", 
"25jsxi33dblc8fr<nowiki>}}</nowiki>\n\nxo4f2m9ziaawnrk9\n\n{{[[{{echo|foo}}]]}}\n");
 add("selser", "Template with targets containing wikilinks [2,0,[4,0,3],0,0]", 
"jwj1clvcmw5qaor\n\n{{[[foo]]}}\n\na6sabnbx8xueg66r[[{{echo|foo}}]]\n\n{{{{echo|[[foo}}]]}}");
 add("selser", "Template with targets containing wikilinks [2,3,2,0,0]", 
"jn3l3gn2shlac3di\n\n{{[[foo]]}}\n\neps1xdvsq62vgqfr\n\n{{[[{{echo|foo}}]]}}\n\n{{{{echo|[[foo}}]]}}");
@@ -1883,7 +1896,7 @@
 add("selser", "1. Table tag in SOL posn. should get reparsed correctly with 
valid TSR [0,[0,[[1],4]]]", "{{echo|}}{| width = '100%'\n| 
data-foobar=\"pnyys77mkaxrms4i\" |foo<!--kok37wstwgbvs4i-->\n|}");
 add("selser", "Templates: P-wrapping: 1d. Template preceded by comment-only 
line [2,0,0]", "i0wqqfgpkyjsjor\n<!-- foo -->\n{{echo|Bar}}");
 add("selser", "Templates: P-wrapping: 1d. Template preceded by comment-only 
line [2,3,0]", "5x3qqz5k5wl2qpvi\n\n<!-- foo -->{{echo|Bar}}");
-add("selser", "Templates: HTML Tables: 5. Proper fostering of categories from 
inside [0,4,3,3,0,0,3,1]", "\n00y7omltvljfko6r\n<table 
data-foobar=\"jmfnmukwsfko6r\"><tr><td>foo</td></tr></table>");
+add("selser", "Templates: HTML Tables: 5. Proper fostering of categories from 
inside [0,4,3,3,0,0,3,1]", "\n00y7omltvljfko6r\n<table 
data-foobar=\"jmfnmukwsfko6r\">[[Category:bar1]][[Category:bar2]]<tr><td>foo</td></tr></table>");
 add("selser", "Templates: HTML Tables: 5. Proper fostering of categories from 
inside [0,[3],0,0,3,0,4,2]", "<table></table>\n<!--Two categories (Bug 
50330)-->\naa9zlufnr5nlv7vi\n\nq2pyl7rcb4e4gqfr<table>[[Category:bar1]][[Category:bar2]]<tr><td>foo</td></tr></table>");
 add("selser", "Templates: HTML Tables: 5. Proper fostering of categories from 
inside [4,1,3,2,2,2,0,2]", "ixen0t4bgr8xs9k9<table 
data-foobar=\"srvdo6x0y0bb7qfr\"><tr><td>foo</td></tr></table>uzdg6q9o13xcrf6r<!--Two
 categories (Bug 
50330)-->4qtzlqvafwyaatt9\nxof76nvw8xmkj4i\nmjznl60h5moenrk9<table>[[Category:bar1]][[Category:bar2]]<tr><td>foo</td></tr></table>");
 add("selser", "Templates: HTML Tables: 5. Proper fostering of categories from 
inside [0,4,2,4,2,1,0,1]", 
"\nfvxtgp3ng3c8fr\n\nndpvbu6qrq2awcdi\n\nxvl7qedcdte29\n\nut1kj4t41ud6lxr\n[[Category:bar1]]<table
 
data-foobar=\"bl3hi9ypv5d34n29\">[[Category:bar1]][[Category:bar2]]<tr><td>foo</td></tr></table>");
@@ -1983,6 +1996,7 @@
 add("selser", "Table multiple attributes correction [[4,[[[2]],0]]]", 
"{|<!--7o9jsnzarwq7u8fr-->\n!+ class=\"error\" 
class=\"awesome\"|ic6dfteyj3zhncdi status\n|}");
 add("selser", "Table multiple attributes correction [[0,2]]", 
"{|\n<!--659x00mqf8b8olxr-->!+ class=\"error\" class=\"awesome\"| status\n|}");
 add("selser", "Table multiple attributes correction [[0,[1,3]]]", "{|\n!+ 
class=\"error\" class=\"awesome\"| status\n|}");
+add("selser", "Table multiple attributes correction [[3,1]]", "{|\n!+ 
class=\"error\" class=\"awesome\"| status\n|}");
 add("selser", "Table multiple attributes correction [[4,1]]", 
"{|<!--hp0nnumivla6ecdi-->\n!+ class=\"error\" class=\"awesome\"| status\n|}");
 add("selser", "Table multiple attributes correction [[3,2]]", 
"{|<!--42sj7fkd0anpzaor-->\n!+ class=\"error\" class=\"awesome\"| status\n|}");
 add("selser", "Table multiple attributes correction [[0,[2,0]]]", 
"{|\n<!--k6lgk37x5g0hpvi-->!+ class=\"error\" class=\"awesome\"| status\n|}");
@@ -2127,8 +2141,10 @@
 add("selser", "Fuzz testing: Parser22 [1,0,2]", 
"http://===r:::https://b\n\n3ql477um4peyu8fr\n{|");
 add("selser", "Fuzz testing: Parser24 [[0,2,0],3,2]", 
"{{{g6r38jevgd37hkt9|\n<u class=\"|\" 
{{{{SSSll!!!!!!!VVVV)]]][[Special:*xxxxxxx--><noinclude>}}}}>\n<br 
style=\"onmouseover='alert(document.cookie);' \" 
/>\n\n7yitay7jtsjdcxr\n{|\n{{{|\n<u CLASS=\n| 
{{{{SSSll!!!!!!!VVVV)]]][[Special:*xxxxxxx--><noinclude>}}}} >\n<br 
style=\"onmouseover='alert(document.cookie);' \" />\n\nMOVE YOUR MOUSE CURSOR 
OVER THIS TEXT\n|");
 add("selser", "Fuzz testing: Parser24 [[[4],3,0],0,[0,3]]", 
"<nowiki>aosym28xh3ibpgb9</nowiki><u class=\"|\" 
{{{{SSSll!!!!!!!VVVV)]]][[Special:*xxxxxxx--><noinclude>}}}}>\n<br 
style=\"onmouseover='alert(document.cookie);' \" />{|\n\n|}");
+add("selser", "Fuzz testing: Parser24 [1,3,1]", "{{{|\n<u class=\"|\" 
{{{{SSSll!!!!!!!VVVV)]]][[Special:*xxxxxxx--><noinclude>}}}}>\n<br 
style=\"onmouseover='alert(document.cookie);' \" />\n{| 
data-foobar=\"6fgt6dvgb9j7zaor\"\n\n||}");
 add("selser", "Fuzz testing: Parser24 [[4,0,0],0,[4,[1]]]", 
"11sr1z4igrvpwrk9|\n<u class=\"|\" 
{{{{SSSll!!!!!!!VVVV)]]][[Special:*xxxxxxx--><noinclude>}}}}>\n<br 
style=\"onmouseover='alert(document.cookie);' \" 
/>{|<!--smnv2ch56iy919k9-->\n||}");
 add("selser", "Fuzz testing: Parser24 [3,2,4]", 
"u39lbr4wb5ptlnmi\n\n\n\nng2zinxre265hfr\n");
+add("selser", "Fuzz testing: Parser24 [[2,4,0],3,1]", 
"05fmnodtnjfnipb9{{{wcunbgauo7uv7vi<u class=\"|\" 
{{{{SSSll!!!!!!!VVVV)]]][[Special:*xxxxxxx--><noinclude>}}}}>\n<br 
style=\"onmouseover='alert(document.cookie);' \" />\n{| 
data-foobar=\"yddsdri9li110pb9\"\n\n||}");
 add("selser", "Fuzz testing: Parser24 [[[3],0,0],2,3]", 
"<nowiki></nowiki>|\n<u class=\"|\" 
{{{{SSSll!!!!!!!VVVV)]]][[Special:*xxxxxxx--><noinclude>}}}}>\n<br 
style=\"onmouseover='alert(document.cookie);' \" />\n\naruqvd6sv8bvgqfr\n\n\n");
 add("selser", "Fuzz testing: Parser24 [4,4,[2,1]]", 
"u2mgcfdhu9d7k3xr\n\nt2gfu2pam7vi\n{|<!--wl9sr7uggvjf9a4i-->\n\n||}");
 add("selser", "Fuzz testing: Parser24 [[3,0,0],0,1]", "|\n<u class=\"|\" 
{{{{SSSll!!!!!!!VVVV)]]][[Special:*xxxxxxx--><noinclude>}}}}>\n<br 
style=\"onmouseover='alert(document.cookie);' \" />{| 
data-foobar=\"gvuyg42a70y3c8fr\"\n\n||}");
@@ -2136,10 +2152,12 @@
 add("selser", "Fuzz testing: Parser24 [0,2,0]", 
"\n\n78ok5mnhx8icz0k9\n\n{|\n{{{|\n<u CLASS=\n| 
{{{{SSSll!!!!!!!VVVV)]]][[Special:*xxxxxxx--><noinclude>}}}} >\n<br 
style=\"onmouseover='alert(document.cookie);' \" />\n\nMOVE YOUR MOUSE CURSOR 
OVER THIS TEXT\n|");
 add("selser", "Fuzz testing: Parser24 [[1,0,0],0,3]", "{{{|\n<u class=\"|\" 
{{{{SSSll!!!!!!!VVVV)]]][[Special:*xxxxxxx--><noinclude>}}}}>\n<br 
style=\"onmouseover='alert(document.cookie);' \" />\n");
 add("selser", "Fuzz testing: Parser24 [1,2,[0,[3]]]", "{{{|\n<u class=\"|\" 
{{{{SSSll!!!!!!!VVVV)]]][[Special:*xxxxxxx--><noinclude>}}}}>\n<br 
style=\"onmouseover='alert(document.cookie);' \" 
/>\n\n2ee2y1k6jblkrzfr\n\n{|\n\n|}");
+add("selser", "Fuzz testing: Parser24 [3,0,1]", "MOVE YOUR MOUSE CURSOR OVER 
THIS TEXT\n{| data-foobar=\"vpeg0ehvafijatt9\"\n\n||}");
 add("selser", "Fuzz testing: Parser24 [[2,4,0],0,3]", 
"2h96h5bmgi2lz0k9{{{7nrcllfxlygmn29<u class=\"|\" 
{{{{SSSll!!!!!!!VVVV)]]][[Special:*xxxxxxx--><noinclude>}}}}>\n<br 
style=\"onmouseover='alert(document.cookie);' \" />\n");
 add("selser", "Fuzz testing: Parser24 [4,4,[3,[2]]]", 
"vtpmggos1rxm9529\n\ntg1e2avwggbymn29\n{|<!--yi16pa7w3cv7vi-->\n||}");
 add("selser", "Fuzz testing: Parser24 [[1,2,0],2,3]", 
"{{{6xvikssdmi4zehfr|\n<u class=\"|\" 
{{{{SSSll!!!!!!!VVVV)]]][[Special:*xxxxxxx--><noinclude>}}}}>\n<br 
style=\"onmouseover='alert(document.cookie);' \" />\n\nwvwpzfhipqqfflxr\n\n\n");
 add("selser", "Fuzz testing: Parser24 [[1,2,0],0,4]", 
"{{{sk3rl6utosgojemi|\n<u class=\"|\" 
{{{{SSSll!!!!!!!VVVV)]]][[Special:*xxxxxxx--><noinclude>}}}}>\n<br 
style=\"onmouseover='alert(document.cookie);' \" />\n\n\n\njzny1t7i47mygb9\n");
+add("selser", "Fuzz testing: Parser24 [[4,3,0],3,1]", "ajjrvymgwee45cdi<u 
class=\"|\" {{{{SSSll!!!!!!!VVVV)]]][[Special:*xxxxxxx--><noinclude>}}}}>\n<br 
style=\"onmouseover='alert(document.cookie);' \" />\n{| 
data-foobar=\"q3u36zzq1lg3z0k9\"\n\n||}");
 add("selser", "Fuzz testing: Parser24 [1,1,2]", "{{{|\n<u class=\"|\" 
{{{{SSSll!!!!!!!VVVV)]]][[Special:*xxxxxxx--><noinclude>}}}}>\n<br 
style=\"onmouseover='alert(document.cookie);' \" />\n\nMOVE YOUR MOUSE CURSOR 
OVER THIS TEXT\n\nwo1ljwyi3jlzbyb9\n{|\n{{{|\n<u CLASS=\n| 
{{{{SSSll!!!!!!!VVVV)]]][[Special:*xxxxxxx--><noinclude>}}}} >\n<br 
style=\"onmouseover='alert(document.cookie);' \" />\n\nMOVE YOUR MOUSE CURSOR 
OVER THIS TEXT\n|");
 add("selser", "Fuzz testing: Parser25 (bug 6055) [0,2]", "{{{\n| \n<LI 
CLASS=||\n >\n}}}zstgbb6nw6nr8uxr\n\nblah\" onmouseover=\"alert('hello 
world');\" align=\"left\"'''MOVE MOUSE CURSOR OVER HERE");
 add("selser", "Fuzz testing: Parser25 (bug 6055) [0,1]", "{{{\n| \n<LI 
CLASS=||\n >\n}}}blah\" onmouseover=\"alert('hello world');\" 
align=\"left\"'''MOVE MOUSE CURSOR OVER HERE");
@@ -2179,10 +2197,14 @@
 add("selser", "Don't fall for the self-closing div [[2]]", 
"<div>3554xqvubx83erk9hello world</div/>");
 add("selser", "Parsing of overlapping (improperly nested) inline html tags 
[2]", "y9cin9njblr6n7b9\n\n<span><s>x</span></s>");
 add("selser", "Don't break table handling if language converter markup is in 
the cell. [2]", "ixer2na9oirudi\n{|\n|-\n| -{R|B}-\n|}");
+add("selser", "Don't break table handling if language converter markup is in 
the cell. [[3,[1,4]]]", "{|\n|- data-foobar=\"lxrh34k2mmoq1tt9\"\n| 
-{R|B}-<!--czk30pw9nitl0udi-->\n|}");
+add("selser", "Don't break table handling if language converter markup is in 
the cell. [[3,[2,3]]]", "{|<!--kvgh4eibaoiggb9-->\n|-\n| -{R|B}-\n|}");
 add("selser", "Don't break table handling if language converter markup is in 
the cell. [[4,2]]", "{|<!--g1hlzg5fl3hrrudi--><!--x4cqrou87inyu8fr-->\n|-\n| 
-{R|B}-\n|}");
 add("selser", "Don't break table handling if language converter markup is in 
the cell. [1]", "{| data-foobar=\"ihw5lexd32uzncdi\"\n|-\n| -{R|B}-\n|}");
 add("selser", "Don't break table handling if language converter markup is in 
the cell. [[4,[[4,0],0]]]", "{|<!--nuhfaguqghc9pb9-->\n|-\n|9qyto9ifqjsxxbt9\n| 
-{R|B}-\n|}");
 add("selser", "Don't break table handling if language converter markup is in 
the cell. [[0,2]]", "{|\n<!--11c9cgnqpuys0pb9-->|-\n| -{R|B}-\n|}");
+add("selser", "Don't break table handling if language converter markup is in 
the cell. [[3,1]]", "{|\n|-\n| -{R|B}-\n|}");
+add("selser", "Don't break table handling if language converter markup is in 
the cell. [[3,[1,3]]]", "{|\n|- data-foobar=\"62vnpmgm6rzlg14i\"\n| 
-{R|B}-\n|}");
 add("selser", "Don't break table handling if language converter markup is in 
the cell. [[0,1]]", "{|\n|-\n| -{R|B}-\n|}");
 add("selser", "Bug 529: Uncovered bullet leaving empty list, normally removed 
by tidy [[[[[3]]],0]]", "**{{bullet}}");
 add("selser", "Bug 529: Uncovered bullet leaving empty list, normally removed 
by tidy [[1,0]]", "******* Foo {{bullet}}");
@@ -2445,11 +2467,13 @@
 add("selser", "Table with broken attribute value quoting [1]", "{| 
data-foobar=\"pa0vp357jvr0ms4i\"\n| title=\"Hello world|Foo\n|}");
 add("selser", "Table with broken attribute value quoting [[0,[[2],0]]]", 
"{|\n|wf125xn56rhsq0k9\n| title=\"Hello world|Foo\n|}");
 add("selser", "Table with broken attribute value quoting [[0,[[2],2]]]", 
"{|\n|cp6e2iwuotkjra4i\n| title=\"Hello world|Foo<!--ndtyo6dy2iou5wmi-->\n|}");
+add("selser", "Table with broken attribute value quoting on consecutive lines 
[[3,1]]", "{|\n| title=\"Hello world|Foo\n| style=\"color:red|Bar\n|}");
 add("selser", "Table with broken attribute value quoting on consecutive lines 
[[3,2]]", "{|<!--e45oiux5ebmg3nmi-->\n| title=\"Hello world|Foo\n| 
style=\"color:red|Bar\n|}");
 add("selser", "Table with broken attribute value quoting on consecutive lines 
[1]", "{| data-foobar=\"r285ew8on06yldi\"\n| title=\"Hello world|Foo\n| 
style=\"color:red|Bar\n|}");
 add("selser", "Table with broken attribute value quoting on consecutive lines 
[[0,[1,0]]]", "{|\n| title=\"Hello world|Foo\n| style=\"color:red|Bar\n|}");
 add("selser", "Table with broken attribute value quoting on consecutive lines 
[2]", "g4iu5aji4bwqaor\n{|\n| title=\"Hello world|Foo\n| 
style=\"color:red|Bar\n|}");
 add("selser", "Table with broken attribute value quoting on consecutive lines 
[[0,1]]", "{|\n| title=\"Hello world|Foo\n| style=\"color:red|Bar\n|}");
+add("selser", "Table with broken attribute value quoting on consecutive lines 
[[3,[2,0]]]", "{|<!--vmfsvz1xmlrz4cxr-->\n| title=\"Hello world|Foo\n| 
style=\"color:red|Bar\n|}");
 add("selser", "Table with broken attribute value quoting on consecutive lines 
[[0,[[[2],3,3],0]]]", "{|\n| title=\"Hello world|b04knn3whm5nrk9Foo\n|}");
 add("selser", "Table with broken attribute value quoting on consecutive lines 
[[4,[[[3],0,0],0]]]", "{|<!--xx6pmaat1ma0dx6r-->\n| title=\"Hello world\" |\n| 
style=\"color:red|Bar\n|}");
 add("selser", "Table with broken attribute value quoting on consecutive lines 
[[4,[[1,0,0],0]]]", "{|<!--nejaqckt9hmbcsor-->\n| title=\"Hello world\" 
data-foobar=\"bumvfdcvrbhme7b9\" |Foo\n| style=\"color:red|Bar\n|}");
@@ -2500,9 +2524,10 @@
 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> 
<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,4,1]", "o7gd264t7kdwjyvi<table data-foobar=\"lv0fkoe23hdj9k9\">\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,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>");
+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> || 
||\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,[4,4]]", "<table><!--7u0an54r0gdgqfr--><!--2brxlofgz5cj714i--></table>");
 add("selser", "2. Ensure fostered text content is wrapped in element nodes 
(traps regressions around fostered marker on the element getting lost) 
[2,3,3]", "swmghyjbym3u9pb9\n\n\n");
 add("selser", "2. Ensure fostered text content is wrapped in element nodes 
(traps regressions around fostered marker on the element getting lost) 
[0,4,4]", "\n\n6ouscimmanvobt9\n\nyr9z5asll86hto6r\n");
@@ -2514,6 +2539,7 @@
 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", "2. Ensure fostered text content is wrapped in element nodes 
(traps regressions around fostered marker on the element getting lost) 
[3,4,[2,0]]", "r04d5cr392cpu8fr<table><!--nkka2k3hiqode7b9-->\n<tr> || ||\n<td> 
a\n</table>");
 add("selser", "Table in fosterable position 5", 
"{{OpenTable}}\n<div>\n{|\n|}\n");
 add("selser", "Image: upright option is ignored on inline and frame images 
(parsoid) [1]", "[[File:Foobar.jpg|500x500px|upright=0.5|caption]]");
 add("selser", "Image: upright option is ignored on inline and frame images 
(parsoid) [2]", 
"kywu2qkfz9eh4cxr\n\n[[File:Foobar.jpg|500x500px|upright=0.5|caption]]");

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

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

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

Reply via email to