Subramanya Sastry has uploaded a new change for review.

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

Change subject: WIP: Suppress newlines before category links
......................................................................

WIP: Suppress newlines before category links

* itwiki:Melampyrum now RTs without semantic errors because the
  duplicate args category links no longer ends up on a new line.

* http://localhost:8000/enwiki/Taiko?oldid=665356368 now renders
  as expected as well.

* enwiki:User:SSastry_%28WMF%29/Category_Test now renders more
  accurately than before. The list tests will not RT back the
  newlines because of newline suppression in list context -- RTing
  of that test case will not be supported.

* We continue to treat category links as SOL-transparent, because
  that is their "true nature" in scenarios where newlines aren't
  stripped.

* TODO: Need some sanity check.
* TODO: Parser tests need updating.

Change-Id: I507dcefcca5a4ee22fb9f9bf0cfe678f14d64991
---
M lib/ext.core.TokenStreamPatcher.js
M tests/parserTests-blacklist.js
2 files changed, 36 insertions(+), 8 deletions(-)


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

diff --git a/lib/ext.core.TokenStreamPatcher.js 
b/lib/ext.core.TokenStreamPatcher.js
index 626841e..d119728 100644
--- a/lib/ext.core.TokenStreamPatcher.js
+++ b/lib/ext.core.TokenStreamPatcher.js
@@ -18,6 +18,7 @@
 
 // define some constructor shortcuts
 var CommentTk = defines.CommentTk;
+var NlTk = defines.NlTk;
 var TagTk = defines.TagTk;
 var SelfclosingTagTk = defines.SelfclosingTagTk;
 var EndTagTk = defines.EndTagTk;
@@ -34,8 +35,8 @@
 // FIXME: At this point, it probably deserves a refactor.
 coreutil.inherits(TokenStreamPatcher, TemplateHandler);
 
-TokenStreamPatcher.prototype.anyRank  = 2.001;
-TokenStreamPatcher.prototype.nlRank   = 2.002;
+TokenStreamPatcher.prototype.nlRank   = 2.001;
+TokenStreamPatcher.prototype.anyRank  = 2.002;
 TokenStreamPatcher.prototype.endRank  = 2.003;
 
 TokenStreamPatcher.prototype.register = function() {
@@ -56,12 +57,15 @@
        this.wikiTableNesting = 0;
        this.srcOffset = 0;
        this.sol = true;
+       this.nlBuffer = [];
 };
 
 TokenStreamPatcher.prototype.onNewline = function(token) {
+       this.manager.env.log("trace/tsp", this.manager.pipelineId, function() { 
return JSON.stringify(token); } );
        this.srcOffset = (token.dataAttribs.tsr || [null, null])[1];
        this.sol = true;
-       return {tokens: [token]};
+       this.nlBuffer.push(token);
+       return {tokens: []};
 };
 
 TokenStreamPatcher.prototype.onEnd = function(token) {
@@ -166,6 +170,24 @@
                case SelfclosingTagTk:
                        if (token.name === "meta" && token.dataAttribs.stx !== 
"html") {
                                this.srcOffset = (token.dataAttribs.tsr || 
[null, null])[1];
+                       } else if (token.name === 'link' && 
token.getAttribute('rel') === 'mw:PageProp/Category') {
+                               // Replace buffered newlines with a placeholder 
for rt-ing
+                               if (this.nlBuffer.length > 0) {
+                                       var firstNL = this.nlBuffer[0];
+                                       var lastNL = this.nlBuffer.last();
+                                       if (firstNL.dataAttribs.tsr && 
lastNL.dataAttribs.tsr) {
+                                               var tsr0 = 
firstNL.dataAttribs.tsr[0];
+                                               var tsr1 = 
lastNL.dataAttribs.tsr[1];
+                                               tokens.unshift(new 
SelfclosingTagTk('meta',
+                                                       [new KV('typeof', 
'mw:Placeholder')],
+                                                       {
+                                                               src: 
this.manager.env.page.src.substring(tsr0, tsr1),
+                                                               tsr: [tsr0, 
tsr1]
+                                                       }));
+                                       }
+                                       this.nlBuffer = [];
+                               }
+                               this.sol = false;
                        } else {
                                this.clearSOL();
                        }
@@ -203,6 +225,11 @@
                        break;
        }
 
+       // Emit buffered newlines
+       if (this.nlBuffer.length > 0) {
+               tokens = this.nlBuffer.concat(tokens);
+               this.nlBuffer = [];
+       }
        return {tokens: tokens};
 };
 
diff --git a/tests/parserTests-blacklist.js b/tests/parserTests-blacklist.js
index a00ea55..b10826a 100644
--- a/tests/parserTests-blacklist.js
+++ b/tests/parserTests-blacklist.js
@@ -44,6 +44,7 @@
 add("wt2html", "Comment on its own line post-expand with non-significant 
whitespace", "<p data-parsoid='{\"dsr\":[0,23,0,0]}'>a\n <span about=\"#mwt1\" 
typeof=\"mw:Transclusion\" 
data-parsoid='{\"dsr\":[3,12,null,null],\"pi\":[[]]}' 
data-mw='{\"parts\":[{\"template\":{\"target\":{\"wt\":\"blank\",\"href\":\"./Template:Blank\"},\"params\":{},\"i\":0}}]}'></span>
 <!----> \nb</p>");
 add("wt2html", "Block tag on one line (<blockquote>)", "<p 
data-parsoid='{\"dsr\":[0,2,0,0]}'>a </p><blockquote 
data-parsoid='{\"stx\":\"html\",\"dsr\":[2,30,12,13]}'>foo</blockquote>\n\n<p 
data-parsoid='{\"dsr\":[32,33,0,0]}'>b</p>");
 add("wt2html", "Block tag on both lines (<blockquote>)", "<p 
data-parsoid='{\"dsr\":[0,2,0,0]}'>a </p><blockquote 
data-parsoid='{\"stx\":\"html\",\"dsr\":[2,30,12,13]}'>foo</blockquote>\n\n<p 
data-parsoid='{\"dsr\":[32,34,0,0]}'>b </p><blockquote 
data-parsoid='{\"stx\":\"html\",\"dsr\":[34,62,12,13]}'>foo</blockquote>");
+add("wt2html", "1. P-wrapping should leave sol-transparent tags outside p-tags 
where possible", "<p data-parsoid='{\"dsr\":[0,2,0,0]}'>a </p><link 
rel=\"mw:PageProp/Category\" href=\"./Category:A1\" 
data-parsoid='{\"stx\":\"simple\",\"a\":{\"href\":\"./Category:A1\"},\"sa\":{\"href\":\"Category:A1\"},\"dsr\":[2,17,null,null]}'/>
 <link rel=\"mw:PageProp/Category\" href=\"./Category:A2\" 
data-parsoid='{\"stx\":\"simple\",\"a\":{\"href\":\"./Category:A2\"},\"sa\":{\"href\":\"Category:A2\"},\"dsr\":[18,33,null,null]}'/><meta
 typeof=\"mw:Placeholder\" 
data-parsoid='{\"src\":\"\\n\",\"dsr\":[33,34,null,null]}'/><link 
rel=\"mw:PageProp/Category\" href=\"./Category:A3\" 
data-parsoid='{\"stx\":\"simple\",\"a\":{\"href\":\"./Category:A3\"},\"sa\":{\"href\":\"Category:A3\"},\"dsr\":[34,49,null,null]}'/><meta
 typeof=\"mw:Placeholder\" 
data-parsoid='{\"src\":\"\\n\",\"dsr\":[49,50,null,null]}'/><link 
rel=\"mw:PageProp/Category\" href=\"./Category:A4\" 
data-parsoid='{\"stx\":\"simple\",\"a\":{\"href\":\"./Category:A4\"},\"sa\":{\"href\":\"Category:A4\"},\"dsr\":[50,65,null,null]}'/>");
 add("wt2html", "<pre> with <nowiki> inside (compatibility with 1.6 and 
earlier)", "<pre data-parsoid='{\"stx\":\"html\",\"dsr\":[0,45,5,6]}'><span 
typeof=\"mw:Nowiki\" 
data-parsoid='{\"dsr\":[5,39,8,9]}'>\n&lt;b>\n&lt;cite>\n&lt;em>\n</span></pre>");
 add("wt2html", "Bug 52763: Preformatted in <blockquote>", "<blockquote 
data-parsoid='{\"stx\":\"html\",\"dsr\":[0,74,12,13]}'>\n<p 
data-parsoid='{\"dsr\":[13,18,0,0]}'> Blah</p>\n<table 
data-parsoid='{\"dsr\":[19,60,2,2]}'>\n<tbody 
data-parsoid='{\"dsr\":[22,58,0,0]}'><tr 
data-parsoid='{\"autoInsertedEnd\":true,\"autoInsertedStart\":true,\"dsr\":[22,57,0,0]}'><td
 data-parsoid='{\"autoInsertedEnd\":true,\"dsr\":[22,57,1,0]}'>\n<pre 
data-parsoid='{\"dsr\":[24,57,1,0]}'>indented cell (no 
pre-wrapping!)</pre></td></tr>\n</tbody></table>\n</blockquote>");
 add("wt2html", "Bug 15491: <ins>/<del> in blockquote (2)", "<blockquote 
data-parsoid='{\"stx\":\"html\",\"dsr\":[0,64,12,13]}'>Foo <del 
data-parsoid='{\"stx\":\"html\",\"dsr\":[16,30,5,6]}'>bar</del> <ins 
data-parsoid='{\"stx\":\"html\",\"dsr\":[31,45,5,6]}'>baz</ins> 
quux\n</blockquote>");
@@ -186,7 +187,8 @@
 add("wt2html", "Category with template", "<link typeof=\"mw:ExpandedAttrs\" 
about=\"#mwt2\" rel=\"mw:PageProp/Category\" href=\"./Category:Foo\" 
data-parsoid='{\"stx\":\"simple\",\"a\":{\"href\":\"./Category:Foo\"},\"sa\":{\"href\":\"Category:{{echo|Foo}}\"},\"dsr\":[0,25,null,null]}'
 data-mw='{\"attribs\":[[{\"txt\":\"href\"},{\"html\":\"Category:&lt;span 
about=\\\"#mwt1\\\" typeof=\\\"mw:Transclusion\\\" 
data-parsoid=\\\"{&amp;quot;pi&amp;quot;:[[{&amp;quot;k&amp;quot;:&amp;quot;1&amp;quot;,&amp;quot;spc&amp;quot;:[&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;]}]],&amp;quot;dsr&amp;quot;:[11,23,null,null]}\\\"
 
data-mw=\\\"{&amp;quot;parts&amp;quot;:[{&amp;quot;template&amp;quot;:{&amp;quot;target&amp;quot;:{&amp;quot;wt&amp;quot;:&amp;quot;echo&amp;quot;,&amp;quot;href&amp;quot;:&amp;quot;./Template:Echo&amp;quot;},&amp;quot;params&amp;quot;:{&amp;quot;1&amp;quot;:{&amp;quot;wt&amp;quot;:&amp;quot;Foo&amp;quot;}},&amp;quot;i&amp;quot;:0}}]}\\\">Foo&lt;/span>\"}]]}'/>");
 add("wt2html", "Category with template in sort key", "<link 
rel=\"mw:PageProp/Category\" href=\"./Category:Foo#Bar\" about=\"#mwt2\" 
typeof=\"mw:ExpandedAttrs\" 
data-parsoid='{\"stx\":\"piped\",\"a\":{\"href\":\"./Category:Foo\"},\"sa\":{\"href\":\"Category:Foo\"},\"dsr\":[0,29,null,null]}'
 data-mw='{\"attribs\":[[{\"txt\":\"mw:sortKey\"},{\"html\":\"&lt;span 
about=\\\"#mwt1\\\" typeof=\\\"mw:Transclusion\\\" 
data-parsoid=\\\"{&amp;quot;pi&amp;quot;:[[{&amp;quot;k&amp;quot;:&amp;quot;1&amp;quot;,&amp;quot;spc&amp;quot;:[&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;]}]],&amp;quot;dsr&amp;quot;:[15,27,null,null]}\\\"
 
data-mw=\\\"{&amp;quot;parts&amp;quot;:[{&amp;quot;template&amp;quot;:{&amp;quot;target&amp;quot;:{&amp;quot;wt&amp;quot;:&amp;quot;echo&amp;quot;,&amp;quot;href&amp;quot;:&amp;quot;./Template:Echo&amp;quot;},&amp;quot;params&amp;quot;:{&amp;quot;1&amp;quot;:{&amp;quot;wt&amp;quot;:&amp;quot;Bar&amp;quot;}},&amp;quot;i&amp;quot;:0}}]}\\\">Bar&lt;/span>\"}]]}'/>");
 add("wt2html", "Category with template in sort key and title", "<link 
typeof=\"mw:ExpandedAttrs\" about=\"#mwt4\" rel=\"mw:PageProp/Category\" 
href=\"./Category:Foo#Bar\" 
data-parsoid='{\"stx\":\"piped\",\"a\":{\"href\":\"./Category:Foo\"},\"sa\":{\"href\":\"Category:{{echo|Foo}}\"},\"dsr\":[0,38,null,null]}'
 data-mw='{\"attribs\":[[{\"txt\":\"href\"},{\"html\":\"Category:&lt;span 
about=\\\"#mwt1\\\" typeof=\\\"mw:Transclusion\\\" 
data-parsoid=\\\"{&amp;quot;pi&amp;quot;:[[{&amp;quot;k&amp;quot;:&amp;quot;1&amp;quot;,&amp;quot;spc&amp;quot;:[&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;]}]],&amp;quot;dsr&amp;quot;:[11,23,null,null]}\\\"
 
data-mw=\\\"{&amp;quot;parts&amp;quot;:[{&amp;quot;template&amp;quot;:{&amp;quot;target&amp;quot;:{&amp;quot;wt&amp;quot;:&amp;quot;echo&amp;quot;,&amp;quot;href&amp;quot;:&amp;quot;./Template:Echo&amp;quot;},&amp;quot;params&amp;quot;:{&amp;quot;1&amp;quot;:{&amp;quot;wt&amp;quot;:&amp;quot;Foo&amp;quot;}},&amp;quot;i&amp;quot;:0}}]}\\\">Foo&lt;/span>\"}],[{\"txt\":\"mw:sortKey\"},{\"html\":\"&lt;span
 about=\\\"#mwt2\\\" typeof=\\\"mw:Transclusion\\\" 
data-parsoid=\\\"{&amp;quot;pi&amp;quot;:[[{&amp;quot;k&amp;quot;:&amp;quot;1&amp;quot;,&amp;quot;spc&amp;quot;:[&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;]}]],&amp;quot;dsr&amp;quot;:[24,36,null,null]}\\\"
 
data-mw=\\\"{&amp;quot;parts&amp;quot;:[{&amp;quot;template&amp;quot;:{&amp;quot;target&amp;quot;:{&amp;quot;wt&amp;quot;:&amp;quot;echo&amp;quot;,&amp;quot;href&amp;quot;:&amp;quot;./Template:Echo&amp;quot;},&amp;quot;params&amp;quot;:{&amp;quot;1&amp;quot;:{&amp;quot;wt&amp;quot;:&amp;quot;Bar&amp;quot;}},&amp;quot;i&amp;quot;:0}}]}\\\">Bar&lt;/span>\"}]]}'/>");
-add("wt2html", "Category / paragraph interactions", "<p 
data-parsoid='{\"dsr\":[0,24,0,0]}'>Foo <link rel=\"mw:PageProp/Category\" 
href=\"./Category:Baz\" 
data-parsoid='{\"stx\":\"simple\",\"a\":{\"href\":\"./Category:Baz\"},\"sa\":{\"href\":\"Category:Baz\"},\"dsr\":[4,20,null,null]}'/>
 Bar</p>\n\n<p data-parsoid='{\"dsr\":[26,50,0,0]}'>Foo <link 
rel=\"mw:PageProp/Category\" href=\"./Category:Baz\" 
data-parsoid='{\"stx\":\"simple\",\"a\":{\"href\":\"./Category:Baz\"},\"sa\":{\"href\":\"Category:Baz\"},\"dsr\":[30,46,null,null]}'/>\nBar</p>\n\n<p
 data-parsoid='{\"dsr\":[52,76,0,0]}'>Foo\n<link rel=\"mw:PageProp/Category\" 
href=\"./Category:Baz\" 
data-parsoid='{\"stx\":\"simple\",\"a\":{\"href\":\"./Category:Baz\"},\"sa\":{\"href\":\"Category:Baz\"},\"dsr\":[56,72,null,null]}'/>\nBar</p>\n\n<p
 data-parsoid='{\"dsr\":[78,81,0,0]}'>Foo</p>\n<link 
rel=\"mw:PageProp/Category\" href=\"./Category:Baz\" 
data-parsoid='{\"stx\":\"simple\",\"a\":{\"href\":\"./Category:Baz\"},\"sa\":{\"href\":\"Category:Baz\"},\"dsr\":[82,98,null,null]}'/><pre
 data-parsoid='{\"dsr\":[98,102,1,0]}'>Bar</pre>\n\n<p 
data-parsoid='{\"dsr\":[104,163,0,0]}'>Foo\n<link rel=\"mw:PageProp/Category\" 
href=\"./Category:Baz\" 
data-parsoid='{\"stx\":\"simple\",\"a\":{\"href\":\"./Category:Baz\"},\"sa\":{\"href\":\"Category:Baz\"},\"dsr\":[108,124,null,null]}'/>\n
 <link rel=\"mw:PageProp/Category\" href=\"./Category:Baz\" 
data-parsoid='{\"stx\":\"simple\",\"a\":{\"href\":\"./Category:Baz\"},\"sa\":{\"href\":\"Category:Baz\"},\"dsr\":[126,142,null,null]}'/>\n<link
 rel=\"mw:PageProp/Category\" href=\"./Category:Baz\" 
data-parsoid='{\"stx\":\"simple\",\"a\":{\"href\":\"./Category:Baz\"},\"sa\":{\"href\":\"Category:Baz\"},\"dsr\":[143,159,null,null]}'/>\nBar</p>\n\n<link
 rel=\"mw:PageProp/Category\" href=\"./Category:Baz\" 
data-parsoid='{\"stx\":\"simple\",\"a\":{\"href\":\"./Category:Baz\"},\"sa\":{\"href\":\"Category:Baz\"},\"dsr\":[165,181,null,null]}'/>\n
 <link rel=\"mw:PageProp/Category\" href=\"./Category:Baz\" 
data-parsoid='{\"stx\":\"simple\",\"a\":{\"href\":\"./Category:Baz\"},\"sa\":{\"href\":\"Category:Baz\"},\"dsr\":[183,199,null,null]}'/>\n<link
 rel=\"mw:PageProp/Category\" href=\"./Category:Baz\" 
data-parsoid='{\"stx\":\"simple\",\"a\":{\"href\":\"./Category:Baz\"},\"sa\":{\"href\":\"Category:Baz\"},\"dsr\":[200,216,null,null]}'/>\n\n<link
 rel=\"mw:PageProp/Category\" href=\"./Category:Baz\" 
data-parsoid='{\"stx\":\"simple\",\"a\":{\"href\":\"./Category:Baz\"},\"sa\":{\"href\":\"Category:Baz\"},\"dsr\":[218,234,null,null]}'/>\n
 <link rel=\"mw:PageProp/Category\" href=\"./Category:Baz\" about=\"#mwt1\" 
typeof=\"mw:Transclusion\" 
data-parsoid='{\"stx\":\"simple\",\"a\":{\"href\":\"./Category:Baz\"},\"sa\":{\"href\":\"Category:Baz\"},\"dsr\":[236,261,null,null],\"pi\":[[{\"k\":\"1\",\"spc\":[\"\",\"\",\"\",\"\"]}]]}'
 
data-mw='{\"parts\":[{\"template\":{\"target\":{\"wt\":\"echo\",\"href\":\"./Template:Echo\"},\"params\":{\"1\":{\"wt\":\"[[Category:Baz]]\"}},\"i\":0}}]}'/>\n<link
 rel=\"mw:PageProp/Category\" href=\"./Category:Baz\" 
data-parsoid='{\"stx\":\"simple\",\"a\":{\"href\":\"./Category:Baz\"},\"sa\":{\"href\":\"Category:Baz\"},\"dsr\":[262,278,null,null]}'/>");
+add("wt2html", "Category / paragraph interactions", "<p 
data-parsoid='{\"dsr\":[0,24,0,0]}'>Foo <link rel=\"mw:PageProp/Category\" 
href=\"./Category:Baz\" 
data-parsoid='{\"stx\":\"simple\",\"a\":{\"href\":\"./Category:Baz\"},\"sa\":{\"href\":\"Category:Baz\"},\"dsr\":[4,20,null,null]}'/>
 Bar</p>\n\n<p data-parsoid='{\"dsr\":[26,50,0,0]}'>Foo <link 
rel=\"mw:PageProp/Category\" href=\"./Category:Baz\" 
data-parsoid='{\"stx\":\"simple\",\"a\":{\"href\":\"./Category:Baz\"},\"sa\":{\"href\":\"Category:Baz\"},\"dsr\":[30,46,null,null]}'/>\nBar</p>\n\n<p
 data-parsoid='{\"dsr\":[52,76,0,0]}'>Foo<meta typeof=\"mw:Placeholder\" 
data-parsoid='{\"src\":\"\\n\",\"dsr\":[55,56,null,null]}'/><link 
rel=\"mw:PageProp/Category\" href=\"./Category:Baz\" 
data-parsoid='{\"stx\":\"simple\",\"a\":{\"href\":\"./Category:Baz\"},\"sa\":{\"href\":\"Category:Baz\"},\"dsr\":[56,72,null,null]}'/>\nBar</p>\n\n<p
 data-parsoid='{\"dsr\":[78,102,0,0]}'>Foo<meta typeof=\"mw:Placeholder\" 
data-parsoid='{\"src\":\"\\n\",\"dsr\":[81,82,null,null]}'/><link 
rel=\"mw:PageProp/Category\" href=\"./Category:Baz\" 
data-parsoid='{\"stx\":\"simple\",\"a\":{\"href\":\"./Category:Baz\"},\"sa\":{\"href\":\"Category:Baz\"},\"dsr\":[82,98,null,null]}'/>
 Bar</p>\n\n<p data-parsoid='{\"dsr\":[104,261,0,0]}'>Foo<meta 
typeof=\"mw:Placeholder\" 
data-parsoid='{\"src\":\"\\n\",\"dsr\":[107,108,null,null]}'/><link 
rel=\"mw:PageProp/Category\" href=\"./Category:Baz\" 
data-parsoid='{\"stx\":\"simple\",\"a\":{\"href\":\"./Category:Baz\"},\"sa\":{\"href\":\"Category:Baz\"},\"dsr\":[108,124,null,null]}'/>\n
 <link rel=\"mw:PageProp/Category\" href=\"./Category:Baz\" 
data-parsoid='{\"stx\":\"simple\",\"a\":{\"href\":\"./Category:Baz\"},\"sa\":{\"href\":\"Category:Baz\"},\"dsr\":[126,142,null,null]}'/><meta
 typeof=\"mw:Placeholder\" 
data-parsoid='{\"src\":\"\\n\",\"dsr\":[142,143,null,null]}'/><link 
rel=\"mw:PageProp/Category\" href=\"./Category:Baz\" 
data-parsoid='{\"stx\":\"simple\",\"a\":{\"href\":\"./Category:Baz\"},\"sa\":{\"href\":\"Category:Baz\"},\"dsr\":[143,159,null,null]}'/>\nBar<meta
 typeof=\"mw:Placeholder\" 
data-parsoid='{\"src\":\"\\n\\n\",\"dsr\":[163,165,null,null]}'/><link 
rel=\"mw:PageProp/Category\" href=\"./Category:Baz\" 
data-parsoid='{\"stx\":\"simple\",\"a\":{\"href\":\"./Category:Baz\"},\"sa\":{\"href\":\"Category:Baz\"},\"dsr\":[165,181,null,null]}'/>\n
 <link rel=\"mw:PageProp/Category\" href=\"./Category:Baz\" 
data-parsoid='{\"stx\":\"simple\",\"a\":{\"href\":\"./Category:Baz\"},\"sa\":{\"href\":\"Category:Baz\"},\"dsr\":[183,199,null,null]}'/><meta
 typeof=\"mw:Placeholder\" 
data-parsoid='{\"src\":\"\\n\",\"dsr\":[199,200,null,null]}'/><link 
rel=\"mw:PageProp/Category\" href=\"./Category:Baz\" 
data-parsoid='{\"stx\":\"simple\",\"a\":{\"href\":\"./Category:Baz\"},\"sa\":{\"href\":\"Category:Baz\"},\"dsr\":[200,216,null,null]}'/><meta
 typeof=\"mw:Placeholder\" 
data-parsoid='{\"src\":\"\\n\\n\",\"dsr\":[216,218,null,null]}'/><link 
rel=\"mw:PageProp/Category\" href=\"./Category:Baz\" 
data-parsoid='{\"stx\":\"simple\",\"a\":{\"href\":\"./Category:Baz\"},\"sa\":{\"href\":\"Category:Baz\"},\"dsr\":[218,234,null,null]}'/>\n
 <link rel=\"mw:PageProp/Category\" href=\"./Category:Baz\" about=\"#mwt1\" 
typeof=\"mw:Transclusion\" 
data-parsoid='{\"stx\":\"simple\",\"a\":{\"href\":\"./Category:Baz\"},\"sa\":{\"href\":\"Category:Baz\"},\"dsr\":[236,261,null,null],\"pi\":[[{\"k\":\"1\",\"spc\":[\"\",\"\",\"\",\"\"]}]]}'
 
data-mw='{\"parts\":[{\"template\":{\"target\":{\"wt\":\"echo\",\"href\":\"./Template:Echo\"},\"params\":{\"1\":{\"wt\":\"[[Category:Baz]]\"}},\"i\":0}}]}'/></p><meta
 typeof=\"mw:Placeholder\" 
data-parsoid='{\"src\":\"\\n\",\"dsr\":[261,262,null,null]}'/><link 
rel=\"mw:PageProp/Category\" href=\"./Category:Baz\" 
data-parsoid='{\"stx\":\"simple\",\"a\":{\"href\":\"./Category:Baz\"},\"sa\":{\"href\":\"Category:Baz\"},\"dsr\":[262,278,null,null]}'/>");
+add("wt2html", "Parsoid: Serialize a genuine category link without colon 
escape", "<link rel=\"mw:PageProp/Category\" href=\"./Category:Foo\" 
data-parsoid='{\"stx\":\"simple\",\"a\":{\"href\":\"./Category:Foo\"},\"sa\":{\"href\":\"Category:Foo\"},\"dsr\":[0,16,null,null]}'/><meta
 typeof=\"mw:Placeholder\" 
data-parsoid='{\"src\":\"\\n\",\"dsr\":[16,17,null,null]}'/><link 
rel=\"mw:PageProp/Category\" href=\"./Category:Foo#Bar\" 
data-parsoid='{\"stx\":\"piped\",\"a\":{\"href\":\"./Category:Foo\"},\"sa\":{\"href\":\"Category:Foo\"},\"dsr\":[17,37,null,null]}'/>");
 add("wt2html", "Short headings with trailing space should match behavior of 
Parser::doHeadings (bug 19910)", "<p data-parsoid='{\"dsr\":[0,100,0,0]}'>=== 
\nThe line above must have a trailing space!\n=== <!--\n--> <!-- -->\nBut just 
in case it doesn't...</p>");
 add("wt2html", "Header with space, plus and underscore as entity", "<p 
data-parsoid='{\"dsr\":[0,34,0,0]}'>Id should not contain + for 
spaces</p>\n\n<h2 data-parsoid='{\"dsr\":[36,60,2,2]}'> Space between Text 
</h2>\n<p data-parsoid='{\"dsr\":[61,70,0,0]}'>section 1</p>\n\n<h2 
data-parsoid='{\"dsr\":[72,111,2,2]}'> Space-Entity<span typeof=\"mw:Entity\" 
data-parsoid='{\"src\":\"&amp;#32;\",\"srcContent\":\" 
\",\"dsr\":[87,92,null,null]}'> </span>between<span typeof=\"mw:Entity\" 
data-parsoid='{\"src\":\"&amp;#32;\",\"srcContent\":\" 
\",\"dsr\":[99,104,null,null]}'> </span>Text </h2>\n<p 
data-parsoid='{\"dsr\":[112,121,0,0]}'>section 2</p>\n\n<h2 
data-parsoid='{\"dsr\":[123,146,2,2]}'> Plus+between+Text </h2>\n<p 
data-parsoid='{\"dsr\":[147,156,0,0]}'>section 3</p>\n\n<h2 
data-parsoid='{\"dsr\":[158,196,2,2]}'> Plus-Entity<span typeof=\"mw:Entity\" 
data-parsoid='{\"src\":\"&amp;#43;\",\"srcContent\":\"+\",\"dsr\":[172,177,null,null]}'>+</span>between<span
 typeof=\"mw:Entity\" 
data-parsoid='{\"src\":\"&amp;#43;\",\"srcContent\":\"+\",\"dsr\":[184,189,null,null]}'>+</span>Text
 </h2>\n<p data-parsoid='{\"dsr\":[197,206,0,0]}'>section 4</p>\n\n<h2 
data-parsoid='{\"dsr\":[208,237,2,2]}'> Underscore_between_Text </h2>\n<p 
data-parsoid='{\"dsr\":[238,247,0,0]}'>section 5</p>\n\n<h2 
data-parsoid='{\"dsr\":[249,293,2,2]}'> Underscore-Entity<span 
typeof=\"mw:Entity\" 
data-parsoid='{\"src\":\"&amp;#95;\",\"srcContent\":\"_\",\"dsr\":[269,274,null,null]}'>_</span>between<span
 typeof=\"mw:Entity\" 
data-parsoid='{\"src\":\"&amp;#95;\",\"srcContent\":\"_\",\"dsr\":[281,286,null,null]}'>_</span>Text
 </h2>\n<p data-parsoid='{\"dsr\":[294,303,0,0]}'>section 6</p>\n\n<p 
data-parsoid='{\"dsr\":[305,501,0,0]}'><a rel=\"mw:WikiLink\" 
href=\"./Main%20Page#Space_between_Text\" 
data-parsoid='{\"stx\":\"simple\",\"a\":{\"href\":\"./Main%20Page#Space_between_Text\"},\"sa\":{\"href\":\"#Space
 between Text\"},\"dsr\":[305,328,2,2]}'>#Space between Text</a>\n<a 
rel=\"mw:WikiLink\" href=\"./Main%20Page#Space-Entity_between_Text\" 
data-parsoid='{\"stx\":\"simple\",\"a\":{\"href\":\"./Main%20Page#Space-Entity_between_Text\"},\"sa\":{\"href\":\"#Space-Entity&amp;#32;between&amp;#32;Text\"},\"dsr\":[329,367,2,2]}'>#Space-Entity
 between Text</a>\n<a rel=\"mw:WikiLink\" 
href=\"./Main%20Page#Plus+between+Text\" 
data-parsoid='{\"stx\":\"simple\",\"a\":{\"href\":\"./Main%20Page#Plus+between+Text\"},\"sa\":{\"href\":\"#Plus+between+Text\"},\"dsr\":[368,390,2,2]}'>#Plus+between+Text</a>\n<a
 rel=\"mw:WikiLink\" href=\"./Main%20Page#Plus-Entity+between+Text\" 
data-parsoid='{\"stx\":\"simple\",\"a\":{\"href\":\"./Main%20Page#Plus-Entity+between+Text\"},\"sa\":{\"href\":\"#Plus-Entity&amp;#43;between&amp;#43;Text\"},\"dsr\":[391,428,2,2]}'>#Plus-Entity+between+Text</a>\n<a
 rel=\"mw:WikiLink\" href=\"./Main%20Page#Underscore_between_Text\" 
data-parsoid='{\"stx\":\"simple\",\"a\":{\"href\":\"./Main%20Page#Underscore_between_Text\"},\"sa\":{\"href\":\"#Underscore_between_Text\"},\"dsr\":[429,457,2,2]}'>#Underscore_between_Text</a>\n<a
 rel=\"mw:WikiLink\" href=\"./Main%20Page#Underscore-Entity_between_Text\" 
data-parsoid='{\"stx\":\"simple\",\"a\":{\"href\":\"./Main%20Page#Underscore-Entity_between_Text\"},\"sa\":{\"href\":\"#Underscore-Entity&amp;#95;between&amp;#95;Text\"},\"dsr\":[458,501,2,2]}'>#Underscore-Entity_between_Text</a></p>");
 add("wt2html", "Single-line or multiline-comments can follow headings", "<h2 
data-parsoid='{\"dsr\":[0,7,2,2]}'>foo</h2><!---->\n<h2 
data-parsoid='{\"dsr\":[15,22,2,2]}'>bar</h2><!--c1-->\n<h2 
data-parsoid='{\"dsr\":[32,39,2,2]}'>baz</h2><!--\nc2\nc3-->");
@@ -695,7 +697,8 @@
 add("html2html", "Category with template", "<p 
data-parsoid='{\"dsr\":[0,42,0,0]}'><span typeof=\"mw:Nowiki\" 
data-parsoid='{\"dsr\":[0,42,8,9]}'>[[Category:{{echo|Foo}}]]</span></p>");
 add("html2html", "Category with template in sort key", "<p 
data-parsoid='{\"dsr\":[0,46,0,0]}'><span typeof=\"mw:Nowiki\" 
data-parsoid='{\"dsr\":[0,46,8,9]}'>[[Category:Foo|{{echo|Bar}}]]</span></p>");
 add("html2html", "Category with template in sort key and title", "<p 
data-parsoid='{\"dsr\":[0,55,0,0]}'><span typeof=\"mw:Nowiki\" 
data-parsoid='{\"dsr\":[0,55,8,9]}'>[[Category:{{echo|Foo}}|{{echo|Bar}}]]</span></p>");
-add("html2html", "Parsoid: Link prefix/suffixes aren't applied to category 
links", "<p data-parsoid='{\"dsr\":[0,20,0,0]}'>x\n<link 
rel=\"mw:PageProp/Category\" href=\"./Flokkur:Foo\" 
data-parsoid='{\"stx\":\"simple\",\"a\":{\"href\":\"./Flokkur:Foo\"},\"sa\":{\"href\":\"Category:Foo\"},\"dsr\":[2,18,null,null]}'/>\ny</p>\n");
+add("html2html", "Parsoid: Link prefix/suffixes aren't applied to category 
links", "<p data-parsoid='{\"dsr\":[0,20,0,0]}'>x<meta 
typeof=\"mw:Placeholder\" 
data-parsoid='{\"src\":\"\\n\",\"dsr\":[1,2,null,null]}'/><link 
rel=\"mw:PageProp/Category\" href=\"./Flokkur:Foo\" 
data-parsoid='{\"stx\":\"simple\",\"a\":{\"href\":\"./Flokkur:Foo\"},\"sa\":{\"href\":\"Category:Foo\"},\"dsr\":[2,18,null,null]}'/>\ny</p>\n");
+add("html2html", "Parsoid: Serialize a genuine category link without colon 
escape", "<link rel=\"mw:PageProp/Category\" href=\"./Category:Foo\" 
data-parsoid='{\"stx\":\"simple\",\"a\":{\"href\":\"./Category:Foo\"},\"sa\":{\"href\":\"Category:Foo\"},\"dsr\":[0,16,null,null]}'/><meta
 typeof=\"mw:Placeholder\" 
data-parsoid='{\"src\":\"\\n\",\"dsr\":[16,17,null,null]}'/><link 
rel=\"mw:PageProp/Category\" href=\"./Category:Foo#Bar\" 
data-parsoid='{\"stx\":\"piped\",\"a\":{\"href\":\"./Category:Foo\"},\"sa\":{\"href\":\"Category:Foo\"},\"dsr\":[17,37,null,null]}'/>");
 add("html2html", "Section headings with TOC", "<div id=\"toc\" class=\"toc\" 
data-parsoid='{\"stx\":\"html\",\"dsr\":[0,691,26,6]}'><div id=\"toctitle\" 
data-parsoid='{\"stx\":\"html\",\"dsr\":[26,67,19,6]}'>\n<h2 
data-parsoid='{\"dsr\":[46,60,2,2]}'> Contents </h2>\n</div>\n\n<ul 
data-parsoid='{\"dsr\":[69,159,0,0]}'><li 
data-parsoid='{\"dsr\":[69,159,1,0]}'> <a rel=\"mw:WikiLink\" 
href=\"./Main%20Page#Headline_1\" 
data-parsoid='{\"stx\":\"piped\",\"a\":{\"href\":\"./Main%20Page#Headline_1\"},\"sa\":{\"href\":\"#Headline_1\"},\"dsr\":[71,159,14,2]}'><span
 class=\"tocnumber\" 
data-parsoid='{\"stx\":\"html\",\"dsr\":[85,117,24,7]}'>1</span> <span 
class=\"toctext\" 
data-parsoid='{\"stx\":\"html\",\"dsr\":[118,157,22,7]}'>Headline 
1</span></a></li></ul>\n\n<ul data-parsoid='{\"dsr\":[161,260,0,0]}'><li 
data-parsoid='{\"dsr\":[161,260,1,0]}'><ul 
data-parsoid='{\"dsr\":[162,260,0,0]}'><li 
data-parsoid='{\"dsr\":[162,260,1,0]}'> <a rel=\"mw:WikiLink\" 
href=\"./Main%20Page#Subheadline_1\" 
data-parsoid='{\"stx\":\"piped\",\"a\":{\"href\":\"./Main%20Page#Subheadline_1\"},\"sa\":{\"href\":\"#Subheadline_1\"},\"dsr\":[164,260,17,2]}'><span
 class=\"tocnumber\" 
data-parsoid='{\"stx\":\"html\",\"dsr\":[181,215,24,7]}'>1.1</span> <span 
class=\"toctext\" 
data-parsoid='{\"stx\":\"html\",\"dsr\":[216,258,22,7]}'>Subheadline 
1</span></a></li></ul></li></ul>\n\n<ul 
data-parsoid='{\"dsr\":[262,370,0,0]}'><li 
data-parsoid='{\"dsr\":[262,370,1,0]}'><ul 
data-parsoid='{\"dsr\":[263,370,0,0]}'><li 
data-parsoid='{\"dsr\":[263,370,1,0]}'><ul 
data-parsoid='{\"dsr\":[264,370,0,0]}'><li 
data-parsoid='{\"dsr\":[264,370,1,0]}'> <a rel=\"mw:WikiLink\" 
href=\"./Main%20Page#Skipping_a_level\" 
data-parsoid='{\"stx\":\"piped\",\"a\":{\"href\":\"./Main%20Page#Skipping_a_level\"},\"sa\":{\"href\":\"#Skipping_a_level\"},\"dsr\":[266,370,20,2]}'><span
 class=\"tocnumber\" 
data-parsoid='{\"stx\":\"html\",\"dsr\":[286,322,24,7]}'>1.1.1</span> <span 
class=\"toctext\" 
data-parsoid='{\"stx\":\"html\",\"dsr\":[323,368,22,7]}'>Skipping a 
level</span></a></li></ul></li></ul></li></ul>\n\n<ul 
data-parsoid='{\"dsr\":[372,576,0,0]}'><li 
data-parsoid='{\"dsr\":[372,485,1,0]}'><ul 
data-parsoid='{\"dsr\":[373,485,0,0]}'><li 
data-parsoid='{\"dsr\":[373,485,1,0]}'><ul 
data-parsoid='{\"dsr\":[374,485,0,0]}'><li 
data-parsoid='{\"dsr\":[374,485,1,0]}'><ul 
data-parsoid='{\"dsr\":[375,485,0,0]}'><li 
data-parsoid='{\"dsr\":[375,485,1,0]}'> <a rel=\"mw:WikiLink\" 
href=\"./Main%20Page#Skipping_a_level_2\" 
data-parsoid='{\"stx\":\"piped\",\"a\":{\"href\":\"./Main%20Page#Skipping_a_level_2\"},\"sa\":{\"href\":\"#Skipping_a_level_2\"},\"dsr\":[377,485,22,2]}'><span
 class=\"tocnumber\" 
data-parsoid='{\"stx\":\"html\",\"dsr\":[399,437,24,7]}'>1.1.1.1</span> <span 
class=\"toctext\" 
data-parsoid='{\"stx\":\"html\",\"dsr\":[438,483,22,7]}'>Skipping a 
level</span></a></li></ul></li></ul></li></ul></li>\n<li 
data-parsoid='{\"dsr\":[486,576,1,0]}'> <a rel=\"mw:WikiLink\" 
href=\"./Main%20Page#Headline_2\" 
data-parsoid='{\"stx\":\"piped\",\"a\":{\"href\":\"./Main%20Page#Headline_2\"},\"sa\":{\"href\":\"#Headline_2\"},\"dsr\":[488,576,14,2]}'><span
 class=\"tocnumber\" 
data-parsoid='{\"stx\":\"html\",\"dsr\":[502,534,24,7]}'>2</span> <span 
class=\"toctext\" 
data-parsoid='{\"stx\":\"html\",\"dsr\":[535,574,22,7]}'>Headline 
2</span></a></li></ul>\n\n<ul data-parsoid='{\"dsr\":[578,683,0,0]}'><li 
data-parsoid='{\"dsr\":[578,683,1,0]}'><ul 
data-parsoid='{\"dsr\":[579,683,0,0]}'><li 
data-parsoid='{\"dsr\":[579,683,1,0]}'> <a rel=\"mw:WikiLink\" 
href=\"./Main%20Page#Another_headline\" 
data-parsoid='{\"stx\":\"piped\",\"a\":{\"href\":\"./Main%20Page#Another_headline\"},\"sa\":{\"href\":\"#Another_headline\"},\"dsr\":[581,683,20,2]}'><span
 class=\"tocnumber\" 
data-parsoid='{\"stx\":\"html\",\"dsr\":[601,635,24,7]}'>2.1</span> <span 
class=\"toctext\" 
data-parsoid='{\"stx\":\"html\",\"dsr\":[636,681,22,7]}'>Another 
headline</span></a></li></ul></li></ul>\n\n</div>\n\n<h2 
data-parsoid='{\"dsr\":[693,709,2,2]}'> Headline 1 </h2>\n\n<h3 
data-parsoid='{\"dsr\":[711,732,3,3]}'> Subheadline 1 </h3>\n\n<h5 
data-parsoid='{\"dsr\":[734,762,5,5]}'> Skipping a level </h5>\n\n<h6 
data-parsoid='{\"dsr\":[764,794,6,6]}'> Skipping a level </h6>\n\n<h2 
data-parsoid='{\"dsr\":[796,812,2,2]}'> Headline 2 </h2>\n<p 
data-parsoid='{\"dsr\":[813,822,0,0]}'>Some text</p>\n\n<h3 
data-parsoid='{\"dsr\":[824,848,3,3]}'> Another headline </h3>\n");
 add("html2html", "TOC anchors don't collide", "<div id=\"toc\" class=\"toc\" 
data-parsoid='{\"stx\":\"html\",\"dsr\":[0,436,26,6]}'><div id=\"toctitle\" 
data-parsoid='{\"stx\":\"html\",\"dsr\":[26,67,19,6]}'>\n<h2 
data-parsoid='{\"dsr\":[46,60,2,2]}'> Contents </h2>\n</div>\n\n<ul 
data-parsoid='{\"dsr\":[69,428,0,0]}'><li 
data-parsoid='{\"dsr\":[69,159,1,0]}'> <a rel=\"mw:WikiLink\" 
href=\"./Main%20Page#Headline_2\" 
data-parsoid='{\"stx\":\"piped\",\"a\":{\"href\":\"./Main%20Page#Headline_2\"},\"sa\":{\"href\":\"#Headline_2\"},\"dsr\":[71,159,14,2]}'><span
 class=\"tocnumber\" 
data-parsoid='{\"stx\":\"html\",\"dsr\":[85,117,24,7]}'>1</span> <span 
class=\"toctext\" 
data-parsoid='{\"stx\":\"html\",\"dsr\":[118,157,22,7]}'>Headline 
2</span></a></li>\n<li data-parsoid='{\"dsr\":[160,246,1,0]}'> <a 
rel=\"mw:WikiLink\" href=\"./Main%20Page#Headline\" 
data-parsoid='{\"stx\":\"piped\",\"a\":{\"href\":\"./Main%20Page#Headline\"},\"sa\":{\"href\":\"#Headline\"},\"dsr\":[162,246,12,2]}'><span
 class=\"tocnumber\" 
data-parsoid='{\"stx\":\"html\",\"dsr\":[174,206,24,7]}'>2</span> <span 
class=\"toctext\" 
data-parsoid='{\"stx\":\"html\",\"dsr\":[207,244,22,7]}'>Headline</span></a></li>\n<li
 data-parsoid='{\"dsr\":[247,339,1,0]}'> <a rel=\"mw:WikiLink\" 
href=\"./Main%20Page#Headline_2_2\" 
data-parsoid='{\"stx\":\"piped\",\"a\":{\"href\":\"./Main%20Page#Headline_2_2\"},\"sa\":{\"href\":\"#Headline_2_2\"},\"dsr\":[249,339,16,2]}'><span
 class=\"tocnumber\" 
data-parsoid='{\"stx\":\"html\",\"dsr\":[265,297,24,7]}'>3</span> <span 
class=\"toctext\" 
data-parsoid='{\"stx\":\"html\",\"dsr\":[298,337,22,7]}'>Headline 
2</span></a></li>\n<li data-parsoid='{\"dsr\":[340,428,1,0]}'> <a 
rel=\"mw:WikiLink\" href=\"./Main%20Page#Headline_3\" 
data-parsoid='{\"stx\":\"piped\",\"a\":{\"href\":\"./Main%20Page#Headline_3\"},\"sa\":{\"href\":\"#Headline_3\"},\"dsr\":[342,428,14,2]}'><span
 class=\"tocnumber\" 
data-parsoid='{\"stx\":\"html\",\"dsr\":[356,388,24,7]}'>4</span> <span 
class=\"toctext\" 
data-parsoid='{\"stx\":\"html\",\"dsr\":[389,426,22,7]}'>Headline</span></a></li></ul>\n\n</div>\n\n<h2
 data-parsoid='{\"dsr\":[438,454,2,2]}'> Headline 2 </h2>\n\n<h2 
data-parsoid='{\"dsr\":[456,470,2,2]}'> Headline </h2>\n\n<h2 
data-parsoid='{\"dsr\":[472,488,2,2]}'> Headline 2 </h2>\n\n<h2 
data-parsoid='{\"dsr\":[490,504,2,2]}'> Headline </h2>\n");
 add("html2html", "Handling of sections up to level 6 and beyond", "<div 
id=\"toc\" class=\"toc\" 
data-parsoid='{\"stx\":\"html\",\"dsr\":[0,1286,26,6]}'><div id=\"toctitle\" 
data-parsoid='{\"stx\":\"html\",\"dsr\":[26,67,19,6]}'>\n<h2 
data-parsoid='{\"dsr\":[46,60,2,2]}'> Contents </h2>\n</div>\n\n<ul 
data-parsoid='{\"dsr\":[69,169,0,0]}'><li 
data-parsoid='{\"dsr\":[69,169,1,0]}'> <a rel=\"mw:WikiLink\" 
href=\"./Main%20Page#Level_1_Heading\" 
data-parsoid='{\"stx\":\"piped\",\"a\":{\"href\":\"./Main%20Page#Level_1_Heading\"},\"sa\":{\"href\":\"#Level_1_Heading\"},\"dsr\":[71,169,19,2]}'><span
 class=\"tocnumber\" 
data-parsoid='{\"stx\":\"html\",\"dsr\":[90,122,24,7]}'>1</span> <span 
class=\"toctext\" 
data-parsoid='{\"stx\":\"html\",\"dsr\":[123,167,22,7]}'>Level 1 
Heading</span></a></li></ul>\n\n<ul data-parsoid='{\"dsr\":[171,274,0,0]}'><li 
data-parsoid='{\"dsr\":[171,274,1,0]}'><ul 
data-parsoid='{\"dsr\":[172,274,0,0]}'><li 
data-parsoid='{\"dsr\":[172,274,1,0]}'> <a rel=\"mw:WikiLink\" 
href=\"./Main%20Page#Level_2_Heading\" 
data-parsoid='{\"stx\":\"piped\",\"a\":{\"href\":\"./Main%20Page#Level_2_Heading\"},\"sa\":{\"href\":\"#Level_2_Heading\"},\"dsr\":[174,274,19,2]}'><span
 class=\"tocnumber\" 
data-parsoid='{\"stx\":\"html\",\"dsr\":[193,227,24,7]}'>1.1</span> <span 
class=\"toctext\" 
data-parsoid='{\"stx\":\"html\",\"dsr\":[228,272,22,7]}'>Level 2 
Heading</span></a></li></ul></li></ul>\n\n<ul 
data-parsoid='{\"dsr\":[276,382,0,0]}'><li 
data-parsoid='{\"dsr\":[276,382,1,0]}'><ul 
data-parsoid='{\"dsr\":[277,382,0,0]}'><li 
data-parsoid='{\"dsr\":[277,382,1,0]}'><ul 
data-parsoid='{\"dsr\":[278,382,0,0]}'><li 
data-parsoid='{\"dsr\":[278,382,1,0]}'> <a rel=\"mw:WikiLink\" 
href=\"./Main%20Page#Level_3_Heading\" 
data-parsoid='{\"stx\":\"piped\",\"a\":{\"href\":\"./Main%20Page#Level_3_Heading\"},\"sa\":{\"href\":\"#Level_3_Heading\"},\"dsr\":[280,382,19,2]}'><span
 class=\"tocnumber\" 
data-parsoid='{\"stx\":\"html\",\"dsr\":[299,335,24,7]}'>1.1.1</span> <span 
class=\"toctext\" 
data-parsoid='{\"stx\":\"html\",\"dsr\":[336,380,22,7]}'>Level 3 
Heading</span></a></li></ul></li></ul></li></ul>\n\n<ul 
data-parsoid='{\"dsr\":[384,493,0,0]}'><li 
data-parsoid='{\"dsr\":[384,493,1,0]}'><ul 
data-parsoid='{\"dsr\":[385,493,0,0]}'><li 
data-parsoid='{\"dsr\":[385,493,1,0]}'><ul 
data-parsoid='{\"dsr\":[386,493,0,0]}'><li 
data-parsoid='{\"dsr\":[386,493,1,0]}'><ul 
data-parsoid='{\"dsr\":[387,493,0,0]}'><li 
data-parsoid='{\"dsr\":[387,493,1,0]}'> <a rel=\"mw:WikiLink\" 
href=\"./Main%20Page#Level_4_Heading\" 
data-parsoid='{\"stx\":\"piped\",\"a\":{\"href\":\"./Main%20Page#Level_4_Heading\"},\"sa\":{\"href\":\"#Level_4_Heading\"},\"dsr\":[389,493,19,2]}'><span
 class=\"tocnumber\" 
data-parsoid='{\"stx\":\"html\",\"dsr\":[408,446,24,7]}'>1.1.1.1</span> <span 
class=\"toctext\" 
data-parsoid='{\"stx\":\"html\",\"dsr\":[447,491,22,7]}'>Level 4 
Heading</span></a></li></ul></li></ul></li></ul></li></ul>\n\n<ul 
data-parsoid='{\"dsr\":[495,607,0,0]}'><li 
data-parsoid='{\"dsr\":[495,607,1,0]}'><ul 
data-parsoid='{\"dsr\":[496,607,0,0]}'><li 
data-parsoid='{\"dsr\":[496,607,1,0]}'><ul 
data-parsoid='{\"dsr\":[497,607,0,0]}'><li 
data-parsoid='{\"dsr\":[497,607,1,0]}'><ul 
data-parsoid='{\"dsr\":[498,607,0,0]}'><li 
data-parsoid='{\"dsr\":[498,607,1,0]}'><ul 
data-parsoid='{\"dsr\":[499,607,0,0]}'><li 
data-parsoid='{\"dsr\":[499,607,1,0]}'> <a rel=\"mw:WikiLink\" 
href=\"./Main%20Page#Level_5_Heading\" 
data-parsoid='{\"stx\":\"piped\",\"a\":{\"href\":\"./Main%20Page#Level_5_Heading\"},\"sa\":{\"href\":\"#Level_5_Heading\"},\"dsr\":[501,607,19,2]}'><span
 class=\"tocnumber\" 
data-parsoid='{\"stx\":\"html\",\"dsr\":[520,560,24,7]}'>1.1.1.1.1</span> <span 
class=\"toctext\" 
data-parsoid='{\"stx\":\"html\",\"dsr\":[561,605,22,7]}'>Level 5 
Heading</span></a></li></ul></li></ul></li></ul></li></ul></li></ul>\n\n<ul 
data-parsoid='{\"dsr\":[609,1278,0,0]}'><li 
data-parsoid='{\"dsr\":[609,1278,1,0]}'><ul 
data-parsoid='{\"dsr\":[610,1278,0,0]}'><li 
data-parsoid='{\"dsr\":[610,1278,1,0]}'><ul 
data-parsoid='{\"dsr\":[611,1278,0,0]}'><li 
data-parsoid='{\"dsr\":[611,1278,1,0]}'><ul 
data-parsoid='{\"dsr\":[612,1278,0,0]}'><li 
data-parsoid='{\"dsr\":[612,1278,1,0]}'><ul 
data-parsoid='{\"dsr\":[613,1278,0,0]}'><li 
data-parsoid='{\"dsr\":[613,1278,1,0]}'><ul 
data-parsoid='{\"dsr\":[614,1278,0,0]}'><li 
data-parsoid='{\"dsr\":[614,724,1,0]}'> <a rel=\"mw:WikiLink\" 
href=\"./Main%20Page#Level_6_Heading\" 
data-parsoid='{\"stx\":\"piped\",\"a\":{\"href\":\"./Main%20Page#Level_6_Heading\"},\"sa\":{\"href\":\"#Level_6_Heading\"},\"dsr\":[616,724,19,2]}'><span
 class=\"tocnumber\" 
data-parsoid='{\"stx\":\"html\",\"dsr\":[635,677,24,7]}'>1.1.1.1.1.1</span> 
<span class=\"toctext\" 
data-parsoid='{\"stx\":\"html\",\"dsr\":[678,722,22,7]}'>Level 6 
Heading</span></a></li>\n<li data-parsoid='{\"dsr\":[725,850,6,0]}'> <a 
rel=\"mw:WikiLink\" href=\"./Main%20Page#.3D_Level_7_Heading.3D\" 
data-parsoid='{\"stx\":\"piped\",\"a\":{\"href\":\"./Main%20Page#.3D_Level_7_Heading.3D\"},\"sa\":{\"href\":\"#.3D_Level_7_Heading.3D\"},\"dsr\":[732,850,26,2]}'><span
 class=\"tocnumber\" 
data-parsoid='{\"stx\":\"html\",\"dsr\":[758,800,24,7]}'>1.1.1.1.1.2</span> 
<span class=\"toctext\" 
data-parsoid='{\"stx\":\"html\",\"dsr\":[801,848,22,7]}'>= Level 7 
Heading=</span></a></li>\n<li data-parsoid='{\"dsr\":[851,984,6,0]}'> <a 
rel=\"mw:WikiLink\" href=\"./Main%20Page#.3D.3D_Level_8_Heading.3D.3D\" 
data-parsoid='{\"stx\":\"piped\",\"a\":{\"href\":\"./Main%20Page#.3D.3D_Level_8_Heading.3D.3D\"},\"sa\":{\"href\":\"#.3D.3D_Level_8_Heading.3D.3D\"},\"dsr\":[858,984,32,2]}'><span
 class=\"tocnumber\" 
data-parsoid='{\"stx\":\"html\",\"dsr\":[890,932,24,7]}'>1.1.1.1.1.3</span> 
<span class=\"toctext\" 
data-parsoid='{\"stx\":\"html\",\"dsr\":[933,982,22,7]}'>== Level 8 
Heading==</span></a></li>\n<li data-parsoid='{\"dsr\":[985,1126,6,0]}'> <a 
rel=\"mw:WikiLink\" href=\"./Main%20Page#.3D.3D.3D_Level_9_Heading.3D.3D.3D\" 
data-parsoid='{\"stx\":\"piped\",\"a\":{\"href\":\"./Main%20Page#.3D.3D.3D_Level_9_Heading.3D.3D.3D\"},\"sa\":{\"href\":\"#.3D.3D.3D_Level_9_Heading.3D.3D.3D\"},\"dsr\":[992,1126,38,2]}'><span
 class=\"tocnumber\" 
data-parsoid='{\"stx\":\"html\",\"dsr\":[1030,1072,24,7]}'>1.1.1.1.1.4</span> 
<span class=\"toctext\" 
data-parsoid='{\"stx\":\"html\",\"dsr\":[1073,1124,22,7]}'>=== Level 9 
Heading===</span></a></li>\n<li data-parsoid='{\"dsr\":[1127,1278,6,0]}'> <a 
rel=\"mw:WikiLink\" 
href=\"./Main%20Page#.3D.3D.3D.3D_Level_10_Heading.3D.3D.3D.3D\" 
data-parsoid='{\"stx\":\"piped\",\"a\":{\"href\":\"./Main%20Page#.3D.3D.3D.3D_Level_10_Heading.3D.3D.3D.3D\"},\"sa\":{\"href\":\"#.3D.3D.3D.3D_Level_10_Heading.3D.3D.3D.3D\"},\"dsr\":[1134,1278,45,2]}'><span
 class=\"tocnumber\" 
data-parsoid='{\"stx\":\"html\",\"dsr\":[1179,1221,24,7]}'>1.1.1.1.1.5</span> 
<span class=\"toctext\" 
data-parsoid='{\"stx\":\"html\",\"dsr\":[1222,1276,22,7]}'>==== Level 10 
Heading====</span></a></li></ul></li></ul></li></ul></li></ul></li></ul></li></ul>\n\n</div>\n\n<h1
 data-parsoid='{\"dsr\":[1288,1307,1,1]}'> Level 1 Heading </h1>\n\n<h2 
data-parsoid='{\"dsr\":[1309,1330,2,2]}'> Level 2 Heading </h2>\n\n<h3 
data-parsoid='{\"dsr\":[1332,1355,3,3]}'> Level 3 Heading </h3>\n\n<h4 
data-parsoid='{\"dsr\":[1357,1382,4,4]}'> Level 4 Heading </h4>\n\n<h5 
data-parsoid='{\"dsr\":[1384,1411,5,5]}'> Level 5 Heading </h5>\n\n<h6 
data-parsoid='{\"dsr\":[1413,1442,6,6]}'> Level 6 Heading </h6>\n\n<h6 
data-parsoid='{\"dsr\":[1444,1476,6,6]}'> = Level 7 Heading= </h6>\n\n<h6 
data-parsoid='{\"dsr\":[1478,1512,6,6]}'> == Level 8 Heading== </h6>\n\n<h6 
data-parsoid='{\"dsr\":[1514,1550,6,6]}'> === Level 9 Heading=== </h6>\n\n<h6 
data-parsoid='{\"dsr\":[1552,1591,6,6]}'> ==== Level 10 Heading==== </h6>\n");
@@ -2227,9 +2230,7 @@
 add("selser", "Render invalid page names as plain text (bug 51090) [2,4,3]", 
"x280lbt0x9smunmi\n\n[[./../foo|bar]]\n[[foo�|bar]]\n[[foo/.|bar]]\n[[foo/..|bar]]\n[[foo~~~bar]]\n[[foo>bar]]\n[[foo[bar]]\n[[.]]\n[[..]]\n[[foo././bar]]\n\n9zekc2ruir0h33di\n");
 add("selser", "Render invalid page names as plain text (bug 51090) [2,0,3]", 
"uy7lbslcu8mvaemi\n\n[[./../foo|bar]]\n[[foo�|bar]]\n[[foo/.|bar]]\n[[foo/..|bar]]\n[[foo~~~bar]]\n[[foo>bar]]\n[[foo[bar]]\n[[.]]\n[[..]]\n[[foo././bar]]\n");
 add("selser", "Render invalid page names as plain text (bug 51090) 
[2,0,[2,0,0,0,4,0,4,0,0,0,4,0,0,0,0,0,0,0,0,0,3,0,2]]", 
"ixtw0uq17iqtcsor\n\n[[./../foo|bar]]\n[[foo�|bar]]\n[[foo/.|bar]]\n[[foo/..|bar]]\n[[foo~~~bar]]\n[[foo>bar]]\n[[foo[bar]]\n[[.]]\n[[..]]\n[[foo././bar]]\n\ncjgyt6cnj124kj4i[[{{echo|./../foo}}|bar]]\n[[{{echo|foo/.}}4i3f1qev8b5u3di{{echo|foo/..}}t26yvjmagszl4n29{{echo|foo~~~~bar}}]]\n[[{{echo|foo>bar}}3vx6jfw5gbvs4i{{echo|foo././bar}}]]\n[[{{echo|foo{bar}}]]\n[[{{echo|foo}bar}}]]\n[[{{echo|foo[bar}}]]\n[[{{echo|foo]bar}}{{echo|foo<bar}}<nowiki>3vz7g6pd5lzhncdi]]</nowiki>");
-add("selser", "Category / paragraph interactions 
[[0,3,2],0,2,4,[3,2,0],0,[2],3,0,[3],0,[3,3,4,1,4,2,3],0,3,4,0,4,3,0,0,2,0,0,0]",
 "Foo 83zrad4tpxxkcsor Bar\n\nysekf8brayr885mi\n\nFoo 
[[Category:Baz]]\nBar\n\nduknjpcnvnyzxgvi\n\nhroyapi5paqhncdi[[Category:Baz]]\nBar\n\nmsiv1cjc1q8e61orFoo\n[[Category:Baz]]
 
\n\nljrvpzob03tedn29[[Category:Baz]]6bqrn9ug03npcik95jcarnywu55klnmi[[Category:Baz]]\n\nik3u2lqitfomkj4i[[Category:Baz]]\nn8wwykwa78f72e29\n\n[[Category:Baz]]\n9dl89xg0l57phkt9\n
 {{echo|[[Category:Baz]]}}\n[[Category:Baz]]");
-add("selser", "Category / paragraph interactions 
[4,0,0,0,[4,1,0],3,3,0,0,0,2,[2,0,0,1,3,0,0],0,1,3,0,2,0,2,0,0,0,4,2]", 
"y2ksxygpidn7y14i\n\nFoo 
[[Category:Baz]]\nBar\n\ntqcbbea7bmiy66r[[Category:Baz]]\nBar\n[[Category:Baz]] 
Bar\nc42dqedyb3u6usor\n\ndjmvd61k80kymn29Foo\n[[Category:Baz]]\n 
[[Category:Baz]][[Category:Baz]]\nBar\n\n[[Category:Baz]]\n 
[[Category:Baz]]\nvyv3u18bgs4z33di\n[[Category:Baz]]\ne98vfkx1eqld6lxr\n\n[[Category:Baz]]\n
 
{{echo|[[Category:Baz]]}}\nviznyhgcd9muz0k9\n\nd830mwe1qg1oflxr[[Category:Baz]]");
-add("selser", "Category / paragraph interactions 
[1,0,1,0,1,0,1,0,0,0,2,[4,0,0,0,0,4,0],3,0,4,0,0,1,4,4,0,0,3,0]", "Foo 
[[Category:Baz]] Bar\n\nFoo 
[[Category:Baz]]\nBar\n\nFoo\n[[Category:Baz]]\nBar\n\nFoo\n[[Category:Baz]] 
Bar\nqyq2tw4tbcjfko6r\n\n8rsqjn6ahwoecdi[[Category:Baz]]\n 
[[Category:Baz]]\n7qub38k3od0od2t9\nBar\n\n[[Category:Baz]]\njml3cn3gxdt5ipb9[[Category:Baz]]\n[[Category:Baz]]\n7www48dkmtg74x6r\n\nfddlp7i37zwr8uxr\n
 {{echo|[[Category:Baz]]}}[[Category:Baz]]");
+add("selser", "Category / paragraph interactions 
[1,3,4,4,3,3,1,0,[0,3,0,0,2,2,0,0,0,3,0,0,4,0,0,1,2,0],0,0]", "Foo 
[[Category:Baz]] 
Bar\n\n10mwgehifibgwrk9\n\no0nac2tpantjfw29\n\nFoo\n[[Category:Baz]] 
Bar\n\nFoo[[Category:Baz]]\n<nowiki> 
</nowiki>s8xrvt11irn97ldi[[Category:Baz]]zhm5ka7id77am7vi\n[[Category:Baz]]\nBar\n\n\n<nowiki>
 
</nowiki>[[Category:Baz]]zkdnn4uz7rqqia4i[[Category:Baz]]\n\n[[Category:Baz]]r29advfq52qsq0k9\n
 {{echo|[[Category:Baz]]}}\n[[Category:Baz]]");
 add("selser", "Section headings with TOC [3,4,0,0,3,2,[3],3,0,4,3,3,0]", 
"px8b3ng5n4lpu8fr\n\n=== Subheadline 1 
===\np64mngpetwfm9529\n\n======<nowiki/>======\n\n== Headline 2 
==\nzvfwz386e7xbhuxr\n\n===Another headline===");
 add("selser", "Handling of sections up to level 6 and beyond 
[1,2,1,2,1,0,[3],2,2,4,[2],4,0,0,1,0,0,3,1]", "= Level 1 
Heading=\n7e043zzvvtzf47vi\n\n== Level 2 Heading==\n0pp0pcwrmkakyb9\n\n=== 
Level 3 
Heading===\n====<nowiki/>====\n253vnq49otg9zfr\nmncpvxste96vquxr\n\n===== Level 
5 Heading=====\n91qmbb1e2vlpu8fr\n\n======ohqkkrlkoqi79zfr Level 6 
Heading======\n6hv8gbhdqngn9udi\n\n======= Level 7 
Heading=======\n======<nowiki>== Level 8 Heading==</nowiki>======\n========= 
Level 9 Heading=========\n======<nowiki>==== Level 10 
Heading====</nowiki>======");
 add("selser", "Handling of sections up to level 6 and beyond 
[1,0,1,0,0,3,2,3,0,0,4,0,[4],0,1,0,0,4,0]", "= Level 1 Heading=\n== Level 2 
Heading==\n=== Level 3 Heading===\n6fs6ykhv45nrk9\n\n==== Level 4 
Heading====\n===== Level 5 
Heading=====\njkvm1xjd1mw2vs4i\n\n======lrcthal0ujwnrk9======\n======<nowiki>== 
Level 8 Heading==</nowiki>======\n========= Level 9 
Heading=========\n6uicqh73ey5bfbt9\n\n========== Level 10 Heading==========");

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

Gerrit-MessageType: newchange
Gerrit-Change-Id: I507dcefcca5a4ee22fb9f9bf0cfe678f14d64991
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