Catrope has uploaded a new change for review.
https://gerrit.wikimedia.org/r/280832
Change subject: Factor out undeletability from internal-ness
......................................................................
Factor out undeletability from internal-ness
This will allow us to have undeletable node types
that aren't internal nodes.
Change-Id: I44cf221311a6b2a5c5cd5bb4845a5ef39d2752ff
---
M src/dm/nodes/ve.dm.InternalItemNode.js
M src/dm/nodes/ve.dm.InternalListNode.js
M src/dm/ve.dm.Node.js
M src/dm/ve.dm.NodeFactory.js
M src/dm/ve.dm.Transaction.js
5 files changed, 36 insertions(+), 8 deletions(-)
git pull ssh://gerrit.wikimedia.org:29418/VisualEditor/VisualEditor
refs/changes/32/280832/1
diff --git a/src/dm/nodes/ve.dm.InternalItemNode.js
b/src/dm/nodes/ve.dm.InternalItemNode.js
index e69b7a7..b4cab4c 100644
--- a/src/dm/nodes/ve.dm.InternalItemNode.js
+++ b/src/dm/nodes/ve.dm.InternalItemNode.js
@@ -33,6 +33,8 @@
ve.dm.InternalItemNode.static.isInternal = true;
+ve.dm.InternalItemNode.static.isDeletable = false;
+
/* Registration */
ve.dm.modelRegistry.register( ve.dm.InternalItemNode );
diff --git a/src/dm/nodes/ve.dm.InternalListNode.js
b/src/dm/nodes/ve.dm.InternalListNode.js
index 8b80598..91eb2d8 100644
--- a/src/dm/nodes/ve.dm.InternalListNode.js
+++ b/src/dm/nodes/ve.dm.InternalListNode.js
@@ -33,6 +33,8 @@
ve.dm.InternalListNode.static.isInternal = true;
+ve.dm.InternalListNode.static.isDeletable = false;
+
/* Registration */
ve.dm.modelRegistry.register( ve.dm.InternalListNode );
diff --git a/src/dm/ve.dm.Node.js b/src/dm/ve.dm.Node.js
index d27a975..4f96912 100644
--- a/src/dm/ve.dm.Node.js
+++ b/src/dm/ve.dm.Node.js
@@ -80,6 +80,16 @@
ve.dm.Node.static.ignoreChildren = false;
/**
+ * Whether this node can be deleted. If false,
ve.dm.Transaction#newFromRemoval will silently
+ * ignore any attepts to delete this node.
+ *
+ * @static
+ * @property {boolean}
+ * @inheritable
+ */
+ve.dm.Node.static.deletable = true;
+
+/**
* Whether this node type is internal. Internal node types are ignored by the
converter.
*
* @static
diff --git a/src/dm/ve.dm.NodeFactory.js b/src/dm/ve.dm.NodeFactory.js
index 7ba6507..5a408ed 100644
--- a/src/dm/ve.dm.NodeFactory.js
+++ b/src/dm/ve.dm.NodeFactory.js
@@ -270,6 +270,20 @@
throw new Error( 'Unknown node type: ' + type );
};
+/**
+ * Check if node is deletable.
+ *
+ * @param {string} type Node type
+ * @return {boolean} Whether the node is internal
+ * @throws {Error} Unknown node type
+ */
+ve.dm.NodeFactory.prototype.isNodeDeletable = function ( type ) {
+ if ( Object.prototype.hasOwnProperty.call( this.registry, type ) ) {
+ return this.registry[ type ].static.isDeletable;
+ }
+ throw new Error( 'Unknown node type: ' + type );
+};
+
/* Initialization */
ve.dm.nodeFactory = new ve.dm.NodeFactory();
diff --git a/src/dm/ve.dm.Transaction.js b/src/dm/ve.dm.Transaction.js
index 2d4ea94..1b510fc 100644
--- a/src/dm/ve.dm.Transaction.js
+++ b/src/dm/ve.dm.Transaction.js
@@ -1115,7 +1115,7 @@
/**
* Adds a replace op to remove the desired range and, where required, splices
in retain ops
- * to prevent the deletion of internal data.
+ * to prevent the deletion of undeletable nodes.
*
* An extra `replaceMetadata` operation might be pushed at the end if the
* affected region contains metadata; see
@@ -1130,23 +1130,23 @@
ve.dm.Transaction.prototype.addSafeRemoveOps = function ( doc, removeStart,
removeEnd, removeMetadata ) {
var i, queuedRetain,
retainStart = removeStart,
- internalStackDepth = 0;
+ undeletableStackDepth = 0;
// Iterate over removal range and use a stack counter to determine if
- // we are inside an internal node
+ // we are inside an undeletable node
for ( i = removeStart; i < removeEnd; i++ ) {
- if ( doc.data.isElementData( i ) &&
ve.dm.nodeFactory.isNodeInternal( doc.data.getType( i ) ) ) {
+ if ( doc.data.isElementData( i ) &&
!ve.dm.nodeFactory.isNodeDeletable( doc.data.getType( i ) ) ) {
if ( !doc.data.isCloseElementData( i ) ) {
- if ( internalStackDepth === 0 ) {
+ if ( undeletableStackDepth === 0 ) {
if ( queuedRetain ) {
this.pushRetain( queuedRetain );
}
this.pushReplace( doc, removeStart, i -
removeStart, [], removeMetadata ? [] : undefined );
retainStart = i;
}
- internalStackDepth++;
+ undeletableStackDepth++;
} else {
- internalStackDepth--;
- if ( internalStackDepth === 0 ) {
+ undeletableStackDepth--;
+ if ( undeletableStackDepth === 0 ) {
queuedRetain = i + 1 - retainStart;
removeStart = i + 1;
}
--
To view, visit https://gerrit.wikimedia.org/r/280832
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I44cf221311a6b2a5c5cd5bb4845a5ef39d2752ff
Gerrit-PatchSet: 1
Gerrit-Project: VisualEditor/VisualEditor
Gerrit-Branch: master
Gerrit-Owner: Catrope <[email protected]>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits