comfortable_mexican_sofa 1.12.7 → 1.12.8
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.
- checksums.yaml +4 -4
- data/.travis.yml +1 -1
- data/app/assets/javascripts/comfy/admin/cms/application.js.coffee +1 -1
- data/app/assets/javascripts/comfy/admin/cms/base.js.coffee +4 -2
- data/app/assets/javascripts/comfy/admin/cms/lib/redactor.js +309 -218
- data/app/assets/javascripts/comfy/admin/cms/lib/redactor/definedlinks.js +53 -0
- data/app/controllers/comfy/admin/cms/pages_controller.rb +21 -0
- data/app/helpers/comfy/cms_helper.rb +1 -1
- data/app/models/comfy/cms/site.rb +1 -1
- data/app/views/comfy/admin/cms/pages/_form.html.haml +2 -4
- data/app/views/layouts/comfy/admin/cms/_head.html.haml +1 -0
- data/config/environments/test.rb +4 -0
- data/config/locales/cs.yml +28 -23
- data/config/locales/da.yml +36 -31
- data/config/locales/de.yml +32 -27
- data/config/locales/en.yml +10 -7
- data/config/locales/es.yml +21 -16
- data/config/locales/fr.yml +28 -23
- data/config/locales/it.yml +12 -7
- data/config/locales/ja.yml +28 -23
- data/config/locales/nb.yml +12 -7
- data/config/locales/nl.yml +21 -16
- data/config/locales/pl.yml +28 -23
- data/config/locales/pt-BR.yml +27 -22
- data/config/locales/ru.yml +19 -16
- data/config/locales/sv.yml +28 -23
- data/config/locales/uk.yml +10 -7
- data/config/locales/zh-CN.yml +22 -17
- data/config/locales/zh-TW.yml +22 -17
- data/lib/comfortable_mexican_sofa/render_methods.rb +1 -1
- data/lib/comfortable_mexican_sofa/version.rb +1 -1
- data/test/controllers/comfy/admin/cms/pages_controller_test.rb +59 -46
- data/test/gemfiles/Gemfile.rails.4.0 +2 -2
- data/test/gemfiles/Gemfile.rails.4.1 +1 -1
- data/test/gemfiles/Gemfile.rails.4.2 +1 -1
- data/test/gemfiles/Gemfile.rails.master +1 -1
- data/test/integration/i18n_test.rb +37 -0
- data/test/integration/js_variables_test.rb +1 -0
- data/test/lib/mirrors_test.rb +35 -35
- metadata +4 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: f933c8018264bf9d49d604db850abedcde229e03
|
|
4
|
+
data.tar.gz: 28b5de9bdd3d6db7accafdba10d4a1408ef6bb90
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: b421cc43496c817bc03c01729b3f45147665420343ab92cfcf82166e66e8ebf86976e87f783e4de58797896a2eda17d6dc4c86e95fed30917c3e76e5ed8c1baf
|
|
7
|
+
data.tar.gz: 2d31bfe29ac5c3bc8e61ef0794e9c3121440dce69ee5a1b0f71ad1c125889471479fed9057cbd5dbf4f51ebf110ac9d1667494a921f8ebf7b71f90c547b738d2
|
data/.travis.yml
CHANGED
|
@@ -9,12 +9,12 @@
|
|
|
9
9
|
#= require codemirror/modes/xml
|
|
10
10
|
#= require codemirror/addons/edit/closetag
|
|
11
11
|
#= require bootstrap-sprockets
|
|
12
|
-
#= require bootstrap
|
|
13
12
|
#= require comfy/admin/cms/lib/bootstrap-datetimepicker
|
|
14
13
|
#= require comfy/admin/cms/lib/diff
|
|
15
14
|
#= require comfy/admin/cms/lib/redactor
|
|
16
15
|
#= require comfy/admin/cms/lib/redactor/filemanager
|
|
17
16
|
#= require comfy/admin/cms/lib/redactor/imagemanager
|
|
17
|
+
#= require comfy/admin/cms/lib/redactor/definedlinks
|
|
18
18
|
#= require comfy/admin/cms/lib/redactor/table
|
|
19
19
|
#= require comfy/admin/cms/lib/redactor/video
|
|
20
20
|
#= require_directory ./lib/redactor/i18n/
|
|
@@ -51,10 +51,12 @@ window.CMS.wysiwyg = ->
|
|
|
51
51
|
imageManagerJson: "#{CMS.file_upload_path}?source=redactor&type=image"
|
|
52
52
|
fileUpload: "#{CMS.file_upload_path}?source=redactor&type=file&#{params}"
|
|
53
53
|
fileManagerJson: "#{CMS.file_upload_path}?source=redactor&type=file"
|
|
54
|
+
definedLinks: "#{CMS.pages_path}?source=redactor"
|
|
54
55
|
buttonSource: true
|
|
55
|
-
|
|
56
|
-
plugins: ['imagemanager', 'filemanager', 'table', 'video']
|
|
56
|
+
formatting: ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6']
|
|
57
|
+
plugins: ['imagemanager', 'filemanager', 'table', 'video', 'definedlinks']
|
|
57
58
|
lang: CMS.locale
|
|
59
|
+
convertDivs: false
|
|
58
60
|
|
|
59
61
|
|
|
60
62
|
window.CMS.codemirror = ->
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/*
|
|
2
|
-
Redactor v10.0.
|
|
3
|
-
Updated: January
|
|
2
|
+
Redactor v10.0.7
|
|
3
|
+
Updated: January 31, 2015
|
|
4
4
|
|
|
5
5
|
http://imperavi.com/redactor/
|
|
6
6
|
|
|
@@ -94,7 +94,7 @@
|
|
|
94
94
|
|
|
95
95
|
// Functionality
|
|
96
96
|
$.Redactor = Redactor;
|
|
97
|
-
$.Redactor.VERSION = '10.0.
|
|
97
|
+
$.Redactor.VERSION = '10.0.7';
|
|
98
98
|
$.Redactor.modules = ['alignment', 'autosave', 'block', 'buffer', 'build', 'button',
|
|
99
99
|
'caret', 'clean', 'code', 'core', 'dropdown', 'file', 'focus',
|
|
100
100
|
'image', 'indent', 'inline', 'insert', 'keydown', 'keyup',
|
|
@@ -147,14 +147,14 @@
|
|
|
147
147
|
imageFloatMargin: '10px',
|
|
148
148
|
imageResizable: true,
|
|
149
149
|
|
|
150
|
-
imageUpload:
|
|
150
|
+
imageUpload: null,
|
|
151
151
|
imageUploadParam: 'file',
|
|
152
152
|
|
|
153
153
|
uploadImageField: false,
|
|
154
154
|
|
|
155
155
|
dragImageUpload: true,
|
|
156
156
|
|
|
157
|
-
fileUpload:
|
|
157
|
+
fileUpload: null,
|
|
158
158
|
fileUploadParam: 'file',
|
|
159
159
|
|
|
160
160
|
dragFileUpload: true,
|
|
@@ -179,7 +179,7 @@
|
|
|
179
179
|
toolbarExternal: false, // ID selector
|
|
180
180
|
toolbarOverflow: false,
|
|
181
181
|
|
|
182
|
-
|
|
182
|
+
source: true,
|
|
183
183
|
buttons: ['html', 'formatting', 'bold', 'italic', 'deleted', 'unorderedlist', 'orderedlist',
|
|
184
184
|
'outdent', 'indent', 'image', 'file', 'link', 'alignment', 'horizontalrule'], // + 'underline'
|
|
185
185
|
|
|
@@ -447,50 +447,69 @@
|
|
|
447
447
|
},
|
|
448
448
|
set: function(type)
|
|
449
449
|
{
|
|
450
|
+
// focus
|
|
450
451
|
if (!this.utils.browser('msie')) this.$editor.focus();
|
|
451
452
|
|
|
452
453
|
this.buffer.set();
|
|
453
454
|
this.selection.save();
|
|
454
455
|
|
|
456
|
+
// get blocks
|
|
455
457
|
this.alignment.blocks = this.selection.getBlocks();
|
|
456
|
-
|
|
458
|
+
this.alignment.type = type;
|
|
459
|
+
|
|
460
|
+
// set alignment
|
|
461
|
+
if (this.alignment.isLinebreaksOrNoBlocks())
|
|
457
462
|
{
|
|
458
|
-
this.alignment.setText(
|
|
463
|
+
this.alignment.setText();
|
|
459
464
|
}
|
|
460
465
|
else
|
|
461
466
|
{
|
|
462
|
-
this.alignment.setBlocks(
|
|
467
|
+
this.alignment.setBlocks();
|
|
463
468
|
}
|
|
464
469
|
|
|
470
|
+
// sync
|
|
465
471
|
this.selection.restore();
|
|
466
472
|
this.code.sync();
|
|
467
473
|
},
|
|
468
|
-
setText: function(
|
|
474
|
+
setText: function()
|
|
469
475
|
{
|
|
470
476
|
var wrapper = this.selection.wrap('div');
|
|
471
|
-
$(wrapper).attr('data-tagblock', 'redactor');
|
|
472
|
-
$(wrapper).css('text-align', type);
|
|
477
|
+
$(wrapper).attr('data-tagblock', 'redactor').css('text-align', this.alignment.type);
|
|
473
478
|
},
|
|
474
|
-
setBlocks: function(
|
|
479
|
+
setBlocks: function()
|
|
475
480
|
{
|
|
476
481
|
$.each(this.alignment.blocks, $.proxy(function(i, el)
|
|
477
482
|
{
|
|
478
483
|
var $el = this.utils.getAlignmentElement(el);
|
|
479
|
-
|
|
480
484
|
if (!$el) return;
|
|
481
485
|
|
|
482
|
-
if (
|
|
486
|
+
if (this.alignment.isNeedReplaceElement($el))
|
|
483
487
|
{
|
|
484
|
-
|
|
488
|
+
this.alignment.replaceElement($el);
|
|
485
489
|
}
|
|
486
490
|
else
|
|
487
491
|
{
|
|
488
|
-
$el
|
|
489
|
-
this.utils.removeEmptyAttr($el, 'style');
|
|
492
|
+
this.alignment.alignElement($el);
|
|
490
493
|
}
|
|
491
494
|
|
|
492
|
-
|
|
493
495
|
}, this));
|
|
496
|
+
},
|
|
497
|
+
isLinebreaksOrNoBlocks: function()
|
|
498
|
+
{
|
|
499
|
+
return (this.opts.linebreaks && this.alignment.blocks[0] === false);
|
|
500
|
+
},
|
|
501
|
+
isNeedReplaceElement: function($el)
|
|
502
|
+
{
|
|
503
|
+
return (this.alignment.type === '' && typeof($el.data('tagblock')) !== 'undefined');
|
|
504
|
+
},
|
|
505
|
+
replaceElement: function($el)
|
|
506
|
+
{
|
|
507
|
+
$el.replaceWith($el.html());
|
|
508
|
+
},
|
|
509
|
+
alignElement: function($el)
|
|
510
|
+
{
|
|
511
|
+
$el.css('text-align', this.alignment.type);
|
|
512
|
+
this.utils.removeEmptyAttr($el, 'style');
|
|
494
513
|
}
|
|
495
514
|
};
|
|
496
515
|
},
|
|
@@ -504,35 +523,36 @@
|
|
|
504
523
|
this.autosave.html = false;
|
|
505
524
|
this.autosave.name = (this.opts.autosaveName) ? this.opts.autosaveName : this.$textarea.attr('name');
|
|
506
525
|
|
|
507
|
-
if (
|
|
508
|
-
|
|
509
|
-
this.autosaveInterval = setInterval($.proxy(this.autosave.load, this), this.opts.autosaveInterval * 1000);
|
|
510
|
-
}
|
|
526
|
+
if (this.opts.autosaveOnChange) return;
|
|
527
|
+
this.autosaveInterval = setInterval(this.autosave.load, this.opts.autosaveInterval * 1000);
|
|
511
528
|
},
|
|
512
529
|
onChange: function()
|
|
513
530
|
{
|
|
514
531
|
if (!this.opts.autosaveOnChange) return;
|
|
515
|
-
|
|
516
532
|
this.autosave.load();
|
|
517
533
|
},
|
|
518
534
|
load: function()
|
|
519
535
|
{
|
|
520
|
-
|
|
521
|
-
if (this.autosave.html === html) return;
|
|
522
|
-
if (this.utils.isEmpty(html)) return;
|
|
536
|
+
this.autosave.source = this.code.get();
|
|
523
537
|
|
|
524
|
-
|
|
538
|
+
if (this.autosave.html === this.autosave.source) return;
|
|
539
|
+
if (this.utils.isEmpty(this.autosave.source)) return;
|
|
540
|
+
|
|
541
|
+
// data
|
|
542
|
+
var data = {};
|
|
543
|
+
data['name'] = this.autosave.name;
|
|
544
|
+
data[this.autosave.name] = escape(encodeURIComponent(this.autosave.source));
|
|
545
|
+
|
|
546
|
+
// ajax
|
|
547
|
+
var jsxhr = $.ajax({
|
|
525
548
|
url: this.opts.autosave,
|
|
526
549
|
type: 'post',
|
|
527
|
-
data:
|
|
528
|
-
success: $.proxy(function(data)
|
|
529
|
-
{
|
|
530
|
-
this.autosave.success(data, html);
|
|
531
|
-
|
|
532
|
-
}, this)
|
|
550
|
+
data: data
|
|
533
551
|
});
|
|
552
|
+
|
|
553
|
+
jsxhr.done(this.autosave.success);
|
|
534
554
|
},
|
|
535
|
-
success: function(data
|
|
555
|
+
success: function(data)
|
|
536
556
|
{
|
|
537
557
|
var json;
|
|
538
558
|
try
|
|
@@ -548,7 +568,7 @@
|
|
|
548
568
|
var callbackName = (typeof json.error == 'undefined') ? 'autosave' : 'autosaveError';
|
|
549
569
|
|
|
550
570
|
this.core.setCallback(callbackName, this.autosave.name, json);
|
|
551
|
-
this.autosave.html =
|
|
571
|
+
this.autosave.html = this.autosave.source;
|
|
552
572
|
},
|
|
553
573
|
disable: function()
|
|
554
574
|
{
|
|
@@ -741,6 +761,7 @@
|
|
|
741
761
|
}
|
|
742
762
|
else
|
|
743
763
|
{
|
|
764
|
+
|
|
744
765
|
if (this.opts.linebreaks || tag != 'p')
|
|
745
766
|
{
|
|
746
767
|
if (tag == 'blockquote')
|
|
@@ -773,6 +794,7 @@
|
|
|
773
794
|
|
|
774
795
|
}
|
|
775
796
|
|
|
797
|
+
|
|
776
798
|
this.block.formatWrap(tag);
|
|
777
799
|
}
|
|
778
800
|
else
|
|
@@ -782,7 +804,7 @@
|
|
|
782
804
|
if (this.block.type == 'class')
|
|
783
805
|
{
|
|
784
806
|
toggleType = 'toggle';
|
|
785
|
-
classSize = $(this.block.blocks).filter('.' + this.block.value).
|
|
807
|
+
classSize = $(this.block.blocks).filter('.' + this.block.value).length;
|
|
786
808
|
|
|
787
809
|
if (this.block.blocksSize == classSize) toggleType = 'toggle';
|
|
788
810
|
else if (this.block.blocksSize > classSize) toggleType = 'set';
|
|
@@ -964,10 +986,10 @@
|
|
|
964
986
|
},
|
|
965
987
|
formatTableWrapping: function($formatted)
|
|
966
988
|
{
|
|
967
|
-
if ($formatted.closest('table').
|
|
989
|
+
if ($formatted.closest('table').length === 0) return;
|
|
968
990
|
|
|
969
|
-
if ($formatted.closest('tr').
|
|
970
|
-
if ($formatted.closest('td').
|
|
991
|
+
if ($formatted.closest('tr').length === 0) $formatted.wrap('<tr>');
|
|
992
|
+
if ($formatted.closest('td').length === 0 && $formatted.closest('th').length === 0)
|
|
971
993
|
{
|
|
972
994
|
$formatted.wrap('<td>');
|
|
973
995
|
}
|
|
@@ -1122,13 +1144,11 @@
|
|
|
1122
1144
|
return {
|
|
1123
1145
|
run: function()
|
|
1124
1146
|
{
|
|
1125
|
-
|
|
1126
1147
|
this.build.createContainerBox();
|
|
1127
1148
|
this.build.loadContent();
|
|
1128
1149
|
this.build.loadEditor();
|
|
1129
1150
|
this.build.enableEditor();
|
|
1130
1151
|
this.build.setCodeAndCall();
|
|
1131
|
-
|
|
1132
1152
|
},
|
|
1133
1153
|
isTextarea: function()
|
|
1134
1154
|
{
|
|
@@ -1144,13 +1164,7 @@
|
|
|
1144
1164
|
},
|
|
1145
1165
|
getTextareaName: function()
|
|
1146
1166
|
{
|
|
1147
|
-
|
|
1148
|
-
if (typeof(name) == 'undefined')
|
|
1149
|
-
{
|
|
1150
|
-
name = 'content-' + this.uuid;
|
|
1151
|
-
}
|
|
1152
|
-
|
|
1153
|
-
return name;
|
|
1167
|
+
return ((typeof(name) == 'undefined')) ? 'content-' + this.uuid : this.$element.attr('id');
|
|
1154
1168
|
},
|
|
1155
1169
|
loadContent: function()
|
|
1156
1170
|
{
|
|
@@ -1193,10 +1207,8 @@
|
|
|
1193
1207
|
this.build.callEditor();
|
|
1194
1208
|
|
|
1195
1209
|
// code mode
|
|
1196
|
-
if (
|
|
1197
|
-
|
|
1198
|
-
setTimeout($.proxy(this.code.showCode, this), 200);
|
|
1199
|
-
}
|
|
1210
|
+
if (this.opts.visual) return;
|
|
1211
|
+
setTimeout($.proxy(this.code.showCode, this), 200);
|
|
1200
1212
|
},
|
|
1201
1213
|
callEditor: function()
|
|
1202
1214
|
{
|
|
@@ -1236,6 +1248,21 @@
|
|
|
1236
1248
|
if (this.opts.maxHeight) this.$editor.css('maxHeight', this.opts.maxHeight);
|
|
1237
1249
|
|
|
1238
1250
|
},
|
|
1251
|
+
setEventDropUpload: function(e)
|
|
1252
|
+
{
|
|
1253
|
+
e.preventDefault();
|
|
1254
|
+
|
|
1255
|
+
if (!this.opts.dragImageUpload || !this.opts.dragFileUpload) return;
|
|
1256
|
+
|
|
1257
|
+
var files = e.dataTransfer.files;
|
|
1258
|
+
this.upload.directUpload(files[0], e);
|
|
1259
|
+
},
|
|
1260
|
+
setEventDrop: function(e)
|
|
1261
|
+
{
|
|
1262
|
+
this.code.sync();
|
|
1263
|
+
setTimeout(this.clean.clearUnverified, 1);
|
|
1264
|
+
this.core.setCallback('drop', e);
|
|
1265
|
+
},
|
|
1239
1266
|
setEvents: function()
|
|
1240
1267
|
{
|
|
1241
1268
|
// drop
|
|
@@ -1245,28 +1272,16 @@
|
|
|
1245
1272
|
|
|
1246
1273
|
if (window.FormData === undefined || !e.dataTransfer) return true;
|
|
1247
1274
|
|
|
1248
|
-
|
|
1249
|
-
if (length === 0)
|
|
1275
|
+
if (e.dataTransfer.files.length === 0)
|
|
1250
1276
|
{
|
|
1251
|
-
this.
|
|
1252
|
-
setTimeout($.proxy(this.clean.clearUnverified, this), 1);
|
|
1253
|
-
this.core.setCallback('drop', e);
|
|
1254
|
-
|
|
1255
|
-
return true;
|
|
1277
|
+
return this.build.setEventDrop(e);
|
|
1256
1278
|
}
|
|
1257
1279
|
else
|
|
1258
1280
|
{
|
|
1259
|
-
|
|
1260
|
-
|
|
1261
|
-
if (this.opts.dragImageUpload || this.opts.dragFileUpload)
|
|
1262
|
-
{
|
|
1263
|
-
var files = e.dataTransfer.files;
|
|
1264
|
-
this.upload.directUpload(files[0], e);
|
|
1265
|
-
}
|
|
1281
|
+
this.build.setEventDropUpload(e);
|
|
1266
1282
|
}
|
|
1267
1283
|
|
|
1268
|
-
setTimeout(
|
|
1269
|
-
|
|
1284
|
+
setTimeout(this.clean.clearUnverified, 1);
|
|
1270
1285
|
this.core.setCallback('drop', e);
|
|
1271
1286
|
|
|
1272
1287
|
}, this));
|
|
@@ -1275,11 +1290,8 @@
|
|
|
1275
1290
|
// click
|
|
1276
1291
|
this.$editor.on('click.redactor', $.proxy(function(e)
|
|
1277
1292
|
{
|
|
1278
|
-
var
|
|
1279
|
-
|
|
1280
|
-
{
|
|
1281
|
-
type = false;
|
|
1282
|
-
}
|
|
1293
|
+
var event = this.core.getEvent();
|
|
1294
|
+
var type = (event == 'click' || event == 'arrow') ? false : 'click';
|
|
1283
1295
|
|
|
1284
1296
|
this.core.addEvent(type);
|
|
1285
1297
|
this.utils.disableSelectAll();
|
|
@@ -1315,23 +1327,25 @@
|
|
|
1315
1327
|
}
|
|
1316
1328
|
|
|
1317
1329
|
var clickedElement;
|
|
1318
|
-
$(document).on('mousedown', function(e) {
|
|
1319
|
-
clickedElement = $(e.target);
|
|
1320
|
-
});
|
|
1330
|
+
$(document).on('mousedown', function(e) { clickedElement = e.target; });
|
|
1321
1331
|
|
|
1322
1332
|
// blur
|
|
1323
1333
|
this.$editor.on('blur.redactor', $.proxy(function(e)
|
|
1324
1334
|
{
|
|
1325
1335
|
if (this.rtePaste) return;
|
|
1336
|
+
if (!this.build.isBlured(clickedElement)) return;
|
|
1337
|
+
|
|
1338
|
+
this.utils.disableSelectAll();
|
|
1339
|
+
if ($.isFunction(this.opts.blurCallback)) this.core.setCallback('blur', e);
|
|
1326
1340
|
|
|
1327
|
-
var $el = $(clickedElement);
|
|
1328
|
-
if (!$el.hasClass('redactor-toolbar, redactor-dropdown') && !$el.is('#redactor-modal') && $el.parents('.redactor-toolbar, .redactor-dropdown, #redactor-modal').size() === 0)
|
|
1329
|
-
{
|
|
1330
|
-
this.utils.disableSelectAll();
|
|
1331
|
-
if ($.isFunction(this.opts.blurCallback)) this.core.setCallback('blur', e);
|
|
1332
|
-
}
|
|
1333
1341
|
}, this));
|
|
1334
1342
|
},
|
|
1343
|
+
isBlured: function(clickedElement)
|
|
1344
|
+
{
|
|
1345
|
+
var $el = $(clickedElement);
|
|
1346
|
+
|
|
1347
|
+
return (!$el.hasClass('redactor-toolbar, redactor-dropdown') && !$el.is('#redactor-modal') && $el.parents('.redactor-toolbar, .redactor-dropdown, #redactor-modal').length === 0);
|
|
1348
|
+
},
|
|
1335
1349
|
setHelpers: function()
|
|
1336
1350
|
{
|
|
1337
1351
|
// autosave
|
|
@@ -1341,8 +1355,8 @@
|
|
|
1341
1355
|
this.placeholder.enable();
|
|
1342
1356
|
|
|
1343
1357
|
// focus
|
|
1344
|
-
if (this.opts.focus) setTimeout(
|
|
1345
|
-
if (this.opts.focusEnd) setTimeout(
|
|
1358
|
+
if (this.opts.focus) setTimeout(this.focus.setStart, 100);
|
|
1359
|
+
if (this.opts.focusEnd) setTimeout(this.focus.setEnd, 100);
|
|
1346
1360
|
|
|
1347
1361
|
},
|
|
1348
1362
|
plugins: function()
|
|
@@ -1364,6 +1378,7 @@
|
|
|
1364
1378
|
|
|
1365
1379
|
this[s] = RedactorPlugins[s]();
|
|
1366
1380
|
|
|
1381
|
+
// get methods
|
|
1367
1382
|
var methods = this.getModuleMethods(this[s]);
|
|
1368
1383
|
var len = methods.length;
|
|
1369
1384
|
|
|
@@ -1378,7 +1393,6 @@
|
|
|
1378
1393
|
|
|
1379
1394
|
}, this));
|
|
1380
1395
|
|
|
1381
|
-
|
|
1382
1396
|
},
|
|
1383
1397
|
disableMozillaEditing: function()
|
|
1384
1398
|
{
|
|
@@ -1399,28 +1413,10 @@
|
|
|
1399
1413
|
{
|
|
1400
1414
|
var $button = $('<a href="#" class="re-icon re-' + btnName + '" rel="' + btnName + '" />').attr('tabindex', '-1');
|
|
1401
1415
|
|
|
1416
|
+
// click
|
|
1402
1417
|
if (btnObject.func || btnObject.command || btnObject.dropdown)
|
|
1403
1418
|
{
|
|
1404
|
-
|
|
1405
|
-
{
|
|
1406
|
-
if ($button.hasClass('redactor-button-disabled')) return false;
|
|
1407
|
-
|
|
1408
|
-
var type = 'func';
|
|
1409
|
-
var callback = btnObject.func;
|
|
1410
|
-
if (btnObject.command)
|
|
1411
|
-
{
|
|
1412
|
-
type = 'command';
|
|
1413
|
-
callback = btnObject.command;
|
|
1414
|
-
}
|
|
1415
|
-
else if (btnObject.dropdown)
|
|
1416
|
-
{
|
|
1417
|
-
type = 'dropdown';
|
|
1418
|
-
callback = false;
|
|
1419
|
-
}
|
|
1420
|
-
|
|
1421
|
-
this.button.onClick(e, btnName, type, callback);
|
|
1422
|
-
|
|
1423
|
-
}, this));
|
|
1419
|
+
this.button.setEvent($button, btnName, btnObject);
|
|
1424
1420
|
}
|
|
1425
1421
|
|
|
1426
1422
|
// dropdown
|
|
@@ -1439,6 +1435,30 @@
|
|
|
1439
1435
|
|
|
1440
1436
|
return $button;
|
|
1441
1437
|
},
|
|
1438
|
+
setEvent: function($button, btnName, btnObject)
|
|
1439
|
+
{
|
|
1440
|
+
$button.on('touchstart click', $.proxy(function(e)
|
|
1441
|
+
{
|
|
1442
|
+
if ($button.hasClass('redactor-button-disabled')) return false;
|
|
1443
|
+
|
|
1444
|
+
var type = 'func';
|
|
1445
|
+
var callback = btnObject.func;
|
|
1446
|
+
|
|
1447
|
+
if (btnObject.command)
|
|
1448
|
+
{
|
|
1449
|
+
type = 'command';
|
|
1450
|
+
callback = btnObject.command;
|
|
1451
|
+
}
|
|
1452
|
+
else if (btnObject.dropdown)
|
|
1453
|
+
{
|
|
1454
|
+
type = 'dropdown';
|
|
1455
|
+
callback = false;
|
|
1456
|
+
}
|
|
1457
|
+
|
|
1458
|
+
this.button.onClick(e, btnName, type, callback);
|
|
1459
|
+
|
|
1460
|
+
}, this));
|
|
1461
|
+
},
|
|
1442
1462
|
createTooltip: function($button, name, title)
|
|
1443
1463
|
{
|
|
1444
1464
|
var $tooltip = $('<span>').addClass('redactor-toolbar-tooltip redactor-toolbar-tooltip-' + name).hide().html(title);
|
|
@@ -1449,13 +1469,11 @@
|
|
|
1449
1469
|
if ($(this).hasClass('redactor-button-disabled')) return;
|
|
1450
1470
|
|
|
1451
1471
|
var pos = $button.offset();
|
|
1452
|
-
var height = $button.innerHeight();
|
|
1453
|
-
var width = $button.innerWidth();
|
|
1454
1472
|
|
|
1455
1473
|
$tooltip.show();
|
|
1456
1474
|
$tooltip.css({
|
|
1457
|
-
top: (pos.top +
|
|
1458
|
-
left: (pos.left +
|
|
1475
|
+
top: (pos.top + $button.innerHeight()) + 'px',
|
|
1476
|
+
left: (pos.left + $button.innerWidth()/2 - $tooltip.innerWidth()/2) + 'px'
|
|
1459
1477
|
});
|
|
1460
1478
|
});
|
|
1461
1479
|
|
|
@@ -1473,38 +1491,25 @@
|
|
|
1473
1491
|
|
|
1474
1492
|
if (this.utils.browser('msie')) e.returnValue = false;
|
|
1475
1493
|
|
|
1476
|
-
if (type == 'command')
|
|
1477
|
-
|
|
1478
|
-
|
|
1479
|
-
|
|
1480
|
-
|
|
1481
|
-
|
|
1482
|
-
|
|
1483
|
-
|
|
1484
|
-
|
|
1494
|
+
if (type == 'command') this.inline.format(callback);
|
|
1495
|
+
else if (type == 'dropdown') this.dropdown.show(e, btnName);
|
|
1496
|
+
else this.button.onClickCallback(e, callback, btnName);
|
|
1497
|
+
},
|
|
1498
|
+
onClickCallback: function(e, callback, btnName)
|
|
1499
|
+
{
|
|
1500
|
+
var func;
|
|
1501
|
+
|
|
1502
|
+
if ($.isFunction(callback)) callback.call(this, btnName);
|
|
1503
|
+
else if (callback.search(/\./) != '-1')
|
|
1485
1504
|
{
|
|
1486
|
-
|
|
1505
|
+
func = callback.split('.');
|
|
1506
|
+
if (typeof this[func[0]] == 'undefined') return;
|
|
1487
1507
|
|
|
1488
|
-
|
|
1489
|
-
{
|
|
1490
|
-
callback.call(this, btnName);
|
|
1491
|
-
this.observe.buttons(e, btnName);
|
|
1492
|
-
}
|
|
1493
|
-
else if (callback.search(/\./) != '-1')
|
|
1494
|
-
{
|
|
1495
|
-
func = callback.split('.');
|
|
1496
|
-
if (typeof this[func[0]] != 'undefined')
|
|
1497
|
-
{
|
|
1498
|
-
this[func[0]][func[1]](btnName);
|
|
1499
|
-
this.observe.buttons(e, btnName);
|
|
1500
|
-
}
|
|
1501
|
-
}
|
|
1502
|
-
else
|
|
1503
|
-
{
|
|
1504
|
-
this[callback](btnName);
|
|
1505
|
-
this.observe.buttons(e, btnName);
|
|
1506
|
-
}
|
|
1508
|
+
this[func[0]][func[1]](btnName);
|
|
1507
1509
|
}
|
|
1510
|
+
else this[callback](btnName);
|
|
1511
|
+
|
|
1512
|
+
this.observe.buttons(e, btnName);
|
|
1508
1513
|
},
|
|
1509
1514
|
get: function(key)
|
|
1510
1515
|
{
|
|
@@ -1570,10 +1575,8 @@
|
|
|
1570
1575
|
var $dropdown = $('<div class="redactor-dropdown redactor-dropdown-box-' + key + '" style="display: none;">');
|
|
1571
1576
|
$btn.data('dropdown', $dropdown);
|
|
1572
1577
|
|
|
1573
|
-
|
|
1574
|
-
|
|
1575
|
-
this.dropdown.build(key, $dropdown, dropdown);
|
|
1576
|
-
}
|
|
1578
|
+
// build dropdown
|
|
1579
|
+
if (dropdown) this.dropdown.build(key, $dropdown, dropdown);
|
|
1577
1580
|
|
|
1578
1581
|
return $dropdown;
|
|
1579
1582
|
},
|
|
@@ -1604,7 +1607,7 @@
|
|
|
1604
1607
|
var btn = this.button.build(key, { title: title });
|
|
1605
1608
|
var $btn = this.button.get(afterkey);
|
|
1606
1609
|
|
|
1607
|
-
if ($btn.
|
|
1610
|
+
if ($btn.length !== 0) $btn.parent().after($('<li>').append(btn));
|
|
1608
1611
|
else this.$toolbar.append($('<li>').append(btn));
|
|
1609
1612
|
|
|
1610
1613
|
return btn;
|
|
@@ -1616,7 +1619,7 @@
|
|
|
1616
1619
|
var btn = this.button.build(key, { title: title });
|
|
1617
1620
|
var $btn = this.button.get(beforekey);
|
|
1618
1621
|
|
|
1619
|
-
if ($btn.
|
|
1622
|
+
if ($btn.length !== 0) $btn.parent().before($('<li>').append(btn));
|
|
1620
1623
|
else this.$toolbar.append($('<li>').append(btn));
|
|
1621
1624
|
|
|
1622
1625
|
return btn;
|
|
@@ -1652,7 +1655,8 @@
|
|
|
1652
1655
|
set: function(orgn, orgo, focn, foco)
|
|
1653
1656
|
{
|
|
1654
1657
|
// focus
|
|
1655
|
-
|
|
1658
|
+
// disabled in 10.0.7
|
|
1659
|
+
// if (!this.utils.browser('msie')) this.$editor.focus();
|
|
1656
1660
|
|
|
1657
1661
|
orgn = orgn[0] || orgn;
|
|
1658
1662
|
focn = focn[0] || focn;
|
|
@@ -1664,15 +1668,16 @@
|
|
|
1664
1668
|
|
|
1665
1669
|
if (orgn.tagName == 'BR' && this.opts.linebreaks === false)
|
|
1666
1670
|
{
|
|
1667
|
-
var
|
|
1668
|
-
$(orgn).replaceWith(
|
|
1669
|
-
orgn =
|
|
1671
|
+
var parent = $(this.opts.emptyHtml)[0];
|
|
1672
|
+
$(orgn).replaceWith(parent);
|
|
1673
|
+
orgn = parent;
|
|
1670
1674
|
focn = orgn;
|
|
1671
1675
|
}
|
|
1672
1676
|
|
|
1673
1677
|
this.selection.get();
|
|
1674
1678
|
|
|
1675
|
-
try
|
|
1679
|
+
try
|
|
1680
|
+
{
|
|
1676
1681
|
this.range.setStart(orgn, orgo);
|
|
1677
1682
|
this.range.setEnd(focn, foco);
|
|
1678
1683
|
}
|
|
@@ -1682,7 +1687,8 @@
|
|
|
1682
1687
|
},
|
|
1683
1688
|
setAfter: function(node)
|
|
1684
1689
|
{
|
|
1685
|
-
try
|
|
1690
|
+
try
|
|
1691
|
+
{
|
|
1686
1692
|
var tag = $(node)[0].tagName;
|
|
1687
1693
|
|
|
1688
1694
|
// inline tag
|
|
@@ -1705,7 +1711,8 @@
|
|
|
1705
1711
|
}
|
|
1706
1712
|
}
|
|
1707
1713
|
}
|
|
1708
|
-
catch (e)
|
|
1714
|
+
catch (e)
|
|
1715
|
+
{
|
|
1709
1716
|
var space = this.utils.createSpaceElement();
|
|
1710
1717
|
$(node).after(space);
|
|
1711
1718
|
this.caret.setEnd(space);
|
|
@@ -1810,6 +1817,7 @@
|
|
|
1810
1817
|
this.range.collapse(false);
|
|
1811
1818
|
this.selection.addRange();
|
|
1812
1819
|
},
|
|
1820
|
+
// deprecated
|
|
1813
1821
|
setToPoint: function(start, end)
|
|
1814
1822
|
{
|
|
1815
1823
|
this.caret.setOffset(start, end);
|
|
@@ -1945,9 +1953,7 @@
|
|
|
1945
1953
|
}
|
|
1946
1954
|
|
|
1947
1955
|
// reconvert inline
|
|
1948
|
-
html = html.replace(
|
|
1949
|
-
html = html.replace(/<(.*?) data-redactor-class="(.*?)"(.*?[^>])>/gi, '<$1$3>');
|
|
1950
|
-
html = html.replace(/<(.*?) data-redactor-style="(.*?)"(.*?[^>])>/gi, '<$1$3>');
|
|
1956
|
+
html = html.replace(/\sdata-redactor-(tag|class|style)="(.*?[^>])"/gi, '');
|
|
1951
1957
|
html = html.replace(new RegExp('<(.*?) data-verified="redactor"(.*?[^>])>', 'gi'), '<$1$2>');
|
|
1952
1958
|
html = html.replace(new RegExp('<(.*?) data-verified="redactor">', 'gi'), '<$1>');
|
|
1953
1959
|
|
|
@@ -1958,12 +1964,11 @@
|
|
|
1958
1964
|
html = $.trim(html);
|
|
1959
1965
|
|
|
1960
1966
|
html = html.replace(/\$/g, '$');
|
|
1961
|
-
html = html.replace(/”/g, '"');
|
|
1962
|
-
html = html.replace(/“/g, '"');
|
|
1963
1967
|
html = html.replace(/‘/g, '\'');
|
|
1964
1968
|
html = html.replace(/’/g, '\'');
|
|
1965
1969
|
|
|
1966
1970
|
// convert dirty spaces
|
|
1971
|
+
html = html.replace(/<span class="s1">/gi, '<span>');
|
|
1967
1972
|
html = html.replace(/<span class="Apple-converted-space"> <\/span>/gi, ' ');
|
|
1968
1973
|
html = html.replace(/<span class="Apple-tab-span"[^>]*>\t<\/span>/gi, '\t');
|
|
1969
1974
|
html = html.replace(/<span[^>]*>(\s| )<\/span>/gi, ' ');
|
|
@@ -1982,6 +1987,9 @@
|
|
|
1982
1987
|
|
|
1983
1988
|
if (this.utils.isCurrentOrParent('PRE'))
|
|
1984
1989
|
{
|
|
1990
|
+
html = html.replace(/”/g, '"');
|
|
1991
|
+
html = html.replace(/“/g, '"');
|
|
1992
|
+
|
|
1985
1993
|
return this.clean.getPreCode(html);
|
|
1986
1994
|
}
|
|
1987
1995
|
|
|
@@ -2200,6 +2208,11 @@
|
|
|
2200
2208
|
removeEmpty: tagsEmpty
|
|
2201
2209
|
};
|
|
2202
2210
|
|
|
2211
|
+
// denied tags
|
|
2212
|
+
if (this.opts.deniedTags)
|
|
2213
|
+
{
|
|
2214
|
+
options.deniedTags = this.opts.deniedTags;
|
|
2215
|
+
}
|
|
2203
2216
|
|
|
2204
2217
|
return this.tidy.load(html, options);
|
|
2205
2218
|
|
|
@@ -2800,6 +2813,8 @@
|
|
|
2800
2813
|
|
|
2801
2814
|
$item.on('click', $.proxy(function(e)
|
|
2802
2815
|
{
|
|
2816
|
+
e.preventDefault();
|
|
2817
|
+
|
|
2803
2818
|
var type = 'func';
|
|
2804
2819
|
var callback = btnObject.func;
|
|
2805
2820
|
if (btnObject.command)
|
|
@@ -2814,6 +2829,7 @@
|
|
|
2814
2829
|
}
|
|
2815
2830
|
|
|
2816
2831
|
this.button.onClick(e, btnName, type, callback);
|
|
2832
|
+
this.dropdown.hideAll();
|
|
2817
2833
|
|
|
2818
2834
|
}, this));
|
|
2819
2835
|
|
|
@@ -2859,7 +2875,7 @@
|
|
|
2859
2875
|
var dropdownWidth = $dropdown.width();
|
|
2860
2876
|
if ((keyPosition.left + dropdownWidth) > $(document).width())
|
|
2861
2877
|
{
|
|
2862
|
-
keyPosition.left
|
|
2878
|
+
keyPosition.left = Math.max(0, keyPosition.left - dropdownWidth);
|
|
2863
2879
|
}
|
|
2864
2880
|
|
|
2865
2881
|
var left = keyPosition.left + 'px';
|
|
@@ -2988,7 +3004,7 @@
|
|
|
2988
3004
|
if (typeof json == 'string') return;
|
|
2989
3005
|
|
|
2990
3006
|
var linkmarker = $(this.$editor.find('a#filelink-marker'));
|
|
2991
|
-
if (linkmarker.
|
|
3007
|
+
if (linkmarker.length !== 0)
|
|
2992
3008
|
{
|
|
2993
3009
|
linkmarker.removeAttr('id').removeAttr('style');
|
|
2994
3010
|
}
|
|
@@ -3008,7 +3024,7 @@
|
|
|
3008
3024
|
|
|
3009
3025
|
var first = this.$editor.children().first();
|
|
3010
3026
|
|
|
3011
|
-
if (first.
|
|
3027
|
+
if (first.length === 0) return;
|
|
3012
3028
|
if (first[0].length === 0 || first[0].tagName == 'BR' || first[0].nodeType == 3)
|
|
3013
3029
|
{
|
|
3014
3030
|
return;
|
|
@@ -3106,7 +3122,6 @@
|
|
|
3106
3122
|
|
|
3107
3123
|
}, this));
|
|
3108
3124
|
|
|
3109
|
-
|
|
3110
3125
|
$('#redactor-image-title').val($image.attr('alt'));
|
|
3111
3126
|
|
|
3112
3127
|
if (!this.opts.imageLink) $('.redactor-image-link-option').hide();
|
|
@@ -3115,7 +3130,7 @@
|
|
|
3115
3130
|
var $redactorImageLink = $('#redactor-image-link');
|
|
3116
3131
|
|
|
3117
3132
|
$redactorImageLink.attr('href', $image.attr('src'));
|
|
3118
|
-
if ($link.
|
|
3133
|
+
if ($link.length !== 0)
|
|
3119
3134
|
{
|
|
3120
3135
|
$redactorImageLink.val($link.attr('href'));
|
|
3121
3136
|
if ($link.attr('target') == '_blank') $('#redactor-image-link-blank').prop('checked', true);
|
|
@@ -3174,9 +3189,19 @@
|
|
|
3174
3189
|
var link = $.trim($('#redactor-image-link').val());
|
|
3175
3190
|
if (link !== '')
|
|
3176
3191
|
{
|
|
3192
|
+
// test url (add protocol)
|
|
3193
|
+
var pattern = '((xn--)?[a-z0-9]+(-[a-z0-9]+)*\\.)+[a-z]{2,}';
|
|
3194
|
+
var re = new RegExp('^(http|ftp|https)://' + pattern, 'i');
|
|
3195
|
+
var re2 = new RegExp('^' + pattern, 'i');
|
|
3196
|
+
|
|
3197
|
+
if (link.search(re) == -1 && link.search(re2) === 0 && this.opts.linkProtocol)
|
|
3198
|
+
{
|
|
3199
|
+
link = this.opts.linkProtocol + '://' + link;
|
|
3200
|
+
}
|
|
3201
|
+
|
|
3177
3202
|
var target = ($('#redactor-image-link-blank').prop('checked')) ? true : false;
|
|
3178
3203
|
|
|
3179
|
-
if ($link.
|
|
3204
|
+
if ($link.length === 0)
|
|
3180
3205
|
{
|
|
3181
3206
|
var a = $('<a href="' + link + '">' + this.utils.getOuterHtml($image) + '</a>');
|
|
3182
3207
|
if (target) a.attr('target', '_blank');
|
|
@@ -3196,7 +3221,7 @@
|
|
|
3196
3221
|
}
|
|
3197
3222
|
}
|
|
3198
3223
|
}
|
|
3199
|
-
else if ($link.
|
|
3224
|
+
else if ($link.length !== 0)
|
|
3200
3225
|
{
|
|
3201
3226
|
$link.replaceWith(this.utils.getOuterHtml($image));
|
|
3202
3227
|
|
|
@@ -3220,7 +3245,7 @@
|
|
|
3220
3245
|
{
|
|
3221
3246
|
this.observe.image = $image;
|
|
3222
3247
|
|
|
3223
|
-
if (this.$editor.find('#redactor-image-box').
|
|
3248
|
+
if (this.$editor.find('#redactor-image-box').length !== 0) return false;
|
|
3224
3249
|
|
|
3225
3250
|
this.image.resizer = this.image.loadEditableControls($image);
|
|
3226
3251
|
|
|
@@ -3296,7 +3321,7 @@
|
|
|
3296
3321
|
},
|
|
3297
3322
|
onDrag: function(e)
|
|
3298
3323
|
{
|
|
3299
|
-
if (this.$editor.find('#redactor-image-box').
|
|
3324
|
+
if (this.$editor.find('#redactor-image-box').length !== 0)
|
|
3300
3325
|
{
|
|
3301
3326
|
e.preventDefault();
|
|
3302
3327
|
return false;
|
|
@@ -3335,7 +3360,7 @@
|
|
|
3335
3360
|
}
|
|
3336
3361
|
|
|
3337
3362
|
var imageBox = this.$editor.find('#redactor-image-box');
|
|
3338
|
-
if (imageBox.
|
|
3363
|
+
if (imageBox.length === 0) return;
|
|
3339
3364
|
|
|
3340
3365
|
if (this.opts.imageEditable)
|
|
3341
3366
|
{
|
|
@@ -3442,18 +3467,18 @@
|
|
|
3442
3467
|
var $link = $image.closest('a');
|
|
3443
3468
|
var $figure = $image.closest('figure');
|
|
3444
3469
|
var $parent = $image.parent();
|
|
3445
|
-
if ($('#redactor-image-box').
|
|
3470
|
+
if ($('#redactor-image-box').length !== 0)
|
|
3446
3471
|
{
|
|
3447
3472
|
$parent = $('#redactor-image-box').parent();
|
|
3448
3473
|
}
|
|
3449
3474
|
|
|
3450
3475
|
var $next;
|
|
3451
|
-
if ($figure.
|
|
3476
|
+
if ($figure.length !== 0)
|
|
3452
3477
|
{
|
|
3453
3478
|
$next = $figure.next();
|
|
3454
3479
|
$figure.remove();
|
|
3455
3480
|
}
|
|
3456
|
-
else if ($link.
|
|
3481
|
+
else if ($link.length !== 0)
|
|
3457
3482
|
{
|
|
3458
3483
|
$parent = $link.parent();
|
|
3459
3484
|
$link.remove();
|
|
@@ -3465,7 +3490,7 @@
|
|
|
3465
3490
|
|
|
3466
3491
|
$('#redactor-image-box').remove();
|
|
3467
3492
|
|
|
3468
|
-
if ($figure.
|
|
3493
|
+
if ($figure.length !== 0)
|
|
3469
3494
|
{
|
|
3470
3495
|
this.caret.setStart($next);
|
|
3471
3496
|
}
|
|
@@ -3525,7 +3550,6 @@
|
|
|
3525
3550
|
this.selection.restore();
|
|
3526
3551
|
this.buffer.set();
|
|
3527
3552
|
|
|
3528
|
-
|
|
3529
3553
|
this.insert.html(this.utils.getOuterHtml(node), false);
|
|
3530
3554
|
|
|
3531
3555
|
var $image = this.$editor.find('img[data-redactor-inserted-image=true]').removeAttr('data-redactor-inserted-image');
|
|
@@ -3628,14 +3652,14 @@
|
|
|
3628
3652
|
|
|
3629
3653
|
var $item = $(current).closest('li');
|
|
3630
3654
|
var $parent = $item.parent();
|
|
3631
|
-
if ($item.
|
|
3655
|
+
if ($item.length !== 0 && $parent.length !== 0 && $parent[0].tagName == 'LI')
|
|
3632
3656
|
{
|
|
3633
3657
|
$parent.after($item);
|
|
3634
3658
|
}
|
|
3635
3659
|
|
|
3636
3660
|
this.indent.fixEmptyIndent();
|
|
3637
3661
|
|
|
3638
|
-
if (!this.opts.linebreaks && $item.
|
|
3662
|
+
if (!this.opts.linebreaks && $item.length === 0)
|
|
3639
3663
|
{
|
|
3640
3664
|
document.execCommand('formatblock', false, 'p');
|
|
3641
3665
|
this.$editor.find('ul, ol, blockquote, p').each($.proxy(this.utils.removeEmpty, this));
|
|
@@ -3733,14 +3757,16 @@
|
|
|
3733
3757
|
var $parent = $(current).closest(tag + '[data-redactor-tag=' + tag + ']');
|
|
3734
3758
|
|
|
3735
3759
|
// inline there is
|
|
3736
|
-
if ($parent.
|
|
3760
|
+
if ($parent.length !== 0 && (this.inline.type != 'style' && $parent[0].tagName != 'SPAN'))
|
|
3737
3761
|
{
|
|
3738
3762
|
this.caret.setAfter($parent[0]);
|
|
3739
3763
|
|
|
3740
3764
|
// remove empty
|
|
3741
|
-
if (this.utils.isEmpty($parent.text()))
|
|
3742
|
-
|
|
3743
|
-
|
|
3765
|
+
if ( this.utils.isEmpty($parent.text()))
|
|
3766
|
+
{
|
|
3767
|
+
$parent.remove();
|
|
3768
|
+
this.code.sync();
|
|
3769
|
+
}
|
|
3744
3770
|
|
|
3745
3771
|
return;
|
|
3746
3772
|
}
|
|
@@ -3763,7 +3789,6 @@
|
|
|
3763
3789
|
this.selection.save();
|
|
3764
3790
|
document.execCommand('strikethrough');
|
|
3765
3791
|
|
|
3766
|
-
|
|
3767
3792
|
this.$editor.find('strike').each($.proxy(function(i,s)
|
|
3768
3793
|
{
|
|
3769
3794
|
var $el = $(s);
|
|
@@ -3838,13 +3863,37 @@
|
|
|
3838
3863
|
},
|
|
3839
3864
|
formatRemoveSameChildren: function($el, tag)
|
|
3840
3865
|
{
|
|
3866
|
+
var self = this;
|
|
3841
3867
|
$el.children(tag).each(function()
|
|
3842
3868
|
{
|
|
3843
3869
|
var $child = $(this);
|
|
3870
|
+
|
|
3844
3871
|
if (!$child.hasClass('redactor-selection-marker'))
|
|
3845
3872
|
{
|
|
3846
|
-
|
|
3873
|
+
if (self.inline.type == 'style')
|
|
3874
|
+
{
|
|
3875
|
+
var arr = self.inline.value.split(';');
|
|
3876
|
+
|
|
3877
|
+
for (var z = 0; z < arr.length; z++)
|
|
3878
|
+
{
|
|
3879
|
+
if (arr[z] === '') return;
|
|
3880
|
+
|
|
3881
|
+
var style = arr[z].split(':');
|
|
3882
|
+
$child.css(style[0], '');
|
|
3883
|
+
|
|
3884
|
+
if (self.utils.removeEmptyAttr($child , 'style'))
|
|
3885
|
+
{
|
|
3886
|
+
$child.replaceWith($child.contents());
|
|
3887
|
+
}
|
|
3888
|
+
|
|
3889
|
+
}
|
|
3890
|
+
}
|
|
3891
|
+
else
|
|
3892
|
+
{
|
|
3893
|
+
$child.contents().unwrap();
|
|
3894
|
+
}
|
|
3847
3895
|
}
|
|
3896
|
+
|
|
3848
3897
|
});
|
|
3849
3898
|
},
|
|
3850
3899
|
formatConvert: function(tag)
|
|
@@ -3858,15 +3907,25 @@
|
|
|
3858
3907
|
find = '[data-redactor-style="' + this.inline.value + '"]';
|
|
3859
3908
|
}
|
|
3860
3909
|
|
|
3910
|
+
var self = this;
|
|
3861
3911
|
if (tag != 'del')
|
|
3862
3912
|
{
|
|
3863
|
-
var self = this;
|
|
3864
3913
|
this.$editor.find('del').each(function(i,s)
|
|
3865
3914
|
{
|
|
3866
3915
|
self.utils.replaceToTag(s, 'inline');
|
|
3867
3916
|
});
|
|
3868
3917
|
}
|
|
3869
3918
|
|
|
3919
|
+
if (tag != 'span')
|
|
3920
|
+
{
|
|
3921
|
+
this.$editor.find(tag).each(function()
|
|
3922
|
+
{
|
|
3923
|
+
var $el = $(this);
|
|
3924
|
+
$el.replaceWith($('<strike />').html($el.contents()));
|
|
3925
|
+
|
|
3926
|
+
});
|
|
3927
|
+
}
|
|
3928
|
+
|
|
3870
3929
|
this.$editor.find('[data-redactor-tag="' + tag + '"]' + find).each(function()
|
|
3871
3930
|
{
|
|
3872
3931
|
if (find === '' && tag == 'span' && this.tagName.toLowerCase() == tag) return;
|
|
@@ -4194,7 +4253,10 @@
|
|
|
4194
4253
|
var html = this.utils.getOuterHtml(node);
|
|
4195
4254
|
html = this.clean.setVerified(html);
|
|
4196
4255
|
|
|
4197
|
-
|
|
4256
|
+
if (html.match(/</g) !== null)
|
|
4257
|
+
{
|
|
4258
|
+
node = $(html)[0];
|
|
4259
|
+
}
|
|
4198
4260
|
|
|
4199
4261
|
this.selection.get();
|
|
4200
4262
|
|
|
@@ -4398,7 +4460,7 @@
|
|
|
4398
4460
|
current = this.selection.getCurrent();
|
|
4399
4461
|
$next = $(current).next();
|
|
4400
4462
|
|
|
4401
|
-
if ($next.
|
|
4463
|
+
if ($next.length !== 0 && $next[0].tagName == 'BR')
|
|
4402
4464
|
{
|
|
4403
4465
|
return this.keydown.insertBreakLine(e);
|
|
4404
4466
|
}
|
|
@@ -4418,7 +4480,8 @@
|
|
|
4418
4480
|
|
|
4419
4481
|
if (current !== false && $(current).hasClass('redactor-invisible-space'))
|
|
4420
4482
|
{
|
|
4421
|
-
|
|
4483
|
+
this.caret.setAfter(current);
|
|
4484
|
+
$(current).contents().unwrap();
|
|
4422
4485
|
return this.keydown.insertDblBreakLine(e);
|
|
4423
4486
|
}
|
|
4424
4487
|
else
|
|
@@ -4427,6 +4490,10 @@
|
|
|
4427
4490
|
{
|
|
4428
4491
|
return this.keydown.insertDblBreakLine(e);
|
|
4429
4492
|
}
|
|
4493
|
+
else if (this.utils.isEndOfEditor())
|
|
4494
|
+
{
|
|
4495
|
+
return this.keydown.insertDblBreakLine(e);
|
|
4496
|
+
}
|
|
4430
4497
|
|
|
4431
4498
|
return this.keydown.insertBreakLine(e);
|
|
4432
4499
|
}
|
|
@@ -4448,7 +4515,6 @@
|
|
|
4448
4515
|
|
|
4449
4516
|
}
|
|
4450
4517
|
|
|
4451
|
-
|
|
4452
4518
|
// Shift+Enter or Ctrl+Enter
|
|
4453
4519
|
if (key === this.keyCode.ENTER && (e.ctrlKey || e.shiftKey))
|
|
4454
4520
|
{
|
|
@@ -4462,7 +4528,6 @@
|
|
|
4462
4528
|
return this.keydown.onTab(e, key);
|
|
4463
4529
|
}
|
|
4464
4530
|
|
|
4465
|
-
|
|
4466
4531
|
// image delete and backspace
|
|
4467
4532
|
if (key === this.keyCode.BACKSPACE || key === this.keyCode.DELETE)
|
|
4468
4533
|
{
|
|
@@ -4474,7 +4539,7 @@
|
|
|
4474
4539
|
for (var i = 0; i < len; i++)
|
|
4475
4540
|
{
|
|
4476
4541
|
var children = $(nodes[i]).children('img');
|
|
4477
|
-
if (children.
|
|
4542
|
+
if (children.length !== 0)
|
|
4478
4543
|
{
|
|
4479
4544
|
var self = this;
|
|
4480
4545
|
$.each(children, function(z,s)
|
|
@@ -4810,7 +4875,7 @@
|
|
|
4810
4875
|
var $parent = $(this.keydown.parent);
|
|
4811
4876
|
var td = $current.closest('td');
|
|
4812
4877
|
|
|
4813
|
-
if (td.
|
|
4878
|
+
if (td.length !== 0 && $current.closest('li') && $parent.children('li').length === 1)
|
|
4814
4879
|
{
|
|
4815
4880
|
if (!this.utils.isEmpty($current.text())) return;
|
|
4816
4881
|
|
|
@@ -4896,14 +4961,11 @@
|
|
|
4896
4961
|
this.$editor.find('p').each($.proxy(this.utils.removeEmpty, this));
|
|
4897
4962
|
|
|
4898
4963
|
// remove invisible space
|
|
4899
|
-
if (this.keyup.current && this.keyup.current.tagName == 'DIV' && this.utils.isEmpty(this.keyup.current.innerHTML))
|
|
4964
|
+
if (this.opts.linebreaks && this.keyup.current && this.keyup.current.tagName == 'DIV' && this.utils.isEmpty(this.keyup.current.innerHTML))
|
|
4900
4965
|
{
|
|
4901
|
-
|
|
4902
|
-
|
|
4903
|
-
|
|
4904
|
-
this.selection.restore();
|
|
4905
|
-
$(this.keyup.current).remove();
|
|
4906
|
-
}
|
|
4966
|
+
$(this.keyup.current).after(this.selection.getMarkerAsHtml());
|
|
4967
|
+
this.selection.restore();
|
|
4968
|
+
$(this.keyup.current).remove();
|
|
4907
4969
|
}
|
|
4908
4970
|
|
|
4909
4971
|
// if empty
|
|
@@ -5111,7 +5173,7 @@
|
|
|
5111
5173
|
this.link.$node = false;
|
|
5112
5174
|
|
|
5113
5175
|
var $el = $(this.selection.getCurrent()).closest('a');
|
|
5114
|
-
if ($el.
|
|
5176
|
+
if ($el.length !== 0 && $el[0].tagName === 'A')
|
|
5115
5177
|
{
|
|
5116
5178
|
this.link.$node = $el;
|
|
5117
5179
|
|
|
@@ -5162,8 +5224,8 @@
|
|
|
5162
5224
|
var pattern = '((xn--)?[a-z0-9]+(-[a-z0-9]+)*\\.)+[a-z]{2,}';
|
|
5163
5225
|
var re = new RegExp('^(http|ftp|https)://' + pattern, 'i');
|
|
5164
5226
|
var re2 = new RegExp('^' + pattern, 'i');
|
|
5165
|
-
|
|
5166
|
-
if (link.search(re) == -1 && link.search(re2) === 0 && this.opts.linkProtocol)
|
|
5227
|
+
var re3 = new RegExp('\.(html|php)$', 'i');
|
|
5228
|
+
if (link.search(re) == -1 && link.search(re3) == -1 && link.search(re2) === 0 && this.opts.linkProtocol)
|
|
5167
5229
|
{
|
|
5168
5230
|
link = this.opts.linkProtocol + '://' + link;
|
|
5169
5231
|
}
|
|
@@ -5227,7 +5289,7 @@
|
|
|
5227
5289
|
if (target !== '') $a.attr('target', target);
|
|
5228
5290
|
$a.removeAttr('style');
|
|
5229
5291
|
|
|
5230
|
-
if (this.link.text === '')
|
|
5292
|
+
if (this.link.text === '' || this.link.text != text)
|
|
5231
5293
|
{
|
|
5232
5294
|
$a.text(text);
|
|
5233
5295
|
this.selection.selectElement($a);
|
|
@@ -5288,7 +5350,7 @@
|
|
|
5288
5350
|
var parent = this.selection.getParent();
|
|
5289
5351
|
var $list = $(parent).closest('ol, ul');
|
|
5290
5352
|
|
|
5291
|
-
if (!this.utils.isRedactorParent($list) && $list.
|
|
5353
|
+
if (!this.utils.isRedactorParent($list) && $list.length !== 0)
|
|
5292
5354
|
{
|
|
5293
5355
|
$list = false;
|
|
5294
5356
|
}
|
|
@@ -5345,7 +5407,7 @@
|
|
|
5345
5407
|
|
|
5346
5408
|
var $list = $(this.selection.getParent()).closest('ol, ul');
|
|
5347
5409
|
|
|
5348
|
-
if ($td.
|
|
5410
|
+
if ($td.length !== 0)
|
|
5349
5411
|
{
|
|
5350
5412
|
var prev = $td.prev();
|
|
5351
5413
|
var html = $td.html();
|
|
@@ -5430,7 +5492,7 @@
|
|
|
5430
5492
|
|
|
5431
5493
|
this.indent.fixEmptyIndent();
|
|
5432
5494
|
|
|
5433
|
-
if (!this.opts.linebreaks && $current.closest('li, th, td').
|
|
5495
|
+
if (!this.opts.linebreaks && $current.closest('li, th, td').length === 0)
|
|
5434
5496
|
{
|
|
5435
5497
|
document.execCommand('formatblock', false, 'p');
|
|
5436
5498
|
this.$editor.find('ul, ol, blockquote').each($.proxy(this.utils.removeEmpty, this));
|
|
@@ -5438,7 +5500,7 @@
|
|
|
5438
5500
|
|
|
5439
5501
|
var $table = $(this.selection.getCurrent()).closest('table');
|
|
5440
5502
|
var $prev = $table.prev();
|
|
5441
|
-
if (!this.opts.linebreaks && $table.
|
|
5503
|
+
if (!this.opts.linebreaks && $table.length !== 0 && $prev.length !== 0 && $prev[0].tagName == 'BR')
|
|
5442
5504
|
{
|
|
5443
5505
|
$prev.remove();
|
|
5444
5506
|
}
|
|
@@ -5603,8 +5665,7 @@
|
|
|
5603
5665
|
$(document).off('focusin.modal');
|
|
5604
5666
|
|
|
5605
5667
|
// enter
|
|
5606
|
-
this.$modal.find('input[type=text]').on('keydown.redactor-modal', $.proxy(this.modal.setEnter, this));
|
|
5607
|
-
|
|
5668
|
+
this.$modal.find('input[type=text],input[type=url],input[type=email]').on('keydown.redactor-modal', $.proxy(this.modal.setEnter, this));
|
|
5608
5669
|
},
|
|
5609
5670
|
showOnDesktop: function()
|
|
5610
5671
|
{
|
|
@@ -5702,7 +5763,7 @@
|
|
|
5702
5763
|
setButtonsWidth: function()
|
|
5703
5764
|
{
|
|
5704
5765
|
var buttons = this.$modalFooter.find('button');
|
|
5705
|
-
var buttonsSize = buttons.
|
|
5766
|
+
var buttonsSize = buttons.length;
|
|
5706
5767
|
if (buttonsSize === 0) return;
|
|
5707
5768
|
|
|
5708
5769
|
buttons.css('width', (100/buttonsSize) + '%');
|
|
@@ -5877,7 +5938,7 @@
|
|
|
5877
5938
|
{
|
|
5878
5939
|
var $link = $(e.target);
|
|
5879
5940
|
var $parent = $link.closest('a');
|
|
5880
|
-
var tag = ($link.
|
|
5941
|
+
var tag = ($link.length !== 0) ? $link[0].tagName : false;
|
|
5881
5942
|
|
|
5882
5943
|
if ($parent[0].tagName === 'A')
|
|
5883
5944
|
{
|
|
@@ -5907,7 +5968,7 @@
|
|
|
5907
5968
|
|
|
5908
5969
|
tooltip.append(aLink).append(' | ').append(aEdit).append(' | ').append(aUnlink);
|
|
5909
5970
|
tooltip.css({
|
|
5910
|
-
top: (pos.top +
|
|
5971
|
+
top: (pos.top + parseInt($link.css('line-height'), 10)) + 'px',
|
|
5911
5972
|
left: pos.left + 'px'
|
|
5912
5973
|
});
|
|
5913
5974
|
|
|
@@ -5920,7 +5981,7 @@
|
|
|
5920
5981
|
|
|
5921
5982
|
var target = e.target;
|
|
5922
5983
|
var $parent = $(target).closest('a');
|
|
5923
|
-
if ($parent.
|
|
5984
|
+
if ($parent.length !== 0 && $parent[0].tagName === 'A' && target.tagName !== 'A')
|
|
5924
5985
|
{
|
|
5925
5986
|
return;
|
|
5926
5987
|
}
|
|
@@ -6323,15 +6384,23 @@
|
|
|
6323
6384
|
|
|
6324
6385
|
var startNode = this.selection.getNodesMarker(1);
|
|
6325
6386
|
var endNode = this.selection.getNodesMarker(2);
|
|
6326
|
-
|
|
6327
|
-
this.selection.setNodesMarker(this.range, startNode, true);
|
|
6387
|
+
var range = this.range.cloneRange();
|
|
6328
6388
|
|
|
6329
6389
|
if (this.range.collapsed === false)
|
|
6330
6390
|
{
|
|
6331
|
-
|
|
6391
|
+
var startContainer = range.startContainer;
|
|
6392
|
+
var startOffset = range.startOffset;
|
|
6393
|
+
|
|
6394
|
+
// end marker
|
|
6395
|
+
this.selection.setNodesMarker(range, endNode, false);
|
|
6396
|
+
|
|
6397
|
+
// start marker
|
|
6398
|
+
range.setStart(startContainer, startOffset);
|
|
6399
|
+
this.selection.setNodesMarker(range, startNode, true);
|
|
6332
6400
|
}
|
|
6333
6401
|
else
|
|
6334
6402
|
{
|
|
6403
|
+
this.selection.setNodesMarker(range, startNode, true);
|
|
6335
6404
|
endNode = startNode;
|
|
6336
6405
|
}
|
|
6337
6406
|
|
|
@@ -6389,8 +6458,6 @@
|
|
|
6389
6458
|
},
|
|
6390
6459
|
setNodesMarker: function(range, node, type)
|
|
6391
6460
|
{
|
|
6392
|
-
range = range.cloneRange();
|
|
6393
|
-
|
|
6394
6461
|
try {
|
|
6395
6462
|
range.collapse(type);
|
|
6396
6463
|
range.insertNode(node);
|
|
@@ -7334,8 +7401,17 @@
|
|
|
7334
7401
|
{
|
|
7335
7402
|
if (!this.opts.toolbar[btnName]) return;
|
|
7336
7403
|
|
|
7337
|
-
if (
|
|
7338
|
-
|
|
7404
|
+
if (btnName === 'file')
|
|
7405
|
+
{
|
|
7406
|
+
if (this.opts.fileUpload === false) return;
|
|
7407
|
+
else if (!this.opts.fileUpload && this.opts.s3 === false) return;
|
|
7408
|
+
}
|
|
7409
|
+
|
|
7410
|
+
if (btnName === 'image')
|
|
7411
|
+
{
|
|
7412
|
+
if (this.opts.imageUpload === false) return;
|
|
7413
|
+
else if (!this.opts.imageUpload && this.opts.s3 === false) return;
|
|
7414
|
+
}
|
|
7339
7415
|
|
|
7340
7416
|
var btnObject = this.opts.toolbar[btnName];
|
|
7341
7417
|
this.$toolbar.append($('<li>').append(this.button.build(btnName, btnObject)));
|
|
@@ -7373,7 +7449,7 @@
|
|
|
7373
7449
|
},
|
|
7374
7450
|
isButtonSourceNeeded: function()
|
|
7375
7451
|
{
|
|
7376
|
-
if (this.opts.
|
|
7452
|
+
if (this.opts.source) return;
|
|
7377
7453
|
|
|
7378
7454
|
var index = this.opts.buttons.indexOf('html');
|
|
7379
7455
|
if (index !== -1)
|
|
@@ -8005,6 +8081,15 @@
|
|
|
8005
8081
|
|
|
8006
8082
|
return (offset == text.length) ? true : false;
|
|
8007
8083
|
},
|
|
8084
|
+
isEndOfEditor: function()
|
|
8085
|
+
{
|
|
8086
|
+
var block = this.$editor[0];
|
|
8087
|
+
|
|
8088
|
+
var offset = this.caret.getOffsetOfElement(block);
|
|
8089
|
+
var text = $.trim($(block).text()).replace(/\n\r\n/g, '');
|
|
8090
|
+
|
|
8091
|
+
return (offset == text.length) ? true : false;
|
|
8092
|
+
},
|
|
8008
8093
|
|
|
8009
8094
|
// test blocks
|
|
8010
8095
|
isBlock: function(block)
|
|
@@ -8024,7 +8109,7 @@
|
|
|
8024
8109
|
isTag: function(current, tag)
|
|
8025
8110
|
{
|
|
8026
8111
|
var element = $(current).closest(tag);
|
|
8027
|
-
if (element.
|
|
8112
|
+
if (element.length == 1)
|
|
8028
8113
|
{
|
|
8029
8114
|
return element[0];
|
|
8030
8115
|
}
|
|
@@ -8122,6 +8207,7 @@
|
|
|
8122
8207
|
ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec( ua ) ||
|
|
8123
8208
|
[];
|
|
8124
8209
|
|
|
8210
|
+
if (browser == 'safari') return (typeof match[3] != 'undefined') ? match[3] == 'safari' : false;
|
|
8125
8211
|
if (browser == 'version') return match[2];
|
|
8126
8212
|
if (browser == 'webkit') return (match[1] == 'chrome' || match[1] == 'webkit');
|
|
8127
8213
|
if (match[1] == 'rv') return browser == 'msie';
|
|
@@ -8133,6 +8219,11 @@
|
|
|
8133
8219
|
}
|
|
8134
8220
|
};
|
|
8135
8221
|
|
|
8222
|
+
$(window).on('load.tools.redactor', function()
|
|
8223
|
+
{
|
|
8224
|
+
$('[data-tools="redactor"]').redactor();
|
|
8225
|
+
});
|
|
8226
|
+
|
|
8136
8227
|
// constructor
|
|
8137
8228
|
Redactor.prototype.init.prototype = Redactor.prototype;
|
|
8138
8229
|
|