GWicke has uploaded a new change for review.
https://gerrit.wikimedia.org/r/59729
Change subject: WIP: Use look-ahead for more precise diff results
......................................................................
WIP: Use look-ahead for more precise diff results
The DOM diff algorithm was not using any look-ahead when a shallow comparison
of nodes found no difference. This caused it to detect insertions and
deletions like this:
* foo
* bar
->
* bar
This patch fixes this by performing look-ahead whenever a deep comparison
fails. In this example, it detects that a list item was deleted and does not
mark the remaining (unchanged) list item as modified.
Overall, three additional selser tests are failing. Two are related to
escaping of nowiki tags, and another is exposing the old issue of list items
emitting all bullets while its dsr only covers one bullet.
TODO:
* Investigate extra failures
* Abstract out common recursive case / clean up
Change-Id: I65379445a93229687198dd2be25e1640e575cced
---
M js/lib/mediawiki.DOMDiff.js
1 file changed, 26 insertions(+), 12 deletions(-)
git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/Parsoid
refs/changes/29/59729/1
diff --git a/js/lib/mediawiki.DOMDiff.js b/js/lib/mediawiki.DOMDiff.js
index cdec7c0..7e580cc 100644
--- a/js/lib/mediawiki.DOMDiff.js
+++ b/js/lib/mediawiki.DOMDiff.js
@@ -171,7 +171,8 @@
var baseNode = baseParentNode.firstChild,
newNode = newParentNode.firstChild,
lookaheadNode = null,
- foundDiffOverall = false;
+ foundDiffOverall = false,
+ subtreeDiffers;
while ( baseNode && newNode ) {
if (this.debugging) {
console.warn("--> A: " + (DU.isElt(baseNode) ?
baseNode.outerHTML : JSON.stringify(baseNode.nodeValue)));
@@ -179,7 +180,7 @@
}
// Quick shallow equality check first
- if ( ! this.treeEquals(baseNode, newNode, false) ) {
+ if ( ! this.treeEquals(baseNode, newNode, true) ) {
var origNode = newNode,
foundDiff = false;
@@ -229,22 +230,35 @@
}
if (!foundDiff) {
- if (origNode.nodeName === baseNode.nodeName) {
- // Identical wrapper-type, but modified.
- // Mark as modified, and recurse.
- this.markNode(origNode,
'modified-wrapper');
- this.doDOMDiff(baseNode, origNode);
+ if (this.treeEquals(baseNode, newNode, false)) {
+ if (!DU.isTplElementNode(this.env,
newNode)) {
+ // recursive call
+ // Recursively diff subtrees if
not template-like content
+ subtreeDiffers =
this.doDOMDiff(baseNode, newNode);
+ if (subtreeDiffers) {
+ this.markNode(newNode,
'subtree-changed');
+ }
+ foundDiff = subtreeDiffers ||
foundDiffOverall;
+ }
} else {
- // Mark the sub-tree as modified since
- // we have two entirely different nodes
here
- this.markNode(origNode, 'modified');
+ if (origNode.nodeName ===
baseNode.nodeName) {
+ // Identical wrapper-type, but
modified.
+ // Mark as modified, and
recurse.
+ this.markNode(origNode,
'modified-wrapper');
+ this.doDOMDiff(baseNode,
origNode);
+ } else {
+ // Mark the sub-tree as
modified since
+ // we have two entirely
different nodes here
+ this.markNode(origNode,
'modified');
+ }
+ foundDiff = true;
}
}
- foundDiffOverall = true;
+ foundDiffOverall = foundDiff;
} else if(!DU.isTplElementNode(this.env, newNode)) {
// Recursively diff subtrees if not template-like
content
- var subtreeDiffers = this.doDOMDiff(baseNode, newNode);
+ subtreeDiffers = this.doDOMDiff(baseNode, newNode);
if (subtreeDiffers) {
this.markNode(newNode, 'subtree-changed');
}
--
To view, visit https://gerrit.wikimedia.org/r/59729
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I65379445a93229687198dd2be25e1640e575cced
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