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