Marcoil has uploaded a new change for review.

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

Change subject: [Cite] Generate the same ids for <ref>s and notes as Cite.php
......................................................................

[Cite] Generate the same ids for <ref>s and notes as Cite.php

One particular case is that Cite.php considers equal a name and
its encoding, i.e. "a & b" === "a &amp; b". Added a new test for
this case, but blacklisted it on html2wt, wt2wt and html2html due
to a different problem with how Parsoid encodes entities. This
will be investigated separately as a simple fix could break
unrelated cases.

Also updated tests and blacklist to the new ids.

Change-Id: I87637a1dc812a3a8f29327b9e6c0040b22a651c4
---
M lib/ext.Cite.js
M tests/parserTests-blacklist.js
M tests/parserTests.txt
3 files changed, 119 insertions(+), 80 deletions(-)


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

diff --git a/lib/ext.Cite.js b/lib/ext.Cite.js
index ffe92ff..7d1c704 100644
--- a/lib/ext.Cite.js
+++ b/lib/ext.Cite.js
@@ -8,7 +8,8 @@
 var Util = require( './mediawiki.Util.js' ).Util,
        DU = require( './mediawiki.DOMUtils.js').DOMUtils,
        coreutil = require('util'),
-       defines = require('./mediawiki.parser.defines.js');
+       defines = require('./mediawiki.parser.defines.js'),
+       entities = require('entities');
 
 // define some constructor shortcuts
 var    KV = defines.KV,
@@ -154,8 +155,10 @@
        // Looks like Cite.php doesn't try to fix ids that already have
        // a "_" in them. Ex: name="a b" and name="a_b" are considered
        // identical. Not sure if this is a feature or a bug.
-       // It also encodes them and then substitutes '%' with '.'.
-       return encodeURIComponent(val.replace(/\s/g, '_')).replace(/%/g, '.');
+       // It also considers entities equal to their encoding (i.e. '&' === 
'&amp;')
+       // and then substitutes % with .
+       var v = entities.decodeHTML(val).replace(/\s/g, '_');
+       return encodeURIComponent(v).replace(/%/g,".");
 }
 
 RefGroup.prototype.add = function(references, refName, about, skipLinkback) {
@@ -164,25 +167,30 @@
        if ( refName && this.indexByName.has( refName ) ) {
                ref = this.indexByName.get( refName );
        } else {
+               // The ids produced Cite.php have some particulars:
+               // Simple refs get 'cite_ref-' + index
+               // Refs with names get 'cite_ref-' + name + '_' + index + 
(backlink num || 0)
+               // Notes (references) whose ref doesn't have a name are 
'cite_note-' + index
+               // Notes whose ref has a name are 'cite_note-' + name + '-' + 
index
                var n = references.index,
-                       refKey = (1+n) + '';
+                       refKey = (1+n) + '',
+                       refIdBase = 'cite_ref-' + (refName ? refName + '_' + 
refKey : refKey),
+                       noteId = 'cite_note-' + (refName ? refName + '-' + 
refKey : refKey);
 
                // bump index
                references.index += 1;
 
-               if (refName) {
-                       refKey = refName + '-' + refKey;
-               }
                ref = {
                        about: about,
                        content: null,
                        group: this.name,
                        groupIndex: this.refs.length + 1,
                        index: n,
-                       key: refKey,
+                       key: refIdBase,
+                       id: (refName ? refIdBase + '-0' : refIdBase),
                        linkbacks: [],
                        name: refName,
-                       target: 'cite_note-' + refKey
+                       target: noteId
                };
                this.refs.push( ref );
                if (refName) {
@@ -191,7 +199,7 @@
        }
 
        if (!skipLinkback) {
-               ref.linkbacks.push('cite_ref-' + ref.key + '-' + 
ref.linkbacks.length);
+               ref.linkbacks.push(ref.key + '-' + ref.linkbacks.length);
        }
 
        return ref;
@@ -222,7 +230,7 @@
        if (ref.linkbacks.length === 1) {
                a = ownerDoc.createElement('a');
                DU.addAttributes(a, {
-                       'href': '#' + ref.linkbacks[0]
+                       'href': '#' + ref.id
                });
                a.appendChild(arrow);
                span.appendChild(a);
@@ -387,7 +395,8 @@
        DU.addAttributes(span, {
                'about': about,
                'class': 'reference',
-               'id': nestedInReferences ? undefined : 
ref.linkbacks[ref.linkbacks.length - 1],
+               'id': nestedInReferences ? undefined :
+                       (ref.name ? ref.linkbacks[ref.linkbacks.length - 1] : 
ref.id),
                'rel': 'dc:references',
                'typeof': nodeType
        });
diff --git a/tests/parserTests-blacklist.js b/tests/parserTests-blacklist.js
index 62d3461..1d2d206 100644
--- a/tests/parserTests-blacklist.js
+++ b/tests/parserTests-blacklist.js
@@ -523,6 +523,7 @@
 add("wt2wt", "Ref: 8. transclusion wikitext has lower precedence", "A <ref>foo 
{{echo|</ref> B C}}\n\n<references />");
 add("wt2wt", "Ref: 9. unclosed comments should not leak out of ref-body", "A 
<ref>foo <!----></ref> B C\n<references />");
 add("wt2wt", "Ref: 10. Unclosed HTML tags should not leak out of ref-body", "A 
<ref><b> foo </ref> B C\n\n<references />");
+add("wt2wt", "Ref: 19. ref-tags with identical name encodings should get 
identical indexes", "1 <ref name=\"a & b\">foo</ref> 2 <ref name=\"a &amp;amp; 
b\" />\n\n<references />");
 add("wt2wt", "References: 5. ref tags in references should be processed while 
ignoring all other content", "A <ref name=\"a\" />\nB <ref 
name=\"b\">bar</ref>\n\n<references>\n<ref 
name=\"a\">foo</ref>\n</references>");
 add("wt2wt", "Entities in ref name", "<ref name=\"test &amp;amp; 
me\">hi</ref>\n");
 add("wt2wt", "Headings: 4a'. No escaping needed (Parsoid bug T84903)", "= 
''<nowiki>=</nowiki>''foo= =\n");
@@ -898,12 +899,13 @@
 add("html2html", "Gallery override link with malicious javascript (bug 
34852)", "<p data-parsoid='{\"dsr\":[0,4,0,0]}'>\t\t* </p><div style=\"width: 
155px\" data-parsoid='{\"stx\":\"html\",\"dsr\":[4,239,26,6]}'>\n\t\t\t<div 
class=\"thumb\" style=\"width: 150px;\" 
data-parsoid='{\"stx\":\"html\",\"dsr\":[34,182,41,6]}'><div 
style=\"margin:68px auto;\" 
data-parsoid='{\"stx\":\"html\",\"dsr\":[75,176,31,6]}'><img 
src=\"http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg\"; 
alt=\"120px-Foobar.jpg\" rel=\"mw:externalImage\" 
data-parsoid='{\"dsr\":[106,170,null,null]}'/></div></div>\n\t\t\t<div 
class=\"gallerytext\" 
data-parsoid='{\"stx\":\"html\",\"dsr\":[186,230,25,6]}'>\n<p 
data-parsoid='{\"dsr\":[212,219,0,0]}'>caption</p>\n\n\t\t\t</div>\n\t\t</div>\n");
 add("html2html", "Gallery with invalid title as link (bug 43964)", "<p 
data-parsoid='{\"dsr\":[0,4,0,0]}'>\t\t* </p><div style=\"width: 155px\" 
data-parsoid='{\"stx\":\"html\",\"dsr\":[4,229,26,6]}'>\n\t\t\t<div 
class=\"thumb\" style=\"width: 150px;\" 
data-parsoid='{\"stx\":\"html\",\"dsr\":[34,182,41,6]}'><div 
style=\"margin:68px auto;\" 
data-parsoid='{\"stx\":\"html\",\"dsr\":[75,176,31,6]}'><img 
src=\"http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg\"; 
alt=\"120px-Foobar.jpg\" rel=\"mw:externalImage\" 
data-parsoid='{\"dsr\":[106,170,null,null]}'/></div></div>\n\t\t\t<div 
class=\"gallerytext\" 
data-parsoid='{\"stx\":\"html\",\"dsr\":[186,220,25,6]}'>\t\t\t</div>\n\t\t</div>\n");
 add("html2html", "Disable TOC", "<p 
data-parsoid='{\"dsr\":[0,4,0,0]}'>Lead</p>\n\n<h2 
data-parsoid='{\"dsr\":[6,252,2,2]}'> <span class=\"mw-headline\" 
id=\"Section_1\" data-parsoid='{\"stx\":\"html\",\"dsr\":[9,66,41,7]}'>Section 
1</span><span class=\"mw-editsection\" 
data-parsoid='{\"stx\":\"html\",\"dsr\":[66,249,29,7]}'><span 
class=\"mw-editsection-bracket\" 
data-parsoid='{\"stx\":\"html\",\"dsr\":[95,140,37,7]}'>[</span>[/index.php?title=Parser_test&amp;action=edit&amp;section=1
 edit]<span class=\"mw-editsection-bracket\" 
data-parsoid='{\"stx\":\"html\",\"dsr\":[197,242,37,7]}'>]</span></span> 
</h2>\n\n<h2 data-parsoid='{\"dsr\":[254,500,2,2]}'> <span 
class=\"mw-headline\" id=\"Section_2\" 
data-parsoid='{\"stx\":\"html\",\"dsr\":[257,314,41,7]}'>Section 2</span><span 
class=\"mw-editsection\" 
data-parsoid='{\"stx\":\"html\",\"dsr\":[314,497,29,7]}'><span 
class=\"mw-editsection-bracket\" 
data-parsoid='{\"stx\":\"html\",\"dsr\":[343,388,37,7]}'>[</span>[/index.php?title=Parser_test&amp;action=edit&amp;section=2
 edit]<span class=\"mw-editsection-bracket\" 
data-parsoid='{\"stx\":\"html\",\"dsr\":[445,490,37,7]}'>]</span></span> 
</h2>\n\n<h2 data-parsoid='{\"dsr\":[502,748,2,2]}'> <span 
class=\"mw-headline\" id=\"Section_3\" 
data-parsoid='{\"stx\":\"html\",\"dsr\":[505,562,41,7]}'>Section 3</span><span 
class=\"mw-editsection\" 
data-parsoid='{\"stx\":\"html\",\"dsr\":[562,745,29,7]}'><span 
class=\"mw-editsection-bracket\" 
data-parsoid='{\"stx\":\"html\",\"dsr\":[591,636,37,7]}'>[</span>[/index.php?title=Parser_test&amp;action=edit&amp;section=3
 edit]<span class=\"mw-editsection-bracket\" 
data-parsoid='{\"stx\":\"html\",\"dsr\":[693,738,37,7]}'>]</span></span> 
</h2>\n\n<h2 data-parsoid='{\"dsr\":[750,996,2,2]}'> <span 
class=\"mw-headline\" id=\"Section_4\" 
data-parsoid='{\"stx\":\"html\",\"dsr\":[753,810,41,7]}'>Section 4</span><span 
class=\"mw-editsection\" 
data-parsoid='{\"stx\":\"html\",\"dsr\":[810,993,29,7]}'><span 
class=\"mw-editsection-bracket\" 
data-parsoid='{\"stx\":\"html\",\"dsr\":[839,884,37,7]}'>[</span>[/index.php?title=Parser_test&amp;action=edit&amp;section=4
 edit]<span class=\"mw-editsection-bracket\" 
data-parsoid='{\"stx\":\"html\",\"dsr\":[941,986,37,7]}'>]</span></span> 
</h2>\n\n<h2 data-parsoid='{\"dsr\":[998,1244,2,2]}'> <span 
class=\"mw-headline\" id=\"Section_5\" 
data-parsoid='{\"stx\":\"html\",\"dsr\":[1001,1058,41,7]}'>Section 
5</span><span class=\"mw-editsection\" 
data-parsoid='{\"stx\":\"html\",\"dsr\":[1058,1241,29,7]}'><span 
class=\"mw-editsection-bracket\" 
data-parsoid='{\"stx\":\"html\",\"dsr\":[1087,1132,37,7]}'>[</span>[/index.php?title=Parser_test&amp;action=edit&amp;section=5
 edit]<span class=\"mw-editsection-bracket\" 
data-parsoid='{\"stx\":\"html\",\"dsr\":[1189,1234,37,7]}'>]</span></span> 
</h2>\n");
-add("html2html", "Ref: 5. body should accept generic wikitext", "<p 
data-parsoid='{\"dsr\":[0,81,0,0]}'>A <span about=\"#mwt2\" class=\"reference\" 
id=\"cite_ref-1-0\" rel=\"dc:references\" typeof=\"mw:Extension/ref\" 
data-parsoid=\"{&quot;src&quot;:&quot;&lt;ref>This is a '''[[bolded link]]''' 
and this is a 
{{echo|transclusion}}\\n&lt;/ref>&quot;,&quot;dsr&quot;:[2,81,5,6]}\" 
data-mw='{\"name\":\"ref\",\"body\":{\"html\":\"This is a &lt;b 
data-parsoid=&#39;{\\\"dsr\\\":[17,38,3,3]}&#39;>&lt;a rel=\\\"mw:WikiLink\\\" 
href=\\\"./Bolded_link\\\" title=\\\"Bolded link\\\" 
data-parsoid=&#39;{\\\"stx\\\":\\\"simple\\\",\\\"a\\\":{\\\"href\\\":\\\"./Bolded_link\\\"},\\\"sa\\\":{\\\"href\\\":\\\"bolded
 link\\\"},\\\"dsr\\\":[20,35,2,2]}&#39;>bolded link&lt;/a>&lt;/b> and this is 
a &lt;span about=\\\"#mwt3\\\" typeof=\\\"mw:Transclusion\\\" 
data-parsoid=&#39;{\\\"pi\\\":[[{\\\"k\\\":\\\"1\\\",\\\"spc\\\":[\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\"]}]],\\\"dsr\\\":[53,74,null,null]}&#39;
 
data-mw=&#39;{\\\"parts\\\":[{\\\"template\\\":{\\\"target\\\":{\\\"wt\\\":\\\"echo\\\",\\\"href\\\":\\\"./Template:Echo\\\"},\\\"params\\\":{\\\"1\\\":{\\\"wt\\\":\\\"transclusion\\\"}},\\\"i\\\":0}}]}&#39;>transclusion&lt;/span>\\n\"},\"attrs\":{}}'><a
 href=\"#cite_note-1\">[1]</a></span></p>\n\n<ol class=\"references\" 
typeof=\"mw:Extension/references\" about=\"#mwt5\" 
data-parsoid='{\"src\":\"&lt;references />\",\"dsr\":[83,97,2,2]}' 
data-mw='{\"name\":\"references\",\"attrs\":{}}'><li about=\"#cite_note-1\" 
id=\"cite_note-1\"><span rel=\"mw:referencedBy\"><a 
href=\"#cite_ref-1-0\">↑</a></span> This is a <b><a rel=\"mw:WikiLink\" 
href=\"./Bolded_link\" title=\"Bolded link\" 
data-parsoid='{\"stx\":\"simple\",\"a\":{\"href\":\"./Bolded_link\"},\"sa\":{\"href\":\"bolded
 link\"},\"dsr\":[20,35,2,2]}'>bolded link</a></b> and this is a <span 
about=\"#mwt3\" typeof=\"mw:Transclusion\" 
data-parsoid='{\"pi\":[[{\"k\":\"1\",\"spc\":[\"\",\"\",\"\",\"\"]}]],\"dsr\":[53,74,null,null]}'
 
data-mw='{\"parts\":[{\"template\":{\"target\":{\"wt\":\"echo\",\"href\":\"./Template:Echo\"},\"params\":{\"1\":{\"wt\":\"transclusion\"}},\"i\":0}}]}'>transclusion</span>\n</li></ol>");
-add("html2html", "Ref: 7. No p-wrapping in ref-body", "<p 
data-parsoid='{\"dsr\":[0,30,0,0]}'>A <span about=\"#mwt2\" class=\"reference\" 
id=\"cite_ref-1-0\" rel=\"dc:references\" typeof=\"mw:Extension/ref\" 
data-parsoid='{\"src\":\"&lt;ref>foo\\nbar\\nbaz\\nbooz\\n&lt;/ref>\",\"dsr\":[2,30,5,6]}'
 
data-mw='{\"name\":\"ref\",\"body\":{\"html\":\"foo\\nbar\\nbaz\\nbooz\\n\"},\"attrs\":{}}'><a
 href=\"#cite_note-1\">[1]</a></span></p>\n\n<ol class=\"references\" 
typeof=\"mw:Extension/references\" about=\"#mwt4\" 
data-parsoid='{\"src\":\"&lt;references />\",\"dsr\":[32,46,2,2]}' 
data-mw='{\"name\":\"references\",\"attrs\":{}}'><li about=\"#cite_note-1\" 
id=\"cite_note-1\"><span rel=\"mw:referencedBy\"><a 
href=\"#cite_ref-1-0\">↑</a></span> foo\nbar\nbaz\nbooz\n</li></ol>");
-add("html2html", "Ref: 8. transclusion wikitext has lower precedence", "<p 
data-parsoid='{\"dsr\":[0,47,0,0]}'>A <span about=\"#mwt2\" class=\"reference\" 
id=\"cite_ref-1-0\" rel=\"dc:references\" typeof=\"mw:Extension/ref\" 
data-parsoid='{\"src\":\"&lt;ref>foo {{echo|&lt;/ref>\",\"dsr\":[2,24,5,6]}' 
data-mw='{\"name\":\"ref\",\"body\":{\"html\":\"foo &lt;span 
typeof=\\\"mw:Nowiki\\\" 
data-parsoid=&#39;{\\\"src\\\":\\\"{{\\\",\\\"dsr\\\":[11,13,0,0]}&#39;>{{&lt;/span>echo|\"},\"attrs\":{}}'><a
 href=\"#cite_note-1\">[1]</a></span> B C<span typeof=\"mw:Nowiki\" 
data-parsoid='{\"dsr\":[28,47,8,9]}'>}}</span></p>\n<ol class=\"references\" 
typeof=\"mw:Extension/references\" about=\"#mwt4\" 
data-parsoid='{\"src\":\"&lt;references />\",\"dsr\":[48,62,2,2]}' 
data-mw='{\"name\":\"references\",\"attrs\":{}}'><li about=\"#cite_note-1\" 
id=\"cite_note-1\"><span rel=\"mw:referencedBy\"><a 
href=\"#cite_ref-1-0\">↑</a></span> foo <span 
typeof=\"mw:Nowiki\">{{</span>echo|</li></ol>");
-add("html2html", "Ref: 10. Unclosed HTML tags should not leak out of 
ref-body", "<p data-parsoid='{\"dsr\":[0,25,0,0]}'>A <span about=\"#mwt2\" 
class=\"reference\" id=\"cite_ref-1-0\" rel=\"dc:references\" 
typeof=\"mw:Extension/ref\" data-parsoid='{\"src\":\"&lt;ref>&lt;b> foo 
&lt;/ref>\",\"dsr\":[2,21,5,6]}' 
data-mw='{\"name\":\"ref\",\"body\":{\"html\":\"&lt;b 
data-parsoid=&#39;{\\\"stx\\\":\\\"html\\\",\\\"autoInsertedEnd\\\":true,\\\"dsr\\\":[7,15,3,0]}&#39;>
 foo &lt;/b>\"},\"attrs\":{}}'><a href=\"#cite_note-1\">[1]</a></span> B 
C</p>\n\n<ol class=\"references\" typeof=\"mw:Extension/references\" 
about=\"#mwt4\" data-parsoid='{\"src\":\"&lt;references 
/>\",\"dsr\":[27,41,2,2]}' data-mw='{\"name\":\"references\",\"attrs\":{}}'><li 
about=\"#cite_note-1\" id=\"cite_note-1\"><span rel=\"mw:referencedBy\"><a 
href=\"#cite_ref-1-0\">↑</a></span> <b 
data-parsoid='{\"stx\":\"html\",\"autoInsertedEnd\":true,\"dsr\":[7,15,3,0]}'> 
foo </b></li></ol>");
-add("html2html", "References: 5. ref tags in references should be processed 
while ignoring all other content", "<p data-parsoid='{\"dsr\":[0,44,0,0]}'>A 
<span about=\"#mwt2\" class=\"reference\" id=\"cite_ref-a-1-0\" 
rel=\"dc:references\" typeof=\"mw:Extension/ref\" 
data-parsoid='{\"src\":\"&lt;ref name=\\\"a\\\" />\",\"dsr\":[2,18,16,0]}' 
data-mw='{\"name\":\"ref\",\"attrs\":{\"name\":\"a\"}}'><a 
href=\"#cite_note-a-1\">[1]</a></span>\nB <span about=\"#mwt4\" 
class=\"reference\" id=\"cite_ref-b-2-0\" rel=\"dc:references\" 
typeof=\"mw:Extension/ref\" data-parsoid='{\"src\":\"&lt;ref 
name=\\\"b\\\">bar&lt;/ref>\",\"dsr\":[21,44,14,6]}' 
data-mw='{\"name\":\"ref\",\"body\":{\"html\":\"bar\"},\"attrs\":{\"name\":\"b\"}}'><a
 href=\"#cite_note-b-2\">[2]</a></span></p>\n\n<ol class=\"references\" 
typeof=\"mw:Extension/references\" about=\"#mwt6\" 
data-parsoid='{\"src\":\"&lt;references>\\n&lt;ref 
name=\\\"a\\\">foo&lt;/ref>\\n&lt;/references>\",\"dsr\":[46,96,2,2]}' 
data-mw='{\"name\":\"references\",\"body\":{\"extsrc\":\"&lt;ref 
name=\\\"a\\\">foo&lt;/ref>\",\"html\":\"\\n&lt;span about=\\\"#mwt8\\\" 
class=\\\"reference\\\" rel=\\\"dc:references\\\" 
typeof=\\\"mw:Extension/ref\\\" data-parsoid=&#39;{\\\"src\\\":\\\"&amp;lt;ref 
name=\\\\\\\"a\\\\\\\">foo&amp;lt;/ref>\\\",\\\"dsr\\\":[59,82,14,6]}&#39; 
data-mw=&#39;{\\\"name\\\":\\\"ref\\\",\\\"body\\\":{\\\"html\\\":\\\"foo\\\"},\\\"attrs\\\":{\\\"name\\\":\\\"a\\\"}}&#39;>&lt;a
 href=\\\"#cite_note-a-1\\\">[1]&lt;/a>&lt;/span>\\n\"},\"attrs\":{}}'><li 
about=\"#cite_note-a-1\" id=\"cite_note-a-1\"><span rel=\"mw:referencedBy\"><a 
href=\"#cite_ref-a-1-0\">↑</a></span> foo</li><li about=\"#cite_note-b-2\" 
id=\"cite_note-b-2\"><span rel=\"mw:referencedBy\"><a 
href=\"#cite_ref-b-2-0\">↑</a></span> bar</li></ol>");
-add("html2html", "Entities in ref name", "<p 
data-parsoid='{\"dsr\":[0,38,0,0]}'><span about=\"#mwt2\" class=\"reference\" 
id=\"cite_ref-test_.26amp.3Bamp.3B_me-1-0\" rel=\"dc:references\" 
typeof=\"mw:Extension/ref\" data-parsoid='{\"src\":\"&lt;ref name=\\\"test 
&amp;amp;amp; me\\\">hi&lt;/ref>\",\"dsr\":[0,38,30,6]}' 
data-mw='{\"name\":\"ref\",\"body\":{\"html\":\"hi\"},\"attrs\":{\"name\":\"test
 &amp;amp;amp; me\"}}'><a 
href=\"#cite_note-test_.26amp.3Bamp.3B_me-1\">[1]</a></span></p>\n");
+add("html2html", "Ref: 5. body should accept generic wikitext", "<p 
data-parsoid='{\"dsr\":[0,81,0,0]}'>A <span about=\"#mwt2\" class=\"reference\" 
id=\"cite_ref-1\" rel=\"dc:references\" typeof=\"mw:Extension/ref\" 
data-parsoid=\"{&quot;src&quot;:&quot;&lt;ref>This is a '''[[bolded link]]''' 
and this is a 
{{echo|transclusion}}\\n&lt;/ref>&quot;,&quot;dsr&quot;:[2,81,5,6]}\" 
data-mw='{\"name\":\"ref\",\"body\":{\"html\":\"This is a &lt;b 
data-parsoid=&#39;{\\\"dsr\\\":[17,38,3,3]}&#39;>&lt;a rel=\\\"mw:WikiLink\\\" 
href=\\\"./Bolded_link\\\" title=\\\"Bolded link\\\" 
data-parsoid=&#39;{\\\"stx\\\":\\\"simple\\\",\\\"a\\\":{\\\"href\\\":\\\"./Bolded_link\\\"},\\\"sa\\\":{\\\"href\\\":\\\"bolded
 link\\\"},\\\"dsr\\\":[20,35,2,2]}&#39;>bolded link&lt;/a>&lt;/b> and this is 
a &lt;span about=\\\"#mwt3\\\" typeof=\\\"mw:Transclusion\\\" 
data-parsoid=&#39;{\\\"pi\\\":[[{\\\"k\\\":\\\"1\\\",\\\"spc\\\":[\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\"]}]],\\\"dsr\\\":[53,74,null,null]}&#39;
 
data-mw=&#39;{\\\"parts\\\":[{\\\"template\\\":{\\\"target\\\":{\\\"wt\\\":\\\"echo\\\",\\\"href\\\":\\\"./Template:Echo\\\"},\\\"params\\\":{\\\"1\\\":{\\\"wt\\\":\\\"transclusion\\\"}},\\\"i\\\":0}}]}&#39;>transclusion&lt;/span>\\n\"},\"attrs\":{}}'><a
 href=\"#cite_note-1\">[1]</a></span></p>\n\n<ol class=\"references\" 
typeof=\"mw:Extension/references\" about=\"#mwt5\" 
data-parsoid='{\"src\":\"&lt;references />\",\"dsr\":[83,97,2,2]}' 
data-mw='{\"name\":\"references\",\"attrs\":{}}'><li about=\"#cite_note-1\" 
id=\"cite_note-1\"><span rel=\"mw:referencedBy\"><a 
href=\"#cite_ref-1\">↑</a></span> This is a <b><a rel=\"mw:WikiLink\" 
href=\"./Bolded_link\" title=\"Bolded link\" 
data-parsoid='{\"stx\":\"simple\",\"a\":{\"href\":\"./Bolded_link\"},\"sa\":{\"href\":\"bolded
 link\"},\"dsr\":[20,35,2,2]}'>bolded link</a></b> and this is a <span 
about=\"#mwt3\" typeof=\"mw:Transclusion\" 
data-parsoid='{\"pi\":[[{\"k\":\"1\",\"spc\":[\"\",\"\",\"\",\"\"]}]],\"dsr\":[53,74,null,null]}'
 
data-mw='{\"parts\":[{\"template\":{\"target\":{\"wt\":\"echo\",\"href\":\"./Template:Echo\"},\"params\":{\"1\":{\"wt\":\"transclusion\"}},\"i\":0}}]}'>transclusion</span>\n</li></ol>");
+add("html2html", "Ref: 7. No p-wrapping in ref-body", "<p 
data-parsoid='{\"dsr\":[0,30,0,0]}'>A <span about=\"#mwt2\" class=\"reference\" 
id=\"cite_ref-1\" rel=\"dc:references\" typeof=\"mw:Extension/ref\" 
data-parsoid='{\"src\":\"&lt;ref>foo\\nbar\\nbaz\\nbooz\\n&lt;/ref>\",\"dsr\":[2,30,5,6]}'
 
data-mw='{\"name\":\"ref\",\"body\":{\"html\":\"foo\\nbar\\nbaz\\nbooz\\n\"},\"attrs\":{}}'><a
 href=\"#cite_note-1\">[1]</a></span></p>\n\n<ol class=\"references\" 
typeof=\"mw:Extension/references\" about=\"#mwt4\" 
data-parsoid='{\"src\":\"&lt;references />\",\"dsr\":[32,46,2,2]}' 
data-mw='{\"name\":\"references\",\"attrs\":{}}'><li about=\"#cite_note-1\" 
id=\"cite_note-1\"><span rel=\"mw:referencedBy\"><a 
href=\"#cite_ref-1\">↑</a></span> foo\nbar\nbaz\nbooz\n</li></ol>");
+add("html2html", "Ref: 8. transclusion wikitext has lower precedence", "<p 
data-parsoid='{\"dsr\":[0,47,0,0]}'>A <span about=\"#mwt2\" class=\"reference\" 
id=\"cite_ref-1\" rel=\"dc:references\" typeof=\"mw:Extension/ref\" 
data-parsoid='{\"src\":\"&lt;ref>foo {{echo|&lt;/ref>\",\"dsr\":[2,24,5,6]}' 
data-mw='{\"name\":\"ref\",\"body\":{\"html\":\"foo &lt;span 
typeof=\\\"mw:Nowiki\\\" 
data-parsoid=&#39;{\\\"src\\\":\\\"{{\\\",\\\"dsr\\\":[11,13,0,0]}&#39;>{{&lt;/span>echo|\"},\"attrs\":{}}'><a
 href=\"#cite_note-1\">[1]</a></span> B C<span typeof=\"mw:Nowiki\" 
data-parsoid='{\"dsr\":[28,47,8,9]}'>}}</span></p>\n<ol class=\"references\" 
typeof=\"mw:Extension/references\" about=\"#mwt4\" 
data-parsoid='{\"src\":\"&lt;references />\",\"dsr\":[48,62,2,2]}' 
data-mw='{\"name\":\"references\",\"attrs\":{}}'><li about=\"#cite_note-1\" 
id=\"cite_note-1\"><span rel=\"mw:referencedBy\"><a 
href=\"#cite_ref-1\">↑</a></span> foo <span 
typeof=\"mw:Nowiki\">{{</span>echo|</li></ol>");
+add("html2html", "Ref: 10. Unclosed HTML tags should not leak out of 
ref-body", "<p data-parsoid='{\"dsr\":[0,25,0,0]}'>A <span about=\"#mwt2\" 
class=\"reference\" id=\"cite_ref-1\" rel=\"dc:references\" 
typeof=\"mw:Extension/ref\" data-parsoid='{\"src\":\"&lt;ref>&lt;b> foo 
&lt;/ref>\",\"dsr\":[2,21,5,6]}' 
data-mw='{\"name\":\"ref\",\"body\":{\"html\":\"&lt;b 
data-parsoid=&#39;{\\\"stx\\\":\\\"html\\\",\\\"autoInsertedEnd\\\":true,\\\"dsr\\\":[7,15,3,0]}&#39;>
 foo &lt;/b>\"},\"attrs\":{}}'><a href=\"#cite_note-1\">[1]</a></span> B 
C</p>\n\n<ol class=\"references\" typeof=\"mw:Extension/references\" 
about=\"#mwt4\" data-parsoid='{\"src\":\"&lt;references 
/>\",\"dsr\":[27,41,2,2]}' data-mw='{\"name\":\"references\",\"attrs\":{}}'><li 
about=\"#cite_note-1\" id=\"cite_note-1\"><span rel=\"mw:referencedBy\"><a 
href=\"#cite_ref-1\">↑</a></span> <b 
data-parsoid='{\"stx\":\"html\",\"autoInsertedEnd\":true,\"dsr\":[7,15,3,0]}'> 
foo </b></li></ol>");
+add("html2html", "Ref: 19. ref-tags with identical name encodings should get 
identical indexes", "<p data-parsoid='{\"dsr\":[0,60,0,0]}'>1 <span 
about=\"#mwt3\" class=\"reference\" id=\"cite_ref-a_.26_b_1-0\" 
rel=\"dc:references\" typeof=\"mw:Extension/ref\" 
data-parsoid='{\"src\":\"&lt;ref name=\\\"a &amp; 
b\\\">foo&lt;/ref>\",\"dsr\":[2,29,18,6]}' 
data-mw='{\"name\":\"ref\",\"body\":{\"html\":\"foo\"},\"attrs\":{\"name\":\"a 
&amp; b\"}}'><a href=\"#cite_note-a_.26_b-1\">[1]</a></span> 2 <span 
about=\"#mwt4\" class=\"reference\" id=\"cite_ref-a_.26amp.3B_b_2-0\" 
rel=\"dc:references\" typeof=\"mw:Extension/ref\" 
data-parsoid='{\"src\":\"&lt;ref name=\\\"a &amp;amp;amp; b\\\" 
/>\",\"dsr\":[32,60,28,0]}' data-mw='{\"name\":\"ref\",\"attrs\":{\"name\":\"a 
&amp;amp;amp; b\"}}'><a 
href=\"#cite_note-a_.26amp.3B_b-2\">[2]</a></span></p>\n\n<ol 
class=\"references\" typeof=\"mw:Extension/references\" about=\"#mwt6\" 
data-parsoid='{\"src\":\"&lt;references />\",\"dsr\":[62,76,2,2]}' 
data-mw='{\"name\":\"references\",\"attrs\":{}}'><li 
about=\"#cite_note-a_.26_b-1\" id=\"cite_note-a_.26_b-1\"><span 
rel=\"mw:referencedBy\"><a href=\"#cite_ref-a_.26_b_1-0\">↑</a></span> 
foo</li><li about=\"#cite_note-a_.26amp.3B_b-2\" 
id=\"cite_note-a_.26amp.3B_b-2\"><span rel=\"mw:referencedBy\"><a 
href=\"#cite_ref-a_.26amp.3B_b_2-0\">↑</a></span> </li></ol>");
+add("html2html", "References: 5. ref tags in references should be processed 
while ignoring all other content", "<p data-parsoid='{\"dsr\":[0,44,0,0]}'>A 
<span about=\"#mwt2\" class=\"reference\" id=\"cite_ref-a_1-0\" 
rel=\"dc:references\" typeof=\"mw:Extension/ref\" 
data-parsoid='{\"src\":\"&lt;ref name=\\\"a\\\" />\",\"dsr\":[2,18,16,0]}' 
data-mw='{\"name\":\"ref\",\"attrs\":{\"name\":\"a\"}}'><a 
href=\"#cite_note-a-1\">[1]</a></span>\nB <span about=\"#mwt4\" 
class=\"reference\" id=\"cite_ref-b_2-0\" rel=\"dc:references\" 
typeof=\"mw:Extension/ref\" data-parsoid='{\"src\":\"&lt;ref 
name=\\\"b\\\">bar&lt;/ref>\",\"dsr\":[21,44,14,6]}' 
data-mw='{\"name\":\"ref\",\"body\":{\"html\":\"bar\"},\"attrs\":{\"name\":\"b\"}}'><a
 href=\"#cite_note-b-2\">[2]</a></span></p>\n\n<ol class=\"references\" 
typeof=\"mw:Extension/references\" about=\"#mwt6\" 
data-parsoid='{\"src\":\"&lt;references>\\n&lt;ref 
name=\\\"a\\\">foo&lt;/ref>\\n&lt;/references>\",\"dsr\":[46,96,2,2]}' 
data-mw='{\"name\":\"references\",\"body\":{\"extsrc\":\"&lt;ref 
name=\\\"a\\\">foo&lt;/ref>\",\"html\":\"\\n&lt;span about=\\\"#mwt8\\\" 
class=\\\"reference\\\" rel=\\\"dc:references\\\" 
typeof=\\\"mw:Extension/ref\\\" data-parsoid=&#39;{\\\"src\\\":\\\"&amp;lt;ref 
name=\\\\\\\"a\\\\\\\">foo&amp;lt;/ref>\\\",\\\"dsr\\\":[59,82,14,6]}&#39; 
data-mw=&#39;{\\\"name\\\":\\\"ref\\\",\\\"body\\\":{\\\"html\\\":\\\"foo\\\"},\\\"attrs\\\":{\\\"name\\\":\\\"a\\\"}}&#39;>&lt;a
 href=\\\"#cite_note-a-1\\\">[1]&lt;/a>&lt;/span>\\n\"},\"attrs\":{}}'><li 
about=\"#cite_note-a-1\" id=\"cite_note-a-1\"><span rel=\"mw:referencedBy\"><a 
href=\"#cite_ref-a_1-0\">↑</a></span> foo</li><li about=\"#cite_note-b-2\" 
id=\"cite_note-b-2\"><span rel=\"mw:referencedBy\"><a 
href=\"#cite_ref-b_2-0\">↑</a></span> bar</li></ol>");
+add("html2html", "Entities in ref name", "<p 
data-parsoid='{\"dsr\":[0,38,0,0]}'><span about=\"#mwt2\" class=\"reference\" 
id=\"cite_ref-test_.26amp.3B_me_1-0\" rel=\"dc:references\" 
typeof=\"mw:Extension/ref\" data-parsoid='{\"src\":\"&lt;ref name=\\\"test 
&amp;amp;amp; me\\\">hi&lt;/ref>\",\"dsr\":[0,38,30,6]}' 
data-mw='{\"name\":\"ref\",\"body\":{\"html\":\"hi\"},\"attrs\":{\"name\":\"test
 &amp;amp;amp; me\"}}'><a 
href=\"#cite_note-test_.26amp.3B_me-1\">[1]</a></span></p>\n");
 add("html2html", "Empty LI and TR nodes should not be stripped from top-level 
content", "<ul data-parsoid='{\"dsr\":[0,9,0,0]}'><li 
data-parsoid='{\"dsr\":[0,3,1,0]}'> a</li>\n<li 
data-parsoid='{\"dsr\":[4,5,1,0]}'></li>\n<li 
data-parsoid='{\"dsr\":[6,9,1,0]}'> b</li></ul>\n\n<table 
data-parsoid='{\"dsr\":[11,26,2,2]}'>\n\n<tbody 
data-parsoid='{\"dsr\":[15,24,0,0]}'><tr 
data-parsoid='{\"startTagSrc\":\"|-\",\"autoInsertedEnd\":true,\"dsr\":[15,22,2,0]}'>\n<td
 
data-parsoid='{\"autoInsertedEnd\":true,\"dsr\":[18,22,1,0]}'>foo</td></tr>\n\n</tbody></table>\n");
 add("html2html", "Headings: 6a. Heading chars in SOL context (with trailing 
spaces)", "<p data-parsoid='{\"dsr\":[0,20,0,0]}'><span typeof=\"mw:Nowiki\" 
data-parsoid='{\"dsr\":[0,20,8,9]}'>=a=</span></p>\n\n<p 
data-parsoid='{\"dsr\":[22,42,0,0]}'><span typeof=\"mw:Nowiki\" 
data-parsoid='{\"dsr\":[22,42,8,9]}'>=a=</span></p> \n\n<p 
data-parsoid='{\"dsr\":[45,65,0,0]}'><span typeof=\"mw:Nowiki\" 
data-parsoid='{\"dsr\":[45,65,8,9]}'>=a=</span></p>\t\n\n<p 
data-parsoid='{\"dsr\":[68,88,0,0]}'><span typeof=\"mw:Nowiki\" 
data-parsoid='{\"dsr\":[68,88,8,9]}'>=a=</span></p> \t\n");
 add("html2html", "Headings: 6b. Heading chars in SOL context (with trailing 
newlines)", "<p data-parsoid='{\"dsr\":[0,22,0,0]}'><span typeof=\"mw:Nowiki\" 
data-parsoid='{\"dsr\":[0,22,8,9]}'>=a=\nb</span></p>\n\n<p 
data-parsoid='{\"dsr\":[24,47,0,0]}'><span typeof=\"mw:Nowiki\" 
data-parsoid='{\"dsr\":[24,47,8,9]}'>=a= \nb</span></p>\n\n<p 
data-parsoid='{\"dsr\":[49,72,0,0]}'><span typeof=\"mw:Nowiki\" 
data-parsoid='{\"dsr\":[49,72,8,9]}'>=a=\t\nb</span></p>\n\n<p 
data-parsoid='{\"dsr\":[74,98,0,0]}'><span typeof=\"mw:Nowiki\" 
data-parsoid='{\"dsr\":[74,98,8,9]}'>=a=\t \nb</span></p>\n");
@@ -1753,6 +1755,7 @@
 add("html2wt", "Ref: 8. transclusion wikitext has lower precedence", "A 
<ref>foo {{echo|</ref> B C<nowiki>}}</nowiki>\n<references />");
 add("html2wt", "Ref: 9. unclosed comments should not leak out of ref-body", "A 
<ref>foo <!----></ref> B C\n<references />");
 add("html2wt", "Ref: 10. Unclosed HTML tags should not leak out of ref-body", 
"A <ref><b> foo </ref> B C\n\n<references />");
+add("html2wt", "Ref: 19. ref-tags with identical name encodings should get 
identical indexes", "1 <ref name=\"a & b\">foo</ref> 2 <ref name=\"a &amp;amp; 
b\" />\n\n<references />");
 add("html2wt", "References: 5. ref tags in references should be processed 
while ignoring all other content", "A <ref name=\"a\" />\nB <ref 
name=\"b\">bar</ref>\n\n<references>\n<ref 
name=\"a\">foo</ref>\n</references>");
 add("html2wt", "Entities in ref name", "<ref name=\"test &amp;amp; 
me\">hi</ref>\n");
 add("html2wt", "Empty LI and TR nodes should not be stripped from top-level 
content", "* a\n*\n* b\n\n{|\n\n|-\n|foo\n\n|}\n");
@@ -2764,6 +2767,18 @@
 add("selser", "Ref: 10. Unclosed HTML tags should not leak out of ref-body 
[[2,0,0],2,0]", "3i2udpyjqgehr529A <ref> <b> foo </ref> B 
C\n\n04ufs7jtgivsra4i\n\n<references />");
 add("selser", "Ref: 10. Unclosed HTML tags should not leak out of ref-body 
[0,4,0]", "A <ref> <b> foo </ref> B C\n\nexksatqzwpgsc3di<references />");
 add("selser", "Ref: 10. Unclosed HTML tags should not leak out of ref-body 
[[0,0,4],3,0]", "A <ref> <b> foo </ref>3ds74snl9wly2e29<references />");
+add("selser", "Ref: 19. ref-tags with identical name encodings should get 
identical indexes [[2,0,4,0],0,0]", "0dpatm9gsbqk6gvi1 <ref name=\"a & 
b\">foo</ref>k0yidhh5u2b21emi<ref name=\"a &amp; b\" />\n\n<references />");
+add("selser", "Ref: 19. ref-tags with identical name encodings should get 
identical indexes [2,0,0]", "zmmmjlha7xim5cdi\n\n1 <ref name=\"a & 
b\">foo</ref> 2 <ref name=\"a &amp; b\" />\n\n<references />");
+add("selser", "Ref: 19. ref-tags with identical name encodings should get 
identical indexes [1,0,0]", "1 <ref name=\"a & b\">foo</ref> 2 <ref name=\"a 
&amp; b\" />\n\n<references />");
+add("selser", "Ref: 19. ref-tags with identical name encodings should get 
identical indexes [[3,0,2,0],0,0]", "<ref name=\"a & 
b\">foo</ref>4xwpzmnvwlqy3nmi 2 <ref name=\"a &amp; b\" />\n\n<references />");
+add("selser", "Ref: 19. ref-tags with identical name encodings should get 
identical indexes [[4,0,0,0],3,0]", "7i0zzbh4nhdm42t9<ref name=\"a & 
b\">foo</ref> 2 <ref name=\"a &amp; b\" /><references />");
+add("selser", "Ref: 19. ref-tags with identical name encodings should get 
identical indexes [[2,0,0,0],0,0]", "hjhp2d26mvqs38fr1 <ref name=\"a & 
b\">foo</ref> 2 <ref name=\"a &amp; b\" />\n\n<references />");
+add("selser", "Ref: 19. ref-tags with identical name encodings should get 
identical indexes [[4,0,4,0],3,0]", "zd9k828z9kiysyvi<ref name=\"a & 
b\">foo</ref>q33pirp3a9yhkt9<ref name=\"a &amp; b\" /><references />");
+add("selser", "Ref: 19. ref-tags with identical name encodings should get 
identical indexes [1,4,0]", "1 <ref name=\"a & b\">foo</ref> 2 <ref name=\"a 
&amp; b\" />\n\n8k7rhm4hx2a3v7vi<references />");
+add("selser", "Ref: 19. ref-tags with identical name encodings should get 
identical indexes [[0,0,2,0],4,0]", "1 <ref name=\"a & 
b\">foo</ref>23hldhtd8azfflxr 2 <ref name=\"a &amp; b\" 
/>\n\nemqs1xn2p292uik9<references />");
+add("selser", "Ref: 19. ref-tags with identical name encodings should get 
identical indexes [2,2,0]", "xggq2fn27fxq1tt9\n\n1 <ref name=\"a & 
b\">foo</ref> 2 <ref name=\"a &amp; b\" />\n\na8895s490fnu3di\n\n<references 
/>");
+add("selser", "Ref: 19. ref-tags with identical name encodings should get 
identical indexes [[0,0,2,0],2,0]", "1 <ref name=\"a & 
b\">foo</ref>68etayk44yhqia4i 2 <ref name=\"a &amp; b\" 
/>\n\njzslhat3ryrjm7vi\n\n<references />");
+add("selser", "Ref: 19. ref-tags with identical name encodings should get 
identical indexes [[2,0,0,0],4,0]", "uon9m0ns960f6r1 <ref name=\"a & 
b\">foo</ref> 2 <ref name=\"a &amp; b\" />\n\njhjx2ypla5v4e7b9<references />");
 add("selser", "References: 5. ref tags in references should be processed while 
ignoring all other content [3,2,0]", "in8j4tbs99qz1tt9\n\n<references>\n<ref 
name=\"a\">foo</ref>\nThis should just get lost.\n</references>");
 add("selser", "References: 5. ref tags in references should be processed while 
ignoring all other content [4,3,0]", "meym79sw6mv7k3xr<references>\n<ref 
name=\"a\">foo</ref>\nThis should just get lost.\n</references>");
 add("selser", "References: 5. ref tags in references should be processed while 
ignoring all other content [4,2,0]", 
"pelj4uzr3bs2a9k9\n\nu67k5swfctk2o6r\n\n<references>\n<ref 
name=\"a\">foo</ref>\nThis should just get lost.\n</references>");
diff --git a/tests/parserTests.txt b/tests/parserTests.txt
index 964203b..77a6631 100644
--- a/tests/parserTests.txt
+++ b/tests/parserTests.txt
@@ -19406,9 +19406,9 @@
 B <ref name="x">foo</ref>
 C <ref name="y" />
 !! html
-<p>A <span about="#mwt2" class="reference" id="cite_ref-1-0" 
rel="dc:references" typeof="mw:Extension/ref" 
data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{}}'><a 
href="#cite_note-1">[1]</a></span>
-B <span about="#mwt4" class="reference" id="cite_ref-x-2-0" 
rel="dc:references" typeof="mw:Extension/ref" 
data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{"name":"x"}}'><a 
href="#cite_note-x-2">[2]</a></span>
-C <span about="#mwt6" class="reference" id="cite_ref-y-3-0" 
rel="dc:references" typeof="mw:Extension/ref" 
data-mw='{"name":"ref","attrs":{"name":"y"}}'><a 
href="#cite_note-y-3">[3]</a></span></p>
+<p>A <span about="#mwt2" class="reference" id="cite_ref-1" rel="dc:references" 
typeof="mw:Extension/ref" 
data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{}}'><a 
href="#cite_note-1">[1]</a></span>
+B <span about="#mwt4" class="reference" id="cite_ref-x_2-0" 
rel="dc:references" typeof="mw:Extension/ref" 
data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{"name":"x"}}'><a 
href="#cite_note-x-2">[2]</a></span>
+C <span about="#mwt6" class="reference" id="cite_ref-y_3-0" 
rel="dc:references" typeof="mw:Extension/ref" 
data-mw='{"name":"ref","attrs":{"name":"y"}}'><a 
href="#cite_note-y-3">[3]</a></span></p>
 !!end
 
 !!test
@@ -19419,8 +19419,8 @@
 A <ref name="x">foo</ref>
 B <ref name="x" />
 !! html
-<p>A <span about="#mwt2" class="reference" id="cite_ref-x-1-0" 
rel="dc:references" typeof="mw:Extension/ref" 
data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{"name":"x"}}'><a 
href="#cite_note-x-1">[1]</a></span>
-B <span about="#mwt4" class="reference" id="cite_ref-x-1-1" 
rel="dc:references" typeof="mw:Extension/ref" 
data-mw='{"name":"ref","attrs":{"name":"x"}}'><a 
href="#cite_note-x-1">[1]</a></span></p>
+<p>A <span about="#mwt2" class="reference" id="cite_ref-x_1-0" 
rel="dc:references" typeof="mw:Extension/ref" 
data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{"name":"x"}}'><a 
href="#cite_note-x-1">[1]</a></span>
+B <span about="#mwt4" class="reference" id="cite_ref-x_1-1" 
rel="dc:references" typeof="mw:Extension/ref" 
data-mw='{"name":"ref","attrs":{"name":"x"}}'><a 
href="#cite_note-x-1">[1]</a></span></p>
 !!end
 
 !!test
@@ -19432,9 +19432,9 @@
 B <ref name=" x " />
 C <ref name= x  />
 !! html
-<p>A <span about="#mwt2" class="reference" id="cite_ref-x-1-0" 
rel="dc:references" typeof="mw:Extension/ref" 
data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{"name":"x"}}'><a 
href="#cite_note-x-1">[1]</a></span>
-B <span about="#mwt4" class="reference" id="cite_ref-x-1-1" 
rel="dc:references" typeof="mw:Extension/ref" 
data-mw='{"name":"ref","attrs":{"name":"x"}}'><a 
href="#cite_note-x-1">[1]</a></span>
-C <span about="#mwt6" class="reference" id="cite_ref-x-1-2" 
rel="dc:references" typeof="mw:Extension/ref" 
data-mw='{"name":"ref","attrs":{"name":"x"}}'><a 
href="#cite_note-x-1">[1]</a></span></p>
+<p>A <span about="#mwt2" class="reference" id="cite_ref-x_1-0" 
rel="dc:references" typeof="mw:Extension/ref" 
data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{"name":"x"}}'><a 
href="#cite_note-x-1">[1]</a></span>
+B <span about="#mwt4" class="reference" id="cite_ref-x_1-1" 
rel="dc:references" typeof="mw:Extension/ref" 
data-mw='{"name":"ref","attrs":{"name":"x"}}'><a 
href="#cite_note-x-1">[1]</a></span>
+C <span about="#mwt6" class="reference" id="cite_ref-x_1-2" 
rel="dc:references" typeof="mw:Extension/ref" 
data-mw='{"name":"ref","attrs":{"name":"x"}}'><a 
href="#cite_note-x-1">[1]</a></span></p>
 !!end
 
 # NOTE: constructor is a predefined property in JS and constructor as a 
ref-name can clash with it if not handled properly)
@@ -19445,7 +19445,7 @@
 !! wikitext
 A <ref name="constructor">foo</ref>
 !! html
-<p>A <span about="#mwt2" class="reference" id="cite_ref-constructor-1-0" 
rel="dc:references" typeof="mw:Extension/ref" 
data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{"name":"constructor"}}'><a
 href="#cite_note-constructor-1">[1]</a></span></p>
+<p>A <span about="#mwt2" class="reference" id="cite_ref-constructor_1-0" 
rel="dc:references" typeof="mw:Extension/ref" 
data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{"name":"constructor"}}'><a
 href="#cite_note-constructor-1">[1]</a></span></p>
 !!end
 
 !!test
@@ -19459,10 +19459,10 @@
 
 <references />
 !! html
-<p>A <span about="#mwt2" class="reference" id="cite_ref-1-0" 
rel="dc:references" typeof="mw:Extension/ref" 
data-mw='{"name":"ref","body":{"html":"This is a &lt;b 
data-parsoid=&#39;{\"dsr\":[19,40,3,3]}&#39;>&lt;a rel=\"mw:WikiLink\" 
href=\"./Bolded_link\" title=\"Bolded link\" 
data-parsoid=&#39;{\"stx\":\"simple\",\"a\":{\"href\":\"./Bolded_link\"},\"sa\":{\"href\":\"bolded
 link\"},\"dsr\":[22,37,2,2]}&#39;>bolded link&lt;/a>&lt;/b> and this is a 
&lt;span about=\"#mwt3\" typeof=\"mw:Transclusion\" 
data-parsoid=&#39;{\"pi\":[[{\"k\":\"1\",\"spc\":[\"\",\"\",\"\",\"\"]}]],\"dsr\":[55,76,null,null]}&#39;
 
data-mw=&#39;{\"parts\":[{\"template\":{\"target\":{\"wt\":\"echo\",\"href\":\"./Template:Echo\"},\"params\":{\"1\":{\"wt\":\"transclusion\"}},\"i\":0}}]}&#39;>transclusion&lt;/span>\n"},"attrs":{}}'><a
 href="#cite_note-1">[1]</a></span></p>
+<p>A <span about="#mwt2" class="reference" id="cite_ref-1" rel="dc:references" 
typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"html":"This is a 
&lt;b data-parsoid=&#39;{\"dsr\":[19,40,3,3]}&#39;>&lt;a rel=\"mw:WikiLink\" 
href=\"./Bolded_link\" title=\"Bolded link\" 
data-parsoid=&#39;{\"stx\":\"simple\",\"a\":{\"href\":\"./Bolded_link\"},\"sa\":{\"href\":\"bolded
 link\"},\"dsr\":[22,37,2,2]}&#39;>bolded link&lt;/a>&lt;/b> and this is a 
&lt;span about=\"#mwt3\" typeof=\"mw:Transclusion\" 
data-parsoid=&#39;{\"pi\":[[{\"k\":\"1\",\"spc\":[\"\",\"\",\"\",\"\"]}]],\"dsr\":[55,76,null,null]}&#39;
 
data-mw=&#39;{\"parts\":[{\"template\":{\"target\":{\"wt\":\"echo\",\"href\":\"./Template:Echo\"},\"params\":{\"1\":{\"wt\":\"transclusion\"}},\"i\":0}}]}&#39;>transclusion&lt;/span>\n"},"attrs":{}}'><a
 href="#cite_note-1">[1]</a></span></p>
 
 <ol class="references" typeof="mw:Extension/references" about="#mwt5" 
data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a 
href="#cite_ref-1-0">↑</a></span> This is a <b><a rel="mw:WikiLink" 
href="./Bolded_link" title="Bolded link">bolded link</a></b> and this is a 
<span about="#mwt3" typeof="mw:Transclusion" 
data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"transclusion"}},"i":0}}]}'>transclusion</span>
+<li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a 
href="#cite_ref-1">↑</a></span> This is a <b><a rel="mw:WikiLink" 
href="./Bolded_link" title="Bolded link">bolded link</a></b> and this is a 
<span about="#mwt3" typeof="mw:Transclusion" 
data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"transclusion"}},"i":0}}]}'>transclusion</span>
 </li>
 </ol>
 !!end
@@ -19480,10 +19480,10 @@
 
 <references />
 !! html
-<p>A <span about="#mwt2" class="reference" id="cite_ref-1-0" 
rel="dc:references" typeof="mw:Extension/ref" 
data-mw='{"name":"ref","body":{"html":"foo\n bar\n baz\n"},"attrs":{}}'><a 
href="#cite_note-1">[1]</a></span></p>
+<p>A <span about="#mwt2" class="reference" id="cite_ref-1" rel="dc:references" 
typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"html":"foo\n bar\n 
baz\n"},"attrs":{}}'><a href="#cite_note-1">[1]</a></span></p>
 
 <ol class="references" typeof="mw:Extension/references" about="#mwt4" 
data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a 
href="#cite_ref-1-0">↑</a></span> foo
+<li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a 
href="#cite_ref-1">↑</a></span> foo
  bar
  baz
 </li>
@@ -19510,10 +19510,10 @@
 
 <references />
 !! html
-<p>A <span about="#mwt2" class="reference" id="cite_ref-1-0" 
rel="dc:references" typeof="mw:Extension/ref" 
data-mw='{"name":"ref","body":{"html":"foo\n\nbar\n\n\nbaz\n\n\n\nbooz\n"},"attrs":{}}'><a
 href="#cite_note-1">[1]</a></span></p>
+<p>A <span about="#mwt2" class="reference" id="cite_ref-1" rel="dc:references" 
typeof="mw:Extension/ref" 
data-mw='{"name":"ref","body":{"html":"foo\n\nbar\n\n\nbaz\n\n\n\nbooz\n"},"attrs":{}}'><a
 href="#cite_note-1">[1]</a></span></p>
 
 <ol class="references" typeof="mw:Extension/references" about="#mwt4" 
data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a 
href="#cite_ref-1-0">↑</a></span> foo
+<li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a 
href="#cite_ref-1">↑</a></span> foo
 
 bar
 
@@ -19536,9 +19536,9 @@
 
 <references />
 !! html
-<p>A <span about="#mwt2" class="reference" id="cite_ref-1-0" 
rel="dc:references" typeof="mw:Extension/ref" 
data-mw='{"name":"ref","body":{"html":"foo &lt;span typeof=\"mw:Nowiki\" 
data-parsoid=&#39;{\"src\":\"{{\",\"dsr\":[12,14,0,0]}&#39;>{{&lt;/span>echo|"},"attrs":{}}'><a
 href="#cite_note-1">[1]</a></span> B C<span typeof="mw:Nowiki">}}</span></p>
+<p>A <span about="#mwt2" class="reference" id="cite_ref-1" rel="dc:references" 
typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"html":"foo &lt;span 
typeof=\"mw:Nowiki\" 
data-parsoid=&#39;{\"src\":\"{{\",\"dsr\":[12,14,0,0]}&#39;>{{&lt;/span>echo|"},"attrs":{}}'><a
 href="#cite_note-1">[1]</a></span> B C<span typeof="mw:Nowiki">}}</span></p>
 <ol class="references" typeof="mw:Extension/references" about="#mwt4" 
data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a 
href="#cite_ref-1-0">↑</a></span> foo <span 
typeof="mw:Nowiki">{{</span>echo|</li>
+<li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a 
href="#cite_ref-1">↑</a></span> foo <span typeof="mw:Nowiki">{{</span>echo|</li>
 </ol>
 !!end
 
@@ -19550,9 +19550,9 @@
 A <ref> foo <!--</ref> B C
 <references />
 !! html
-<p>A <span about="#mwt2" class="reference" id="cite_ref-1-0" 
rel="dc:references" typeof="mw:Extension/ref" 
data-mw='{"name":"ref","body":{"html":"foo &lt;!---->"},"attrs":{}}'><a 
href="#cite_note-1">[1]</a></span> B C</p>
+<p>A <span about="#mwt2" class="reference" id="cite_ref-1" rel="dc:references" 
typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"html":"foo 
&lt;!---->"},"attrs":{}}'><a href="#cite_note-1">[1]</a></span> B C</p>
 <ol class="references" typeof="mw:Extension/references" about="#mwt4" 
data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a 
href="#cite_ref-1-0">↑</a></span> foo <!----></li>
+<li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a 
href="#cite_ref-1">↑</a></span> foo <!----></li>
 </ol>
 !!end
 
@@ -19565,11 +19565,11 @@
 
 <references />
 !! html
-<p>A <span about="#mwt2" class="reference" id="cite_ref-1-0" 
rel="dc:references" typeof="mw:Extension/ref" 
data-mw='{"name":"ref","body":{"html":"&lt;b 
data-parsoid=&#39;{\"stx\":\"html\",\"autoInsertedEnd\":true,\"dsr\":[8,16,3,0]}&#39;>
 foo &lt;/b>"},"attrs":{}}'><a href="#cite_note-1">[1]</a></span> B C</p>
+<p>A <span about="#mwt2" class="reference" id="cite_ref-1" rel="dc:references" 
typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"html":"&lt;b 
data-parsoid=&#39;{\"stx\":\"html\",\"autoInsertedEnd\":true,\"dsr\":[8,16,3,0]}&#39;>
 foo &lt;/b>"},"attrs":{}}'><a href="#cite_note-1">[1]</a></span> B C</p>
 
 
 <ol class="references" typeof="mw:Extension/references" about="#mwt4" 
data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a 
href="#cite_ref-1-0">↑</a></span> <b 
data-parsoid='{"stx":"html","autoInsertedEnd":true}'> foo </b></li>
+<li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a 
href="#cite_ref-1">↑</a></span> <b 
data-parsoid='{"stx":"html","autoInsertedEnd":true}'> foo </b></li>
 </ol>
 !!end
 
@@ -19581,8 +19581,8 @@
 A <ref>foo</ref> B
 C <ref>bar</ref> D
 !! html
-<p>A <span about="#mwt2" class="reference" id="cite_ref-1-0" 
rel="dc:references" typeof="mw:Extension/ref" 
data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{}}'><a 
href="#cite_note-1">[1]</a></span> B
-C <span about="#mwt4" class="reference" id="cite_ref-2-0" rel="dc:references" 
typeof="mw:Extension/ref" 
data-mw='{"name":"ref","body":{"html":"bar"},"attrs":{}}'><a 
href="#cite_note-2">[2]</a></span> D</p>
+<p>A <span about="#mwt2" class="reference" id="cite_ref-1" rel="dc:references" 
typeof="mw:Extension/ref" 
data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{}}'><a 
href="#cite_note-1">[1]</a></span> B
+C <span about="#mwt4" class="reference" id="cite_ref-2" rel="dc:references" 
typeof="mw:Extension/ref" 
data-mw='{"name":"ref","body":{"html":"bar"},"attrs":{}}'><a 
href="#cite_note-2">[2]</a></span> D</p>
 !!end
 
 !!test
@@ -19600,8 +19600,8 @@
 <p><!--the newline at the end of this line moves out of the p-tag-->a</p>
 
 
-<p>b<!--the newline at the end of this line stays inside the p-tag--> <span 
about="#mwt2" class="reference" id="cite_ref-1-0" rel="dc:references" 
typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{}}'><a 
href="#cite_note-1">[1]</a></span>
-<span about="#mwt4" class="reference" id="cite_ref-2-0" rel="dc:references" 
typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{}}'><a 
href="#cite_note-2">[2]</a></span></p>
+<p>b<!--the newline at the end of this line stays inside the p-tag--> <span 
about="#mwt2" class="reference" id="cite_ref-1" rel="dc:references" 
typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{}}'><a 
href="#cite_note-1">[1]</a></span>
+<span about="#mwt4" class="reference" id="cite_ref-2" rel="dc:references" 
typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{}}'><a 
href="#cite_note-2">[2]</a></span></p>
 
 <p>c</p>
 !!end
