@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.
Files changed (57) hide show
  1. package/.babelrc +11 -0
  2. package/.eslintignore +3 -0
  3. package/.eslintrc +29 -0
  4. package/CHANGELOG.md +82 -0
  5. package/LICENSE +661 -0
  6. package/README.md +98 -0
  7. package/app/App.js +18 -0
  8. package/app/components/Editor.js +415 -0
  9. package/app/main.js +8 -0
  10. package/app/stylesheets/main.scss +272 -0
  11. package/dist/dist.css +1 -0
  12. package/dist/dist.min.js +2 -0
  13. package/dist/dist.min.js.LICENSE.txt +42 -0
  14. package/dist/filesafe-js/EncryptionWorker.js +2 -0
  15. package/dist/filesafe-js/EncryptionWorker.js.LICENSE.txt +5 -0
  16. package/dist/index.html +1 -0
  17. package/dist/vendor.css +6 -0
  18. package/dist/vendor.js +1 -0
  19. package/editor.index.ejs +14 -0
  20. package/editor_bar.png +0 -0
  21. package/ext.json.sample +9 -0
  22. package/package.json +54 -0
  23. package/redactor/plugins/alignment/alignment.js +55 -0
  24. package/redactor/plugins/alignment/alignment.min.js +1 -0
  25. package/redactor/plugins/counter/counter.js +76 -0
  26. package/redactor/plugins/counter/counter.min.js +1 -0
  27. package/redactor/plugins/filesafe/filesafe.js +70 -0
  28. package/redactor/plugins/filesafe/filesafe.min.js +70 -0
  29. package/redactor/plugins/fontcolor/fontcolor.js +184 -0
  30. package/redactor/plugins/fontcolor/fontcolor.min.js +1 -0
  31. package/redactor/plugins/fontfamily/fontfamily.js +59 -0
  32. package/redactor/plugins/fontfamily/fontfamily.min.js +1 -0
  33. package/redactor/plugins/fontsize/fontsize.js +58 -0
  34. package/redactor/plugins/fontsize/fontsize.min.js +1 -0
  35. package/redactor/plugins/imagemanager/imagemanager.js +82 -0
  36. package/redactor/plugins/imagemanager/imagemanager.min.js +1 -0
  37. package/redactor/plugins/inlinestyle/inlinestyle.css +34 -0
  38. package/redactor/plugins/inlinestyle/inlinestyle.js +62 -0
  39. package/redactor/plugins/inlinestyle/inlinestyle.min.css +1 -0
  40. package/redactor/plugins/inlinestyle/inlinestyle.min.js +1 -0
  41. package/redactor/plugins/specialchars/specialchars.js +78 -0
  42. package/redactor/plugins/specialchars/specialchars.min.js +1 -0
  43. package/redactor/plugins/table/table.js +477 -0
  44. package/redactor/plugins/table/table.min.js +1 -0
  45. package/redactor/plugins/textdirection/textdirection.js +44 -0
  46. package/redactor/plugins/textdirection/textdirection.min.js +1 -0
  47. package/redactor/plugins/textexpander/textexpander.js +64 -0
  48. package/redactor/plugins/textexpander/textexpander.min.js +1 -0
  49. package/redactor/plugins/variable/variable.css +23 -0
  50. package/redactor/plugins/variable/variable.js +222 -0
  51. package/redactor/plugins/variable/variable.min.css +1 -0
  52. package/redactor/plugins/variable/variable.min.js +1 -0
  53. package/redactor/src/redactor.min.css +1 -0
  54. package/redactor/src/redactor.min.js +1 -0
  55. package/webpack.config.js +82 -0
  56. package/webpack.dev.js +20 -0
  57. 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(/&nbsp;/, ' ');
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(/&nbsp;/," ")).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
+ }