GWicke has uploaded a new change for review.
https://gerrit.wikimedia.org/r/79430
Change subject: Bug 50603: Handle |{{echo|{{!}} Foo}}
......................................................................
Bug 50603: Handle |{{echo|{{!}} Foo}}
Add a DOM post-processor pass that fixes the handling of this test case:
{|
|{{echo|{{!}} Foo}}
|}
The first td is removed and the appropriate adjustments to the
transclusion-generated td are performed (DSR adjustment, data-mw updates).
Also add two test cases to verify wt2html, wt2wt and html2wt modes.
This is the first (and easier) part of bug 50603, the second part is still
TODO.
Change-Id: Ibb3fbfdaf71d2242d9b7c6ca0d9f1ab29f56e616
---
A js/lib/dom.t.TDFixups.js
M js/lib/mediawiki.DOMPostProcessor.js
M js/tests/parserTests.txt
3 files changed, 110 insertions(+), 1 deletion(-)
git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/Parsoid
refs/changes/30/79430/1
diff --git a/js/lib/dom.t.TDFixups.js b/js/lib/dom.t.TDFixups.js
new file mode 100644
index 0000000..2b14ca7
--- /dev/null
+++ b/js/lib/dom.t.TDFixups.js
@@ -0,0 +1,80 @@
+var DU = require('./mediawiki.DOMUtils.js').DOMUtils;
+
+
+/**
+ * Strip the double td for this test case:
+ * |{{echo|{{!}} Foo}}
+ *
+ * See https://bugzilla.wikimedia.org/show_bug.cgi?id=50603
+ */
+function stripDoubleTDs (env, node) {
+ var nextNode = node.nextSibling;
+
+ /* Does `node` contain nothing or just non-newline whitespace? */
+ function nodeEssentiallyEmpty(node) {
+ var childNodes = node.childNodes;
+ if (0 === childNodes.length) {
+ return true;
+ } else if (childNodes.length > 1) {
+ return false;
+ } else {
+ var child = childNodes[0];
+ return (child.nodeName === "#text" &&
+ /^[ \t]*$/.test(child.nodeValue));
+ }
+ }
+
+ if (!DU.isLiteralHTMLNode(node) &&
+ node.data.parsoid.autoInsertedEnd === true &&
+ nextNode !== null &&
+ nextNode.nodeName === 'TD' &&
+ !DU.isLiteralHTMLNode(nextNode) &&
+ DU.isTplElementNode(env, nextNode) &&
+ nodeEssentiallyEmpty(node))
+ {
+ console.log(nextNode.outerHTML);
+ // Update the dsr. Since we are coalescing the first
+ // node with the second (or, more precisely, deleting
+ // the first node), we have to update the second DSR's
+ // starting point and start tag width.
+ var nodeDSR = node.data.parsoid.dsr,
+ nextNodeDSR = nextNode.data.parsoid.dsr;
+
+ if (nodeDSR && nextNodeDSR) {
+ nextNodeDSR[0] = nodeDSR[0];
+ }
+
+ // Now update data-mw
+ // XXX: use data.mw for data-mw as well!
+ var dataMW = DU.getJSONAttribute(nextNode, 'data-mw'),
+ nodeSrc = DU.getWTSource(env, node);
+ if (!dataMW.parts) {
+ dataMW.parts = [
+ nodeSrc,
+ {
+ template: {
+ target: dataMW.target,
+ params: dataMW.params,
+ i: 0
+ }
+ }
+ ];
+ dataMW.target = undefined;
+ dataMW.params = undefined;
+ } else {
+ dataMW.unshift(nodeSrc);
+ }
+ DU.setJSONAttribute(nextNode, 'data-mw', dataMW);
+
+ // Delete the duplicated <td> node.
+ node.parentNode.removeChild(node);
+ // This node was deleted, so don't continue processing on it.
+ return nextNode;
+ }
+
+ return true;
+}
+
+if (typeof module === "object") {
+ module.exports.stripDoubleTDs = stripDoubleTDs;
+}
diff --git a/js/lib/mediawiki.DOMPostProcessor.js
b/js/lib/mediawiki.DOMPostProcessor.js
index d06ffd2..962e983 100644
--- a/js/lib/mediawiki.DOMPostProcessor.js
+++ b/js/lib/mediawiki.DOMPostProcessor.js
@@ -10,7 +10,9 @@
wtc = require('./mediawiki.wikitext.constants.js'),
Consts = wtc.WikitextConstants,
Node = wtc.Node,
- domino = require('./domino');
+ domino = require('./domino'),
+
+ TDFixups = require('./dom.t.TDFixups.js');
// map from mediawiki metadata names to RDFa property names
var metadataMap = {
@@ -3050,6 +3052,7 @@
var domVisitor2 = new DOMTraverser();
domVisitor2.addHandler( 'meta', stripMarkerMetas.bind(null,
env.conf.parsoid.editMode) );
domVisitor2.addHandler( 'li', cleanUpLIHack.bind( null, env ) );
+ domVisitor2.addHandler( 'td', TDFixups.stripDoubleTDs.bind( null, env )
);
domVisitor2.addHandler( null, cleanupAndSaveDataParsoid );
this.processors.push(domVisitor2.traverse.bind(domVisitor2));
}
diff --git a/js/tests/parserTests.txt b/js/tests/parserTests.txt
index dfe6161..19fdd06 100644
--- a/js/tests/parserTests.txt
+++ b/js/tests/parserTests.txt
@@ -7134,6 +7134,32 @@
<p>b</p>
!! end
+!! test
+Parsoid: Merge double tds (bug 50603)
+!! options
+parsoid=wt2html,wt2wt
+!! input
+{|
+|{{echo|{{!}} foo}}
+|}
+!! result
+<table>
+<tbody><td about="#mwt1" typeof="mw:Transclusion">foo</td></tr></tbody></table>
+!! end
+
+!! test
+Parsoid: Merge double tds (bug 50603)
+!! options
+parsoid=html2wt
+!! input
+{|
+|{{echo|{{!}}foo}}
+|}
+!! result
+<table>
+<tbody><td about="#mwt1" typeof="mw:Transclusion"
data-mw='{"i":0,"parts":["|",{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"{{!}}foo"}},"i":0}}]}'>foo</td></tr></tbody></table>
+!! end
+
###
### <includeonly> and <noinclude> in attributes
###
--
To view, visit https://gerrit.wikimedia.org/r/79430
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: Ibb3fbfdaf71d2242d9b7c6ca0d9f1ab29f56e616
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/Parsoid
Gerrit-Branch: master
Gerrit-Owner: GWicke <[email protected]>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits