@standardnotes/bold-editor 1.6.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.babelrc +11 -0
- package/.eslintignore +3 -0
- package/.eslintrc +29 -0
- package/CHANGELOG.md +82 -0
- package/LICENSE +661 -0
- package/README.md +98 -0
- package/app/App.js +18 -0
- package/app/components/Editor.js +415 -0
- package/app/main.js +8 -0
- package/app/stylesheets/main.scss +272 -0
- package/dist/dist.css +1 -0
- package/dist/dist.min.js +2 -0
- package/dist/dist.min.js.LICENSE.txt +42 -0
- package/dist/filesafe-js/EncryptionWorker.js +2 -0
- package/dist/filesafe-js/EncryptionWorker.js.LICENSE.txt +5 -0
- package/dist/index.html +1 -0
- package/dist/vendor.css +6 -0
- package/dist/vendor.js +1 -0
- package/editor.index.ejs +14 -0
- package/editor_bar.png +0 -0
- package/ext.json.sample +9 -0
- package/package.json +54 -0
- package/redactor/plugins/alignment/alignment.js +55 -0
- package/redactor/plugins/alignment/alignment.min.js +1 -0
- package/redactor/plugins/counter/counter.js +76 -0
- package/redactor/plugins/counter/counter.min.js +1 -0
- package/redactor/plugins/filesafe/filesafe.js +70 -0
- package/redactor/plugins/filesafe/filesafe.min.js +70 -0
- package/redactor/plugins/fontcolor/fontcolor.js +184 -0
- package/redactor/plugins/fontcolor/fontcolor.min.js +1 -0
- package/redactor/plugins/fontfamily/fontfamily.js +59 -0
- package/redactor/plugins/fontfamily/fontfamily.min.js +1 -0
- package/redactor/plugins/fontsize/fontsize.js +58 -0
- package/redactor/plugins/fontsize/fontsize.min.js +1 -0
- package/redactor/plugins/imagemanager/imagemanager.js +82 -0
- package/redactor/plugins/imagemanager/imagemanager.min.js +1 -0
- package/redactor/plugins/inlinestyle/inlinestyle.css +34 -0
- package/redactor/plugins/inlinestyle/inlinestyle.js +62 -0
- package/redactor/plugins/inlinestyle/inlinestyle.min.css +1 -0
- package/redactor/plugins/inlinestyle/inlinestyle.min.js +1 -0
- package/redactor/plugins/specialchars/specialchars.js +78 -0
- package/redactor/plugins/specialchars/specialchars.min.js +1 -0
- package/redactor/plugins/table/table.js +477 -0
- package/redactor/plugins/table/table.min.js +1 -0
- package/redactor/plugins/textdirection/textdirection.js +44 -0
- package/redactor/plugins/textdirection/textdirection.min.js +1 -0
- package/redactor/plugins/textexpander/textexpander.js +64 -0
- package/redactor/plugins/textexpander/textexpander.min.js +1 -0
- package/redactor/plugins/variable/variable.css +23 -0
- package/redactor/plugins/variable/variable.js +222 -0
- package/redactor/plugins/variable/variable.min.css +1 -0
- package/redactor/plugins/variable/variable.min.js +1 -0
- package/redactor/src/redactor.min.css +1 -0
- package/redactor/src/redactor.min.js +1 -0
- package/webpack.config.js +82 -0
- package/webpack.dev.js +20 -0
- package/webpack.prod.js +11 -0
|
@@ -0,0 +1,477 @@
|
|
|
1
|
+
(function($R)
|
|
2
|
+
{
|
|
3
|
+
$R.add('plugin', 'table', {
|
|
4
|
+
translations: {
|
|
5
|
+
en: {
|
|
6
|
+
"table": "Table",
|
|
7
|
+
"insert-table": "Insert table",
|
|
8
|
+
"insert-row-above": "Insert row above",
|
|
9
|
+
"insert-row-below": "Insert row below",
|
|
10
|
+
"insert-column-left": "Insert column left",
|
|
11
|
+
"insert-column-right": "Insert column right",
|
|
12
|
+
"add-head": "Add head",
|
|
13
|
+
"delete-head": "Delete head",
|
|
14
|
+
"delete-column": "Delete column",
|
|
15
|
+
"delete-row": "Delete row",
|
|
16
|
+
"delete-table": "Delete table"
|
|
17
|
+
}
|
|
18
|
+
},
|
|
19
|
+
init: function(app)
|
|
20
|
+
{
|
|
21
|
+
this.app = app;
|
|
22
|
+
this.lang = app.lang;
|
|
23
|
+
this.opts = app.opts;
|
|
24
|
+
this.caret = app.caret;
|
|
25
|
+
this.editor = app.editor;
|
|
26
|
+
this.toolbar = app.toolbar;
|
|
27
|
+
this.component = app.component;
|
|
28
|
+
this.inspector = app.inspector;
|
|
29
|
+
this.insertion = app.insertion;
|
|
30
|
+
this.selection = app.selection;
|
|
31
|
+
},
|
|
32
|
+
// messages
|
|
33
|
+
ondropdown: {
|
|
34
|
+
table: {
|
|
35
|
+
observe: function(dropdown)
|
|
36
|
+
{
|
|
37
|
+
this._observeDropdown(dropdown);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
},
|
|
41
|
+
onbottomclick: function()
|
|
42
|
+
{
|
|
43
|
+
this.insertion.insertToEnd(this.editor.getLastNode(), 'table');
|
|
44
|
+
},
|
|
45
|
+
|
|
46
|
+
// public
|
|
47
|
+
start: function()
|
|
48
|
+
{
|
|
49
|
+
var dropdown = {
|
|
50
|
+
observe: 'table',
|
|
51
|
+
'insert-table': {
|
|
52
|
+
title: this.lang.get('insert-table'),
|
|
53
|
+
api: 'plugin.table.insert'
|
|
54
|
+
},
|
|
55
|
+
'insert-row-above': {
|
|
56
|
+
title: this.lang.get('insert-row-above'),
|
|
57
|
+
classname: 'redactor-table-item-observable',
|
|
58
|
+
api: 'plugin.table.addRowAbove'
|
|
59
|
+
},
|
|
60
|
+
'insert-row-below': {
|
|
61
|
+
title: this.lang.get('insert-row-below'),
|
|
62
|
+
classname: 'redactor-table-item-observable',
|
|
63
|
+
api: 'plugin.table.addRowBelow'
|
|
64
|
+
},
|
|
65
|
+
'insert-column-left': {
|
|
66
|
+
title: this.lang.get('insert-column-left'),
|
|
67
|
+
classname: 'redactor-table-item-observable',
|
|
68
|
+
api: 'plugin.table.addColumnLeft'
|
|
69
|
+
},
|
|
70
|
+
'insert-column-right': {
|
|
71
|
+
title: this.lang.get('insert-column-right'),
|
|
72
|
+
classname: 'redactor-table-item-observable',
|
|
73
|
+
api: 'plugin.table.addColumnRight'
|
|
74
|
+
},
|
|
75
|
+
'add-head': {
|
|
76
|
+
title: this.lang.get('add-head'),
|
|
77
|
+
classname: 'redactor-table-item-observable',
|
|
78
|
+
api: 'plugin.table.addHead'
|
|
79
|
+
},
|
|
80
|
+
'delete-head': {
|
|
81
|
+
title: this.lang.get('delete-head'),
|
|
82
|
+
classname: 'redactor-table-item-observable',
|
|
83
|
+
api: 'plugin.table.deleteHead'
|
|
84
|
+
},
|
|
85
|
+
'delete-column': {
|
|
86
|
+
title: this.lang.get('delete-column'),
|
|
87
|
+
classname: 'redactor-table-item-observable',
|
|
88
|
+
api: 'plugin.table.deleteColumn'
|
|
89
|
+
},
|
|
90
|
+
'delete-row': {
|
|
91
|
+
title: this.lang.get('delete-row'),
|
|
92
|
+
classname: 'redactor-table-item-observable',
|
|
93
|
+
api: 'plugin.table.deleteRow'
|
|
94
|
+
},
|
|
95
|
+
'delete-table': {
|
|
96
|
+
title: this.lang.get('delete-table'),
|
|
97
|
+
classname: 'redactor-table-item-observable',
|
|
98
|
+
api: 'plugin.table.deleteTable'
|
|
99
|
+
}
|
|
100
|
+
};
|
|
101
|
+
var obj = {
|
|
102
|
+
title: this.lang.get('table')
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
var $button = this.toolbar.addButtonBefore('link', 'table', obj);
|
|
106
|
+
$button.setIcon('<i class="re-icon-table"></i>');
|
|
107
|
+
$button.setDropdown(dropdown);
|
|
108
|
+
},
|
|
109
|
+
insert: function()
|
|
110
|
+
{
|
|
111
|
+
var rows = 2;
|
|
112
|
+
var columns = 3;
|
|
113
|
+
var $component = this.component.create('table');
|
|
114
|
+
|
|
115
|
+
for (var i = 0; i < rows; i++)
|
|
116
|
+
{
|
|
117
|
+
$component.addRow(columns);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
$component = this.insertion.insertHtml($component);
|
|
121
|
+
this.caret.setStart($component);
|
|
122
|
+
},
|
|
123
|
+
addRowAbove: function()
|
|
124
|
+
{
|
|
125
|
+
var $component = this._getComponent();
|
|
126
|
+
if ($component)
|
|
127
|
+
{
|
|
128
|
+
var current = this.selection.getCurrent();
|
|
129
|
+
var $row = $component.addRowTo(current, 'before');
|
|
130
|
+
|
|
131
|
+
this.caret.setStart($row);
|
|
132
|
+
}
|
|
133
|
+
},
|
|
134
|
+
addRowBelow: function()
|
|
135
|
+
{
|
|
136
|
+
var $component = this._getComponent();
|
|
137
|
+
if ($component)
|
|
138
|
+
{
|
|
139
|
+
var current = this.selection.getCurrent();
|
|
140
|
+
var $row = $component.addRowTo(current, 'after');
|
|
141
|
+
|
|
142
|
+
this.caret.setStart($row);
|
|
143
|
+
}
|
|
144
|
+
},
|
|
145
|
+
addColumnLeft: function()
|
|
146
|
+
{
|
|
147
|
+
var $component = this._getComponent();
|
|
148
|
+
if ($component)
|
|
149
|
+
{
|
|
150
|
+
var current = this.selection.getCurrent();
|
|
151
|
+
|
|
152
|
+
this.selection.save();
|
|
153
|
+
$component.addColumnTo(current, 'left');
|
|
154
|
+
this.selection.restore();
|
|
155
|
+
}
|
|
156
|
+
},
|
|
157
|
+
addColumnRight: function()
|
|
158
|
+
{
|
|
159
|
+
var $component = this._getComponent();
|
|
160
|
+
if ($component)
|
|
161
|
+
{
|
|
162
|
+
var current = this.selection.getCurrent();
|
|
163
|
+
|
|
164
|
+
this.selection.save();
|
|
165
|
+
$component.addColumnTo(current, 'right');
|
|
166
|
+
this.selection.restore();
|
|
167
|
+
}
|
|
168
|
+
},
|
|
169
|
+
addHead: function()
|
|
170
|
+
{
|
|
171
|
+
var $component = this._getComponent();
|
|
172
|
+
if ($component)
|
|
173
|
+
{
|
|
174
|
+
this.selection.save();
|
|
175
|
+
$component.addHead();
|
|
176
|
+
this.selection.restore();
|
|
177
|
+
}
|
|
178
|
+
},
|
|
179
|
+
deleteHead: function()
|
|
180
|
+
{
|
|
181
|
+
var $component = this._getComponent();
|
|
182
|
+
if ($component)
|
|
183
|
+
{
|
|
184
|
+
var current = this.selection.getCurrent();
|
|
185
|
+
var $head = $R.dom(current).closest('thead');
|
|
186
|
+
if ($head.length !== 0)
|
|
187
|
+
{
|
|
188
|
+
$component.removeHead();
|
|
189
|
+
this.caret.setStart($component);
|
|
190
|
+
}
|
|
191
|
+
else
|
|
192
|
+
{
|
|
193
|
+
this.selection.save();
|
|
194
|
+
$component.removeHead();
|
|
195
|
+
this.selection.restore();
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
},
|
|
199
|
+
deleteColumn: function()
|
|
200
|
+
{
|
|
201
|
+
var $component = this._getComponent();
|
|
202
|
+
if ($component)
|
|
203
|
+
{
|
|
204
|
+
var current = this.selection.getCurrent();
|
|
205
|
+
|
|
206
|
+
var $currentCell = $R.dom(current).closest('td, th');
|
|
207
|
+
var nextCell = $currentCell.nextElement().get();
|
|
208
|
+
var prevCell = $currentCell.prevElement().get();
|
|
209
|
+
|
|
210
|
+
$component.removeColumn(current);
|
|
211
|
+
|
|
212
|
+
if (nextCell) this.caret.setStart(nextCell);
|
|
213
|
+
else if (prevCell) this.caret.setEnd(prevCell);
|
|
214
|
+
else this.deleteTable();
|
|
215
|
+
}
|
|
216
|
+
},
|
|
217
|
+
deleteRow: function()
|
|
218
|
+
{
|
|
219
|
+
var $component = this._getComponent();
|
|
220
|
+
if ($component)
|
|
221
|
+
{
|
|
222
|
+
var current = this.selection.getCurrent();
|
|
223
|
+
|
|
224
|
+
var $currentRow = $R.dom(current).closest('tr');
|
|
225
|
+
var nextRow = $currentRow.nextElement().get();
|
|
226
|
+
var prevRow = $currentRow.prevElement().get();
|
|
227
|
+
var $head = $R.dom(current).closest('thead');
|
|
228
|
+
|
|
229
|
+
$component.removeRow(current);
|
|
230
|
+
|
|
231
|
+
if (nextRow) this.caret.setStart(nextRow);
|
|
232
|
+
else if (prevRow) this.caret.setEnd(prevRow);
|
|
233
|
+
else if ($head.length !== 0) {
|
|
234
|
+
$component.removeHead();
|
|
235
|
+
this.caret.setStart($component);
|
|
236
|
+
}
|
|
237
|
+
else this.deleteTable();
|
|
238
|
+
}
|
|
239
|
+
},
|
|
240
|
+
deleteTable: function()
|
|
241
|
+
{
|
|
242
|
+
var table = this._getTable();
|
|
243
|
+
if (table)
|
|
244
|
+
{
|
|
245
|
+
this.component.remove(table);
|
|
246
|
+
}
|
|
247
|
+
},
|
|
248
|
+
|
|
249
|
+
// private
|
|
250
|
+
_getTable: function()
|
|
251
|
+
{
|
|
252
|
+
var current = this.selection.getCurrent();
|
|
253
|
+
var data = this.inspector.parse(current);
|
|
254
|
+
if (data.isTable())
|
|
255
|
+
{
|
|
256
|
+
return data.getTable();
|
|
257
|
+
}
|
|
258
|
+
},
|
|
259
|
+
_getComponent: function()
|
|
260
|
+
{
|
|
261
|
+
var current = this.selection.getCurrent();
|
|
262
|
+
var data = this.inspector.parse(current);
|
|
263
|
+
if (data.isTable())
|
|
264
|
+
{
|
|
265
|
+
var table = data.getTable();
|
|
266
|
+
|
|
267
|
+
return this.component.create('table', table);
|
|
268
|
+
}
|
|
269
|
+
},
|
|
270
|
+
_observeDropdown: function(dropdown)
|
|
271
|
+
{
|
|
272
|
+
var table = this._getTable();
|
|
273
|
+
var items = dropdown.getItemsByClass('redactor-table-item-observable');
|
|
274
|
+
var tableItem = dropdown.getItem('insert-table');
|
|
275
|
+
if (table)
|
|
276
|
+
{
|
|
277
|
+
this._observeItems(items, 'enable');
|
|
278
|
+
tableItem.disable();
|
|
279
|
+
}
|
|
280
|
+
else
|
|
281
|
+
{
|
|
282
|
+
this._observeItems(items, 'disable');
|
|
283
|
+
tableItem.enable();
|
|
284
|
+
}
|
|
285
|
+
},
|
|
286
|
+
_observeItems: function(items, type)
|
|
287
|
+
{
|
|
288
|
+
for (var i = 0; i < items.length; i++)
|
|
289
|
+
{
|
|
290
|
+
items[i][type]();
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
});
|
|
294
|
+
})(Redactor);
|
|
295
|
+
(function($R)
|
|
296
|
+
{
|
|
297
|
+
$R.add('class', 'table.component', {
|
|
298
|
+
mixins: ['dom', 'component'],
|
|
299
|
+
init: function(app, el)
|
|
300
|
+
{
|
|
301
|
+
this.app = app;
|
|
302
|
+
|
|
303
|
+
// init
|
|
304
|
+
return (el && el.cmnt !== undefined) ? el : this._init(el);
|
|
305
|
+
},
|
|
306
|
+
|
|
307
|
+
// public
|
|
308
|
+
addHead: function()
|
|
309
|
+
{
|
|
310
|
+
this.removeHead();
|
|
311
|
+
|
|
312
|
+
var columns = this.$element.find('tr').first().children('td, th').length;
|
|
313
|
+
var $head = $R.dom('<thead>');
|
|
314
|
+
var $row = this._buildRow(columns, '<th>');
|
|
315
|
+
|
|
316
|
+
$head.append($row);
|
|
317
|
+
this.$element.prepend($head);
|
|
318
|
+
},
|
|
319
|
+
addRow: function(columns)
|
|
320
|
+
{
|
|
321
|
+
var $row = this._buildRow(columns);
|
|
322
|
+
this.$element.append($row);
|
|
323
|
+
|
|
324
|
+
return $row;
|
|
325
|
+
},
|
|
326
|
+
addRowTo: function(current, type)
|
|
327
|
+
{
|
|
328
|
+
return this._addRowTo(current, type);
|
|
329
|
+
},
|
|
330
|
+
addColumnTo: function(current, type)
|
|
331
|
+
{
|
|
332
|
+
var $current = $R.dom(current);
|
|
333
|
+
var $currentRow = $current.closest('tr');
|
|
334
|
+
var $currentCell = $current.closest('td, th');
|
|
335
|
+
|
|
336
|
+
var index = 0;
|
|
337
|
+
$currentRow.find('td, th').each(function(node, i)
|
|
338
|
+
{
|
|
339
|
+
if (node === $currentCell.get()) index = i;
|
|
340
|
+
});
|
|
341
|
+
|
|
342
|
+
this.$element.find('tr').each(function(node)
|
|
343
|
+
{
|
|
344
|
+
var $node = $R.dom(node);
|
|
345
|
+
var origCell = $node.find('td, th').get(index);
|
|
346
|
+
var $origCell = $R.dom(origCell);
|
|
347
|
+
|
|
348
|
+
var $td = $origCell.clone();
|
|
349
|
+
$td.html('<div data-redactor-tag="tbr"></div>');
|
|
350
|
+
|
|
351
|
+
if (type === 'right') $origCell.after($td);
|
|
352
|
+
else $origCell.before($td);
|
|
353
|
+
});
|
|
354
|
+
},
|
|
355
|
+
removeHead: function()
|
|
356
|
+
{
|
|
357
|
+
var $head = this.$element.find('thead');
|
|
358
|
+
if ($head.length !== 0) $head.remove();
|
|
359
|
+
},
|
|
360
|
+
removeRow: function(current)
|
|
361
|
+
{
|
|
362
|
+
var $current = $R.dom(current);
|
|
363
|
+
var $currentRow = $current.closest('tr');
|
|
364
|
+
|
|
365
|
+
$currentRow.remove();
|
|
366
|
+
},
|
|
367
|
+
removeColumn: function(current)
|
|
368
|
+
{
|
|
369
|
+
var $current = $R.dom(current);
|
|
370
|
+
var $currentRow = $current.closest('tr');
|
|
371
|
+
var $currentCell = $current.closest('td, th');
|
|
372
|
+
|
|
373
|
+
var index = 0;
|
|
374
|
+
$currentRow.find('td, th').each(function(node, i)
|
|
375
|
+
{
|
|
376
|
+
if (node === $currentCell.get()) index = i;
|
|
377
|
+
});
|
|
378
|
+
|
|
379
|
+
this.$element.find('tr').each(function(node)
|
|
380
|
+
{
|
|
381
|
+
var $node = $R.dom(node);
|
|
382
|
+
var origCell = $node.find('td, th').get(index);
|
|
383
|
+
var $origCell = $R.dom(origCell);
|
|
384
|
+
|
|
385
|
+
$origCell.remove();
|
|
386
|
+
});
|
|
387
|
+
},
|
|
388
|
+
|
|
389
|
+
// private
|
|
390
|
+
_init: function(el)
|
|
391
|
+
{
|
|
392
|
+
var wrapper, element;
|
|
393
|
+
if (typeof el !== 'undefined')
|
|
394
|
+
{
|
|
395
|
+
var $node = $R.dom(el);
|
|
396
|
+
var node = $node.get();
|
|
397
|
+
var $figure = $node.closest('figure');
|
|
398
|
+
if ($figure.length !== 0)
|
|
399
|
+
{
|
|
400
|
+
wrapper = $figure;
|
|
401
|
+
element = $figure.find('table').get();
|
|
402
|
+
}
|
|
403
|
+
else if (node.tagName === 'TABLE')
|
|
404
|
+
{
|
|
405
|
+
element = node;
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
this._buildWrapper(wrapper);
|
|
410
|
+
this._buildElement(element);
|
|
411
|
+
this._initWrapper();
|
|
412
|
+
},
|
|
413
|
+
_addRowTo: function(current, position)
|
|
414
|
+
{
|
|
415
|
+
var $current = $R.dom(current);
|
|
416
|
+
var $currentRow = $current.closest('tr');
|
|
417
|
+
if ($currentRow.length !== 0)
|
|
418
|
+
{
|
|
419
|
+
var columns = $currentRow.children('td, th').length;
|
|
420
|
+
var $newRow = this._buildRow(columns);
|
|
421
|
+
|
|
422
|
+
$currentRow[position]($newRow);
|
|
423
|
+
|
|
424
|
+
return $newRow;
|
|
425
|
+
}
|
|
426
|
+
},
|
|
427
|
+
_buildRow: function(columns, tag)
|
|
428
|
+
{
|
|
429
|
+
tag = tag || '<td>';
|
|
430
|
+
|
|
431
|
+
var $row = $R.dom('<tr>');
|
|
432
|
+
for (var i = 0; i < columns; i++)
|
|
433
|
+
{
|
|
434
|
+
var $cell = $R.dom(tag);
|
|
435
|
+
$cell.attr('contenteditable', true);
|
|
436
|
+
$cell.html('<div data-redactor-tag="tbr"></div>');
|
|
437
|
+
|
|
438
|
+
$row.append($cell);
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
return $row;
|
|
442
|
+
},
|
|
443
|
+
_buildElement: function(node)
|
|
444
|
+
{
|
|
445
|
+
if (node)
|
|
446
|
+
{
|
|
447
|
+
this.$element = $R.dom(node);
|
|
448
|
+
}
|
|
449
|
+
else
|
|
450
|
+
{
|
|
451
|
+
this.$element = $R.dom('<table>');
|
|
452
|
+
this.append(this.$element);
|
|
453
|
+
}
|
|
454
|
+
},
|
|
455
|
+
_buildWrapper: function(node)
|
|
456
|
+
{
|
|
457
|
+
node = node || '<figure>';
|
|
458
|
+
|
|
459
|
+
this.parse(node);
|
|
460
|
+
},
|
|
461
|
+
_initWrapper: function()
|
|
462
|
+
{
|
|
463
|
+
this.addClass('redactor-component');
|
|
464
|
+
this.attr({
|
|
465
|
+
'data-redactor-type': 'table',
|
|
466
|
+
'tabindex': '-1',
|
|
467
|
+
'contenteditable': false
|
|
468
|
+
});
|
|
469
|
+
|
|
470
|
+
if (this.app.detector.isIe())
|
|
471
|
+
{
|
|
472
|
+
this.removeAttr('contenteditable');
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
});
|
|
476
|
+
|
|
477
|
+
})(Redactor);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
!function(r){r.add("plugin","table",{translations:{en:{table:"Table","insert-table":"Insert table","insert-row-above":"Insert row above","insert-row-below":"Insert row below","insert-column-left":"Insert column left","insert-column-right":"Insert column right","add-head":"Add head","delete-head":"Delete head","delete-column":"Delete column","delete-row":"Delete row","delete-table":"Delete table"}},init:function(e){this.app=e,this.lang=e.lang,this.opts=e.opts,this.caret=e.caret,this.editor=e.editor,this.toolbar=e.toolbar,this.component=e.component,this.inspector=e.inspector,this.insertion=e.insertion,this.selection=e.selection},ondropdown:{table:{observe:function(e){this._observeDropdown(e)}}},onbottomclick:function(){this.insertion.insertToEnd(this.editor.getLastNode(),"table")},start:function(){var e={observe:"table","insert-table":{title:this.lang.get("insert-table"),api:"plugin.table.insert"},"insert-row-above":{title:this.lang.get("insert-row-above"),classname:"redactor-table-item-observable",api:"plugin.table.addRowAbove"},"insert-row-below":{title:this.lang.get("insert-row-below"),classname:"redactor-table-item-observable",api:"plugin.table.addRowBelow"},"insert-column-left":{title:this.lang.get("insert-column-left"),classname:"redactor-table-item-observable",api:"plugin.table.addColumnLeft"},"insert-column-right":{title:this.lang.get("insert-column-right"),classname:"redactor-table-item-observable",api:"plugin.table.addColumnRight"},"add-head":{title:this.lang.get("add-head"),classname:"redactor-table-item-observable",api:"plugin.table.addHead"},"delete-head":{title:this.lang.get("delete-head"),classname:"redactor-table-item-observable",api:"plugin.table.deleteHead"},"delete-column":{title:this.lang.get("delete-column"),classname:"redactor-table-item-observable",api:"plugin.table.deleteColumn"},"delete-row":{title:this.lang.get("delete-row"),classname:"redactor-table-item-observable",api:"plugin.table.deleteRow"},"delete-table":{title:this.lang.get("delete-table"),classname:"redactor-table-item-observable",api:"plugin.table.deleteTable"}},t={title:this.lang.get("table")},n=this.toolbar.addButtonBefore("link","table",t);n.setIcon('<i class="re-icon-table"></i>'),n.setDropdown(e)},insert:function(){for(var e=this.component.create("table"),t=0;t<2;t++)e.addRow(3);e=this.insertion.insertHtml(e),this.caret.setStart(e)},addRowAbove:function(){var e=this._getComponent();if(e){var t=this.selection.getCurrent(),n=e.addRowTo(t,"before");this.caret.setStart(n)}},addRowBelow:function(){var e=this._getComponent();if(e){var t=this.selection.getCurrent(),n=e.addRowTo(t,"after");this.caret.setStart(n)}},addColumnLeft:function(){var e=this._getComponent();if(e){var t=this.selection.getCurrent();this.selection.save(),e.addColumnTo(t,"left"),this.selection.restore()}},addColumnRight:function(){var e=this._getComponent();if(e){var t=this.selection.getCurrent();this.selection.save(),e.addColumnTo(t,"right"),this.selection.restore()}},addHead:function(){var e=this._getComponent();e&&(this.selection.save(),e.addHead(),this.selection.restore())},deleteHead:function(){var e=this._getComponent();if(e){var t=this.selection.getCurrent();0!==r.dom(t).closest("thead").length?(e.removeHead(),this.caret.setStart(e)):(this.selection.save(),e.removeHead(),this.selection.restore())}},deleteColumn:function(){var e=this._getComponent();if(e){var t=this.selection.getCurrent(),n=r.dom(t).closest("td, th"),i=n.nextElement().get(),o=n.prevElement().get();e.removeColumn(t),i?this.caret.setStart(i):o?this.caret.setEnd(o):this.deleteTable()}},deleteRow:function(){var e=this._getComponent();if(e){var t=this.selection.getCurrent(),n=r.dom(t).closest("tr"),i=n.nextElement().get(),o=n.prevElement().get(),a=r.dom(t).closest("thead");e.removeRow(t),i?this.caret.setStart(i):o?this.caret.setEnd(o):0!==a.length?(e.removeHead(),this.caret.setStart(e)):this.deleteTable()}},deleteTable:function(){var e=this._getTable();e&&this.component.remove(e)},_getTable:function(){var e=this.selection.getCurrent(),t=this.inspector.parse(e);if(t.isTable())return t.getTable()},_getComponent:function(){var e=this.selection.getCurrent(),t=this.inspector.parse(e);if(t.isTable()){var n=t.getTable();return this.component.create("table",n)}},_observeDropdown:function(e){var t=this._getTable(),n=e.getItemsByClass("redactor-table-item-observable"),i=e.getItem("insert-table");t?(this._observeItems(n,"enable"),i.disable()):(this._observeItems(n,"disable"),i.enable())},_observeItems:function(e,t){for(var n=0;n<e.length;n++)e[n][t]()}})}(Redactor),function(r){r.add("class","table.component",{mixins:["dom","component"],init:function(e,t){return this.app=e,t&&void 0!==t.cmnt?t:this._init(t)},addHead:function(){this.removeHead();var e=this.$element.find("tr").first().children("td, th").length,t=r.dom("<thead>"),n=this._buildRow(e,"<th>");t.append(n),this.$element.prepend(t)},addRow:function(e){var t=this._buildRow(e);return this.$element.append(t),t},addRowTo:function(e,t){return this._addRowTo(e,t)},addColumnTo:function(e,o){var t=r.dom(e),n=t.closest("tr"),i=t.closest("td, th"),a=0;n.find("td, th").each(function(e,t){e===i.get()&&(a=t)}),this.$element.find("tr").each(function(e){var t=r.dom(e).find("td, th").get(a),n=r.dom(t),i=n.clone();i.html('<div data-redactor-tag="tbr"></div>'),"right"===o?n.after(i):n.before(i)})},removeHead:function(){var e=this.$element.find("thead");0!==e.length&&e.remove()},removeRow:function(e){r.dom(e).closest("tr").remove()},removeColumn:function(e){var t=r.dom(e),n=t.closest("tr"),i=t.closest("td, th"),o=0;n.find("td, th").each(function(e,t){e===i.get()&&(o=t)}),this.$element.find("tr").each(function(e){var t=r.dom(e).find("td, th").get(o);r.dom(t).remove()})},_init:function(e){var t,n;if(void 0!==e){var i=r.dom(e),o=i.get(),a=i.closest("figure");0!==a.length?n=(t=a).find("table").get():"TABLE"===o.tagName&&(n=o)}this._buildWrapper(t),this._buildElement(n),this._initWrapper()},_addRowTo:function(e,t){var n=r.dom(e).closest("tr");if(0!==n.length){var i=n.children("td, th").length,o=this._buildRow(i);return n[t](o),o}},_buildRow:function(e,t){t=t||"<td>";for(var n=r.dom("<tr>"),i=0;i<e;i++){var o=r.dom(t);o.attr("contenteditable",!0),o.html('<div data-redactor-tag="tbr"></div>'),n.append(o)}return n},_buildElement:function(e){e?this.$element=r.dom(e):(this.$element=r.dom("<table>"),this.append(this.$element))},_buildWrapper:function(e){e=e||"<figure>",this.parse(e)},_initWrapper:function(){this.addClass("redactor-component"),this.attr({"data-redactor-type":"table",tabindex:"-1",contenteditable:!1}),this.app.detector.isIe()&&this.removeAttr("contenteditable")}})}(Redactor);
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
(function($R)
|
|
2
|
+
{
|
|
3
|
+
$R.add('plugin', 'textdirection', {
|
|
4
|
+
translations: {
|
|
5
|
+
en: {
|
|
6
|
+
"change-text-direction": "RTL-LTR",
|
|
7
|
+
"left-to-right": "Left to Right",
|
|
8
|
+
"right-to-left": "Right to Left"
|
|
9
|
+
}
|
|
10
|
+
},
|
|
11
|
+
init: function(app)
|
|
12
|
+
{
|
|
13
|
+
this.app = app;
|
|
14
|
+
this.lang = app.lang;
|
|
15
|
+
this.block = app.block;
|
|
16
|
+
this.editor = app.editor;
|
|
17
|
+
this.toolbar = app.toolbar;
|
|
18
|
+
this.selection = app.selection;
|
|
19
|
+
},
|
|
20
|
+
// public
|
|
21
|
+
start: function()
|
|
22
|
+
{
|
|
23
|
+
var dropdown = {};
|
|
24
|
+
|
|
25
|
+
dropdown.ltr = { title: this.lang.get('left-to-right'), api: 'plugin.textdirection.set', args: 'ltr' };
|
|
26
|
+
dropdown.rtl = { title: this.lang.get('right-to-left'), api: 'plugin.textdirection.set', args: 'rtl' };
|
|
27
|
+
|
|
28
|
+
var $button = this.toolbar.addButton('textdirection', { title: this.lang.get('change-text-direction') });
|
|
29
|
+
$button.setIcon('<i class="re-icon-textdirection"></i>');
|
|
30
|
+
$button.setDropdown(dropdown);
|
|
31
|
+
},
|
|
32
|
+
set: function(type)
|
|
33
|
+
{
|
|
34
|
+
var block = this.selection.getBlock();
|
|
35
|
+
if (block && block.tagName === 'LI') {
|
|
36
|
+
var list = $R.dom(block).parents('ul, ol', this.editor.getElement()).last();
|
|
37
|
+
this.block.add({ attr: { dir: type }}, false, list);
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
this.block.add({ attr: { dir: type }});
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
})(Redactor);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
!function(o){o.add("plugin","textdirection",{translations:{en:{"change-text-direction":"RTL-LTR","left-to-right":"Left to Right","right-to-left":"Right to Left"}},init:function(t){this.app=t,this.lang=t.lang,this.block=t.block,this.editor=t.editor,this.toolbar=t.toolbar,this.selection=t.selection},start:function(){var t={};t.ltr={title:this.lang.get("left-to-right"),api:"plugin.textdirection.set",args:"ltr"},t.rtl={title:this.lang.get("right-to-left"),api:"plugin.textdirection.set",args:"rtl"};var i=this.toolbar.addButton("textdirection",{title:this.lang.get("change-text-direction")});i.setIcon('<i class="re-icon-textdirection"></i>'),i.setDropdown(t)},set:function(t){var i=this.selection.getBlock();if(i&&"LI"===i.tagName){var e=o.dom(i).parents("ul, ol",this.editor.getElement()).last();this.block.add({attr:{dir:t}},!1,e)}else this.block.add({attr:{dir:t}})}})}(Redactor);
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
(function($R)
|
|
2
|
+
{
|
|
3
|
+
$R.add('plugin', 'textexpander', {
|
|
4
|
+
init: function(app)
|
|
5
|
+
{
|
|
6
|
+
this.app = app;
|
|
7
|
+
this.opts = app.opts;
|
|
8
|
+
this.utils = app.utils;
|
|
9
|
+
this.editor = app.editor;
|
|
10
|
+
this.marker = app.marker;
|
|
11
|
+
this.keycodes = app.keycodes;
|
|
12
|
+
this.selection = app.selection;
|
|
13
|
+
},
|
|
14
|
+
// public
|
|
15
|
+
start: function()
|
|
16
|
+
{
|
|
17
|
+
if (!this.opts.textexpander) return;
|
|
18
|
+
|
|
19
|
+
var $editor = this.editor.getElement();
|
|
20
|
+
$editor.on('keyup.redactor-plugin-textexpander', this._expand.bind(this));
|
|
21
|
+
},
|
|
22
|
+
stop: function()
|
|
23
|
+
{
|
|
24
|
+
var $editor = this.editor.getElement();
|
|
25
|
+
$editor.off('.redactor-plugin-textexpander');
|
|
26
|
+
},
|
|
27
|
+
|
|
28
|
+
// private
|
|
29
|
+
_expand: function(e)
|
|
30
|
+
{
|
|
31
|
+
var key = e.which;
|
|
32
|
+
if (key === this.keycodes.SPACE)
|
|
33
|
+
{
|
|
34
|
+
var len = this.opts.textexpander.length;
|
|
35
|
+
for (var i = 0; i < len; i++)
|
|
36
|
+
{
|
|
37
|
+
var str = this.opts.textexpander[i];
|
|
38
|
+
var re = new RegExp(this.utils.escapeRegExp(str[0]) + '\\s$');
|
|
39
|
+
var rangeText = this.selection.getTextBeforeCaret(str[0].length + 1).replace(/\s$/, '');
|
|
40
|
+
|
|
41
|
+
if (str[0] === rangeText)
|
|
42
|
+
{
|
|
43
|
+
return this._replaceSelection(re, str[1]);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
},
|
|
49
|
+
_replaceSelection: function(re, replacement)
|
|
50
|
+
{
|
|
51
|
+
var marker = this.marker.insert('start');
|
|
52
|
+
var current = marker.previousSibling;
|
|
53
|
+
var currentText = current.textContent;
|
|
54
|
+
|
|
55
|
+
currentText = currentText.replace(/ /, ' ');
|
|
56
|
+
currentText = currentText.replace(re, replacement);
|
|
57
|
+
current.textContent = currentText;
|
|
58
|
+
|
|
59
|
+
this.selection.restoreMarkers();
|
|
60
|
+
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
})(Redactor);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Redactor.add("plugin","textexpander",{init:function(e){this.app=e,this.opts=e.opts,this.utils=e.utils,this.editor=e.editor,this.marker=e.marker,this.keycodes=e.keycodes,this.selection=e.selection},start:function(){this.opts.textexpander&&this.editor.getElement().on("keyup.redactor-plugin-textexpander",this._expand.bind(this))},stop:function(){this.editor.getElement().off(".redactor-plugin-textexpander")},_expand:function(e){if(e.which===this.keycodes.SPACE)for(var t=this.opts.textexpander.length,i=0;i<t;i++){var s=this.opts.textexpander[i],n=new RegExp(this.utils.escapeRegExp(s[0])+"\\s$"),r=this.selection.getTextBeforeCaret(s[0].length+1).replace(/\s$/,"");if(s[0]===r)return this._replaceSelection(n,s[1])}},_replaceSelection:function(e,t){var i=this.marker.insert("start").previousSibling,s=i.textContent;s=(s=s.replace(/ /," ")).replace(e,t),i.textContent=s,this.selection.restoreMarkers()}});
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
.redactor-variables-list {
|
|
2
|
+
list-style: none;
|
|
3
|
+
margin: 0;
|
|
4
|
+
padding: 0;
|
|
5
|
+
}
|
|
6
|
+
.redactor-variables-list li {
|
|
7
|
+
display: inline-block;
|
|
8
|
+
margin-right: 4px;
|
|
9
|
+
margin-bottom: 4px;
|
|
10
|
+
}
|
|
11
|
+
.redactor-variables-list span {
|
|
12
|
+
white-space: nowrap;
|
|
13
|
+
background: rgba(0,125,255, .75);
|
|
14
|
+
color: #fff;
|
|
15
|
+
display: inline-block;
|
|
16
|
+
padding: 3px 6px;
|
|
17
|
+
line-height: 1;
|
|
18
|
+
border-radius: 4px;
|
|
19
|
+
cursor: pointer;
|
|
20
|
+
}
|
|
21
|
+
.redactor-variables-list span.redactor-variables-item-selected {
|
|
22
|
+
background: #ee698a;
|
|
23
|
+
}
|