jenkins-bot has submitted this change and it was merged. ( 
https://gerrit.wikimedia.org/r/385312 )

Change subject: Avoid serialize/parse of mw:dom-fragment-token content
......................................................................


Avoid serialize/parse of mw:dom-fragment-token content

 * The contents of "mw:dom-fragment-token"s was being serialized
   after processing to the DOM and stored on the token to be
   shuttled through tree building.  Only to be reparsed in the
   unpacking phase.

 * Here we store a pointer to the contents in a fragment map.

 * Doing less work results in a performance improvement, though
   only slightly because the content still needs to be adopted
   by the main document.

Change-Id: Ia0aec7de469101a2a93342ea89daac0f0e73cf1a
---
M lib/api/apiUtils.js
M lib/config/MWParserEnvironment.js
M lib/ext/Cite/index.js
M lib/utils/DOMUtils.js
M lib/wt2html/pp/handlers/unpackDOMFragments.js
M tests/citeParserTests-blacklist.js
6 files changed, 75 insertions(+), 51 deletions(-)

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



diff --git a/lib/api/apiUtils.js b/lib/api/apiUtils.js
index 68b3337..b1129fa 100644
--- a/lib/api/apiUtils.js
+++ b/lib/api/apiUtils.js
@@ -502,7 +502,7 @@
        apiUtils.validatePageBundle(pb, env.originalVersion);
        DU.applyPageBundle(doc, pb);
        DU.visitDOM(doc.body, DU.loadDataAttribs);
-       var expansions = DU.extractExpansions(doc.body);
+       var expansions = DU.extractExpansions(env, doc.body);
        Object.keys(updates).forEach(function(mode) {
                switch (mode) {
                        case 'transclusions':
diff --git a/lib/config/MWParserEnvironment.js 
b/lib/config/MWParserEnvironment.js
index 3b72173..7673582 100644
--- a/lib/config/MWParserEnvironment.js
+++ b/lib/config/MWParserEnvironment.js
@@ -168,6 +168,16 @@
        this.batcher = new Batcher(this);
 
        this.setResourceLimits();
+
+       // Fragments have had `storeDataAttribs` called on them
+       this.fragmentMap = new Map();
+       this.fid = 1;
+};
+
+MWParserEnvironment.prototype.setFragment = function(nodes) {
+       var oid = 'mwf' + this.fid++;
+       this.fragmentMap.set(oid, nodes);
+       return oid;
 };
 
 MWParserEnvironment.prototype.setResourceLimits = function() {
diff --git a/lib/ext/Cite/index.js b/lib/ext/Cite/index.js
index e6c7cf3..0192263 100644
--- a/lib/ext/Cite/index.js
+++ b/lib/ext/Cite/index.js
@@ -55,7 +55,6 @@
                group: null,
        }, Util.kvToHash(refTok.getAttribute("options"), true));
 
-       var about = manager.env.newAboutId();
        var finalCB = function(toks, contentBody) {
                // Marker meta with ref content
                var da = Util.clone(refTok.dataAttribs);
@@ -63,12 +62,21 @@
                da.stx = undefined;
                da.group = refOpts.group || '';
                da.name = refOpts.name || '';
-               da.content = contentBody ? DU.ppToXML(contentBody, { innerXML: 
true }) : '';
-               da.hasRefInRef = contentBody ? hasRef(contentBody) : false;
+
+               if (contentBody) {
+                       da.hasRefInRef = hasRef(contentBody);
+                       DU.visitDOM(contentBody, DU.storeDataAttribs);
+                       da.content = manager.env.setFragment(contentBody);
+               } else {
+                       da.hasRefInRef = false;
+                       da.content = '';
+               }
+
                toks.push(new SelfclosingTagTk('meta', [
                        new KV('typeof', 'mw:Extension/ref/Marker'),
-                       new KV('about', about),
+                       new KV('about', manager.env.newAboutId()),
                ], da));
+
                // All done!
                cb({ tokens: toks, async: false });
        };
@@ -192,7 +200,11 @@
                'id': "mw-reference-text-" + ref.target,
                'class': "mw-reference-text",
        });
-       DU.ppToDOM(ref.content, { node: reftextSpan });
+       if (ref.content) {
+               var content = env.fragmentMap.get(ref.content);
+               DU.migrateChildrenBetweenDocs(content, reftextSpan);
+               DU.visitDOM(reftextSpan, DU.loadDataAttribs);
+       }
        li.appendChild(reftextSpan);
 
        // Generate leading linkbacks
@@ -252,14 +264,18 @@
        }
 };
 
-ReferencesData.prototype.add = function(groupName, refName, about, 
skipLinkback) {
+ReferencesData.prototype.add = function(env, groupName, refName, about, 
skipLinkback) {
        var group = this.getRefGroup(groupName, true);
-       var ref;
        refName = makeValidIdAttr(refName);
+
+       var ref;
        if (refName && group.indexByName.has(refName)) {
                ref = group.indexByName.get(refName);
                if (ref.content) {
                        ref.hasMultiples = true;
+                       // Use the non-pp version here since we've already 
stored attribs
+                       // before putting them in the map.
+                       ref.cachedHtml = 
DU.toXML(env.fragmentMap.get(ref.content), { innerXML: true });
                }
        } else {
                // The ids produced Cite.php have some particulars:
@@ -286,6 +302,9 @@
                        linkbacks: [],
                        name: refName,
                        target: noteId,
+                       hasMultiples: false,
+                       // Just used for comparison when we have multiples
+                       cachedHtml: '',
                };
                group.refs.push(ref);
                if (refName) {
@@ -296,7 +315,6 @@
        if (!skipLinkback) {
                ref.linkbacks.push(ref.key + '-' + ref.linkbacks.length);
        }
-
        return ref;
 };
 
@@ -345,7 +363,7 @@
                                dp.group = refsOpts.group;
                                ol.setAttribute('data-mw-group', 
refsOpts.group);
                        }
-                       // Pass along the `responsive` paramter
+                       // Pass along the `responsive` parameter
                        dp.tmp.responsive = refsOpts.responsive;
                };
                cb({
@@ -389,6 +407,7 @@
 
 References.prototype.extractRefFromNode = function(node, refsData, cite,
                referencesAboutId, referencesGroup, nestedRefsHTML) {
+       var env = refsData.env;
        var nestedInReferences = referencesAboutId !== undefined;
        var dp = DU.getDataParsoid(node);
        // SSS FIXME: Need to clarify semantics here.
@@ -397,7 +416,7 @@
        var group = dp.group || referencesGroup || '';
        var refName = dp.name;
        var about = node.getAttribute("about");
-       var ref = refsData.add(group, refName, about, nestedInReferences);
+       var ref = refsData.add(env, group, refName, about, nestedInReferences);
        var nodeType = (node.getAttribute("typeof") || 
'').replace(/mw:Extension\/ref\/Marker/, '');
 
        // Add ref-index linkback
@@ -408,9 +427,7 @@
        var body;
 
        if (dp.hasRefInRef) {
-               var html = DU.ppToDOM(content);
-               _processRefs(cite, refsData, html);
-               content = DU.ppToXML(html, { innerXML: true });
+               _processRefs(cite, refsData, env.fragmentMap.get(content));
        }
 
        if (content) {
@@ -418,8 +435,16 @@
                // the content of the first <ref> shows up in the <references> 
section.
                // in order to ensure lossless RT-ing for later <refs>, we have 
to record
                // HTML inline for all of them.
-               if (ref.hasMultiples && content !== ref.content) {
-                       body = { 'html': content };
+               var html = '';
+               var contentDiffers = false;
+               if (ref.hasMultiples) {
+                       // Use the non-pp version here since we've already 
stored attribs
+                       // before putting them in the map.
+                       html = DU.toXML(env.fragmentMap.get(content), { 
innerXML: true });
+                       contentDiffers = html !== ref.cachedHtml;
+               }
+               if (contentDiffers) {
+                       body = { 'html': html };
                } else {
                        body = { 'id': "mw-reference-text-" + ref.target };
                }
@@ -465,7 +490,7 @@
        // refLink is the link to the citation
        var refLink = doc.createElement('a');
        DU.addAttributes(refLink, {
-               'href': refsData.env.page.titleURI + '#' + ref.target,
+               'href': env.page.titleURI + '#' + ref.target,
                'style': 'counter-reset: mw-Ref ' + ref.groupIndex + ';',
        });
        if (ref.group) {
@@ -511,7 +536,6 @@
                                responsive: dp.tmp.responsive,
                        },
                };
-
                // Mark this auto-generated so that we can skip this during
                // html -> wt and so that clients can strip it if necessary.
                if (autoGenerated) {
@@ -519,7 +543,6 @@
                } else if (nestedRefsHTML.length > 0) {
                        dataMw.body = { 'html': '\n' + nestedRefsHTML.join('') 
};
                }
-
                DU.setDataMw(refsNode, dataMw);
        }
 
diff --git a/lib/utils/DOMUtils.js b/lib/utils/DOMUtils.js
index db8d74f..a2db0eb 100644
--- a/lib/utils/DOMUtils.js
+++ b/lib/utils/DOMUtils.js
@@ -1621,7 +1621,7 @@
         *         }
         *     }
         */
-       extractExpansions: function(body) {
+       extractExpansions: function(env, body) {
                var expansions = {
                        transclusions: {},
                        extensions: {},
@@ -1654,7 +1654,7 @@
                                                }
 
                                                if (key) {
-                                                       expAccum[key] = 
DU.makeExpansion(nodes);
+                                                       expAccum[key] = 
DU.makeExpansion(env, nodes);
                                                }
                                                node = lastItem(nodes);
                                        } else {
@@ -1995,21 +1995,19 @@
 
                // Get placeholder tokens to get our subdom through the token 
processing
                // stages. These will be finally unwrapped on the DOM.
-               var expansion = DU.makeExpansion(nodes);
+               var expansion = DU.makeExpansion(env, nodes);
                return DU.encapsulateExpansionHTML(env, token, expansion, opts);
        },
 
-       makeExpansion: function(nodes) {
-               return {
-                       nodes: nodes,
-                       html: nodes.map(function(n) {
-                               // The nodes have been through post-processing 
and,
-                               // therefore, had their tmp data stripped.  
However,
-                               // we just added tmp info in the span wrapping 
above,
-                               // so keep it; it's necessary and safe.
-                               return DU.ppToXML(n, { keepTmp: true });
-                       }).join(''),
-               };
+       makeExpansion: function(env, nodes) {
+               nodes.forEach(function(n) {
+                       // The nodes have been through post-processing and,
+                       // therefore, had their tmp data stripped.  However,
+                       // we just added tmp info in the span wrapping above,
+                       // so keep it; it's necessary and safe.
+                       DU.visitDOM(n, DU.storeDataAttribs, { keepTmp: true });
+               });
+               return { nodes: nodes, html: env.setFragment(nodes) };
        },
 
        /**
diff --git a/lib/wt2html/pp/handlers/unpackDOMFragments.js 
b/lib/wt2html/pp/handlers/unpackDOMFragments.js
index 972838c..7c7932b 100644
--- a/lib/wt2html/pp/handlers/unpackDOMFragments.js
+++ b/lib/wt2html/pp/handlers/unpackDOMFragments.js
@@ -150,21 +150,14 @@
        // Replace this node and possibly a sibling with node.dp.html
        var fragmentParent = node.parentNode;
        var dummyNode = 
node.ownerDocument.createElement(fragmentParent.nodeName);
-       var html = dp.html;
-       if (!html) {
-               // Not sure why this would happen at all -- raising fatal 
exception
-               // to see what code paths are causing this
-               var errors = ["Parsing page: " + env.page.name];
-               errors.push("Missing data.parsoid.html for dom-fragment: " + 
node.outerHTML);
-               env.log("error", errors.join("\n"));
-               throw new Error("Missing data.parsoid.html in DOMFragment 
unpacking");
-               // DU.removeTypeOf(node, 'mw:DOMFragment');
-               // return true;
-       }
 
-       // The data atrributes were stored while serializing in
-       // `buildDOMFragmentTokens`.  Reload them here.
-       DU.ppToDOM(html, { node: dummyNode });
+       console.assert(/^mwf/.test(dp.html));
+
+       var nodes = env.fragmentMap.get(dp.html);
+       nodes.forEach(function(n) {
+               dummyNode.appendChild(dummyNode.ownerDocument.importNode(n, 
true));
+       });
+       DU.visitDOM(dummyNode, DU.loadDataAttribs);
 
        // get rid of the wrapper sibling (simplifies logic below)
        var sibling = node.nextSibling;
diff --git a/tests/citeParserTests-blacklist.js 
b/tests/citeParserTests-blacklist.js
index eaa5bae..2508a99 100644
--- a/tests/citeParserTests-blacklist.js
+++ b/tests/citeParserTests-blacklist.js
@@ -41,8 +41,8 @@
 // Blacklist for wt2html
 add("wt2html", "Simple <ref>, no <references/>", "<p 
data-parsoid='{\"dsr\":[0,58,0,0]}'>Wikipedia rocks!<span about=\"#mwt2\" 
class=\"mw-ref\" id=\"cite_ref-1\" rel=\"dc:references\" 
typeof=\"mw:Extension/ref\" data-parsoid='{\"dsr\":[16,58,5,6]}' 
data-mw='{\"name\":\"ref\",\"body\":{\"id\":\"mw-reference-text-cite_note-1\"},\"attrs\":{}}'><a
 href=\"./Main_Page#cite_note-1\" style=\"counter-reset: mw-Ref 1;\"><span 
class=\"mw-reflink-text\">[1]</span></a></span></p>\n<ol class=\"mw-references 
references\" typeof=\"mw:Extension/references\" about=\"#mwt3\" 
data-parsoid='{\"dsr\":[58,58,0,0]}' 
data-mw='{\"name\":\"references\",\"attrs\":{},\"autoGenerated\":true}'><li 
about=\"#cite_note-1\" id=\"cite_note-1\"><a href=\"./Main_Page#cite_ref-1\" 
rel=\"mw:referencedBy\"><span class=\"mw-linkback-text\">↑ </span></a> <span 
id=\"mw-reference-text-cite_note-1\" class=\"mw-reference-text\" 
data-parsoid=\"{}\">Proceeds of Rockology, vol. XXI</span></li></ol>");
 add("wt2html", "Simple <ref>, with <references/>", "<p 
data-parsoid='{\"dsr\":[0,58,0,0]}'>Wikipedia rocks!<span about=\"#mwt2\" 
class=\"mw-ref\" id=\"cite_ref-1\" rel=\"dc:references\" 
typeof=\"mw:Extension/ref\" data-parsoid='{\"dsr\":[16,58,5,6]}' 
data-mw='{\"name\":\"ref\",\"body\":{\"id\":\"mw-reference-text-cite_note-1\"},\"attrs\":{}}'><a
 href=\"./Main_Page#cite_note-1\" style=\"counter-reset: mw-Ref 1;\"><span 
class=\"mw-reflink-text\">[1]</span></a></span></p>\n\n<ol 
class=\"mw-references references\" typeof=\"mw:Extension/references\" 
about=\"#mwt4\" data-parsoid='{\"dsr\":[60,73,2,2]}' 
data-mw='{\"name\":\"references\",\"attrs\":{}}'><li about=\"#cite_note-1\" 
id=\"cite_note-1\"><a href=\"./Main_Page#cite_ref-1\" 
rel=\"mw:referencedBy\"><span class=\"mw-linkback-text\">↑ </span></a> <span 
id=\"mw-reference-text-cite_note-1\" class=\"mw-reference-text\" 
data-parsoid=\"{}\">Proceeds of Rockology, vol. XXI</span></li></ol>");
-add("wt2html", "<ref> with a simple template", "<p 
data-parsoid='{\"dsr\":[0,40,0,0]}'>Templating<span about=\"#mwt2\" 
class=\"mw-ref\" id=\"cite_ref-1\" rel=\"dc:references\" 
typeof=\"mw:Extension/ref\" data-parsoid='{\"dsr\":[10,40,5,6]}' 
data-mw='{\"name\":\"ref\",\"body\":{\"id\":\"mw-reference-text-cite_note-1\"},\"attrs\":{}}'><a
 href=\"./Main_Page#cite_note-1\" style=\"counter-reset: mw-Ref 1;\"><span 
class=\"mw-reflink-text\">[1]</span></a></span></p>\n\n<ol 
class=\"mw-references references\" typeof=\"mw:Extension/references\" 
about=\"#mwt5\" data-parsoid='{\"dsr\":[42,55,2,2]}' 
data-mw='{\"name\":\"references\",\"attrs\":{}}'><li about=\"#cite_note-1\" 
id=\"cite_note-1\"><a href=\"./Main_Page#cite_ref-1\" 
rel=\"mw:referencedBy\"><span class=\"mw-linkback-text\">↑ </span></a> <span 
id=\"mw-reference-text-cite_note-1\" class=\"mw-reference-text\" 
data-parsoid=\"{}\"><span about=\"#mwt3\" typeof=\"mw:Transclusion\" 
data-parsoid='{\"pi\":[[]],\"dsr\":[15,34,null,null]}' 
data-mw='{\"parts\":[{\"template\":{\"target\":{\"wt\":\"simple 
template\",\"href\":\"./Template:Simple_template\"},\"params\":{},\"i\":0}}]}'>A
 </span><i about=\"#mwt3\" data-parsoid=\"{}\">simple</i><span about=\"#mwt3\" 
data-parsoid=\"{}\"> template.</span></span></li></ol>");
-add("wt2html", "<ref> with a <nowiki>", "<p 
data-parsoid='{\"dsr\":[0,57,0,0]}'>Templating<span about=\"#mwt2\" 
class=\"mw-ref\" id=\"cite_ref-1\" rel=\"dc:references\" 
typeof=\"mw:Extension/ref\" data-parsoid='{\"dsr\":[10,57,5,6]}' 
data-mw='{\"name\":\"ref\",\"body\":{\"id\":\"mw-reference-text-cite_note-1\"},\"attrs\":{}}'><a
 href=\"./Main_Page#cite_note-1\" style=\"counter-reset: mw-Ref 1;\"><span 
class=\"mw-reflink-text\">[1]</span></a></span></p>\n\n<ol 
class=\"mw-references references\" typeof=\"mw:Extension/references\" 
about=\"#mwt5\" data-parsoid='{\"dsr\":[59,72,2,2]}' 
data-mw='{\"name\":\"references\",\"attrs\":{}}'><li about=\"#cite_note-1\" 
id=\"cite_note-1\"><a href=\"./Main_Page#cite_ref-1\" 
rel=\"mw:referencedBy\"><span class=\"mw-linkback-text\">↑ </span></a> <span 
id=\"mw-reference-text-cite_note-1\" class=\"mw-reference-text\" 
data-parsoid=\"{}\">{{simple template}}</span></li></ol>");
+add("wt2html", "<ref> with a simple template", "<p 
data-parsoid='{\"dsr\":[0,40,0,0]}'>Templating<span about=\"#mwt3\" 
class=\"mw-ref\" id=\"cite_ref-1\" rel=\"dc:references\" 
typeof=\"mw:Extension/ref\" data-parsoid='{\"dsr\":[10,40,5,6]}' 
data-mw='{\"name\":\"ref\",\"body\":{\"id\":\"mw-reference-text-cite_note-1\"},\"attrs\":{}}'><a
 href=\"./Main_Page#cite_note-1\" style=\"counter-reset: mw-Ref 1;\"><span 
class=\"mw-reflink-text\">[1]</span></a></span></p>\n\n<ol 
class=\"mw-references references\" typeof=\"mw:Extension/references\" 
about=\"#mwt5\" data-parsoid='{\"dsr\":[42,55,2,2]}' 
data-mw='{\"name\":\"references\",\"attrs\":{}}'><li about=\"#cite_note-1\" 
id=\"cite_note-1\"><a href=\"./Main_Page#cite_ref-1\" 
rel=\"mw:referencedBy\"><span class=\"mw-linkback-text\">↑ </span></a> <span 
id=\"mw-reference-text-cite_note-1\" class=\"mw-reference-text\" 
data-parsoid=\"{}\"><span about=\"#mwt2\" typeof=\"mw:Transclusion\" 
data-parsoid='{\"pi\":[[]],\"dsr\":[15,34,null,null]}' 
data-mw='{\"parts\":[{\"template\":{\"target\":{\"wt\":\"simple 
template\",\"href\":\"./Template:Simple_template\"},\"params\":{},\"i\":0}}]}'>A
 </span><i about=\"#mwt2\" data-parsoid=\"{}\">simple</i><span about=\"#mwt2\" 
data-parsoid=\"{}\"> template.</span></span></li></ol>");
+add("wt2html", "<ref> with a <nowiki>", "<p 
data-parsoid='{\"dsr\":[0,57,0,0]}'>Templating<span about=\"#mwt3\" 
class=\"mw-ref\" id=\"cite_ref-1\" rel=\"dc:references\" 
typeof=\"mw:Extension/ref\" data-parsoid='{\"dsr\":[10,57,5,6]}' 
data-mw='{\"name\":\"ref\",\"body\":{\"id\":\"mw-reference-text-cite_note-1\"},\"attrs\":{}}'><a
 href=\"./Main_Page#cite_note-1\" style=\"counter-reset: mw-Ref 1;\"><span 
class=\"mw-reflink-text\">[1]</span></a></span></p>\n\n<ol 
class=\"mw-references references\" typeof=\"mw:Extension/references\" 
about=\"#mwt5\" data-parsoid='{\"dsr\":[59,72,2,2]}' 
data-mw='{\"name\":\"references\",\"attrs\":{}}'><li about=\"#cite_note-1\" 
id=\"cite_note-1\"><a href=\"./Main_Page#cite_ref-1\" 
rel=\"mw:referencedBy\"><span class=\"mw-linkback-text\">↑ </span></a> <span 
id=\"mw-reference-text-cite_note-1\" class=\"mw-reference-text\" 
data-parsoid=\"{}\">{{simple template}}</span></li></ol>");
 add("wt2html", "<ref> in a <nowiki>", "<p 
data-parsoid='{\"dsr\":[0,57,0,0]}'>Templating<span typeof=\"mw:Nowiki\" 
data-parsoid='{\"dsr\":[10,57,8,9]}'>&lt;ref>{{simple 
template}}&lt;/ref></span></p>\n\n<ol class=\"mw-references references\" 
typeof=\"mw:Extension/references\" about=\"#mwt3\" 
data-parsoid='{\"dsr\":[59,72,2,2]}' 
data-mw='{\"name\":\"references\",\"attrs\":{}}'></ol>");
 add("wt2html", "<ref> in a <!--comment-->", "<p 
data-parsoid='{\"dsr\":[0,10,0,0]}'>Templating</p><!--<ref&#x3E;{{simple 
template}}</ref&#x3E;-->\n\n<ol class=\"mw-references references\" 
typeof=\"mw:Extension/references\" about=\"#mwt2\" 
data-parsoid='{\"dsr\":[49,62,2,2]}' 
data-mw='{\"name\":\"references\",\"attrs\":{}}'></ol>");
 add("wt2html", "<!--comment--> in a <ref> (bug 5384)", "<p 
data-parsoid='{\"dsr\":[0,39,0,0]}'>Templating<span about=\"#mwt2\" 
class=\"mw-ref\" id=\"cite_ref-1\" rel=\"dc:references\" 
typeof=\"mw:Extension/ref\" data-parsoid='{\"dsr\":[10,39,5,6]}' 
data-mw='{\"name\":\"ref\",\"body\":{\"id\":\"mw-reference-text-cite_note-1\"},\"attrs\":{}}'><a
 href=\"./Main_Page#cite_note-1\" style=\"counter-reset: mw-Ref 1;\"><span 
class=\"mw-reflink-text\">[1]</span></a></span></p>\n\n<ol 
class=\"mw-references references\" typeof=\"mw:Extension/references\" 
about=\"#mwt4\" data-parsoid='{\"dsr\":[41,54,2,2]}' 
data-mw='{\"name\":\"references\",\"attrs\":{}}'><li about=\"#cite_note-1\" 
id=\"cite_note-1\"><a href=\"./Main_Page#cite_ref-1\" 
rel=\"mw:referencedBy\"><span class=\"mw-linkback-text\">↑ </span></a> <span 
id=\"mw-reference-text-cite_note-1\" class=\"mw-reference-text\" 
data-parsoid=\"{}\">Text<!--comment--></span></li></ol>");
@@ -62,7 +62,7 @@
 add("wt2html", "<ref> defined in <references> error conditions", "<p 
data-parsoid='{\"dsr\":[0,27,0,0]}'><span about=\"#mwt2\" class=\"mw-ref\" 
id=\"cite_ref-foo_1-0\" rel=\"dc:references\" typeof=\"mw:Extension/ref\" 
data-parsoid='{\"dsr\":[0,27,27,0]}' 
data-mw='{\"name\":\"ref\",\"attrs\":{\"group\":\"2\",\"name\":\"foo\"}}'><a 
href=\"./Main_Page#cite_note-foo-1\" style=\"counter-reset: mw-Ref 1;\" 
data-mw-group=\"2\"><span class=\"mw-reflink-text\">[2 
1]</span></a></span></p>\n\n<ol class=\"mw-references references\" 
typeof=\"mw:Extension/references\" about=\"#mwt4\" data-mw-group=\"2\" 
data-parsoid='{\"group\":\"2\",\"dsr\":[29,173,2,2]}' 
data-mw='{\"name\":\"references\",\"attrs\":{\"group\":\"2\"},\"body\":{\"html\":\"\\n&lt;span
 about=\\\"#mwt6\\\" class=\\\"mw-ref\\\" rel=\\\"dc:references\\\" 
typeof=\\\"mw:Extension/ref\\\" 
data-parsoid=&#39;{\\\"dsr\\\":[52,69,17,0]}&#39; 
data-mw=&#39;{\\\"name\\\":\\\"ref\\\",\\\"attrs\\\":{\\\"name\\\":\\\"foo\\\"}}&#39;>&lt;a
 href=\\\"./Main_Page#cite_note-foo-1\\\" style=\\\"counter-reset: mw-Ref 
1;\\\" data-mw-group=\\\"2\\\" data-parsoid=\\\"{}\\\">&lt;span 
class=\\\"mw-reflink-text\\\" data-parsoid=\\\"{}\\\">[2 
1]&lt;/span>&lt;/a>&lt;/span>\\n&lt;span about=\\\"#mwt8\\\" 
class=\\\"mw-ref\\\" rel=\\\"dc:references\\\" typeof=\\\"mw:Extension/ref\\\" 
data-parsoid=&#39;{\\\"dsr\\\":[70,98,19,6]}&#39; 
data-mw=&#39;{\\\"name\\\":\\\"ref\\\",\\\"body\\\":{\\\"id\\\":\\\"mw-reference-text-cite_note-unused-2\\\"},\\\"attrs\\\":{\\\"name\\\":\\\"unused\\\"}}&#39;>&lt;a
 href=\\\"./Main_Page#cite_note-unused-2\\\" style=\\\"counter-reset: mw-Ref 
2;\\\" data-mw-group=\\\"2\\\" data-parsoid=\\\"{}\\\">&lt;span 
class=\\\"mw-reflink-text\\\" data-parsoid=\\\"{}\\\">[2 
2]&lt;/span>&lt;/a>&lt;/span>\\n&lt;span about=\\\"#mwt10\\\" 
class=\\\"mw-ref\\\" rel=\\\"dc:references\\\" typeof=\\\"mw:Extension/ref\\\" 
data-parsoid=&#39;{\\\"dsr\\\":[99,140,26,6]}&#39; 
data-mw=&#39;{\\\"name\\\":\\\"ref\\\",\\\"body\\\":{\\\"id\\\":\\\"mw-reference-text-cite_note-foo-3\\\"},\\\"attrs\\\":{\\\"group\\\":\\\"1\\\",\\\"name\\\":\\\"foo\\\"}}&#39;>&lt;a
 href=\\\"./Main_Page#cite_note-foo-3\\\" style=\\\"counter-reset: mw-Ref 
1;\\\" data-mw-group=\\\"1\\\" data-parsoid=\\\"{}\\\">&lt;span 
class=\\\"mw-reflink-text\\\" data-parsoid=\\\"{}\\\">[1 
1]&lt;/span>&lt;/a>&lt;/span>\\n&lt;span about=\\\"#mwt12\\\" 
class=\\\"mw-ref\\\" rel=\\\"dc:references\\\" typeof=\\\"mw:Extension/ref\\\" 
data-parsoid=&#39;{\\\"dsr\\\":[141,159,5,6]}&#39; 
data-mw=&#39;{\\\"name\\\":\\\"ref\\\",\\\"body\\\":{\\\"id\\\":\\\"mw-reference-text-cite_note-4\\\"},\\\"attrs\\\":{}}&#39;>&lt;a
 href=\\\"./Main_Page#cite_note-4\\\" style=\\\"counter-reset: mw-Ref 3;\\\" 
data-mw-group=\\\"2\\\" data-parsoid=\\\"{}\\\">&lt;span 
class=\\\"mw-reflink-text\\\" data-parsoid=\\\"{}\\\">[2 
3]&lt;/span>&lt;/a>&lt;/span>\\n\"}}'><li about=\"#cite_note-foo-1\" 
id=\"cite_note-foo-1\"><a href=\"./Main_Page#cite_ref-foo_1-0\" 
data-mw-group=\"2\" rel=\"mw:referencedBy\"><span class=\"mw-linkback-text\">↑ 
</span></a> <span id=\"mw-reference-text-cite_note-foo-1\" 
class=\"mw-reference-text\" data-parsoid=\"{}\"></span></li><li 
about=\"#cite_note-unused-2\" id=\"cite_note-unused-2\"><span 
rel=\"mw:referencedBy\"></span> <span 
id=\"mw-reference-text-cite_note-unused-2\" class=\"mw-reference-text\" 
data-parsoid=\"{}\">BAR</span></li><li about=\"#cite_note-4\" 
id=\"cite_note-4\"><span rel=\"mw:referencedBy\"></span> <span 
id=\"mw-reference-text-cite_note-4\" class=\"mw-reference-text\" 
data-parsoid=\"{}\">BAR BAR</span></li></ol>\n<ol class=\"mw-references 
references\" typeof=\"mw:Extension/references\" about=\"#mwt13\" 
data-mw-group=\"1\" data-parsoid='{\"dsr\":[173,173,0,0],\"group\":\"1\"}' 
data-mw='{\"name\":\"references\",\"attrs\":{\"group\":\"1\"},\"autoGenerated\":true}'><li
 about=\"#cite_note-foo-3\" id=\"cite_note-foo-3\"><span 
rel=\"mw:referencedBy\"></span> <span id=\"mw-reference-text-cite_note-foo-3\" 
class=\"mw-reference-text\" data-parsoid=\"{}\">bad group</span></li></ol>");
 add("wt2html", "<ref> with custom group link with number names in Klingon", 
"<p data-parsoid='{\"dsr\":[0,74,0,0]}'>Wikipedia rocks!<span about=\"#mwt2\" 
class=\"mw-ref\" id=\"cite_ref-1\" rel=\"dc:references\" 
typeof=\"mw:Extension/ref\" data-parsoid='{\"dsr\":[16,74,21,6]}' 
data-mw='{\"name\":\"ref\",\"body\":{\"id\":\"mw-reference-text-cite_note-1\"},\"attrs\":{\"group\":\"klingon\"}}'><a
 href=\"./Main_Page#cite_note-1\" style=\"counter-reset: mw-Ref 1;\" 
data-mw-group=\"klingon\"><span class=\"mw-reflink-text\">[klingon 
1]</span></a></span></p>\n\n<ol class=\"mw-references references\" 
typeof=\"mw:Extension/references\" about=\"#mwt4\" data-mw-group=\"klingon\" 
data-parsoid='{\"group\":\"klingon\",\"dsr\":[76,105,2,2]}' 
data-mw='{\"name\":\"references\",\"attrs\":{\"group\":\"klingon\"}}'><li 
about=\"#cite_note-1\" id=\"cite_note-1\"><a href=\"./Main_Page#cite_ref-1\" 
data-mw-group=\"klingon\" rel=\"mw:referencedBy\"><span 
class=\"mw-linkback-text\">↑ </span></a> <span 
id=\"mw-reference-text-cite_note-1\" class=\"mw-reference-text\" 
data-parsoid=\"{}\">Proceeds of Rockology, vol. XXI</span></li></ol>");
 add("wt2html", "Bug 31374 regression check: nested strip items", "<p 
data-parsoid='{\"dsr\":[0,48,0,0]}'><ref about=\"#mwt2\" 
typeof=\"mw:Transclusion\" 
data-parsoid='{\"a\":{\"group\":null},\"sa\":{\"group\":\"Note\"},\"dsr\":[0,48,null,null],\"pi\":[[{\"k\":\"1\"},{\"k\":\"group\",\"named\":true}]]}'
 
data-mw='{\"parts\":[{\"template\":{\"target\":{\"wt\":\"#tag:ref\",\"function\":\"tag\"},\"params\":{\"1\":{\"wt\":\"note&lt;ref>reference&lt;/ref>\"},\"group\":{\"wt\":\"Note\"}},\"i\":0}}]}'>note<span
 about=\"#mwt3\" class=\"mw-ref\" id=\"cite_ref-1\" rel=\"dc:references\" 
typeof=\"mw:Extension/ref\" 
data-mw='{\"name\":\"ref\",\"body\":{\"id\":\"mw-reference-text-cite_note-1\"},\"attrs\":{}}'><a
 href=\"./Main_Page#cite_note-1\" style=\"counter-reset: mw-Ref 1;\"><span 
class=\"mw-reflink-text\">[1]</span></a></span></ref></p>\n<ol 
class=\"mw-references references\" typeof=\"mw:Extension/references\" 
about=\"#mwt5\" data-mw-group=\"Note\" 
data-parsoid='{\"group\":\"Note\",\"dsr\":[49,74,2,2]}' 
data-mw='{\"name\":\"references\",\"attrs\":{\"group\":\"Note\"}}'></ol>\n<ol 
class=\"mw-references references\" typeof=\"mw:Extension/references\" 
about=\"#mwt7\" data-parsoid='{\"dsr\":[75,89,2,2]}' 
data-mw='{\"name\":\"references\",\"attrs\":{}}'><li about=\"#cite_note-1\" 
id=\"cite_note-1\"><a href=\"./Main_Page#cite_ref-1\" 
rel=\"mw:referencedBy\"><span class=\"mw-linkback-text\">↑ </span></a> <span 
id=\"mw-reference-text-cite_note-1\" class=\"mw-reference-text\" 
data-parsoid=\"{}\">reference</span></li></ol>");
-add("wt2html", "Bug 13073 regression check: wrapped <references>", "<p 
data-parsoid='{\"dsr\":[0,16,0,0]}'><span about=\"#mwt2\" class=\"mw-ref\" 
id=\"cite_ref-1\" rel=\"dc:references\" typeof=\"mw:Extension/ref\" 
data-parsoid='{\"dsr\":[0,16,5,6]}' 
data-mw='{\"name\":\"ref\",\"body\":{\"id\":\"mw-reference-text-cite_note-1\"},\"attrs\":{}}'><a
 href=\"./Main_Page#cite_note-1\" style=\"counter-reset: mw-Ref 1;\"><span 
class=\"mw-reflink-text\">[1]</span></a></span></p>\n<div 
data-parsoid='{\"stx\":\"html\",\"dsr\":[17,42,5,6]}'><ol class=\"mw-references 
references\" typeof=\"mw:Extension/references\" about=\"#mwt4\" 
data-parsoid='{\"dsr\":[22,36,2,2]}' 
data-mw='{\"name\":\"references\",\"attrs\":{}}'><li about=\"#cite_note-1\" 
id=\"cite_note-1\"><a href=\"./Main_Page#cite_ref-1\" 
rel=\"mw:referencedBy\"><span class=\"mw-linkback-text\">↑ </span></a> <span 
id=\"mw-reference-text-cite_note-1\" class=\"mw-reference-text\" 
data-parsoid=\"{}\">foo\n</span></li></ol></div>");
+add("wt2html", "Bug 13073 regression check: wrapped <references>", "<p 
data-parsoid='{\"dsr\":[0,16,0,0]}'><span about=\"#mwt4\" class=\"mw-ref\" 
id=\"cite_ref-1\" rel=\"dc:references\" typeof=\"mw:Extension/ref\" 
data-parsoid='{\"dsr\":[0,16,5,6]}' 
data-mw='{\"name\":\"ref\",\"body\":{\"id\":\"mw-reference-text-cite_note-1\"},\"attrs\":{}}'><a
 href=\"./Main_Page#cite_note-1\" style=\"counter-reset: mw-Ref 1;\"><span 
class=\"mw-reflink-text\">[1]</span></a></span></p>\n<div 
data-parsoid='{\"stx\":\"html\",\"dsr\":[17,42,5,6]}'><ol class=\"mw-references 
references\" typeof=\"mw:Extension/references\" about=\"#mwt3\" 
data-parsoid='{\"dsr\":[22,36,2,2]}' 
data-mw='{\"name\":\"references\",\"attrs\":{}}'><li about=\"#cite_note-1\" 
id=\"cite_note-1\"><a href=\"./Main_Page#cite_ref-1\" 
rel=\"mw:referencedBy\"><span class=\"mw-linkback-text\">↑ </span></a> <span 
id=\"mw-reference-text-cite_note-1\" class=\"mw-reference-text\" 
data-parsoid=\"{}\">foo\n</span></li></ol></div>");
 add("wt2html", "<ref> with no name and no content.", "<p 
data-parsoid='{\"dsr\":[0,15,0,0]}'>Bla.<span about=\"#mwt2\" class=\"mw-ref\" 
id=\"cite_ref-1\" rel=\"dc:references\" typeof=\"mw:Extension/ref\" 
data-parsoid='{\"dsr\":[4,15,5,6]}' 
data-mw='{\"name\":\"ref\",\"attrs\":{}}'><a href=\"./Main_Page#cite_note-1\" 
style=\"counter-reset: mw-Ref 1;\"><span 
class=\"mw-reflink-text\">[1]</span></a></span></p>\n<ol class=\"mw-references 
references\" typeof=\"mw:Extension/references\" about=\"#mwt3\" 
data-parsoid='{\"dsr\":[15,15,0,0]}' 
data-mw='{\"name\":\"references\",\"attrs\":{},\"autoGenerated\":true}'><li 
about=\"#cite_note-1\" id=\"cite_note-1\"><a href=\"./Main_Page#cite_ref-1\" 
rel=\"mw:referencedBy\"><span class=\"mw-linkback-text\">↑ </span></a> <span 
id=\"mw-reference-text-cite_note-1\" class=\"mw-reference-text\" 
data-parsoid=\"{}\"></span></li></ol>");
 add("wt2html", "<ref> with an empty-string name parameter and no content.", 
"<p data-parsoid='{\"dsr\":[0,23,0,0]}'>Bla.<span about=\"#mwt2\" 
class=\"mw-ref\" id=\"cite_ref-1\" rel=\"dc:references\" 
typeof=\"mw:Extension/ref\" data-parsoid='{\"dsr\":[4,23,13,6]}' 
data-mw='{\"name\":\"ref\",\"attrs\":{}}'><a href=\"./Main_Page#cite_note-1\" 
style=\"counter-reset: mw-Ref 1;\"><span 
class=\"mw-reflink-text\">[1]</span></a></span></p>\n<ol class=\"mw-references 
references\" typeof=\"mw:Extension/references\" about=\"#mwt3\" 
data-parsoid='{\"dsr\":[23,23,0,0]}' 
data-mw='{\"name\":\"references\",\"attrs\":{},\"autoGenerated\":true}'><li 
about=\"#cite_note-1\" id=\"cite_note-1\"><a href=\"./Main_Page#cite_ref-1\" 
rel=\"mw:referencedBy\"><span class=\"mw-linkback-text\">↑ </span></a> <span 
id=\"mw-reference-text-cite_note-1\" class=\"mw-reference-text\" 
data-parsoid=\"{}\"></span></li></ol>");
 add("wt2html", "<ref> with a non-empty name parameter and no content.", "<p 
data-parsoid='{\"dsr\":[0,27,0,0]}'>Bla.<span about=\"#mwt2\" class=\"mw-ref\" 
id=\"cite_ref-void_1-0\" rel=\"dc:references\" typeof=\"mw:Extension/ref\" 
data-parsoid='{\"dsr\":[4,27,17,6]}' 
data-mw='{\"name\":\"ref\",\"attrs\":{\"name\":\"void\"}}'><a 
href=\"./Main_Page#cite_note-void-1\" style=\"counter-reset: mw-Ref 1;\"><span 
class=\"mw-reflink-text\">[1]</span></a></span></p>\n<ol class=\"mw-references 
references\" typeof=\"mw:Extension/references\" about=\"#mwt3\" 
data-parsoid='{\"dsr\":[27,27,0,0]}' 
data-mw='{\"name\":\"references\",\"attrs\":{},\"autoGenerated\":true}'><li 
about=\"#cite_note-void-1\" id=\"cite_note-void-1\"><a 
href=\"./Main_Page#cite_ref-void_1-0\" rel=\"mw:referencedBy\"><span 
class=\"mw-linkback-text\">↑ </span></a> <span 
id=\"mw-reference-text-cite_note-void-1\" class=\"mw-reference-text\" 
data-parsoid=\"{}\"></span></li></ol>");
@@ -143,7 +143,7 @@
 add("html2html", "Multiple definition (inside <references/>)", "<p 
data-parsoid='{\"dsr\":[0,71,0,0]}'><sup id=\"cite_ref-a_1-0\" 
class=\"reference\" data-parsoid='{\"stx\":\"html\",\"dsr\":[0,71,43,6]}'><a 
rel=\"mw:WikiLink\" href=\"./Main_Page#cite_note-a-1\" 
data-parsoid='{\"stx\":\"piped\",\"a\":{\"href\":\"./Main_Page#cite_note-a-1\"},\"sa\":{\"href\":\"#cite_note-a-1\"},\"dsr\":[43,65,17,2]}'>[1]</a></sup></p>\n\n<ol
 data-parsoid='{\"dsr\":[73,355,0,0]}'><li 
data-parsoid='{\"dsr\":[73,355,1,0]}'> <span class=\"mw-cite-backlink\" 
data-parsoid='{\"stx\":\"html\",\"dsr\":[75,134,31,7]}'><a rel=\"mw:WikiLink\" 
href=\"./Main_Page#cite_ref-a_1-0\" 
data-parsoid='{\"stx\":\"piped\",\"a\":{\"href\":\"./Main_Page#cite_ref-a_1-0\"},\"sa\":{\"href\":\"#cite_ref-a_1-0\"},\"dsr\":[106,127,18,2]}'>↑</a></span>
 <span class=\"reference-text\" 
data-parsoid='{\"stx\":\"html\",\"dsr\":[135,355,29,7]}'>abc <span 
class=\"error mw-ext-cite-error\" lang=\"en\" dir=\"ltr\" 
data-parsoid='{\"stx\":\"html\",\"dsr\":[168,348,58,7]}'>Cite error: Invalid 
<code data-parsoid='{\"stx\":\"html\",\"dsr\":[246,281,6,7]}'><span 
typeof=\"mw:Nowiki\" 
data-parsoid='{\"dsr\":[252,274,8,9]}'>&lt;ref></span></code> tag; name \"a\" 
defined multiple times with different content</span></span></li></ol>\n");
 add("html2html", "Multiple definition (mixed outside/inside)", "<p 
data-parsoid='{\"dsr\":[0,71,0,0]}'><sup id=\"cite_ref-a_1-0\" 
class=\"reference\" data-parsoid='{\"stx\":\"html\",\"dsr\":[0,71,43,6]}'><a 
rel=\"mw:WikiLink\" href=\"./Main_Page#cite_note-a-1\" 
data-parsoid='{\"stx\":\"piped\",\"a\":{\"href\":\"./Main_Page#cite_note-a-1\"},\"sa\":{\"href\":\"#cite_note-a-1\"},\"dsr\":[43,65,17,2]}'>[1]</a></sup></p>\n\n<ol
 data-parsoid='{\"dsr\":[73,355,0,0]}'><li 
data-parsoid='{\"dsr\":[73,355,1,0]}'> <span class=\"mw-cite-backlink\" 
data-parsoid='{\"stx\":\"html\",\"dsr\":[75,134,31,7]}'><a rel=\"mw:WikiLink\" 
href=\"./Main_Page#cite_ref-a_1-0\" 
data-parsoid='{\"stx\":\"piped\",\"a\":{\"href\":\"./Main_Page#cite_ref-a_1-0\"},\"sa\":{\"href\":\"#cite_ref-a_1-0\"},\"dsr\":[106,127,18,2]}'>↑</a></span>
 <span class=\"reference-text\" 
data-parsoid='{\"stx\":\"html\",\"dsr\":[135,355,29,7]}'>abc <span 
class=\"error mw-ext-cite-error\" lang=\"en\" dir=\"ltr\" 
data-parsoid='{\"stx\":\"html\",\"dsr\":[168,348,58,7]}'>Cite error: Invalid 
<code data-parsoid='{\"stx\":\"html\",\"dsr\":[246,281,6,7]}'><span 
typeof=\"mw:Nowiki\" 
data-parsoid='{\"dsr\":[252,274,8,9]}'>&lt;ref></span></code> tag; name \"a\" 
defined multiple times with different content</span></span></li></ol>\n");
 add("html2html", "Multiple definition (inside {{#tag:references}})", "<p 
data-parsoid='{\"dsr\":[0,71,0,0]}'><sup id=\"cite_ref-a_1-0\" 
class=\"reference\" data-parsoid='{\"stx\":\"html\",\"dsr\":[0,71,43,6]}'><a 
rel=\"mw:WikiLink\" href=\"./Main_Page#cite_note-a-1\" 
data-parsoid='{\"stx\":\"piped\",\"a\":{\"href\":\"./Main_Page#cite_note-a-1\"},\"sa\":{\"href\":\"#cite_note-a-1\"},\"dsr\":[43,65,17,2]}'>[1]</a></sup></p>\n\n<ol
 data-parsoid='{\"dsr\":[73,355,0,0]}'><li 
data-parsoid='{\"dsr\":[73,355,1,0]}'> <span class=\"mw-cite-backlink\" 
data-parsoid='{\"stx\":\"html\",\"dsr\":[75,134,31,7]}'><a rel=\"mw:WikiLink\" 
href=\"./Main_Page#cite_ref-a_1-0\" 
data-parsoid='{\"stx\":\"piped\",\"a\":{\"href\":\"./Main_Page#cite_ref-a_1-0\"},\"sa\":{\"href\":\"#cite_ref-a_1-0\"},\"dsr\":[106,127,18,2]}'>↑</a></span>
 <span class=\"reference-text\" 
data-parsoid='{\"stx\":\"html\",\"dsr\":[135,355,29,7]}'>abc <span 
class=\"error mw-ext-cite-error\" lang=\"en\" dir=\"ltr\" 
data-parsoid='{\"stx\":\"html\",\"dsr\":[168,348,58,7]}'>Cite error: Invalid 
<code data-parsoid='{\"stx\":\"html\",\"dsr\":[246,281,6,7]}'><span 
typeof=\"mw:Nowiki\" 
data-parsoid='{\"dsr\":[252,274,8,9]}'>&lt;ref></span></code> tag; name \"a\" 
defined multiple times with different content</span></span></li></ol>\n");
-add("html2html", "Ref: 8. transclusion wikitext has lower precedence", "<p 
data-parsoid='{\"dsr\":[0,64,0,0]}'>A <span about=\"#mwt3\" class=\"mw-ref\" 
id=\"cite_ref-1\" rel=\"dc:references\" typeof=\"mw:Extension/ref\" 
data-parsoid='{\"dsr\":[2,41,5,6]}' 
data-mw='{\"name\":\"ref\",\"body\":{\"id\":\"mw-reference-text-cite_note-1\"},\"attrs\":{}}'><a
 href=\"./Main_Page#cite_note-1\" style=\"counter-reset: mw-Ref 1;\"><span 
class=\"mw-reflink-text\">[1]</span></a></span><span typeof=\"mw:Nowiki\" 
data-parsoid='{\"dsr\":[41,64,8,9]}'> B C}}</span></p>\n<ol 
class=\"mw-references references\" typeof=\"mw:Extension/references\" 
about=\"#mwt6\" data-parsoid='{\"dsr\":[65,79,2,2]}' 
data-mw='{\"name\":\"references\",\"attrs\":{}}'><li about=\"#cite_note-1\" 
id=\"cite_note-1\"><a href=\"./Main_Page#cite_ref-1\" 
rel=\"mw:referencedBy\"><span class=\"mw-linkback-text\">↑ </span></a> <span 
id=\"mw-reference-text-cite_note-1\" class=\"mw-reference-text\" 
data-parsoid=\"{}\">foo {{echo|</span></li></ol>");
+add("html2html", "Ref: 8. transclusion wikitext has lower precedence", "<p 
data-parsoid='{\"dsr\":[0,64,0,0]}'>A <span about=\"#mwt4\" class=\"mw-ref\" 
id=\"cite_ref-1\" rel=\"dc:references\" typeof=\"mw:Extension/ref\" 
data-parsoid='{\"dsr\":[2,41,5,6]}' 
data-mw='{\"name\":\"ref\",\"body\":{\"id\":\"mw-reference-text-cite_note-1\"},\"attrs\":{}}'><a
 href=\"./Main_Page#cite_note-1\" style=\"counter-reset: mw-Ref 1;\"><span 
class=\"mw-reflink-text\">[1]</span></a></span><span typeof=\"mw:Nowiki\" 
data-parsoid='{\"dsr\":[41,64,8,9]}'> B C}}</span></p>\n<ol 
class=\"mw-references references\" typeof=\"mw:Extension/references\" 
about=\"#mwt6\" data-parsoid='{\"dsr\":[65,79,2,2]}' 
data-mw='{\"name\":\"references\",\"attrs\":{}}'><li about=\"#cite_note-1\" 
id=\"cite_note-1\"><a href=\"./Main_Page#cite_ref-1\" 
rel=\"mw:referencedBy\"><span class=\"mw-linkback-text\">↑ </span></a> <span 
id=\"mw-reference-text-cite_note-1\" class=\"mw-reference-text\" 
data-parsoid=\"{}\">foo {{echo|</span></li></ol>");
 add("html2html", "References: 9. Generate missing references list at the end", 
"<p data-parsoid='{\"dsr\":[0,52,0,0]}'>A <span about=\"#mwt3\" 
class=\"mw-ref\" id=\"cite_ref-1\" rel=\"dc:references\" 
typeof=\"mw:Extension/ref\" data-parsoid='{\"dsr\":[2,16,5,6]}' 
data-mw='{\"name\":\"ref\",\"body\":{\"id\":\"mw-reference-text-cite_note-1\"},\"attrs\":{}}'><a
 href=\"./Main_Page#cite_note-1\" style=\"counter-reset: mw-Ref 1;\"><span 
class=\"mw-reflink-text\">[1]</span></a></span> B <span about=\"#mwt4\" 
class=\"mw-ref\" id=\"cite_ref-2\" rel=\"dc:references\" 
typeof=\"mw:Extension/ref\" data-parsoid='{\"dsr\":[19,52,24,6]}' 
data-mw='{\"name\":\"ref\",\"body\":{\"id\":\"mw-reference-text-cite_note-2\"},\"attrs\":{\"group\":\"inexistent\"}}'><a
 href=\"./Main_Page#cite_note-2\" style=\"counter-reset: mw-Ref 1;\" 
data-mw-group=\"inexistent\"><span class=\"mw-reflink-text\">[inexistent 
1]</span></a></span></p>\n<ol class=\"mw-references references\" 
typeof=\"mw:Extension/references\" about=\"#mwt6\" 
data-parsoid='{\"dsr\":[53,67,2,2]}' 
data-mw='{\"name\":\"references\",\"attrs\":{}}'><li about=\"#cite_note-1\" 
id=\"cite_note-1\"><a href=\"./Main_Page#cite_ref-1\" 
rel=\"mw:referencedBy\"><span class=\"mw-linkback-text\">↑ </span></a> <span 
id=\"mw-reference-text-cite_note-1\" class=\"mw-reference-text\" 
data-parsoid=\"{}\">foo</span></li></ol>\n<ol class=\"mw-references 
references\" typeof=\"mw:Extension/references\" about=\"#mwt8\" 
data-mw-group=\"inexistent\" 
data-parsoid='{\"group\":\"inexistent\",\"dsr\":[68,101,2,2]}' 
data-mw='{\"name\":\"references\",\"attrs\":{\"group\":\"inexistent\"}}'><li 
about=\"#cite_note-2\" id=\"cite_note-2\"><a href=\"./Main_Page#cite_ref-2\" 
data-mw-group=\"inexistent\" rel=\"mw:referencedBy\"><span 
class=\"mw-linkback-text\">↑ </span></a> <span 
id=\"mw-reference-text-cite_note-2\" class=\"mw-reference-text\" 
data-parsoid=\"{}\">bar</span></li></ol>");
 
 

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

Gerrit-MessageType: merged
Gerrit-Change-Id: Ia0aec7de469101a2a93342ea89daac0f0e73cf1a
Gerrit-PatchSet: 4
Gerrit-Project: mediawiki/services/parsoid
Gerrit-Branch: master
Gerrit-Owner: Arlolra <abrea...@wikimedia.org>
Gerrit-Reviewer: Arlolra <abrea...@wikimedia.org>
Gerrit-Reviewer: C. Scott Ananian <canan...@wikimedia.org>
Gerrit-Reviewer: Sbailey <sbai...@wikimedia.org>
Gerrit-Reviewer: Subramanya Sastry <ssas...@wikimedia.org>
Gerrit-Reviewer: jenkins-bot <>

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

Reply via email to