editor: actions implementation
[fnpeditor.git] / src / editor / plugins / core / footnote.js
diff --git a/src/editor/plugins/core/footnote.js b/src/editor/plugins/core/footnote.js
new file mode 100644 (file)
index 0000000..2fa314a
--- /dev/null
@@ -0,0 +1,84 @@
+define(function() {
+    
+'use strict';
+/* globals gettext */
+
+var footnoteExecute = {
+    selecting: function(params) {
+        var parent = params.fragment.startNode.parent();
+        return parent.wrapText({
+            _with: {tagName: 'aside', attrs: {'class': 'footnote'}},
+            offsetStart: params.fragment.startOffset,
+            offsetEnd: params.fragment.endOffset,
+            textNodeIdx: [params.fragment.startNode.getIndex(), params.fragment.endNode.getIndex()]
+        });
+    },
+    afterCursor: function(params) {
+        var node = params.fragment.node,
+            asideNode;
+        node.document.transaction(function() {
+            asideNode = node.divideWithElementNode({tagName: 'aside', attrs:{'class': 'footnote'}}, {offset: params.fragment.offset});
+            asideNode.append({text: ''});
+        });
+        return asideNode;
+    },
+    afterNode: function(params) {
+        var node = params.fragment.node,
+            asideNode;
+        node.document.transaction(function() {
+            asideNode = node.after({tagName: 'aside', attrs:{'class': 'footnote'}}, {offset: params.fragment.offset});
+            asideNode.append({text: ''});
+        });
+        return asideNode;
+    }
+};
+
+var footnoteAction =  {
+    name: 'footnote',
+    params: {
+        fragment: {type: 'context', name: 'fragment'}
+    },
+    stateDefaults: {
+        icon: 'asterisk'
+    },
+    getState: function(params) {
+        if(!params.fragment || !params.fragment.isValid()) {
+            return {allowed: false};
+        }
+        if(params.fragment instanceof params.fragment.TextRangeFragment && params.fragment.hasSiblingBoundries()) {
+            return {
+                allowed: true,
+                description: gettext('Create footnote from selection'),
+                execute: footnoteExecute.selecting
+            };
+        }
+        if(params.fragment instanceof params.fragment.CaretFragment) {
+            return {
+                allowed: true,
+                description: gettext('Insert footnote after cursor'),
+                execute: footnoteExecute.afterCursor
+            };
+        }
+        if(params.fragment instanceof params.fragment.NodeFragment) {
+            if(params.fragment.node.isRoot()) {
+                return {
+                    allowed: false,
+                    description: gettext('Cannot insert footnote after root node')
+                };
+            }
+            return {
+                allowed: true,
+                description: gettext('Insert footnote after node'),
+                execute: footnoteExecute.afterNode
+            };
+        }
+        return false;
+    }
+};
+
+
+return {
+    actions: [footnoteAction],
+};
+
+});
\ No newline at end of file