@@ -19615,8 +19615,8 @@
 <ref>bar
 </ref> B
 !! html
-<p><span about="#mwt2" class="reference" id="cite_ref-1-0" rel="dc:references" 
typeof="mw:Extension/ref" 
data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{}}'><a 
href="#cite_note-1">[1]</a></span> A
-<span about="#mwt4" class="reference" id="cite_ref-2-0" rel="dc:references" 
typeof="mw:Extension/ref" 
data-mw='{"name":"ref","body":{"html":"bar\n"},"attrs":{}}'><a 
href="#cite_note-2">[2]</a></span> B</p>
+<p><span about="#mwt2" class="reference" id="cite_ref-1" rel="dc:references" 
typeof="mw:Extension/ref" 
data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{}}'><a 
href="#cite_note-1">[1]</a></span> A
+<span about="#mwt4" class="reference" id="cite_ref-2" rel="dc:references" 
typeof="mw:Extension/ref" 
data-mw='{"name":"ref","body":{"html":"bar\n"},"attrs":{}}'><a 
href="#cite_note-2">[2]</a></span> B</p>
 !!end
 
 !!test
@@ -19628,10 +19628,10 @@
 
 <references />
 !! html
-<p><span about="#mwt2" class="reference" id="cite_ref-1-0" rel="dc:references" 
typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"html":"foo 
&amp;lt;ref>bar&amp;lt;/ref> baz"},"attrs":{}}'><a 
href="#cite_note-1">[1]</a></span></p>
+<p><span about="#mwt2" class="reference" id="cite_ref-1" rel="dc:references" 
typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"html":"foo 
&amp;lt;ref>bar&amp;lt;/ref> baz"},"attrs":{}}'><a 
href="#cite_note-1">[1]</a></span></p>
 
 <ol class="references" typeof="mw:Extension/references" about="#mwt5" 
data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a 
href="#cite_ref-1-0">↑</a></span> foo &lt;ref>bar&lt;/ref> baz</li>
+<li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a 
href="#cite_ref-1">↑</a></span> foo &lt;ref>bar&lt;/ref> baz</li>
 </ol>
 !!end
 
@@ -19645,10 +19645,10 @@
 
 <references />
 !! html
-<p>A1 <span about="#mwt3" class="reference" id="cite_ref-a-1-0" 
rel="dc:references" typeof="mw:Extension/ref" 
data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{"name":"a"}}'><a 
href="#cite_note-a-1">[1]</a></span> A2 <span about="#mwt4" class="reference" 
id="cite_ref-a-1-1" rel="dc:references" typeof="mw:Extension/ref" 
data-mw='{"name":"ref","attrs":{"name":"a"}}'><a 
href="#cite_note-a-1">[1]</a></span>
-B1 <span about="#mwt7" class="reference" id="cite_ref-b-2-0" 
rel="dc:references" typeof="mw:Extension/ref" 
data-mw='{"name":"ref","attrs":{"name":"b"}}'><a 
href="#cite_note-b-2">[2]</a></span> B2 <span about="#mwt8" class="reference" 
id="cite_ref-b-2-1" rel="dc:references" typeof="mw:Extension/ref" 
data-mw='{"name":"ref","body":{"html":"bar"},"attrs":{"name":"b"}}'><a 
href="#cite_note-b-2">[2]</a></span></p>
+<p>A1 <span about="#mwt3" class="reference" id="cite_ref-a_1-0" 
rel="dc:references" typeof="mw:Extension/ref" 
data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{"name":"a"}}'><a 
href="#cite_note-a-1">[1]</a></span> A2 <span about="#mwt4" class="reference" 
id="cite_ref-a_1-1" rel="dc:references" typeof="mw:Extension/ref" 
data-mw='{"name":"ref","attrs":{"name":"a"}}'><a 
href="#cite_note-a-1">[1]</a></span>
+B1 <span about="#mwt7" class="reference" id="cite_ref-b_2-0" 
rel="dc:references" typeof="mw:Extension/ref" 
data-mw='{"name":"ref","attrs":{"name":"b"}}'><a 
href="#cite_note-b-2">[2]</a></span> B2 <span about="#mwt8" class="reference" 
id="cite_ref-b_2-1" rel="dc:references" typeof="mw:Extension/ref" 
data-mw='{"name":"ref","body":{"html":"bar"},"attrs":{"name":"b"}}'><a 
href="#cite_note-b-2">[2]</a></span></p>
 
-<ol class="references" typeof="mw:Extension/references" about="#mwt10" 
data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-a-1" 
id="cite_note-a-1"><span rel="mw:referencedBy">↑ <a 
href="#cite_ref-a-1-0">1.0</a> <a href="#cite_ref-a-1-1">1.1</a></span> 
foo</li><li about="#cite_note-b-2" id="cite_note-b-2"><span 
rel="mw:referencedBy">↑ <a href="#cite_ref-b-2-0">2.0</a> <a 
href="#cite_ref-b-2-1">2.1</a></span> bar</li>
+<ol class="references" typeof="mw:Extension/references" about="#mwt10" 
data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-a-1" 
id="cite_note-a-1"><span rel="mw:referencedBy">↑ <a 
href="#cite_ref-a_1-0">1.0</a> <a href="#cite_ref-a_1-1">1.1</a></span> 
foo</li><li about="#cite_note-b-2" id="cite_note-b-2"><span 
rel="mw:referencedBy">↑ <a href="#cite_ref-b_2-0">2.0</a> <a 
href="#cite_ref-b_2-1">2.1</a></span> bar</li>
 </ol>
 !!end
 
@@ -19662,10 +19662,10 @@
 
 <references />
 !! html
-<p>A <span about="#mwt2" class="reference" id="cite_ref-1-0" 
rel="dc:references" typeof="mw:Extension/ref" 
data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{}}'><a 
href="#cite_note-1">[1]</a></span></p>
+<p>A <span about="#mwt2" class="reference" id="cite_ref-1" rel="dc:references" 
typeof="mw:Extension/ref" 
data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{}}'><a 
href="#cite_note-1">[1]</a></span></p>
 
 <ol class="references" typeof="mw:Extension/references" about="#mwt4" 
data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a 
href="#cite_ref-1-0">↑</a></span> foo</li></ol>
+<li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a 
href="#cite_ref-1">↑</a></span> foo</li></ol>
 !!end
 
 !!test
@@ -19677,11 +19677,11 @@
 
 <references />
 !!html
-<p><span class="reference" id="cite_ref-a_b-1-0" rel="dc:references" 
typeof="mw:Extension/ref" 
data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{"name":"a b"}}'><a 
href="#cite_note-a_b-1">[1]</a></span>
+<p><span class="reference" id="cite_ref-a_b_1-0" rel="dc:references" 
typeof="mw:Extension/ref" 
data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{"name":"a b"}}'><a 
href="#cite_note-a_b-1">[1]</a></span>
 </p>
 
 <ol class="references" typeof="mw:Extension/references" 
data-mw='{"name":"references","attrs":{}}'>
-<li id="cite_note-a_b-1"><span rel="mw:referencedBy"><a 
href="#cite_ref-a_b-1-0">↑</a></span> foo</li>
+<li id="cite_note-a_b-1"><span rel="mw:referencedBy"><a 
href="#cite_ref-a_b_1-0">↑</a></span> foo</li>
 !!end
 
 !!test
@@ -19693,11 +19693,26 @@
 
 <references />
 !!html
-<p><span class="reference" id="cite_ref-.7B.7Becho.7Ca.7D.7D-1-0" 
rel="dc:references" typeof="mw:Extension/ref" 
data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{"name":"{{echo|a}}"}}'><a 
href="#cite_note-.7B.7Becho.7Ca.7D.7D-1">[1]</a></span>
+<p><span class="reference" id="cite_ref-.7B.7Becho.7Ca.7D.7D_1-0" 
rel="dc:references" typeof="mw:Extension/ref" 
data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{"name":"{{echo|a}}"}}'><a 
href="#cite_note-.7B.7Becho.7Ca.7D.7D-1">[1]</a></span>
 </p>
 
 <ol class="references" typeof="mw:Extension/references" 
data-mw='{"name":"references","attrs":{}}'>
-<li id="cite_note-.7B.7Becho.7Ca.7D.7D-1"><span rel="mw:referencedBy"><a 
href="#cite_ref-.7B.7Becho.7Ca.7D.7D-1-0">↑</a></span> foo</li>
+<li id="cite_note-.7B.7Becho.7Ca.7D.7D-1"><span rel="mw:referencedBy"><a 
href="#cite_ref-.7B.7Becho.7Ca.7D.7D_1-0">↑</a></span> foo</li>
+!!end
+
+!!test
+Ref: 19. ref-tags with identical name encodings should get identical indexes
+!!options
+parsoid
+!! wikitext
+1 <ref name="a & b">foo</ref> 2 <ref name="a &amp; b" />
+
+<references />
+!! html
+<p>1 <span about="#mwt3" class="reference" id="cite_ref-a_.26_b_1-0" 
rel="dc:references" typeof="mw:Extension/ref" 
data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{"name":"a &amp; b"}}'><a 
href="#cite_note-a_.26_b-1">[1]</a></span> 2 <span about="#mwt4" 
class="reference" id="cite_ref-a_.26_b_1-1" rel="dc:references" 
typeof="mw:Extension/ref" data-mw='{"name":"ref","attrs":{"name":"a &amp;amp; 
b"}}'><a href="#cite_note-a_.26_b-1">[1]</a></span>
+
+<ol class="references" typeof="mw:Extension/references" about="#mwt10" 
data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-a_.26_b-1" 
id="cite_note-a_.26_b-1"><span rel="mw:referencedBy">↑ <a 
href="#cite_ref-a_.26_b_1-0">1.0</a> <a 
href="#cite_ref-a_.26_b_1-1">1.1</a></span> foo</li>
+</ol>
 !!end
 
 !!test
@@ -19720,10 +19735,10 @@
 
 <references group="a" />
 !! html
-<p>A <span about="#mwt2" class="reference" id="cite_ref-1-0" 
rel="dc:references" typeof="mw:Extension/ref" 
data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{"group":"a"}}'><a 
href="#cite_note-1">[a 1]</a></span>
-B <span about="#mwt4" class="reference" id="cite_ref-2-0" rel="dc:references" 
typeof="mw:Extension/ref" 
data-mw='{"name":"ref","body":{"html":"bar"},"attrs":{"group":"b"}}'><a 
href="#cite_note-2">[b 1]</a></span></p>
+<p>A <span about="#mwt2" class="reference" id="cite_ref-1" rel="dc:references" 
typeof="mw:Extension/ref" 
data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{"group":"a"}}'><a 
href="#cite_note-1">[a 1]</a></span>
+B <span about="#mwt4" class="reference" id="cite_ref-2" rel="dc:references" 
typeof="mw:Extension/ref" 
data-mw='{"name":"ref","body":{"html":"bar"},"attrs":{"group":"b"}}'><a 
href="#cite_note-2">[b 1]</a></span></p>
 
-<ol class="references" typeof="mw:Extension/references" about="#mwt6" 
data-mw='{"name":"references","attrs":{"group":"a"}}'><li about="#cite_note-1" 
id="cite_note-1"><span rel="mw:referencedBy"><a 
href="#cite_ref-1-0">↑</a></span> foo</li>
+<ol class="references" typeof="mw:Extension/references" about="#mwt6" 
data-mw='{"name":"references","attrs":{"group":"a"}}'><li about="#cite_note-1" 
id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1">↑</a></span> 
foo</li>
 </ol>
 !!end
 
@@ -19740,14 +19755,14 @@
 
 <references />
 !! html
-<p>A <span about="#mwt2" class="reference" id="cite_ref-1-0" 
rel="dc:references" typeof="mw:Extension/ref" 
data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{}}'><a 
href="#cite_note-1">[1]</a></span></p>
+<p>A <span about="#mwt2" class="reference" id="cite_ref-1" rel="dc:references" 
typeof="mw:Extension/ref" 
data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{}}'><a 
href="#cite_note-1">[1]</a></span></p>
 
-<ol class="references" typeof="mw:Extension/references" about="#mwt4" 
data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-1" 
id="cite_note-1"><span rel="mw:referencedBy"><a 
href="#cite_ref-1-0">↑</a></span> foo</li>
+<ol class="references" typeof="mw:Extension/references" about="#mwt4" 
data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-1" 
id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1">↑</a></span> 
foo</li>
 </ol>
 
-<p>B <span about="#mwt6" class="reference" id="cite_ref-2-0" 
rel="dc:references" typeof="mw:Extension/ref" 
data-mw='{"name":"ref","body":{"html":"bar"},"attrs":{}}'><a 
href="#cite_note-2">[1]</a></span></p>
+<p>B <span about="#mwt6" class="reference" id="cite_ref-2" rel="dc:references" 
typeof="mw:Extension/ref" 
data-mw='{"name":"ref","body":{"html":"bar"},"attrs":{}}'><a 
href="#cite_note-2">[1]</a></span></p>
 
-<ol class="references" typeof="mw:Extension/references" about="#mwt8" 
data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-2" 
id="cite_note-2"><span rel="mw:referencedBy"><a 
href="#cite_ref-2-0">↑</a></span> bar</li>
+<ol class="references" typeof="mw:Extension/references" about="#mwt8" 
data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-2" 
id="cite_note-2"><span rel="mw:referencedBy"><a href="#cite_ref-2">↑</a></span> 
bar</li>
 </ol>
 !!end
 
@@ -19765,15 +19780,15 @@
 
 <references />
 !! html
-<p>A <span about="#mwt2" class="reference" id="cite_ref-1-0" 
rel="dc:references" typeof="mw:Extension/ref" 
data-mw='{"name":"ref","body":{"html":"afoo"},"attrs":{"group":"a"}}'><a 
href="#cite_note-1">[a 1]</a></span>
-B <span about="#mwt4" class="reference" id="cite_ref-2-0" rel="dc:references" 
typeof="mw:Extension/ref" 
data-mw='{"name":"ref","body":{"html":"bfoo"},"attrs":{}}'><a 
href="#cite_note-2">[1]</a></span></p>
+<p>A <span about="#mwt2" class="reference" id="cite_ref-1" rel="dc:references" 
typeof="mw:Extension/ref" 
data-mw='{"name":"ref","body":{"html":"afoo"},"attrs":{"group":"a"}}'><a 
href="#cite_note-1">[a 1]</a></span>
+B <span about="#mwt4" class="reference" id="cite_ref-2" rel="dc:references" 
typeof="mw:Extension/ref" 
data-mw='{"name":"ref","body":{"html":"bfoo"},"attrs":{}}'><a 
href="#cite_note-2">[1]</a></span></p>
 
-<ol class="references" typeof="mw:Extension/references" about="#mwt6" 
data-mw='{"name":"references","attrs":{"group":"a"}}'><li about="#cite_note-1" 
id="cite_note-1"><span rel="mw:referencedBy"><a 
href="#cite_ref-1-0">↑</a></span> afoo</li>
+<ol class="references" typeof="mw:Extension/references" about="#mwt6" 
data-mw='{"name":"references","attrs":{"group":"a"}}'><li about="#cite_note-1" 
id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1">↑</a></span> 
afoo</li>
 </ol>
 
-<p>C <span about="#mwt8" class="reference" id="cite_ref-3-0" 
rel="dc:references" typeof="mw:Extension/ref" 
data-mw='{"name":"ref","body":{"html":"cfoo"},"attrs":{}}'><a 
href="#cite_note-3">[2]</a></span></p>
+<p>C <span about="#mwt8" class="reference" id="cite_ref-3" rel="dc:references" 
typeof="mw:Extension/ref" 
data-mw='{"name":"ref","body":{"html":"cfoo"},"attrs":{}}'><a 
href="#cite_note-3">[2]</a></span></p>
 
-<ol class="references" typeof="mw:Extension/references" about="#mwt10" 
data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-2" 
id="cite_note-2"><span rel="mw:referencedBy"><a 
href="#cite_ref-2-0">↑</a></span> bfoo</li><li about="#cite_note-3" 
id="cite_note-3"><span rel="mw:referencedBy"><a 
href="#cite_ref-3-0">↑</a></span> cfoo</li>
+<ol class="references" typeof="mw:Extension/references" about="#mwt10" 
data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-2" 
id="cite_note-2"><span rel="mw:referencedBy"><a href="#cite_ref-2">↑</a></span> 
bfoo</li><li about="#cite_note-3" id="cite_note-3"><span 
rel="mw:referencedBy"><a href="#cite_ref-3">↑</a></span> cfoo</li>
 </ol>
 !!end
 
@@ -19790,11 +19805,11 @@
 This should just get lost.
 </references>
 !! html
-<p>A <span about="#mwt2" class="reference" id="cite_ref-a-1-0" 
rel="dc:references" typeof="mw:Extension/ref" 
data-mw='{"name":"ref","attrs":{"name":"a"}}'><a 
href="#cite_note-a-1">[1]</a></span>
-B <span about="#mwt4" class="reference" id="cite_ref-b-2-0" 
rel="dc:references" typeof="mw:Extension/ref" 
data-mw='{"name":"ref","body":{"html":"bar"},"attrs":{"name":"b"}}'><a 
href="#cite_note-b-2">[2]</a></span></p>
+<p>A <span about="#mwt2" class="reference" id="cite_ref-a_1-0" 
rel="dc:references" typeof="mw:Extension/ref" 
data-mw='{"name":"ref","attrs":{"name":"a"}}'><a 
href="#cite_note-a-1">[1]</a></span>
+B <span about="#mwt4" class="reference" id="cite_ref-b_2-0" 
rel="dc:references" typeof="mw:Extension/ref" 
data-mw='{"name":"ref","body":{"html":"bar"},"attrs":{"name":"b"}}'><a 
href="#cite_note-b-2">[2]</a></span></p>
 
 
-<ol class="references" typeof="mw:Extension/references" about="#mwt6" 
data-mw='{"name":"references","body":{"extsrc":"&lt;ref 
name=\"a\">foo&lt;/ref>\nThis should just get lost.","html":"\n&lt;span 
about=\"#mwt8\" class=\"reference\" rel=\"dc:references\" 
typeof=\"mw:Extension/ref\" data-parsoid=&#39;{\"src\":\"&amp;lt;ref 
name=\\\"a\\\">foo&amp;lt;/ref>\",\"dsr\":[59,82,14,6]}&#39; 
data-mw=&#39;{\"name\":\"ref\",\"body\":{\"html\":\"foo\"},\"attrs\":{\"name\":\"a\"}}&#39;>&lt;a
 href=\"#cite_note-a-1\">[1]&lt;/a>&lt;/span>\n"},"attrs":{}}'><li 
about="#cite_note-a-1" id="cite_note-a-1"><span rel="mw:referencedBy"><a 
href="#cite_ref-a-1-0">↑</a></span> foo</li><li about="#cite_note-b-2" 
id="cite_note-b-2"><span rel="mw:referencedBy"><a 
href="#cite_ref-b-2-0">↑</a></span> bar</li>
+<ol class="references" typeof="mw:Extension/references" about="#mwt6" 
data-mw='{"name":"references","body":{"extsrc":"&lt;ref 
name=\"a\">foo&lt;/ref>\nThis should just get lost.","html":"\n&lt;span 
about=\"#mwt8\" class=\"reference\" rel=\"dc:references\" 
typeof=\"mw:Extension/ref\" data-parsoid=&#39;{\"src\":\"&amp;lt;ref 
name=\\\"a\\\">foo&amp;lt;/ref>\",\"dsr\":[59,82,14,6]}&#39; 
data-mw=&#39;{\"name\":\"ref\",\"body\":{\"html\":\"foo\"},\"attrs\":{\"name\":\"a\"}}&#39;>&lt;a
 href=\"#cite_note-a-1\">[1]&lt;/a>&lt;/span>\n"},"attrs":{}}'><li 
about="#cite_note-a-1" id="cite_note-a-1"><span rel="mw:referencedBy"><a 
href="#cite_ref-a_1-0">↑</a></span> foo</li><li about="#cite_note-b-2" 
id="cite_note-b-2"><span rel="mw:referencedBy"><a 
href="#cite_ref-b_2-0">↑</a></span> bar</li>
 </ol>
 !!end
 
@@ -19805,7 +19820,7 @@
 !! wikitext
 <ref>Foo</ref> {{echo|<references />}}
 !! html
-<p><span about="#mwt3" class="reference" id="cite_ref-1-0" rel="dc:references" 
typeof="mw:Extension/ref" 
data-mw='{"name":"ref","body":{"html":"Foo"},"attrs":{}}'><a 
href="#cite_note-1">[1]</a></span></p> <ol class="references" 
typeof="mw:Extension/references mw:Transclusion" about="#mwt4" 
data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"&lt;references
 />"}},"i":0}}]}'><li about="#cite_note-1" id="cite_note-1"><span 
rel="mw:referencedBy"><a href="#cite_ref-1-0">↑</a></span> Foo</li></ol>
+<p><span about="#mwt3" class="reference" id="cite_ref-1" rel="dc:references" 
typeof="mw:Extension/ref" 
data-mw='{"name":"ref","body":{"html":"Foo"},"attrs":{}}'><a 
href="#cite_note-1">[1]</a></span></p> <ol class="references" 
typeof="mw:Extension/references mw:Transclusion" about="#mwt4" 
data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"&lt;references
 />"}},"i":0}}]}'><li about="#cite_note-1" id="cite_note-1"><span 
rel="mw:referencedBy"><a href="#cite_ref-1">↑</a></span> Foo</li></ol>
 !!end
 
 !! test
@@ -19822,12 +19837,12 @@
 <ref name="b">foo</ref>
 </references>
 !! html
-<p>A <span about="#mwt2" class="reference" id="cite_ref-1-0" 
rel="dc:references" typeof="mw:Extension/ref" 
data-mw='{"name":"ref","body":{"html":"foo bar for a"},"attrs":{}}'><a 
href="#cite_note-1">[1]</a></span>
-B <span about="#mwt4" class="reference" id="cite_ref-b-2-0" 
rel="dc:references" typeof="mw:Extension/ref" 
data-mw='{"name":"ref","attrs":{"group":"X","name":"b"}}'><a 
href="#cite_note-b-2">[X 1]</a></span></p>
+<p>A <span about="#mwt2" class="reference" id="cite_ref-1" rel="dc:references" 
typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"html":"foo bar for 
a"},"attrs":{}}'><a href="#cite_note-1">[1]</a></span>
+B <span about="#mwt4" class="reference" id="cite_ref-b_2-0" 
rel="dc:references" typeof="mw:Extension/ref" 
data-mw='{"name":"ref","attrs":{"group":"X","name":"b"}}'><a 
href="#cite_note-b-2">[X 1]</a></span></p>
 
-<ol class="references" typeof="mw:Extension/references" about="#mwt6" 
data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-1" 
id="cite_note-1"><span rel="mw:referencedBy"><a 
href="#cite_ref-1-0">↑</a></span> foo bar for a</li></ol>
+<ol class="references" typeof="mw:Extension/references" about="#mwt6" 
data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-1" 
id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1">↑</a></span> 
foo bar for a</li></ol>
 
-<ol class="references" typeof="mw:Extension/references" about="#mwt8" 
data-mw='{"name":"references","body":{"extsrc":"&lt;ref 
name=\"b\">foo&lt;/ref>","html":"\n&lt;span about=\"#mwt10\" 
class=\"reference\" rel=\"dc:references\" typeof=\"mw:Extension/ref\" 
data-parsoid=&#39;{\"src\":\"&amp;lt;ref 
name=\\\"b\\\">foo&amp;lt;/ref>\",\"dsr\":[96,119,14,6]}&#39; 
data-mw=&#39;{\"name\":\"ref\",\"body\":{\"html\":\"foo\"},\"attrs\":{\"name\":\"b\"}}&#39;>&lt;a
 href=\"#cite_note-b-2\">[X 1]&lt;/a>&lt;/span>\n"},"attrs":{"group":"X"}}'><li 
about="#cite_note-b-2" id="cite_note-b-2"><span rel="mw:referencedBy"><a 
href="#cite_ref-b-2-0">↑</a></span> foo</li></ol>
+<ol class="references" typeof="mw:Extension/references" about="#mwt8" 
data-mw='{"name":"references","body":{"extsrc":"&lt;ref 
name=\"b\">foo&lt;/ref>","html":"\n&lt;span about=\"#mwt10\" 
class=\"reference\" rel=\"dc:references\" typeof=\"mw:Extension/ref\" 
data-parsoid=&#39;{\"src\":\"&amp;lt;ref 
name=\\\"b\\\">foo&amp;lt;/ref>\",\"dsr\":[96,119,14,6]}&#39; 
data-mw=&#39;{\"name\":\"ref\",\"body\":{\"html\":\"foo\"},\"attrs\":{\"name\":\"b\"}}&#39;>&lt;a
 href=\"#cite_note-b-2\">[X 1]&lt;/a>&lt;/span>\n"},"attrs":{"group":"X"}}'><li 
about="#cite_note-b-2" id="cite_note-b-2"><span rel="mw:referencedBy"><a 
href="#cite_ref-b_2-0">↑</a></span> foo</li></ol>
 !! end
 
 !! test
@@ -19837,7 +19852,7 @@
 !! wikitext
 <ref name="test &amp; me">hi</ref>
 !! html
-<p><span about="#mwt2" class="reference" id="cite_ref-test_.26amp.3B_me-1-0" 
rel="dc:references" typeof="mw:Extension/ref" data-parsoid='{"src":"&lt;ref 
name=\"test &amp;amp; me\">hi&lt;/ref>"}' 
data-mw='{"name":"ref","body":{"html":"hi"},"attrs":{"name":"test &amp;amp; 
me"}}'><a href="#cite_note-test_.26amp.3B_me-1">[1]</a></span></p>
+<p><span about="#mwt2" class="reference" id="cite_ref-test_.26_me_1-0" 
rel="dc:references" typeof="mw:Extension/ref" data-parsoid='{"src":"&lt;ref 
name=\"test &amp;amp; me\">hi&lt;/ref>"}' 
data-mw='{"name":"ref","body":{"html":"hi"},"attrs":{"name":"test &amp;amp; 
me"}}'><a href="#cite_note-test_.26_me-1">[1]</a></span></p>
 !! end
 
 # This test is wt2html only because we're permitting the serializer to produce
@@ -19851,11 +19866,11 @@
 
 <references>
 !! html
-<p>a<span about="#mwt2" class="reference" id="cite_ref-1-0" 
rel="dc:references" typeof="mw:Extension/ref" 
data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{}}'><a 
href="#cite_note-1">[1]</a></span></p>
+<p>a<span about="#mwt2" class="reference" id="cite_ref-1" rel="dc:references" 
typeof="mw:Extension/ref" 
data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{}}'><a 
href="#cite_note-1">[1]</a></span></p>
 
 
 <ol class="references" typeof="mw:Extension/references" about="#mwt4" 
data-mw='{"name":"references","attrs":{}}'>
-<li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a 
href="#cite_ref-1-0">↑</a></span> foo</li></ol>
+<li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a 
href="#cite_ref-1">↑</a></span> foo</li></ol>
 !! end
 
 !! test
@@ -21154,7 +21169,7 @@
 foo <ref>''a''
  b</ref>
 !! html
-<p>foo <span about="#mwt2" class="reference" id="cite_ref-1-0" 
rel="dc:references" typeof="mw:Extension/ref" 
data-mw='{"name":"ref","body":{"html":"&lt;i 
data-parsoid=&#39;{\"dsr\":[9,14,2,2]}&#39;>a&lt;/i>\n b"},"attrs":{}}'><a 
href="#cite_note-1">[1]</a></span></p>
+<p>foo <span about="#mwt2" class="reference" id="cite_ref-1" 
rel="dc:references" typeof="mw:Extension/ref" 
data-mw='{"name":"ref","body":{"html":"&lt;i 
data-parsoid=&#39;{\"dsr\":[9,14,2,2]}&#39;>a&lt;/i>\n b"},"attrs":{}}'><a 
href="#cite_note-1">[1]</a></span></p>
 !! end
 
 !! test

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

Gerrit-MessageType: newchange
Gerrit-Change-Id: I87637a1dc812a3a8f29327b9e6c0040b22a651c4
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/services/parsoid
Gerrit-Branch: master
Gerrit-Owner: Marcoil <marc...@wikimedia.org>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to