jenkins-bot has submitted this change and it was merged.
Change subject: Dont wrap IEW with spans when they are in fosterable posns in
tables
......................................................................
Dont wrap IEW with spans when they are in fosterable posns in tables
* On the following wikitext snippet, Parsoid was adding span wrappers
around IEW emitted by the {{WDL}} tpl. These would then get fostered
out and introduce dirty diffs by emitting <span></span> on RTing.
----
{|
|5th {{WDL|7|2|2|3}} || 5 || 7 || 6
|}
----
* This patch makes fixes by not span-wrapping IEW in fosterable posns
in tables.
* Also fixed getAboutSiblings to continue collecting siblings across
IEW gaps when in fosterable position.
* Fixes parsing of above snippet.
* No change in parser test results (TODO: need to come up with a good
test case for this to prevent regressions).
Change-Id: Idaf069866510f63921334c272982ec6e38297bea
---
M js/lib/mediawiki.DOMPostProcessor.js
M js/lib/mediawiki.DOMUtils.js
M js/lib/mediawiki.WikitextSerializer.js
3 files changed, 37 insertions(+), 28 deletions(-)
Approvals:
GWicke: Looks good to me, approved
jenkins-bot: Verified
diff --git a/js/lib/mediawiki.DOMPostProcessor.js
b/js/lib/mediawiki.DOMPostProcessor.js
index a783f86..e11ef23 100644
--- a/js/lib/mediawiki.DOMPostProcessor.js
+++ b/js/lib/mediawiki.DOMPostProcessor.js
@@ -1329,13 +1329,19 @@
var next = n.nextSibling;
if ( n.nodeType === Node.TEXT_NODE || n.nodeType ===
Node.COMMENT_NODE ) {
- span = doc.createElement( 'span' );
- span.setAttribute( 'about', about );
- // attach the new span to the DOM
- n.parentNode.insertBefore( span, n );
- // move the text node into the span
- span.appendChild( n );
- n = span;
+ // Dont add span-wrappers in fosterable
positions
+ //
+ // NOTE: there cannot be any non-IEW text in
fosterable position
+ // since the HTML tree builder would already
have fostered it out.
+ if (!DU.isFosterablePosition(n)) {
+ span = doc.createElement( 'span' );
+ span.setAttribute( 'about', about );
+ // attach the new span to the DOM
+ n.parentNode.insertBefore( span, n );
+ // move the text node into the span
+ span.appendChild( n );
+ n = span;
+ }
} else if (n.nodeType === Node.ELEMENT_NODE) {
n.setAttribute( 'about', about );
}
diff --git a/js/lib/mediawiki.DOMUtils.js b/js/lib/mediawiki.DOMUtils.js
index 512d4a2..21a5b27 100644
--- a/js/lib/mediawiki.DOMUtils.js
+++ b/js/lib/mediawiki.DOMUtils.js
@@ -672,6 +672,22 @@
}
},
+ getAboutSiblings: function(node, about) {
+ var nodes = [node];
+
+ node = node.nextSibling;
+ while (node && (
+ this.isElt(node) && node.getAttribute('about')
=== about ||
+ this.isFosterablePosition(node) &&
!this.isElt(node) && this.isIEW(node)
+ ))
+ {
+ nodes.push(node);
+ node = node.nextSibling;
+ }
+
+ return nodes;
+ },
+
/**
* Extract transclusion and extension expansions from a DOM, and return
* them in a structure like this:
@@ -697,6 +713,8 @@
* }
*/
extractExpansions: function (doc) {
+ var DU = this;
+
var node = doc.body,
expansion,
expansions = {
@@ -705,17 +723,6 @@
files: {}
};
- function getAboutSiblings(node, about) {
- var nodes = [node];
- node = node.nextSibling;
- while (node && node.nodeType === node.ELEMENT_NODE &&
- node.getAttribute('about') === about)
- {
- nodes.push(node);
- node = node.nextSibling;
- }
- return nodes;
- }
function doExtractExpansions (node) {
var nodes, expAccum,
@@ -731,8 +738,8 @@
.test(typeOf)
&& about) ||
/\b(?:mw:Image(?:\b|\/))/.test(typeOf))
{
- DOMUtils.loadDataParsoid(node);
- nodes = getAboutSiblings(node,
about);
+ DU.loadDataParsoid(node);
+ nodes =
DU.getAboutSiblings(node, about);
var key;
if
(/\bmw:Transclusion\b/.test(typeOf)) {
expAccum =
expansions.transclusions;
@@ -817,6 +824,7 @@
* mainly for transclusion and extension processing.
*/
getWrapperTokens: function ( nodes ) {
+ var DU = this;
function makeWrapperForNode ( node ) {
var workNode;
if (node.nodeType === node.ELEMENT_NODE &&
node.childNodes.length) {
@@ -837,7 +845,7 @@
}
var res = [];
// Now convert our node to tokens
- DOMUtils.convertDOMtoTokens(res, workNode);
+ DU.convertDOMtoTokens(res, workNode);
return res;
}
@@ -846,7 +854,7 @@
// broken things up already when building the DOM for the first
time.
//var hasBlockElement = false;
//for (var i = 0; i < nodes.length; i++) {
- // if (DOMUtils.hasBlockElementDescendant(nodes[i])) {
+ // if (DU.hasBlockElementDescendant(nodes[i])) {
// hasBlockElement = true;
// break;
// }
diff --git a/js/lib/mediawiki.WikitextSerializer.js
b/js/lib/mediawiki.WikitextSerializer.js
index 679cc31..95f6d8d 100644
--- a/js/lib/mediawiki.WikitextSerializer.js
+++ b/js/lib/mediawiki.WikitextSerializer.js
@@ -2890,12 +2890,7 @@
return node;
}
- node = node.nextSibling;
- while (node && DU.isElt(node) && about === node.getAttribute('about')) {
- node = node.nextSibling;
- }
-
- return node;
+ return DU.getAboutSiblings(node, about).last().nextSibling;
};
/**
--
To view, visit https://gerrit.wikimedia.org/r/71563
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: merged
Gerrit-Change-Id: Idaf069866510f63921334c272982ec6e38297bea
Gerrit-PatchSet: 2
Gerrit-Project: mediawiki/extensions/Parsoid
Gerrit-Branch: master
Gerrit-Owner: Subramanya Sastry <[email protected]>
Gerrit-Reviewer: GWicke <[email protected]>
Gerrit-Reviewer: Subramanya Sastry <[email protected]>
Gerrit-Reviewer: jenkins-bot
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits