editor: fix - bring back ability to select elements without text
[fnpeditor.git] / src / editor / plugins / core / footnote.js
1 define(function() {
2     
3 'use strict';
4 /* globals gettext */
5
6 var footnoteExecute = {
7     selecting: function(params) {
8         var parent = params.fragment.startNode.parent();
9         return parent.wrapText({
10             _with: {tagName: 'aside', attrs: {'class': 'footnote'}},
11             offsetStart: params.fragment.startOffset,
12             offsetEnd: params.fragment.endOffset,
13             textNodeIdx: [params.fragment.startNode.getIndex(), params.fragment.endNode.getIndex()]
14         });
15     },
16     afterCursor: function(params) {
17         var node = params.fragment.node,
18             asideNode;
19         node.document.transaction(function() {
20             asideNode = node.divideWithElementNode({tagName: 'aside', attrs:{'class': 'footnote'}}, {offset: params.fragment.offset});
21             asideNode.append({text: ''});
22         });
23         return asideNode;
24     },
25     afterNode: function(params) {
26         var node = params.fragment.node,
27             asideNode;
28         node.document.transaction(function() {
29             asideNode = node.after({tagName: 'aside', attrs:{'class': 'footnote'}}, {offset: params.fragment.offset});
30             asideNode.append({text: ''});
31         });
32         return asideNode;
33     }
34 };
35
36 var footnoteAction =  {
37     name: 'footnote',
38     params: {
39         fragment: {type: 'context', name: 'fragment'}
40     },
41     stateDefaults: {
42         icon: 'asterisk'
43     },
44     getState: function(params) {
45         if(!params.fragment || !params.fragment.isValid()) {
46             return {allowed: false};
47         }
48         if(params.fragment instanceof params.fragment.TextRangeFragment && params.fragment.hasSiblingBoundries()) {
49             return {
50                 allowed: true,
51                 description: gettext('Create footnote from selection'),
52                 execute: footnoteExecute.selecting
53             };
54         }
55         if(params.fragment instanceof params.fragment.CaretFragment) {
56             return {
57                 allowed: true,
58                 description: gettext('Insert footnote after cursor'),
59                 execute: footnoteExecute.afterCursor
60             };
61         }
62         if(params.fragment instanceof params.fragment.NodeFragment) {
63             if(params.fragment.node.isRoot()) {
64                 return {
65                     allowed: false,
66                     description: gettext('Cannot insert footnote after root node')
67                 };
68             }
69             return {
70                 allowed: true,
71                 description: gettext('Insert footnote after node'),
72                 execute: footnoteExecute.afterNode
73             };
74         }
75         return false;
76     }
77 };
78
79
80 return {
81     actions: [footnoteAction],
82 };
83
84 });