Subramanya Sastry has uploaded a new change for review.

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


Change subject: WIP: Tweak separator handling to better handle non-Parsoid HTML
......................................................................

WIP: Tweak separator handling to better handle non-Parsoid HTML

* Can help deal with recent PHP parser changes that emits newlines
  after <ul> and before </ul> tags.

Change-Id: If17867dca335e08d06ade3a511d54685afb879de
---
M js/lib/mediawiki.WikitextSerializer.js
M js/tests/parserTests-blacklist.js
M js/tests/parserTests.txt
3 files changed, 90 insertions(+), 38 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/Parsoid 
refs/changes/26/93626/1

diff --git a/js/lib/mediawiki.WikitextSerializer.js 
b/js/lib/mediawiki.WikitextSerializer.js
index 11293bf..0cd938e 100644
--- a/js/lib/mediawiki.WikitextSerializer.js
+++ b/js/lib/mediawiki.WikitextSerializer.js
@@ -2291,16 +2291,6 @@
                },
                sepnls: {
                        before: function (node, otherNode) {
-                               // SSS FIXME: Thoughts about a fix (abandoned 
in this patch)
-                               //
-                               // Checking for otherNode.nodeName === 'BODY' 
and returning
-                               // {min:0, max:0} should eliminate the annoying 
leading newline
-                               // bug in parser tests, but it seems to cause 
other niggling issues
-                               // <ul> <li>foo</li></ul> serializes to " *foo" 
which is buggy.
-                               // So, we may need another constraint/flag/test 
in makeSeparator
-                               // about the node and its context so that 
leading pre-inducing WS
-                               // can be stripped
-
                                if (DU.isText(otherNode) && 
DU.isListItem(node.parentNode)) {
                                        // A list nested inside a list item
                                        // <li> foo <dl> .. </dl></li>
@@ -2309,7 +2299,31 @@
                                        return {min:1, max:2};
                                }
                        },
-                       after: wtListEOL //id({min:1, max:2})
+                       after: wtListEOL, //id({min:1, max:2})
+                       firstChildParent: function(node, otherNode) {
+                               if (otherNode.nodeName === 'BODY') {
+                                       // FIXME: Possibly also a check for 
DU.isListItem(otherNode)
+                                       //
+                                       // A list nested inside a list item
+                                       // Ex: <ul><li><ul>...</ul></li></ul>
+                                       //
+                                       // But, that requires a smarter 
handling of mergeConstraints
+                                       // to merge <some-node> -- <ul> -- <li> 
where the intermediate
+                                       // <ul> doesn't emit any wikitext.
+                                       return {min:0, max:0};
+                               } else {
+                                       return {};
+                               }
+                       },
+                       lastChildParent: function(node, otherNode) {
+                               if (otherNode.nodeName === 'BODY') {
+                                       // A list nested inside a list item
+                                       // Ex: <ul><li><ul>...</ul></li></ul>
+                                       return {min:0, max:2};
+                               } else {
+                                       return {};
+                               }
+                       },
                }
        };
 }
@@ -2359,6 +2373,13 @@
                                } else {
                                        return {};
                                }
+                       },
+                       firstChildParent: function(node, otherNode) {
+                               if (DU.isList(otherNode)) {
+                                       return {min:0, max:0};
+                               } else {
+                                       return {};
+                               }
                        }
                }
        },
@@ -2384,6 +2405,13 @@
                        firstChild: function (node, otherNode) {
                                if (!DU.isList(otherNode)) {
                                        return {min:0, max: 0};
+                               } else {
+                                       return {};
+                               }
+                       },
+                       firstChildParent: function(node, otherNode) {
+                               if (DU.isList(otherNode)) {
+                                       return {min:0, max:0};
                                } else {
                                        return {};
                                }
@@ -2418,6 +2446,13 @@
                        firstChild: function (node, otherNode) {
                                if (!DU.isList(otherNode)) {
                                        return {min:0, max: 0};
+                               } else {
+                                       return {};
+                               }
+                       },
+                       firstChildParent: function(node, otherNode) {
+                               if (DU.isList(otherNode)) {
+                                       return {min:0, max:0};
                                } else {
                                        return {};
                                }
@@ -3810,7 +3845,13 @@
        // below that fails.
        //
        // Ex: "<div>foo</div>\n <span>bar</span>"
-       if (nlConstraints.min > 0 && sep.match(/ 
+(<!--(?:[^\-]|-(?!->))*-->[^\n]*)?$/g)) {
+       //
+       // We also should test for onSOL state to deal with HTML like:
+       //   <ul> <li>foo</li></ul>
+       // and strip the leading space before non-indent-pre-safe tags
+       if ((nlConstraints.min > 0 || state.onSOL) &&
+               sep.match(/ +(<!--(?:[^\-]|-(?!->))*-->[^\n]*)?$/g))
+       {
                // 'sep' is the separator before 'nodeB' and it has leading 
spaces on a newline.
                // We have to decide whether that leading space will trigger 
indent-pres in wikitext.
                // The decision depends on where this separator will be emitted 
relative
@@ -3888,9 +3929,10 @@
  * XXX: Use nesting information for conflict resolution / switch to scoped
  * constraints?
  */
-WSP.mergeConstraints = function (oldConstraints, newConstraints) {
+WSP.mergeConstraints = function (state, oldConstraints, newConstraints, 
prevNode) {
        //console.log(oldConstraints);
        var res = {a: oldConstraints.a, b:newConstraints.b};
+
        res.min = Math.max(oldConstraints.min || 0, newConstraints.min || 0);
        res.max = Math.min(oldConstraints.max !== undefined ? 
oldConstraints.max : 2,
                        newConstraints.max !== undefined ? newConstraints.max : 
2);
@@ -3903,7 +3945,15 @@
                }
 
                res.max = res.min;
+
+               // FIXME: Ugly hack to prevent ultra-verbose warnings
+               var x = oldConstraints.constraintInfo;
+               var y = newConstraints.constraintInfo;
+               oldConstraints.constraintInfo = undefined;
+               newConstraints.constraintInfo = undefined;
                console.error('Incompatible constraints (merge):', res, 
oldConstraints, newConstraints);
+               oldConstraints.constraintInfo = x;
+               newConstraints.constraintInfo = y;
        }
        return res;
 };
@@ -3939,11 +3989,11 @@
                sepType = "parent-child";
                // parent-child separator, nodeA parent of nodeB
                nlConstraints = this.getSepNlConstraints(state, nodeA, 
sepHandlerA.firstChild,
-                                                                               
        nodeB, sepHandlerB.before);
+                                                                               
        nodeB, sepHandlerB.firstChildParent || sepHandlerB.before);
        } else if ( nodeA.parentNode === nodeB ) {
                sepType = "child-parent";
                // parent-child separator, nodeB parent of nodeA
-               nlConstraints = this.getSepNlConstraints(state, nodeA, 
sepHandlerA.after,
+               nlConstraints = this.getSepNlConstraints(state, nodeA, 
sepHandlerA.lastChildParent || sepHandlerA.after,
                                                                                
        nodeB, sepHandlerB.lastChild);
        } else {
                // sibling separator
@@ -3967,7 +4017,7 @@
 
        if(state.sep.constraints) {
                // Merge the constraints
-               state.sep.constraints = 
this.mergeConstraints(state.sep.constraints, nlConstraints);
+               state.sep.constraints = this.mergeConstraints(state, 
state.sep.constraints, nlConstraints, nodeA);
                //if (state.sep.lastSourceNode && 
state.sep.lastSourceNode.nodeType === nodeA.TEXT_NODE) {
                //      state.sep.lastSourceNode = nodeA;
                //}
diff --git a/js/tests/parserTests-blacklist.js 
b/js/tests/parserTests-blacklist.js
index 85fc651..6aecc9a 100644
--- a/js/tests/parserTests-blacklist.js
+++ b/js/tests/parserTests-blacklist.js
@@ -1319,7 +1319,6 @@
 add("html2wt", "Definition Lists: Mixed Lists: Test 9");
 add("html2wt", "Definition Lists: Mixed Lists: Test 10");
 add("html2wt", "Definition Lists: Mixed Lists: Test 11 (parsoid)");
-add("html2wt", "Definition Lists: Weird Ones: Test 1 (parsoid)");
 add("html2wt", "External links: non-bracketed");
 add("html2wt", "External links: numbered");
 add("html2wt", "External links: dollar sign in URL");
@@ -1487,7 +1486,6 @@
 add("html2wt", "Multiple list tags generated by templates");
 add("html2wt", "Single-comment whitespace lines dont break lists, and neither 
do multi-comment whitespace lines");
 add("html2wt", "Replacing whitespace with tabs still doesn't break the list 
(gerrit 78327)");
-add("html2wt", "Parsoid: Test of whitespace serialization with Templated 
bullets");
 add("html2wt", "Unbalanced closing block tags break a list\n(Parsoid-only 
since php parser generates broken html -- relies on Tidy to fix up)");
 add("html2wt", "Unbalanced closing non-block tags don't break a 
list\n(Parsoid-only since php parser generates broken html -- relies on Tidy to 
fix up)");
 add("html2wt", "Unclosed formatting tags that straddle lists are closed and 
reopened\n(Parsoid-only since php parser generates broken html -- relies on 
Tidy to fix up)");
@@ -2165,6 +2163,7 @@
 
 
 // Blacklist for selser
+add("selser", "Extra newlines: More paragraphs with indented comment 
[3,4,0,2,0]", "\n\n<!--boo-->\nb");
 add("selser", "Italics and possessives (1) [1]", "obtained by ''[[Lunar 
Prospector]]'''s gamma-ray spectrometer");
 add("selser", "Italics and possessives (1) [2]", "mylboba6mj3v7vi\n\nobtained 
by ''[[Lunar Prospector]]'''s gamma-ray spectrometer");
 add("selser", "Italics and possessives (1) [[4,[[4],0],0]]", "obtained by 
''[[Lunar Prospector]]'''s gamma-ray spectrometer");
@@ -2482,6 +2481,7 @@
 add("selser", "Definition Lists: Hacky use to indent tables [[[1]],0,[2]]", 
":{|\n|foo\n|bar\n|}\nthis text\nshould be left alone");
 add("selser", "Definition Lists: Hacky use to indent tables [[[[2]]],0,0]", 
":: 8vyka9uv140wwmi\n:{|\n|foo\n|bar\n|}\nthis text\nshould be left alone");
 add("selser", "Definition Lists: Hacky use to indent tables [[1],3,0]", 
":{|\n|foo\n|bar\n|}\nthis text\nshould be left alone");
+add("selser", "Table / list interaction: lists nested in tables nested in 
indented lists [4,3,[[2],4,[2]]]", "wysduevmbbwng66r\n\n*e\n*f");
 add("selser", "Definition Lists: Nesting: Multi-level (Parsoid only) 
[[[3,2],[3],0,1]]", ";t19mvwgsrbe5gbvs4i :d1\n;t2 ::d2\n;;;t3 :::d3");
 add("selser", "Definition Lists: Nesting: Multi-level (Parsoid only) 
[[2,2,0,1]]", ": 30qwj9nju0widx6r\n;t1 \n: 9n4rno4f9st9be29:d1\n;t2 ::d2\n;;;t3 
:::d3");
 add("selser", "Definition Lists: Nesting: Multi-level (Parsoid only) 
[[2,[4],2,1]]", ": cajh3zep82dquxr\n;t1 :d1\n;t2 ::d2\n;;;t3 :::d3");
@@ -2531,7 +2531,7 @@
 add("selser", "Definition Lists: Mixed Lists: Test 3 [[[[1]]]]", ":: d1\n*::: 
d2");
 add("selser", "Definition Lists: Mixed Lists: Test 3 [[[[[[1]]]]]]", ": 
d1\n*::: d2");
 add("selser", "Definition Lists: Mixed Lists: Test 4 [[[2]]]", 
"*6mu8sv5g21s5g66r\n;d1 :d2\n*;d3 :d4");
-add("selser", "Definition Lists: Mixed Lists: Test 4 [[[[[3,[4]],1,0,0,4]]]]", 
";d1 :d2\n*;d3 \n*: u1mwndrpqlmfs9k9\n");
+add("selser", "Definition Lists: Mixed Lists: Test 4 [[[[[3,[4]],1,0,0,4]]]]", 
";d1 :d2\n*;d3 \n*: u1mwndrpqlmfs9k9");
 add("selser", "Definition Lists: Mixed Lists: Test 4 [[1]]", ";d1 :d2\n*;d3 
:d4");
 add("selser", "Definition Lists: Mixed Lists: Test 4 [[[1]]]", ";d1 :d2\n*;d3 
:d4");
 add("selser", "Definition Lists: Mixed Lists: Test 5 [[[1]]]", ":d1\n*:: d2");
@@ -2548,7 +2548,7 @@
 add("selser", "Definition Lists: Mixed Lists: Test 7 [[[[2,2,0]]]]", ":* 
jl7l11bxkgpn9udi\n* d1\n:* d2");
 add("selser", "Definition Lists: Mixed Lists: Test 7 [[[1]]]", "* d1\n:* d2");
 add("selser", "Definition Lists: Mixed Lists: Test 7 [[[[0,4,3]]]]", "* d1\n");
-add("selser", "Definition Lists: Mixed Lists: Test 7 [[[[0,2,4]]]]", "* d1\n:* 
s9flo7ozh9ztzkt9\n");
+add("selser", "Definition Lists: Mixed Lists: Test 7 [[[[0,2,4]]]]", "* d1\n:* 
s9flo7ozh9ztzkt9");
 add("selser", "Definition Lists: Mixed Lists: Test 7 [[[[2,0,3]]]]", ":* 
lvom8bcinxy74x6r\n* d1\n");
 add("selser", "Definition Lists: Mixed Lists: Test 8 [[[[[4]],3,[3]]]]", "* 
d1\n:");
 add("selser", "Definition Lists: Mixed Lists: Test 8 [[1]]", "* d1\n::* d2");
@@ -2843,6 +2843,7 @@
 add("selser", "BUG 2: [[page|http://url/]] should link to page, not 
http://url/ [[0,[3]]]", "[[Main Page|http://url/]]";);
 add("selser", "BUG 2: [[page|http://url/]] should link to page, not 
http://url/ [[1,0]]", "[[Main Page|<nowiki/>]]\n");
 add("selser", "BUG 2: [[page|http://url/]] should link to page, not 
http://url/ [[2,3]]", "cu9gzpv2drkke29[[Main Page|http://url/]]";);
+add("selser", "<nowiki> inside a link [[3,0,0]]", "[[Main Page|the main page 
<nowiki>[it's not very good]</nowiki>]]");
 add("selser", "Internal link with is link prefix [[4,2,2]]", "Aðrir 
64ixo7lf8gxpqfrmótmælenda[[söfnuður|söfnuðir]] og");
 add("selser", "Internal link with is link prefix [[3,2,4]]", "Aðrir 
s3ai59qwk4kj4imótmælenda[[söfnuður|söfnuðir]] og");
 add("selser", "Internal link with is link trail and link prefix 
[[[0,2],2,0,0,2,2,[0,2],4,1]]", 
"[[mótmælendatrú|xxx]]ar\n[[mótmælendatrú]]ar\nn6ye85ixgdp9zfrmótmælenda[[söfnuður]]\nmótmælenda[[söfnuður|söfnuðir]]\nmótmælenda[[söfnuður|söfnuðir]]xxx");
@@ -2923,7 +2924,7 @@
 add("selser", "Horizontal ruler (should it add that extra space?) 
[0,0,0,4,0,0]", "<hr>\n<hr >\nfoo <hr\n> bar");
 add("selser", "Horizontal ruler (should it add that extra space?) 
[0,0,0,3,4,2]", "<hr>\n<hr >\nfoo d13gtt9304e1m7vi bar");
 add("selser", "Mixed list [4,2,[1]]", "n297ww1j5cm1jor\n** Level 3, but 
ordered");
-add("selser", "Mixed list [[[2,2,0,0,0,[[4]]],3,4,4,3],0,[1]]", "*Mixed 
list\n0rgjqgna0dqs38fr\n*# with numbers\n** and bullets\n*# and numbers\n* 
sywz38l1bbsdobt9\n\n** Level 3, but ordered");
+add("selser", "Mixed list [[[2,2,0,0,0,[[4]]],3,4,4,3],0,[1]]", "*Mixed 
list\n0rgjqgna0dqs38fr\n*# with numbers\n** and bullets\n*# and numbers\n* 
sywz38l1bbsdobt9\n** Level 3, but ordered");
 add("selser", "Mixed list [1,0,[1]]", "*Mixed list\n*# with numbers\n** and 
bullets\n*# and numbers\n*bullets again\n**bullet level 2\n***bullet level 
3\n***#Number on level 4\n**bullet level 2\n**#Number on level 3\n**#Number on 
level 3\n*#number level 2\n*Level 1\n*** Level 3\n** Level 3, but ordered");
 add("selser", "Mixed list [[2,3,[2,[[0,[[3,1]]],0,3],2,4],2,4],3,[[2]]]", "* 
gjmnfiyxk9ey7gb9\n*Mixed list\n*# with numbers\n** and bullets\n*# and 
numbers\n*bullets again\n**bullet level 2\n***bullet level 3\n***#Number on 
level 4\n\nrjgy3pohejkmx6r\n* 99gg1s4u1ot4vx6r\n#xje6eyfcfl3ul3di\n** Level 3, 
but ordered");
 add("selser", "Mixed list 
[[2,4,[0,[[4,[2]],0,[0,[0,2,0]]],4,[1]],2,[0,[2]]],3,[1]]", "* 
50lxb7pz4q3vunmi\n*Mixed list\n*# with numbers\n** and bullets\n*# and 
numbers\n*bullets again\n**bullet level 2\n*** kbumjjxqv5eidx6r\n***bullet 
level 3\n***#Number on level 4\n**bullet level 2\n**#Number on level 
3\n**#Number on level 3\n*#number level 2\n*Level 1\n** cpdtevcvqx2mx6r\n*** 
Level 3\n** Level 3, but ordered");
@@ -2961,12 +2962,13 @@
 add("selser", "Nested lists 7 (skip initial nesting levels) [[[2]]]", 
"*tg28w4nd7g0kke29\n** foo");
 add("selser", "Nested lists 7 (skip initial nesting levels) [[[[[1]]]]]", "* 
foo");
 add("selser", "2. Lists with start-of-line-transparent tokens before bullets: 
Template close [0,0,2]", "*foo {{echo|bar\n}}9uqf8ew08p2b7qfr\n*baz");
+add("selser", "List items from template [0,0,0,3,4,[[4],3,[3],0,3,[2]]]", 
"\n{{inner list}}\n* item 2\n\n* item 0\n* notSOL{{inner list}}\n* item 2");
 add("selser", "List interrupted by empty line or heading [[1],0,[1],2,3,0,0]", 
"* foo\n\n* bar\n\n* Another list item");
 add("selser", "List interrupted by empty line or heading 
[[[4]],4,[[1]],0,[3],2,2]", "* foo\n\n* bar\n== A heading 
==\n1xzetsjere75jyvi\n* Another list item");
 add("selser", "Test the li-hack\n(Cannot test this with PHP parser since it 
relies on Tidy for the hack) [1,2,[3,2,[3],0]]", "* foo\n* <li>li-hack\n* 
{{echo|<li>templated li-hack}}\n* <!--foo--> <li> unsupported li-hack with 
preceding comments\n\n<ul>\n<li>6gpem64rni3yds4i</li><li><li>not a 
li-hack\n</li>\n</ul>");
 add("selser", "Test the li-hack\n(Cannot test this with PHP parser since it 
relies on Tidy for the hack) [[1,0,0,0,0,0,[0,2,2],2],2,[2,0,[4],4]]", "* 
foo\n* <li>li-hack\n* {{echo|<li>templated li-hack}}\n* <!--foo--> \n* 
9aw17w0fg4zbmx6r<li> unsupported li-hack with preceding 
comments\n\n<ul>\n<li><li>not a li-hack\n</li>\n</ul>");
 add("selser", "Test the li-hack\n(Cannot test this with PHP parser since it 
relies on Tidy for the hack) [[4,2,[3],0,0,0,[4,2,3],3],0,2]", "* 
3snwnj5c00nhr529\n* <li>li-hack\n* {{echo|<li>templated li-hack}}\n* <!--foo--> 
\n\nmfkpew81wvrvygb9<ul>\n<li><li>not a li-hack\n</li>\n</ul>");
-add("selser", "Test the li-hack\n(Cannot test this with PHP parser since it 
relies on Tidy for the hack) [[3,0,0,0,0,0,[2,0,0],0],0,[0,0,1,0]]", "\n* 
<li>li-hack\n* {{echo|<li>templated li-hack}}\n* <!--foo--> <li> unsupported 
li-hack with preceding comments\n\n<ul>\n<li><li 
data-foobar=\"9irufodzdrt3xr\">not a li-hack\n</li>\n</ul>");
+add("selser", "Test the li-hack\n(Cannot test this with PHP parser since it 
relies on Tidy for the hack) [[3,0,0,0,0,0,[2,0,0],0],0,[0,0,1,0]]", "* 
<li>li-hack\n* {{echo|<li>templated li-hack}}\n* <!--foo--> <li> unsupported 
li-hack with preceding comments\n\n<ul>\n<li><li 
data-foobar=\"9irufodzdrt3xr\">not a li-hack\n</li>\n</ul>");
 add("selser", "Test the li-hack\n(Cannot test this with PHP parser since it 
relies on Tidy for the hack) [[4,3,2,0,0,0,3,4],4,2]", "* heew4bmxhynl8fr\n* 
jxmnsyhftuik9* <li>li-hack\n* {{echo|<li>templated li-hack}}\n* 
ut2i94jm55sfko6r\n\nx0q9zelof75y7gb9<ul>\n<li><li>not a li-hack\n</li>\n</ul>");
 add("selser", "Test the li-hack\n(Cannot test this with PHP parser since it 
relies on Tidy for the hack) [[0,2,0,2,0,0,4,4],0,[2,0,0,0]]", "* foo\n* 
<li>li-hack\n* {{echo|<li>templated li-hack}}\n* e9pz8g9s5urkvs4i\n* 
88uxy4iag0v8to6r\n\n<ul>\n<li><li>not a li-hack\n</li>\n</ul>");
 add("selser", "Test the li-hack\n(Cannot test this with PHP parser since it 
relies on Tidy for the hack) [[0,4,[4],4,0,0,4,1],2,1]", "* foo\n* 
<li>li-hack\n* {{echo|<li>templated li-hack}}\n* 06p0h25k869zr529<li 
data-foobar=\"ck3o9hquxu7bvs4i\"> unsupported li-hack with preceding 
comments</li>\n\n<ul data-foobar=\"av6idg5yinyu8fr\">\n<li><li>not a 
li-hack\n</li>\n</ul>");
@@ -2976,7 +2978,7 @@
 add("selser", "Test the li-hack\n(Cannot test this with PHP parser since it 
relies on Tidy for the hack) [[1,0,[4],0,0,0,1,2],0,0]", "* foo\n* 
<li>li-hack\n* {{echo|<li>templated li-hack}}\n* <!--foo--> \n* 
z8yfv5z7q6o8byb9<li> unsupported li-hack with preceding 
comments\n\n<ul>\n<li><li>not a li-hack\n</li>\n</ul>");
 add("selser", "Test the li-hack\n(Cannot test this with PHP parser since it 
relies on Tidy for the hack) [1,0,3]", "* foo\n* <li>li-hack\n* 
{{echo|<li>templated li-hack}}\n* <!--foo--> <li> unsupported li-hack with 
preceding comments\n");
 add("selser", "Test the li-hack\n(Cannot test this with PHP parser since it 
relies on Tidy for the hack) [[[4],3,1,0,0,0,[2,2,4],0],4,3]", "* foo\n* <li 
data-foobar=\"cn76ap9tripgy14i\">li-hack</li>\n* {{echo|<li>templated 
li-hack}}\n* <!--foo--> <li> unsupported li-hack with preceding comments\n");
-add("selser", "Test the li-hack\n(Cannot test this with PHP parser since it 
relies on Tidy for the hack) [[3,4,4,0,0,4,[2,4,4],0],0,3]", "\n* 
fxkmu1c9q5omvx6r\n* {{echo|<li>templated li-hack}}\n* <!--foo--> <li> 
unsupported li-hack with preceding comments\n");
+add("selser", "Test the li-hack\n(Cannot test this with PHP parser since it 
relies on Tidy for the hack) [[3,4,4,0,0,4,[2,4,4],0],0,3]", "* 
fxkmu1c9q5omvx6r\n* {{echo|<li>templated li-hack}}\n* <!--foo--> <li> 
unsupported li-hack with preceding comments\n");
 add("selser", "Test the li-hack\n(Cannot test this with PHP parser since it 
relies on Tidy for the hack) [2,0,2]", "v63uarsscvo8yqfr\n* foo\n* 
<li>li-hack\n* {{echo|<li>templated li-hack}}\n* <!--foo--> <li> unsupported 
li-hack with preceding comments\n\nfl0wa30cmdndn29<ul>\n<li><li>not a 
li-hack\n</li>\n</ul>");
 add("selser", "Test the li-hack\n(Cannot test this with PHP parser since it 
relies on Tidy for the hack) [2,2,1]", "phdtjgrh0wvwvcxr\n* foo\n* 
<li>li-hack\n* {{echo|<li>templated li-hack}}\n* <!--foo--> <li> unsupported 
li-hack with preceding comments\n\n<ul 
data-foobar=\"e3qh364hiowasjor\">\n<li><li>not a li-hack\n</li>\n</ul>");
 add("selser", "Test the li-hack\n(Cannot test this with PHP parser since it 
relies on Tidy for the hack) [[[3],3,1,0,0,3,[2,0,0],4],0,[3,0,1,2]]", "* 
foo\n* <li data-foobar=\"49afghrf0njw0zfr\">li-hack</li>\n* 
{{echo|<li>templated li-hack}}\n* <!--foo--> \n* 
12sgn2zg2no8ncdi\n\n<ul>\n<li><li data-foobar=\"ayqvyg3gs800be29\">not a 
li-hack\n</li>\n</ul>");
@@ -2988,7 +2990,7 @@
 add("selser", "Unbalanced closing non-block tags don't break a 
list\n(Parsoid-only since php parser generates broken html -- relies on Tidy to 
fix up) [2,3,[2,0,0]]", "rnfnpskpq3nb3xr\n\n<span>\n* 
hmsx2w3nrnt57b9\n*a</span><span>\n*b</span>");
 add("selser", "Unbalanced closing non-block tags don't break a 
list\n(Parsoid-only since php parser generates broken html -- relies on Tidy to 
fix up) [4,0,[0,4,0]]", "jqby6yf3jmijxlxr\n*a</span><span>\n*b</span>");
 add("selser", "Unbalanced closing non-block tags don't break a 
list\n(Parsoid-only since php parser generates broken html -- relies on Tidy to 
fix up) [[1],0,1]", "<span 
data-foobar=\"1miryz5dj8ht1emi\">\n*a</span><span>\n*b</span>");
-add("selser", "Unbalanced closing non-block tags don't break a 
list\n(Parsoid-only since php parser generates broken html -- relies on Tidy to 
fix up) [[4],0,[3,3,[3]]]", "2r812k6qnhw4gqfr\n\n*b</span>");
+add("selser", "Unbalanced closing non-block tags don't break a 
list\n(Parsoid-only since php parser generates broken html -- relies on Tidy to 
fix up) [[4],0,[3,3,[3]]]", "2r812k6qnhw4gqfr\n*b</span>");
 add("selser", "Unbalanced closing non-block tags don't break a 
list\n(Parsoid-only since php parser generates broken html -- relies on Tidy to 
fix up) [1,0,2]", "<span>\n1y79ib1a8bksatt9\n*a</span><span>\n*b</span>");
 add("selser", "Unbalanced closing non-block tags don't break a 
list\n(Parsoid-only since php parser generates broken html -- relies on Tidy to 
fix up) [0,0,[4,3,[4]]]", "<span>\n* 8zvgy6amuvmtpgb9\n*b</span>");
 add("selser", "Unbalanced closing non-block tags don't break a 
list\n(Parsoid-only since php parser generates broken html -- relies on Tidy to 
fix up) [0,3,1]", "<span>\n*a</span><span>\n*b</span>");
@@ -3105,14 +3107,14 @@
 add("selser", "pre-save transform: Signature expansion [1]", "* ~~~\n* 
<noinclude>~~~</noinclude>\n* <includeonly>~~~</includeonly>\n* 
<onlyinclude>~~~</onlyinclude>");
 add("selser", "pre-save transform: Signature expansion [[2,4,3,0,0,0,4]]", "* 
32fknwefh04l5wmi\n* ~~~\n* <includeonly>~~~</includeonly>\n* azo82cwrwz478pvi");
 add("selser", "pre-save transform: Signature expansion 
[[2,0,[3,0,4,2],2,[4,0,0],0,3]]", "* hz1vd0iqjsepcik9\n* ~~~\n* 
<noinclude><nowiki>~~~</nowiki>0bktyo96eqyw4s4i</noinclude>\n* 
<includeonly>~~~</includeonly>\n");
-add("selser", "pre-save transform: Signature expansion 
[[3,0,2,3,3,0,[4,3,0,4]]]", "\n* itjoznribbkjra4i\n* 
<noinclude>~~~</noinclude>\n* <nowiki>~~~</nowiki>5dhwnz8dwu434n29");
+add("selser", "pre-save transform: Signature expansion 
[[3,0,2,3,3,0,[4,3,0,4]]]", "* itjoznribbkjra4i\n* 
<noinclude>~~~</noinclude>\n* <nowiki>~~~</nowiki>5dhwnz8dwu434n29");
 add("selser", "pre-save transform: Signature expansion 
[[[2],2,[0,0,4,4],4,[0,3,0],2,2]]", "* ~~~\n* 
<noinclude><nowiki>~~~</nowiki>yk5lx11ir8u84cxr\n* \n* qkk22lec4f8byb9\n* 
<onlyinclude>~~~</onlyinclude>");
 add("selser", "pre-save transform: Signature expansion 
[[0,4,[0,0,3,0],4,[2,0,2],3,[0,2,0,1]]]", "* ~~~\n* 
<noinclude>~~~</noinclude>\n* <includeonly>~~~</includeonly>e8gh2f3hm17l23xr\n* 
roruz1ccua8j8aor<onlyinclude><nowiki>~~~</nowiki></onlyinclude>");
 add("selser", "pre-save transform: Signature expansion 
[[[4],0,[3,3,4,1],0,[4,0,0],2,4]]", "* ~~~\n* 
<nowiki>~~~</nowiki></noinclude>\n* <includeonly>~~~</includeonly>\n* 
751getf9ir90ms4i");
 add("selser", "pre-save transform: Signature expansion 
[[[4],0,[4,2,0,4],3,[3,2,0],3,4]]", "* ~~~\n* 
vusuko7gj1bdquxr<noinclude><nowiki>~~~</nowiki>mmr4r7rquwuyp66r\n* 
38ngghdx9qbk2o6r<includeonly>~~~</includeonly>\n* hwud01ex616y9zfr");
 add("selser", "pre-save transform: Signature expansion 
[[2,0,1,0,2,0,[4,4,3,0]]]", "* bqju9j481lg3z0k9\n* ~~~\n* 
<noinclude><nowiki>~~~</nowiki></noinclude>\n* jzrurxzih8semi\n* 
<includeonly>~~~</includeonly>\n* 
afwkn1acaje2ke29<nowiki>~~~</nowiki></onlyinclude>");
 add("selser", "pre-save transform: Signature expansion 
[[2,0,3,0,[2,0,0],0,[0,4,0,0]]]", "* l8ywvav463s7nwmi\n* ~~~\n* 
<includeonly>~~~</includeonly>\n* 
pb665fdgs7tlnmi<nowiki>~~~</nowiki></onlyinclude>");
-add("selser", "pre-save transform: Signature expansion [[3,3,2,0,1,0,4]]", 
"\n* n4e6pky0yzdj9k9\n* <noinclude>~~~</noinclude>\n* 
<includeonly>~~~</includeonly>\n* ur7u96qiqwdpwrk9");
+add("selser", "pre-save transform: Signature expansion [[3,3,2,0,1,0,4]]", "* 
n4e6pky0yzdj9k9\n* <noinclude>~~~</noinclude>\n* 
<includeonly>~~~</includeonly>\n* ur7u96qiqwdpwrk9");
 add("selser", "pre-save transform: Signature expansion 
[[0,3,3,0,[4,3,4],3,[3,4,0,1]]]", "* ~~~\n* yw1kct238p6kzkt9\n* 
09d84mjn1li8uxr<nowiki>~~~</nowiki></onlyinclude>");
 add("selser", "pre-save transform: Signature expansion 
[[1,3,[3,0,3,0],0,4,0,3]]", "*<nowiki> ~~~</nowiki>\n* 
<noinclude>~~~</noinclude>\n* toxqhbpksmr3haor\n");
 add("selser", "pre-save transform: Signature expansion in nowiki tags (bug 93) 
[[3],3,2,0,0,3,0,[4,3,2],0,2,4,0,0,[0,0,0,4,0,0,0,0],0,0]", "Shall not 
expand:\n\n18slesrh1zbvgqfr\n\n<nowiki>~~~~</nowiki>\n\n<includeonly><nowiki>~~~~</nowiki></includeonly>\n\nktcua1lf94yousorpew82dlvmvb49529</noinclude>da7bot3zdv6uhaor\n\n<onlyinclude><nowiki>~~~~</nowiki></onlyinclude>\n\n{{subst:Foo}}
 shall be converted to FOO\n\nAs well as inside 
noinclude/onlyinclude<noinclude>{{subst:Foo}}zvvzh0cx02wng66r<onlyinclude>{{subst:Foo}}</onlyinclude>\n\nBut
 not inside includeonly\n<includeonly>{{subst:Foo}}</includeonly>");
@@ -3387,14 +3389,14 @@
 add("selser", "Say the magic word 
[[1,2,0,0,0,4,0,4,0,3,0,4,0,2,2,0,1,3,1,4,[4,0],3,[2],3,0,0,3,0,[2,0],0,4,0,[4,0],0,0,0,2,2,0,0,0,4,0]]",
 "* {{PAGENAME}}\n* {{PAGENAMEE}}\n* {{FULLPAGENAME}}\n* {{FULLPAGENAMEE}}\n* 
{{BASEPAGENAME}}\n* {{BASEPAGENAMEE}}\n* {{SUBPAGENAME}}\n* gk916dn8vo39pb9\n* 
{{SUBPAGENAMEE}}\n* Warning: Page/template fetching disabled, and no cache for 
Template:ROOTPAGENAME\n* Warning: Page/template fetching disabled, and no cache 
for Template:ROOTPAGENAMEE\n* {{TALKPAGENAME}}\n* {{TALKPAGENAMEE}}\n* 
{{SUBJECTPAGENAME}}\n* {{NAMESPACEE}}\n* nq88p8lp1395dn29\n* 
{{NAMESPACENUMBER}}\n* {{TALKSPACE}}\n* 2fslukxw6dyujtt9\n* {{TALKSPACEE}}\n* 
{{SUBJECTSPACE}}\n* {{SUBJECTSPACEE}}\n* 
{{Dynamic|{{NUMBEROFUSERS}}|{{NUMBEROFPAGES}}|{{CURRENTVERSION}}|{{CONTENTLANGUAGE}}|{{DIRECTIONMARK}}|{{CURRENTTIMESTAMP}}|{{NUMBEROFARTICLES}}}}");
 add("selser", "Say the magic word 
[[[4,0],4,4,0,0,0,3,2,[4],2,0,2,0,0,[2],0,2,4,4,3,0,0,[4],0,0,0,1,2,[4,0],0,[3,0],0,[3,0],2,[3,0],2,[4],0,0,0,3,4,[4]]]",
 "* {{PAGENAME}}\n* 9ci6bx3b0kd9rudi\n* {{FULLPAGENAME}}\n* {{BASEPAGENAME}}\n* 
{{BASEPAGENAMEE}}\n* {{SUBPAGENAME}}\n* {{SUBPAGENAMEE}}\n* lx383jf85ogh9f6r\n* 
{{ROOTPAGENAME}}\n* bapujq71wvyam7vi\n* {{TALKPAGENAME}}\n* 
{{TALKPAGENAMEE}}\n* {{SUBJECTPAGENAME}}\n* Warning: Page/template fetching 
disabled, and no cache for Template:SUBJECTPAGENAMEE\n* {{NAMESPACEE}}\n* 
{{NAMESPACE}}\n* {{NAMESPACENUMBER}}\n* {{TALKSPACE}}\n* {{TALKSPACEE}}\n* 
{{SUBJECTSPACE}}\n* 
{{Dynamic|{{NUMBEROFUSERS}}|{{NUMBEROFPAGES}}|{{CURRENTVERSION}}|{{CONTENTLANGUAGE}}|{{DIRECTIONMARK}}|{{CURRENTTIMESTAMP}}|{{NUMBEROFARTICLES}}}}");
 add("selser", "Say the magic word 
[[[3,0],3,3,0,[2,0],2,0,0,[3],3,0,0,4,2,2,4,0,0,4,4,[2,0],0,4,3,[3],2,4,2,0,0,4,0,1,0,0,0,4,0,3,0,0,3,1]]",
 "* {{PAGENAME}}\n* {{FULLPAGENAME}}\n* {{FULLPAGENAMEE}}\n* 
{{BASEPAGENAME}}\n* {{BASEPAGENAMEE}}\n* 9i1mmzlf0ombzkt9\n* 
bgaa5if3qh6ywrk9\n* {{SUBPAGENAMEE}}\n* {{ROOTPAGENAME}}\n* ainvbpywayrxusor\n* 
{{TALKPAGENAME}}\n* bciwqmn6odo647vi\n* {{SUBJECTPAGENAME}}\n* 
kpa6yhaj8dj9k9\n* {{NAMESPACEE}}\n* i035l9fsgojemi\n* {{NAMESPACENUMBER}}\n* 
{{TALKSPACE}}\n* m7c5k2h72dpfogvi\n* {{SUBJECTSPACEE}}\n* Warning: 
Page/template fetching disabled, and no cache for Template:Dynamic");
-add("selser", "Say the magic word 
[[3,2,1,0,0,2,0,4,[2],2,4,2,4,2,3,4,0,3,0,4,[3,0],2,0,0,3,4,3,4,[2,0],0,4,3,2,4,0,0,0,4,1,0,[2],2,[3]]]",
 "\n* {{PAGENAMEE}}\n* {{FULLPAGENAME}}\n* {{FULLPAGENAMEE}}\n* 
{{BASEPAGENAME}}\n* h8ohqlxjqi6kcsor\n* zxy3r1yxs3bzw7b9\n* {{ROOTPAGENAME}}\n* 
{{ROOTPAGENAMEE}}\n* {{TALKPAGENAME}}\n* {{TALKPAGENAMEE}}\n* {{NAMESPACEE}}\n* 
jya8hpq0rzppsyvi\n* szqdq4la370hpvi\n* {{NAMESPACENUMBER}}\n* {{TALKSPACE}}\n* 
{{TALKSPACEE}}\n* {{SUBJECTSPACE}}\n* {{SUBJECTSPACEE}}\n* 
{{Dynamic|{{NUMBEROFUSERS}}|{{NUMBEROFPAGES}}|{{CURRENTVERSION}}|{{CONTENTLANGUAGE}}|{{DIRECTIONMARK}}|{{CURRENTTIMESTAMP}}|{{NUMBEROFARTICLES}}}}");
+add("selser", "Say the magic word 
[[3,2,1,0,0,2,0,4,[2],2,4,2,4,2,3,4,0,3,0,4,[3,0],2,0,0,3,4,3,4,[2,0],0,4,3,2,4,0,0,0,4,1,0,[2],2,[3]]]",
 "* {{PAGENAMEE}}\n* {{FULLPAGENAME}}\n* {{FULLPAGENAMEE}}\n* 
{{BASEPAGENAME}}\n* h8ohqlxjqi6kcsor\n* zxy3r1yxs3bzw7b9\n* {{ROOTPAGENAME}}\n* 
{{ROOTPAGENAMEE}}\n* {{TALKPAGENAME}}\n* {{TALKPAGENAMEE}}\n* {{NAMESPACEE}}\n* 
jya8hpq0rzppsyvi\n* szqdq4la370hpvi\n* {{NAMESPACENUMBER}}\n* {{TALKSPACE}}\n* 
{{TALKSPACEE}}\n* {{SUBJECTSPACE}}\n* {{SUBJECTSPACEE}}\n* 
{{Dynamic|{{NUMBEROFUSERS}}|{{NUMBEROFPAGES}}|{{CURRENTVERSION}}|{{CONTENTLANGUAGE}}|{{DIRECTIONMARK}}|{{CURRENTTIMESTAMP}}|{{NUMBEROFARTICLES}}}}");
 add("selser", "Say the magic word 
[[0,0,0,0,[2,0],0,[3,0],0,2,4,1,0,0,2,4,0,0,0,2,0,0,0,0,0,[4],0,4,2,3,0,2,3,0,2,2,0,0,2,[4,0],3,1,3,3]]",
 "* {{PAGENAME}}\n* {{PAGENAMEE}}\n* {{FULLPAGENAME}}\n* {{FULLPAGENAMEE}}\n* 
ndb2aagd04yousor\n* {{BASEPAGENAME}}\n* Warning: Page/template fetching 
disabled, and no cache for Template:BASEPAGENAMEE\n* {{SUBPAGENAME}}\n* 
fygamhzidon7b9\n* {{ROOTPAGENAME}}\n* uo6tfy23ptvmfgvi\n* {{ROOTPAGENAMEE}}\n* 
{{TALKPAGENAME}}\n* {{TALKPAGENAMEE}}\n* {{SUBJECTPAGENAME}}\n* 
emopyckkbxd2t9\n* 0vj36772upbq33di\n* {{NAMESPACE}}\n* {{NAMESPACENUMBER}}\n* 
7hb5codowjowp14i\n* {{TALKSPACE}}\n* {{TALKSPACEE}}\n* {{SUBJECTSPACE}}\n* 
Warning: Page/template fetching disabled, and no cache for 
Template:SUBJECTSPACEE\n");
 add("selser", "Say the magic word 
[[[3,0],0,3,3,[4,0],2,4,0,[2],3,[3],2,2,0,3,0,[2],0,3,0,3,0,1,4,3,0,0,0,[2,0],0,1,3,0,4,3,0,0,0,3,2,4,4,4]]",
 "* {{PAGENAME}}\n* {{FULLPAGENAME}}\n* ot8fvtvt654mfgvi\n* {{BASEPAGENAME}}\n* 
{{BASEPAGENAMEE}}\n* 6qpg23x7oeyfzuxr\n* {{SUBPAGENAME}}\n* {{ROOTPAGENAME}}\n* 
Warning: Page/template fetching disabled, and no cache for 
Template:TALKPAGENAMEE\n* {{SUBJECTPAGENAMEE}}\n* {{NAMESPACEE}}\n* 
{{NAMESPACE}}\n* {{NAMESPACENUMBER}}\n* {{TALKSPACEE}}\n* 62rooavhbu7vte29\n* 
6cugsy47w4fb6gvi");
 add("selser", "Say the magic word 
[[2,0,[2,0],2,1,0,0,0,4,3,0,2,1,4,2,0,[4],0,2,3,3,3,0,0,2,3,4,0,2,3,3,0,0,3,2,2,[3],2,[3,0],3,0,0,1]]",
 "* m4apfjoelhvbzkt9\n* {{PAGENAME}}\n* {{PAGENAMEE}}\n* {{FULLPAGENAME}}\n* 
{{FULLPAGENAMEE}}\n* wa0cg4hdwpb3ayvi\n* {{BASEPAGENAMEE}}\n* Warning: 
Page/template fetching disabled, and no cache for Template:SUBPAGENAME\n* 
wxdzcid37j6h6w29\n* {{SUBPAGENAMEE}}\n* {{ROOTPAGENAME}}\n* cw8ole0rv1iz4cxr\n* 
{{ROOTPAGENAMEE}}\n* {{TALKPAGENAMEE}}\n* d5y6q7rs1czestt9\n* 
{{SUBJECTPAGENAME}}\n* tdeczyetofajor\n* om7ogw2ujoamj9k9\n* {{NAMESPACEE}}\n* 
{{NAMESPACENUMBER}}\n* bauxyjkh5r4l5wmi\n* {{TALKSPACE}}\n* {{TALKSPACEE}}\n* 
{{SUBJECTSPACE}}\n* {{SUBJECTSPACEE}}\n* Warning: Page/template fetching 
disabled, and no cache for Template:Dynamic");
 add("selser", "Say the magic word 
[[4,3,2,0,[4,0],0,0,0,3,2,0,2,1,2,4,2,[4],0,4,2,0,4,[2],0,0,3,[4],3,0,4,3,2,3,2,[3,0],0,1,0,2,0,0,0,0]]",
 "* z1su9pb83ka6pqfr\n* tm8a2l4q8dmtpgb9\n* {{PAGENAMEE}}\n* 
{{FULLPAGENAME}}\n* {{FULLPAGENAMEE}}\n* {{BASEPAGENAMEE}}\n* Warning: 
Page/template fetching disabled, and no cache for Template:SUBPAGENAME\n* 
su22den5zrveipb9\n* {{ROOTPAGENAME}}\n* tqg4uaq5g1qkhuxr\n* {{TALKPAGENAME}}\n* 
{{TALKPAGENAMEE}}\n* {{SUBJECTPAGENAME}}\n* {{SUBJECTPAGENAMEE}}\n* 
{{NAMESPACEE}}\n* {{TALKSPACE}}\n* Warning: Page/template fetching disabled, 
and no cache for Template:TALKSPACEE\n* ipcotpiu1vxfajor\n* {{SUBJECTSPACE}}\n* 
{{SUBJECTSPACEE}}\n* 
{{Dynamic|{{NUMBEROFUSERS}}|{{NUMBEROFPAGES}}|{{CURRENTVERSION}}|{{CONTENTLANGUAGE}}|{{DIRECTIONMARK}}|{{CURRENTTIMESTAMP}}|{{NUMBEROFARTICLES}}}}");
 add("selser", "Say the magic word 
[[[3,0],4,2,0,[2,0],3,0,3,0,0,3,2,[2],0,[2],0,[2],4,[3],3,0,3,2,0,2,4,0,2,[3,0],0,1,2,[4,0],0,[3,0],0,1,2,0,0,4,0,0]]",
 "* {{PAGENAME}}\n* ky0hpvdy19u7syvi\n* {{PAGENAMEE}}\n* {{FULLPAGENAME}}\n* 
{{FULLPAGENAMEE}}\n* {{BASEPAGENAME}}\n* {{SUBPAGENAME}}\n* {{SUBPAGENAMEE}}\n* 
{{ROOTPAGENAME}}\n* {{ROOTPAGENAMEE}}\n* {{TALKPAGENAME}}\n* 
5zd33tzhsq6ywrk9\n* {{TALKPAGENAMEE}}\n* q1ve04zv3pn45cdi\n* 
{{SUBJECTPAGENAME}}\n* {{SUBJECTPAGENAMEE}}\n* {{NAMESPACEE}}\n* 
{{NAMESPACE}}\n* {{NAMESPACENUMBER}}\n* {{TALKSPACE}}\n* Warning: Page/template 
fetching disabled, and no cache for Template:TALKSPACEE\n* {{SUBJECTSPACE}}\n* 
adrxf8dxaj5j0pb9\n* 
{{Dynamic|{{NUMBEROFUSERS}}|{{NUMBEROFPAGES}}|{{CURRENTVERSION}}|{{CONTENTLANGUAGE}}|{{DIRECTIONMARK}}|{{CURRENTTIMESTAMP}}|{{NUMBEROFARTICLES}}}}");
 add("selser", "Say the magic word 
[[0,0,[2,0],2,0,0,[3,0],0,0,0,2,3,4,0,3,3,[4],0,2,3,4,3,3,3,3,0,0,4,[3,0],3,4,0,[3,0],0,4,0,2,0,1,0,3,0,2]]",
 "* {{PAGENAME}}\n* {{PAGENAMEE}}\n* {{FULLPAGENAME}}\n* {{FULLPAGENAMEE}}\n* 
{{BASEPAGENAME}}\n* u6lhiqyib0pphkt9\n* {{BASEPAGENAMEE}}\n* 
o6hntwguej73z0k9\n* {{ROOTPAGENAME}}\n* k4k4qiif4xbqehfr\n* 
{{ROOTPAGENAMEE}}\n* aac9u9e7hyvf5hfr\n* {{SUBJECTPAGENAMEE}}\n* 
{{NAMESPACEE}}\n* bhm6scwc2qd26gvi\n* {{NAMESPACENUMBER}}\n* 
v2fdxdbteyn45cdi\n* 91971rq8r5rvn29\n* {{TALKSPACEE}}\n* {{SUBJECTSPACE}}\n* 
8bf6iukplc95dn29\n* 
{{Dynamic|{{NUMBEROFUSERS}}|{{NUMBEROFPAGES}}|{{CURRENTVERSION}}|{{CONTENTLANGUAGE}}|{{DIRECTIONMARK}}|{{CURRENTTIMESTAMP}}|{{NUMBEROFARTICLES}}}}");
-add("selser", "Say the magic word 
[[3,0,1,0,[3,0],4,[4,0],0,3,4,1,3,1,0,0,0,0,0,3,0,3,4,3,0,1,0,0,4,[2,0],4,4,0,2,0,4,2,[3],0,3,2,[3],3,[2]]]",
 "\n* {{PAGENAMEE}}\n* {{FULLPAGENAME}}\n* {{FULLPAGENAMEE}}\n* Warning: 
Page/template fetching disabled, and no cache for Template:BASEPAGENAMEE\n* 
Warning: Page/template fetching disabled, and no cache for 
Template:SUBPAGENAME\n* {{SUBPAGENAMEE}}\n* {{ROOTPAGENAME}}\n* Warning: 
Page/template fetching disabled, and no cache for Template:SUBJECTPAGENAME\n* 
{{SUBJECTPAGENAMEE}}\n* {{NAMESPACEE}}\n* 46udxo406dy4x6r\n* 
95cg7ex9o52hjjor\n* {{NAMESPACENUMBER}}\n* mzuww97pkvcgnwmi\n* 
{{TALKSPACEE}}\n* {{SUBJECTSPACEE}}\n* 
{{Dynamic|{{NUMBEROFUSERS}}|{{NUMBEROFPAGES}}|{{CURRENTVERSION}}|{{CONTENTLANGUAGE}}|{{DIRECTIONMARK}}|{{CURRENTTIMESTAMP}}|{{NUMBEROFARTICLES}}}}");
+add("selser", "Say the magic word 
[[3,0,1,0,[3,0],4,[4,0],0,3,4,1,3,1,0,0,0,0,0,3,0,3,4,3,0,1,0,0,4,[2,0],4,4,0,2,0,4,2,[3],0,3,2,[3],3,[2]]]",
 "* {{PAGENAMEE}}\n* {{FULLPAGENAME}}\n* {{FULLPAGENAMEE}}\n* Warning: 
Page/template fetching disabled, and no cache for Template:BASEPAGENAMEE\n* 
Warning: Page/template fetching disabled, and no cache for 
Template:SUBPAGENAME\n* {{SUBPAGENAMEE}}\n* {{ROOTPAGENAME}}\n* Warning: 
Page/template fetching disabled, and no cache for Template:SUBJECTPAGENAME\n* 
{{SUBJECTPAGENAMEE}}\n* {{NAMESPACEE}}\n* 46udxo406dy4x6r\n* 
95cg7ex9o52hjjor\n* {{NAMESPACENUMBER}}\n* mzuww97pkvcgnwmi\n* 
{{TALKSPACEE}}\n* {{SUBJECTSPACEE}}\n* 
{{Dynamic|{{NUMBEROFUSERS}}|{{NUMBEROFPAGES}}|{{CURRENTVERSION}}|{{CONTENTLANGUAGE}}|{{DIRECTIONMARK}}|{{CURRENTTIMESTAMP}}|{{NUMBEROFARTICLES}}}}");
 add("selser", "ISBN code coverage [2]", "v9jyhulo7jnka9k9\n\nISBN  
978-0-1234-56&#x20;789");
 add("selser", "ISBN code coverage [[[3],2,0]]", "ISBN  
978-0-1234-5641z4rabqzspaxlxr&#x20;789");
 add("selser", "ISBN code coverage [1]", "ISBN  978-0-1234-56&#x20;789");
@@ -3472,6 +3474,10 @@
 add("selser", "Free external link invading image caption [[0,[4]]]", 
"[[Image:Foobar.jpg|thumb|http://x|hello]]");
 add("selser", "Free external link invading image caption [[0,[3]]]", 
"[[Image:Foobar.jpg|thumb|http://x|hello]]");
 add("selser", "Free external link invading image caption [[0,[2]]]", 
"[[Image:Foobar.jpg|thumb|http://x|hello]]");
+add("selser", "percent-encoding and + signs in comments (Bug 26410) 
[[3,0,0]]", "[[ABC%33D% ++|+%20]]");
+add("selser", "percent-encoding and + signs in comments (Bug 26410) 
[[3,3,0]]", "[[ABC%33D% ++|+%20]]");
+add("selser", "percent-encoding and + signs in comments (Bug 26410) 
[[3,0,[3]]]", "[[ABC%33D% ++|+%20]]");
+add("selser", "percent-encoding and + signs in comments (Bug 26410) 
[[3,0,[2]]]", "[[ABC%33D% ++|+%20]]");
 add("selser", "preload: check that it doesn't try to do tricks [[2]]", "* 
didei13ahu0afw29\n* <!-- Hello --> ''{{world}}'' 
{{<includeonly>subst:</includeonly>How are you}}{{ {{{|safesubst:}}} 
#if:1|2|3}}");
 add("selser", "preload: check that it doesn't try to do tricks [2]", 
"zkok5psclsnbqpvi\n* <!-- Hello --> ''{{world}}'' 
{{<includeonly>subst:</includeonly>How are you}}{{ {{{|safesubst:}}} 
#if:1|2|3}}");
 add("selser", "preload: check that it doesn't try to do tricks 
[[[4,0,0,1,4,0]]]", "* <!-- Hello --> ''Warning: Page/template fetching 
disabled, and no cache for Template:World'' Warning: Page/template fetching 
disabled, and no cache for Template:How_are_you{{ {{{|safesubst:}}} 
#if:1|2|3}}");
@@ -3679,6 +3685,12 @@
 add("selser", "Headings: 4a. No escaping needed (testing just h1 and h2) 
[4,3,4,0,0,0,0,2,3,0,4,2,2,0,2]", "ocrps9v6n6lmcxr\n\nx56cdedpb531h5mi\n\n= 
=foo= =\n\n==foo= 
bar=\n\nuvgzu2vpz7ntrzfr\n\nksxmuylbj4blc8fr\n=''=''foo==\n\nqlo0n5voltnmte29\n=<nowiki>=</nowiki>=");
 add("selser", "Headings: 4a. No escaping needed (testing just h1 and h2) 
[2,3,[2],0,3,0,0,0,1,0,2,0,2,2,[[3]]]", 
"v10aezhks9rdaemi\n==foo=\n\n=foo==\n\n==foo= 
bar=\n\n===foo==\n\nlf5hzwbg7ujtt9\n==foo===\n\nh2dgrpr2fx647vi\n=''=''foo==\n\n=<nowiki>=</nowiki>=");
 add("selser", "Headings: 4a. No escaping needed (testing just h1 and h2) 
[2,4,4,3,0,0,4,4,2,2,[2],0,0,4,3]", 
"ixqxdfuj1yioogvi\n==foo=\n\ndat2l79l360w9udi\n\n= =foo= 
=\n\nn1wi0vrqn1c92j4i\n\nzt7hsspui04zehfr\n===foo==\n\n==foo===\n\n=''=''foo==\n");
+add("selser", "Lists: 1. Nested inside html 
[[1],0,0,0,[1],4,[4],0,[4],2,4,0,[[[3]]],0,[3]]", 
"*<nowiki>*foo</nowiki>\n\n*<nowiki>#foo</nowiki>\n\n*<nowiki>:foo</nowiki>\n\n*
 ob02l0vkqyf1or\n# 
77i6sh5wpm4jwcdi\n\ndmv3qwke6irudi\n\n#<nowiki>:foo</nowiki>\n\n#");
+add("selser", "Lists: 1. Nested inside html 
[[4],3,[4],0,[[3]],0,4,0,[[4]],3,4,2,[[[2]]],0,3]", "* dsxfuxcwxesqyqfr\n\n* 
owgw4nkqnfef80k9\n\n*\n\nz8ike8xrrxxn7b9\n#zn3w0alil9uanhfr\n\nprnzwyte3puy2e29\n\n#<nowiki>:foo</nowiki>\n");
+add("selser", "Lists: 1. Nested inside html 
[1,0,4,0,[[[3]]],0,[3],2,[3],4,[[[3]]],0,[[1]],0,4]", 
"*<nowiki>*foo</nowiki>\n\n4z2d9eh8d3lq5mi\n\n*<nowiki>:foo</nowiki>\n\n*\n\n#\n\n#<nowiki>#foo</nowiki>\n\n#<nowiki>:foo</nowiki>\n\nnzg4ucp3trjrwwmi");
+add("selser", "Lists: 1. Nested inside html 
[[[2]],3,3,0,3,0,3,0,[2],0,[2],2,4,2,[[[4]]]]", 
"*cqapt5lkmn7y14i<nowiki>*foo</nowiki>\n# 
2tr4lpaoqrzoajor\n#<nowiki>*foo</nowiki>\n\n# 
1hchid9nhsqq6w29\n#<nowiki>#foo</nowiki>\n\ncgewghu5bugfd2t9\n\n#<nowiki>;foo</nowiki>");
+add("selser", "Lists: 1. Nested inside html 
[4,0,2,0,[[[3]]],3,3,2,[[[2]]],0,[[2]],2,[[3]],0,[[[2]]]]", 
"ok4w3sud87low29\n\nvin27aabhpf4j9k9\n*<nowiki>#foo</nowiki>\n\n*<nowiki>:foo</nowiki>\n\n#<nowiki>*foo</nowiki>\n\n#dml26i0dcxxenrk9<nowiki>#foo</nowiki>\n\n#\n\n#<nowiki>;foo</nowiki>");
+add("selser", "Lists: 4. No escapes needed [4,2,[[0,2]],2,[2]]", 
"p6ibs2626wjc3di\n\n*''foo''*bar\n\n* z15lpdjl1wzv9529\n*[[Foo]]: bar");
 add("selser", "Tables: 1b. No escaping needed [2]", "!foo");
 add("selser", "Tables: 1b. No escaping needed [4]", "!foo");
 add("selser", "Tables: 1b. No escaping needed [3]", "!foo");
diff --git a/js/tests/parserTests.txt b/js/tests/parserTests.txt
index 6a17898..b1e6adc 100644
--- a/js/tests/parserTests.txt
+++ b/js/tests/parserTests.txt
@@ -17856,16 +17856,11 @@
 <p>123</p><figure typeof="mw:Image/Thumb" class="mw-halign-right"><a 
href="./File:Wiki.png"><img 
src="http://192.168.142.128/mw/images/thumb/b/bc/Wiki.png/131px-Wiki.png"; 
width="131" height="150" resource="./File:Wiki.png"></a></figure><p>456</p>
 !!end
 
-# Wacky -- the leading newline in input is required because
-# that is what the serializer emits. To be fixed. Not fixing
-# the test because this test is required to test serialization of
-# new content and preferred whitespace style.
 !! test
 Lists: Serialize correctly even when list content is wrapped in p-tags (like 
VE does)
 !! options
 parsoid=html2wt
 !! input
-
 * foo
 !! result
 <ul>
@@ -17930,16 +17925,11 @@
  <span>bar</span>
 !! end
 
-# Wacky -- the leading newline in input is required because
-# that is what the serializer emits. To be fixed. Not fixing
-# the test because this test is required to test serialization of
-# new content and preferred whitespace style.
 !! test
 Lists: Add space after bullets
 !! options
 parsoid=html2wt
 !! input
-
 * foo
 * bar
 * <span> baz</span>

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

Gerrit-MessageType: newchange
Gerrit-Change-Id: If17867dca335e08d06ade3a511d54685afb879de
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/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