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]}'><ref>{{simple template}}</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>{{simple template}}</ref>-->\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<span about=\\\"#mwt6\\\" class=\\\"mw-ref\\\" rel=\\\"dc:references\\\" typeof=\\\"mw:Extension/ref\\\" data-parsoid='{\\\"dsr\\\":[52,69,17,0]}' data-mw='{\\\"name\\\":\\\"ref\\\",\\\"attrs\\\":{\\\"name\\\":\\\"foo\\\"}}'><a href=\\\"./Main_Page#cite_note-foo-1\\\" style=\\\"counter-reset: mw-Ref 1;\\\" data-mw-group=\\\"2\\\" data-parsoid=\\\"{}\\\"><span class=\\\"mw-reflink-text\\\" data-parsoid=\\\"{}\\\">[2 1]</span></a></span>\\n<span about=\\\"#mwt8\\\" class=\\\"mw-ref\\\" rel=\\\"dc:references\\\" typeof=\\\"mw:Extension/ref\\\" data-parsoid='{\\\"dsr\\\":[70,98,19,6]}' data-mw='{\\\"name\\\":\\\"ref\\\",\\\"body\\\":{\\\"id\\\":\\\"mw-reference-text-cite_note-unused-2\\\"},\\\"attrs\\\":{\\\"name\\\":\\\"unused\\\"}}'><a href=\\\"./Main_Page#cite_note-unused-2\\\" style=\\\"counter-reset: mw-Ref 2;\\\" data-mw-group=\\\"2\\\" data-parsoid=\\\"{}\\\"><span class=\\\"mw-reflink-text\\\" data-parsoid=\\\"{}\\\">[2 2]</span></a></span>\\n<span about=\\\"#mwt10\\\" class=\\\"mw-ref\\\" rel=\\\"dc:references\\\" typeof=\\\"mw:Extension/ref\\\" data-parsoid='{\\\"dsr\\\":[99,140,26,6]}' data-mw='{\\\"name\\\":\\\"ref\\\",\\\"body\\\":{\\\"id\\\":\\\"mw-reference-text-cite_note-foo-3\\\"},\\\"attrs\\\":{\\\"group\\\":\\\"1\\\",\\\"name\\\":\\\"foo\\\"}}'><a href=\\\"./Main_Page#cite_note-foo-3\\\" style=\\\"counter-reset: mw-Ref 1;\\\" data-mw-group=\\\"1\\\" data-parsoid=\\\"{}\\\"><span class=\\\"mw-reflink-text\\\" data-parsoid=\\\"{}\\\">[1 1]</span></a></span>\\n<span about=\\\"#mwt12\\\" class=\\\"mw-ref\\\" rel=\\\"dc:references\\\" typeof=\\\"mw:Extension/ref\\\" data-parsoid='{\\\"dsr\\\":[141,159,5,6]}' data-mw='{\\\"name\\\":\\\"ref\\\",\\\"body\\\":{\\\"id\\\":\\\"mw-reference-text-cite_note-4\\\"},\\\"attrs\\\":{}}'><a href=\\\"./Main_Page#cite_note-4\\\" style=\\\"counter-reset: mw-Ref 3;\\\" data-mw-group=\\\"2\\\" data-parsoid=\\\"{}\\\"><span class=\\\"mw-reflink-text\\\" data-parsoid=\\\"{}\\\">[2 3]</span></a></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<ref>reference</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]}'><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]}'><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]}'><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