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 <gwi...@wikimedia.org>

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

Reply via email to