jenkins-bot has submitted this change and it was merged.
Change subject: (Bug 50218) Generated DOMFragment wrapping <ol> for references
tag
......................................................................
(Bug 50218) Generated DOMFragment wrapping <ol> for references tag
* So far, references wikitext was being replaced with a meta marker
token that participated as an inline token in p-wrapping. As a
result, in some cases, a p-tag was wrapping the references ol-node
which is buggy HTML. When VE loaded this DOM, the p-node was split
around the ol-node and duplicated DSR which led to duplicated
output when selser ran on this.
* One way of fixing this would have been to add a special case in
the paragraph wrapper to treat the mw:Extensions/References/Marker
meta tag as a block token.
* A better solution with an eye towards the longer-term is to emit
mw:DOMFragment wrapper for the references tag with the content
being an ol-node. The dom-fragment unpacking code then takes care
of p-wrapping issues for the ol-node. This fixes the bug in this
case.
* Also fixed parser tests output where group attribute was missing
on some tests (which indicated that the older code was not emitting
the group attribute on references tag).
* No change in parser tests.
Change-Id: I073b2e68667d577c75cad07d19cea2b19d0e89fe
---
M js/lib/ext.Cite.js
M js/lib/mediawiki.DOMPostProcessor.js
M js/lib/mediawiki.DOMUtils.js
M js/tests/parserTests.txt
4 files changed, 54 insertions(+), 38 deletions(-)
Approvals:
GWicke: Looks good to me, approved
jenkins-bot: Verified
diff --git a/js/lib/ext.Cite.js b/js/lib/ext.Cite.js
index a4ca97f..322e3d1 100644
--- a/js/lib/ext.Cite.js
+++ b/js/lib/ext.Cite.js
@@ -6,6 +6,8 @@
var Util = require( './mediawiki.Util.js' ).Util,
DU = require( './mediawiki.DOMUtils.js').DOMUtils,
+ coreutil = require('util'),
+ ExtensionHandler =
require('./ext.core.ExtensionHandler.js').ExtensionHandler,
defines = require('./mediawiki.parser.defines.js'),
$ = require( './fakejquery' );
@@ -253,6 +255,9 @@
this.reset();
}
+// Inherit functionality from ExtensionHandler
+coreutil.inherits(References, ExtensionHandler);
+
References.prototype.reset = function(group) {
if (group) {
setRefGroup(this.refGroups, group, undefined);
@@ -281,20 +286,39 @@
group = null;
}
- // Emit a placeholder meta for the references token
- // so that the dom post processor can generate and
- // emit references at this point in the DOM.
- var emitMarkerMeta = function() {
- var marker = new SelfclosingTagTk('meta', refsTok.attribs,
refsTok.dataAttribs);
+ // Emit a marker mw:DOMFragment for the references
+ // token so that the dom post processor can generate
+ // and emit references at this point in the DOM.
+ var emitReferencesFragment = function() {
+ var about = manager.env.newAboutId(),
+ type = refsTok.getAttribute('typeof');
+ var buf = [
+ "<ol class='references'",
+ " typeof='", "mw:Extension/references", "'",
+ " about='", about, "'",
+ "></ol>"
+ ];
- marker.dataAttribs.stx = undefined;
- DU.addAttributes(marker, {
- 'about': manager.env.newAboutId(),
- 'group': group,
- 'typeof': 'mw:Extension/references/Marker'
- });
- cb({ tokens: [marker], async: false });
- };
+ var wrapperDOM = Util.parseHTML(buf.join('')).body.childNodes;
+ wrapperDOM[0].setAttribute('source',
refsTok.getAttribute('source'));
+ if (group) {
+ wrapperDOM[0].setAttribute('group', group);
+ }
+
+ var expansion = {
+ nodes: wrapperDOM,
+ html: wrapperDOM.map(function(n) { return n.outerHTML;
}).join('')
+ };
+
+ // TemplateHandler wants a manager property
+ //
+ // FIXME: Seems silly -- maybe we should move
encapsulateExpansionHTML
+ // into Util and pass env into it .. can avoid extending
ExtensionHandler
+ // as well.
+ this.manager = manager;
+
+ cb({ tokens: this.encapsulateExpansionHTML(refsTok, expansion),
async: false });
+ }.bind(this);
processExtSource(manager, refsTok, {
// Partial pipeline for processing ref-content
@@ -307,7 +331,7 @@
},
res: [],
parentCB: cb,
- emptyContentCB: emitMarkerMeta,
+ emptyContentCB: emitReferencesFragment,
chunkCB: function(chunk) {
// Extract ref-content tokens and discard the rest
var res = [];
@@ -324,7 +348,7 @@
// Pass along the ref toks
cb({ tokens: res, async: true });
},
- endCB: emitMarkerMeta
+ endCB: emitReferencesFragment
});
};
@@ -401,9 +425,7 @@
src = refsNode.getAttribute('source'),
// Extract ext-source for <references>..</references> usage
body = Util.extractExtBody("references", src).trim(),
- refGroup = getRefGroup(this.refGroups, group),
- ol = refsNode.ownerDocument.createElement('ol'),
- nodeType = (refsNode.getAttribute("typeof") ||
'').replace(/mw:Extension\/references\/Marker/, '');
+ refGroup = getRefGroup(this.refGroups, group);
var dataMW = refsNode.getAttribute('data-mw');
if (!dataMW) {
@@ -421,18 +443,12 @@
});
}
- DU.addAttributes(ol, {
- 'about': about,
- 'class': 'references',
- 'data-mw': dataMW,
- 'typeof': nodeType
- });
- DU.addTypeOf(ol, "mw:Extension/references");
- ol.data = refsNode.data;
+ refsNode.removeAttribute('source');
+ refsNode.setAttribute('data-mw', dataMW);
+
if (refGroup) {
- refGroup.refs.map(refGroup.renderLine.bind(refGroup, ol));
+ refGroup.refs.map(refGroup.renderLine.bind(refGroup, refsNode));
}
- refsNode.parentNode.replaceChild(ol, refsNode);
// reset
this.reset(group);
diff --git a/js/lib/mediawiki.DOMPostProcessor.js
b/js/lib/mediawiki.DOMPostProcessor.js
index e54a0b2..a1868e7 100644
--- a/js/lib/mediawiki.DOMPostProcessor.js
+++ b/js/lib/mediawiki.DOMPostProcessor.js
@@ -2662,7 +2662,7 @@
var typeOf = child.getAttribute('typeof');
if ((/\bmw:Extension\/ref\/Marker\b/).test(typeOf)) {
refsExt.extractRefFromNode(child);
- } else if
((/\bmw:Extension\/references\/Marker\b/).test(typeOf)) {
+ } else if
((/\bmw:Extension\/references\b/).test(typeOf)) {
refsExt.insertReferencesIntoDOM(child);
} else if (child.childNodes.length > 0) {
generateReferences(refsExt, child);
diff --git a/js/lib/mediawiki.DOMUtils.js b/js/lib/mediawiki.DOMUtils.js
index 0112b84..0b747b5 100644
--- a/js/lib/mediawiki.DOMUtils.js
+++ b/js/lib/mediawiki.DOMUtils.js
@@ -552,6 +552,13 @@
},
/**
+ * Check if an element is a HTML element.
+ */
+ isHtmlElement: function (node) {
+ return Util.isHTMLElementName(node.nodeName);
+ },
+
+ /**
* Get the first child element or non-IEW text node, ignoring
* whitespace-only text nodes and comments.
*/
@@ -877,13 +884,6 @@
}
};
-
-/**
- * Check if an element is a HTML element.
- */
-DOMUtils.isHtmlElement = function (node) {
- return Util.isHTMLElementName(node.nodeName);
-};
if (typeof module === "object") {
diff --git a/js/tests/parserTests.txt b/js/tests/parserTests.txt
index 11e3454..3e67ed2 100644
--- a/js/tests/parserTests.txt
+++ b/js/tests/parserTests.txt
@@ -14417,7 +14417,7 @@
<p>A <span about="#mwt2" class="reference"
data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{"group":"a"}}'
id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a
href="#cite_note-1">[a 1]</a></span>
B <span about="#mwt4" class="reference"
data-mw='{"name":"ref","body":{"html":"bar"},"attrs":{"group":"b"}}'
id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a
href="#cite_note-1">[b 1]</a></span></p>
-<ol about="#mwt6" class="references"
data-mw='{"name":"references","attrs":{"group":"a"}}'
typeof="mw:Extension/references"><li about="#cite_note-1"
id="cite_note-1"><span rel="mw:referencedBy"><a
href="#cite_ref-1-0">↑</a></span> foo</li></ol>
+<ol about="#mwt6" class="references"
data-mw='{"name":"references","attrs":{"group":"a"}}'
typeof="mw:Extension/references" 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>
!!end
!!test
@@ -14459,7 +14459,7 @@
<p>A <span about="#mwt2" class="reference"
data-mw='{"name":"ref","body":{"html":"afoo"},"attrs":{"group":"a"}}'
id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a
href="#cite_note-1">[a 1]</a></span>
B <span about="#mwt4" class="reference"
data-mw='{"name":"ref","body":{"html":"bfoo"},"attrs":{}}' id="cite_ref-1-0"
rel="dc:references" typeof="mw:Extension/ref"
data-parsoid='{"src":"<ref>bfoo</ref>","dsr":[30,45,5,6]}'><a
href="#cite_note-1">[1]</a></span></p>
-<ol about="#mwt6" class="references"
data-mw='{"name":"references","attrs":{"group":"a"}}'
typeof="mw:Extension/references"><li about="#cite_note-1"
id="cite_note-1"><span rel="mw:referencedBy"><a
href="#cite_ref-1-0">↑</a></span> afoo</li></ol>
+<ol about="#mwt6" class="references"
data-mw='{"name":"references","attrs":{"group":"a"}}'
typeof="mw:Extension/references" 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>
<p>C <span about="#mwt8" class="reference"
data-mw='{"name":"ref","body":{"html":"cfoo"},"attrs":{}}' id="cite_ref-2-0"
rel="dc:references" typeof="mw:Extension/ref"><a
href="#cite_note-2">[2]</a></span></p>
--
To view, visit https://gerrit.wikimedia.org/r/70658
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: merged
Gerrit-Change-Id: I073b2e68667d577c75cad07d19cea2b19d0e89fe
Gerrit-PatchSet: 2
Gerrit-Project: mediawiki/extensions/Parsoid
Gerrit-Branch: master
Gerrit-Owner: Subramanya Sastry <[email protected]>
Gerrit-Reviewer: GWicke <[email protected]>
Gerrit-Reviewer: jenkins-bot
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits