Divec has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/187633

Change subject: WIP: extend nextCursorOffset to work for non-sibling offsets
......................................................................

WIP: extend nextCursorOffset to work for non-sibling offsets

TODO: fix logic; fix tests; extend tests

Change-Id: I77463a950898be623904f01553c6688134cbbac2
---
M src/ce/ve.ce.js
1 file changed, 40 insertions(+), 11 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/VisualEditor/VisualEditor 
refs/changes/33/187633/1

diff --git a/src/ce/ve.ce.js b/src/ce/ve.ce.js
index a3ac0b1..1a76a6f 100644
--- a/src/ce/ve.ce.js
+++ b/src/ce/ve.ce.js
@@ -124,23 +124,52 @@
 };
 
 /**
- * Get the first cursor offset immediately after a node.
+ * Get the first cursor offset immediately after a DOM Element node.
  *
- * @param {Node} node DOM node
+ * @param {Node} elementNode Element node
  * @returns {Object}
  * @returns {Node} return.node
  * @returns {number} return.offset
  */
-ve.ce.nextCursorOffset = function ( node ) {
-       var nextNode, offset;
-       if ( node.nextSibling !== null && node.nextSibling.nodeType === 
Node.TEXT_NODE ) {
-               nextNode = node.nextSibling;
-               offset = 0;
-       } else {
-               nextNode = node.parentNode;
-               offset = 1 + Array.prototype.indexOf.call( 
node.parentNode.childNodes, node );
+ve.ce.nextCursorOffset = function ( elementNode ) {
+       var nextNode = ve.ce.nextEditLeaf( elementNode );
+       if ( nextNode === null ) {
+               // Stay on this node
+               nextNode = elementNode;
+       } else if ( nextNode.nodeType === Node.TEXT_NODE ) {
+               return { node: nextNode, offset: 0 };
        }
-       return { node: nextNode, offset: offset };
+
+       // Return the offset after the node
+       return {
+               node: nextNode.parentNode,
+               offset: 1 + Array.prototype.indexOf.call( 
nextNode.parentNode.childNodes, nextNode )
+       };
+};
+
+/**
+ * Get the next non-descendent "edit leaf node" within the current branch node
+ *
+ * A node is an "edit leaf node" if it is a DOM leaf node or is not 
contenteditable
+ * @param {Node} node DOM node
+ * @returns {Node|null} Next node
+ */
+ve.ce.nextEditLeaf = function ( node ) {
+       while ( node.nextSibling === null ) {
+               node = node.parentNode;
+               if ( node === null || node.classList.contains( 
've-ce-branchNode' ) ) {
+                       return null;
+               }
+       }
+       node = node.nextSibling;
+       while (
+               node.nodeType === Node.ELEMENT_NODE &&
+               node.isContentEditable &&
+               node.childNodes.length > 1
+       ) {
+               node = node.childNodes[0];
+       }
+       return node;
 };
 
 /**

-- 
To view, visit https://gerrit.wikimedia.org/r/187633
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I77463a950898be623904f01553c6688134cbbac2
Gerrit-PatchSet: 1
Gerrit-Project: VisualEditor/VisualEditor
Gerrit-Branch: master
Gerrit-Owner: Divec <[email protected]>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to