biola_wcms_components 0.8.0 → 0.9.0
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/app/assets/javascripts/biola-wcms-components.js.coffee +2 -0
- data/app/assets/javascripts/configuration/setup_redactor.js.coffee +6 -1
- data/app/views/wcms_components/forms/_redactor_editor.html.slim +1 -1
- data/lib/biola_wcms_components/version.rb +1 -1
- data/vendor/assets/javascripts/redactor.js +736 -280
- data/vendor/assets/javascripts/redactor_table.js +338 -0
- data/vendor/assets/javascripts/redactor_video.js +77 -0
- data/vendor/assets/stylesheets/redactor.css +26 -14
- metadata +4 -2
@@ -1,6 +1,6 @@
|
|
1
1
|
/*
|
2
|
-
Redactor v10.
|
3
|
-
Updated:
|
2
|
+
Redactor v10.1.1
|
3
|
+
Updated: April 28, 2015
|
4
4
|
|
5
5
|
http://imperavi.com/redactor/
|
6
6
|
|
@@ -28,9 +28,6 @@
|
|
28
28
|
|
29
29
|
var uuid = 0;
|
30
30
|
|
31
|
-
var reUrlYoutube = /https?:\/\/(?:[0-9A-Z-]+\.)?(?:youtu\.be\/|youtube\.com\S*[^\w\-\s])([\w\-]{11})(?=[^\w\-]|$)(?![?=&+%\w.\-]*(?:['"][^<>]*>|<\/a>))[?=&+%\w.-]*/ig;
|
32
|
-
var reUrlVimeo = /https?:\/\/(www\.)?vimeo.com\/(\d+)($|\/)/;
|
33
|
-
|
34
31
|
// Plugin
|
35
32
|
$.fn.redactor = function(options)
|
36
33
|
{
|
@@ -94,13 +91,13 @@
|
|
94
91
|
|
95
92
|
// Functionality
|
96
93
|
$.Redactor = Redactor;
|
97
|
-
$.Redactor.VERSION = '10.
|
94
|
+
$.Redactor.VERSION = '10.1.1';
|
98
95
|
$.Redactor.modules = ['alignment', 'autosave', 'block', 'buffer', 'build', 'button',
|
99
96
|
'caret', 'clean', 'code', 'core', 'dropdown', 'file', 'focus',
|
100
97
|
'image', 'indent', 'inline', 'insert', 'keydown', 'keyup',
|
101
98
|
'lang', 'line', 'link', 'list', 'modal', 'observe', 'paragraphize',
|
102
99
|
'paste', 'placeholder', 'progress', 'selection', 'shortcuts',
|
103
|
-
'tabifier', 'tidy', 'toolbar', 'upload', 'utils'];
|
100
|
+
'tabifier', 'tidy', 'toolbar', 'upload', 'utils', 'linkify'];
|
104
101
|
|
105
102
|
$.Redactor.opts = {
|
106
103
|
|
@@ -135,6 +132,7 @@
|
|
135
132
|
autosaveName: false,
|
136
133
|
autosaveInterval: 60, // seconds
|
137
134
|
autosaveOnChange: false,
|
135
|
+
autosaveFields: false,
|
138
136
|
|
139
137
|
linkTooltip: true,
|
140
138
|
linkProtocol: 'http',
|
@@ -191,9 +189,13 @@
|
|
191
189
|
|
192
190
|
tabifier: true,
|
193
191
|
|
194
|
-
deniedTags: ['
|
192
|
+
deniedTags: ['script', 'style'],
|
195
193
|
allowedTags: false, // or array
|
196
194
|
|
195
|
+
paragraphizeBlocks: ['table', 'div', 'pre', 'form', 'ul', 'ol', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'dl', 'blockquote', 'figcaption',
|
196
|
+
'address', 'section', 'header', 'footer', 'aside', 'article', 'object', 'style', 'script', 'iframe', 'select', 'input', 'textarea',
|
197
|
+
'button', 'option', 'map', 'area', 'math', 'hr', 'fieldset', 'legend', 'hgroup', 'nav', 'figure', 'details', 'menu', 'summary', 'p'],
|
198
|
+
|
197
199
|
removeComments: false,
|
198
200
|
replaceTags: [
|
199
201
|
['strike', 'del']
|
@@ -323,9 +325,22 @@
|
|
323
325
|
underline: 'Underline',
|
324
326
|
alignment: 'Alignment',
|
325
327
|
filename: 'Name (optional)',
|
326
|
-
edit: 'Edit'
|
328
|
+
edit: 'Edit',
|
329
|
+
upload_label: 'Drop file here or '
|
330
|
+
|
327
331
|
}
|
328
|
-
}
|
332
|
+
},
|
333
|
+
|
334
|
+
linkify: {
|
335
|
+
regexps: {
|
336
|
+
youtube: /https?:\/\/(?:[0-9A-Z-]+\.)?(?:youtu\.be\/|youtube\.com\S*[^\w\-\s])([\w\-]{11})(?=[^\w\-]|$)(?![?=&+%\w.\-]*(?:['"][^<>]*>|<\/a>))[?=&+%\w.-]*/ig,
|
337
|
+
vimeo: /https?:\/\/(www\.)?vimeo.com\/(\d+)($|\/)/,
|
338
|
+
image: /((https?|www)[^\s]+\.)(jpe?g|png|gif)(\?[^\s-]+)?/ig,
|
339
|
+
url: /(https?:\/\/(?:www\.|(?!www))[^\s\.]+\.[^\s]{2,}|www\.[^\s]+\.[^\s]{2,})/ig,
|
340
|
+
}
|
341
|
+
},
|
342
|
+
|
343
|
+
codemirror: false
|
329
344
|
};
|
330
345
|
|
331
346
|
// Functionality
|
@@ -371,6 +386,16 @@
|
|
371
386
|
// setup allowed and denied tags
|
372
387
|
this.tidy.setupAllowed();
|
373
388
|
|
389
|
+
// setup denied tags
|
390
|
+
if (this.opts.deniedTags !== false)
|
391
|
+
{
|
392
|
+
var tags = ['html', 'head', 'link', 'body', 'meta', 'applet'];
|
393
|
+
for (var i = 0; i < tags.length; i++)
|
394
|
+
{
|
395
|
+
this.opts.deniedTags.push(tags[i]);
|
396
|
+
}
|
397
|
+
}
|
398
|
+
|
374
399
|
// load lang
|
375
400
|
this.lang.load();
|
376
401
|
|
@@ -516,11 +541,11 @@
|
|
516
541
|
autosave: function()
|
517
542
|
{
|
518
543
|
return {
|
544
|
+
html: false,
|
519
545
|
enable: function()
|
520
546
|
{
|
521
547
|
if (!this.opts.autosave) return;
|
522
548
|
|
523
|
-
this.autosave.html = false;
|
524
549
|
this.autosave.name = (this.opts.autosaveName) ? this.opts.autosaveName : this.$textarea.attr('name');
|
525
550
|
|
526
551
|
if (this.opts.autosaveOnChange) return;
|
@@ -536,12 +561,13 @@
|
|
536
561
|
this.autosave.source = this.code.get();
|
537
562
|
|
538
563
|
if (this.autosave.html === this.autosave.source) return;
|
539
|
-
if (this.utils.isEmpty(this.autosave.source)) return;
|
564
|
+
//if (this.utils.isEmpty(this.autosave.source)) return;
|
540
565
|
|
541
566
|
// data
|
542
567
|
var data = {};
|
543
568
|
data['name'] = this.autosave.name;
|
544
|
-
data[this.autosave.name] =
|
569
|
+
data[this.autosave.name] = this.autosave.source;
|
570
|
+
data = this.autosave.getHiddenFields(data);
|
545
571
|
|
546
572
|
// ajax
|
547
573
|
var jsxhr = $.ajax({
|
@@ -552,6 +578,23 @@
|
|
552
578
|
|
553
579
|
jsxhr.done(this.autosave.success);
|
554
580
|
},
|
581
|
+
getHiddenFields: function(data)
|
582
|
+
{
|
583
|
+
if (this.opts.autosaveFields === false || typeof this.opts.autosaveFields !== 'object')
|
584
|
+
{
|
585
|
+
return data;
|
586
|
+
}
|
587
|
+
|
588
|
+
$.each(this.opts.autosaveFields, $.proxy(function(k, v)
|
589
|
+
{
|
590
|
+
if (v !== null && v.toString().indexOf('#') === 0) v = $(v).val();
|
591
|
+
data[k] = v;
|
592
|
+
|
593
|
+
}, this));
|
594
|
+
|
595
|
+
return data;
|
596
|
+
|
597
|
+
},
|
555
598
|
success: function(data)
|
556
599
|
{
|
557
600
|
var json;
|
@@ -586,7 +629,7 @@
|
|
586
629
|
|
587
630
|
if (typeof this.formatting[name].data != 'undefined') type = 'data';
|
588
631
|
else if (typeof this.formatting[name].attr != 'undefined') type = 'attr';
|
589
|
-
else if (typeof this.formatting[name]
|
632
|
+
else if (typeof this.formatting[name]['class'] != 'undefined') type = 'class';
|
590
633
|
|
591
634
|
if (typeof this.formatting[name].clear != 'undefined')
|
592
635
|
{
|
@@ -701,6 +744,11 @@
|
|
701
744
|
this.block.toggle($(block));
|
702
745
|
}
|
703
746
|
|
747
|
+
if (typeof this.block.type == 'undefined' && typeof this.block.value == 'undefined')
|
748
|
+
{
|
749
|
+
$(block).removeAttr('class').removeAttr('style');
|
750
|
+
}
|
751
|
+
|
704
752
|
},
|
705
753
|
setMultiple: function(tag)
|
706
754
|
{
|
@@ -777,14 +825,20 @@
|
|
777
825
|
{
|
778
826
|
$.each(this.block.blocks, $.proxy(function(i,s)
|
779
827
|
{
|
828
|
+
var $formatted = false;
|
780
829
|
if (this.opts.linebreaks)
|
781
830
|
{
|
782
831
|
$(s).prepend('<br>').append('<br>');
|
783
|
-
this.utils.replaceWithContents(s);
|
832
|
+
$formatted = this.utils.replaceWithContents(s);
|
784
833
|
}
|
785
834
|
else
|
786
835
|
{
|
787
|
-
this.utils.replaceToTag(s, 'p');
|
836
|
+
$formatted = this.utils.replaceToTag(s, 'p');
|
837
|
+
}
|
838
|
+
|
839
|
+
if ($formatted && typeof this.block.type == 'undefined' && typeof this.block.value == 'undefined')
|
840
|
+
{
|
841
|
+
$formatted.removeAttr('class').removeAttr('style');
|
788
842
|
}
|
789
843
|
|
790
844
|
}, this));
|
@@ -831,6 +885,11 @@
|
|
831
885
|
if (this.block.isRemoveInline) this.utils.removeInlineTags($formatted);
|
832
886
|
if (tag == 'p' || this.block.headTag) $formatted.find('p').contents().unwrap();
|
833
887
|
|
888
|
+
if (typeof this.block.type == 'undefined' && typeof this.block.value == 'undefined')
|
889
|
+
{
|
890
|
+
$formatted.removeAttr('class').removeAttr('style');
|
891
|
+
}
|
892
|
+
|
834
893
|
|
835
894
|
}, this));
|
836
895
|
}
|
@@ -893,7 +952,7 @@
|
|
893
952
|
},
|
894
953
|
formatListToBlockquote: function()
|
895
954
|
{
|
896
|
-
var block = $(this.block.blocks[0]).closest('ul, ol');
|
955
|
+
var block = $(this.block.blocks[0]).closest('ul, ol', this.$editor[0]);
|
897
956
|
|
898
957
|
$(block).find('ul, ol').contents().unwrap();
|
899
958
|
$(block).find('li').append($('<br>')).contents().unwrap();
|
@@ -986,10 +1045,10 @@
|
|
986
1045
|
},
|
987
1046
|
formatTableWrapping: function($formatted)
|
988
1047
|
{
|
989
|
-
if ($formatted.closest('table').length === 0) return;
|
1048
|
+
if ($formatted.closest('table', this.$editor[0]).length === 0) return;
|
990
1049
|
|
991
|
-
if ($formatted.closest('tr').length === 0) $formatted.wrap('<tr>');
|
992
|
-
if ($formatted.closest('td').length === 0 && $formatted.closest('th').length === 0)
|
1050
|
+
if ($formatted.closest('tr', this.$editor[0]).length === 0) $formatted.wrap('<tr>');
|
1051
|
+
if ($formatted.closest('td', this.$editor[0]).length === 0 && $formatted.closest('th').length === 0)
|
993
1052
|
{
|
994
1053
|
$formatted.wrap('<td>');
|
995
1054
|
}
|
@@ -1302,6 +1361,9 @@
|
|
1302
1361
|
// paste
|
1303
1362
|
this.$editor.on('paste.redactor', $.proxy(this.paste.init, this));
|
1304
1363
|
|
1364
|
+
// cut
|
1365
|
+
this.$editor.on('cut.redactor', $.proxy(this.code.sync, this));
|
1366
|
+
|
1305
1367
|
// keydown
|
1306
1368
|
this.$editor.on('keydown.redactor', $.proxy(this.keydown.init, this));
|
1307
1369
|
|
@@ -1348,8 +1410,11 @@
|
|
1348
1410
|
},
|
1349
1411
|
setHelpers: function()
|
1350
1412
|
{
|
1351
|
-
//
|
1352
|
-
this.
|
1413
|
+
// linkify
|
1414
|
+
if (this.linkify.isEnabled())
|
1415
|
+
{
|
1416
|
+
this.linkify.format();
|
1417
|
+
}
|
1353
1418
|
|
1354
1419
|
// placeholder
|
1355
1420
|
this.placeholder.enable();
|
@@ -1422,7 +1487,7 @@
|
|
1422
1487
|
// dropdown
|
1423
1488
|
if (btnObject.dropdown)
|
1424
1489
|
{
|
1425
|
-
var $dropdown = $('<div class="redactor-dropdown redactor-dropdown-box-' + btnName + '" style="display: none;">');
|
1490
|
+
var $dropdown = $('<div class="redactor-dropdown redactor-dropdown-' + this.uuid + ' redactor-dropdown-box-' + btnName + '" style="display: none;">');
|
1426
1491
|
$button.data('dropdown', $dropdown);
|
1427
1492
|
this.dropdown.build(btnName, $dropdown, btnObject.dropdown);
|
1428
1493
|
}
|
@@ -1525,7 +1590,7 @@
|
|
1525
1590
|
},
|
1526
1591
|
setInactiveAll: function(key)
|
1527
1592
|
{
|
1528
|
-
if (typeof key
|
1593
|
+
if (typeof key === 'undefined')
|
1529
1594
|
{
|
1530
1595
|
this.$toolbar.find('a.re-icon').removeClass('redactor-act');
|
1531
1596
|
}
|
@@ -1572,7 +1637,7 @@
|
|
1572
1637
|
var key = $btn.attr('rel');
|
1573
1638
|
this.button.addCallback($btn, 'dropdown');
|
1574
1639
|
|
1575
|
-
var $dropdown = $('<div class="redactor-dropdown redactor-dropdown-box-' + key + '" style="display: none;">');
|
1640
|
+
var $dropdown = $('<div class="redactor-dropdown redactor-dropdown-' + this.uuid + ' redactor-dropdown-box-' + key + '" style="display: none;">');
|
1576
1641
|
$btn.data('dropdown', $dropdown);
|
1577
1642
|
|
1578
1643
|
// build dropdown
|
@@ -1596,6 +1661,7 @@
|
|
1596
1661
|
if (!this.opts.toolbar) return;
|
1597
1662
|
|
1598
1663
|
var btn = this.button.build(key, { title: title });
|
1664
|
+
btn.addClass('redactor-btn-image');
|
1599
1665
|
this.$toolbar.prepend($('<li>').append(btn));
|
1600
1666
|
|
1601
1667
|
return btn;
|
@@ -1605,6 +1671,7 @@
|
|
1605
1671
|
if (!this.opts.toolbar) return;
|
1606
1672
|
|
1607
1673
|
var btn = this.button.build(key, { title: title });
|
1674
|
+
btn.addClass('redactor-btn-image');
|
1608
1675
|
var $btn = this.button.get(afterkey);
|
1609
1676
|
|
1610
1677
|
if ($btn.length !== 0) $btn.parent().after($('<li>').append(btn));
|
@@ -1617,6 +1684,7 @@
|
|
1617
1684
|
if (!this.opts.toolbar) return;
|
1618
1685
|
|
1619
1686
|
var btn = this.button.build(key, { title: title });
|
1687
|
+
btn.addClass('redactor-btn-image');
|
1620
1688
|
var $btn = this.button.get(beforekey);
|
1621
1689
|
|
1622
1690
|
if ($btn.length !== 0) $btn.parent().before($('<li>').append(btn));
|
@@ -1840,9 +1908,9 @@
|
|
1840
1908
|
|
1841
1909
|
// replace dollar sign to entity
|
1842
1910
|
html = html.replace(/\$/g, '$');
|
1843
|
-
|
1844
|
-
|
1845
|
-
html = html.replace(
|
1911
|
+
|
1912
|
+
// replace special characters in links
|
1913
|
+
html = html.replace(/<a href="(.*?[^>]?)®(.*?[^>]?)">/gi, '<a href="$1®$2">');
|
1846
1914
|
|
1847
1915
|
if (this.opts.replaceDivs) html = this.clean.replaceDivs(html);
|
1848
1916
|
if (this.opts.linebreaks) html = this.clean.replaceParagraphsToBr(html);
|
@@ -1924,13 +1992,13 @@
|
|
1924
1992
|
html = html.replace(new RegExp('<br\\s?/?></li>', 'gi'), '</li>');
|
1925
1993
|
html = html.replace(new RegExp('</li><br\\s?/?>', 'gi'), '</li>');
|
1926
1994
|
// remove verified
|
1927
|
-
html = html.replace(
|
1928
|
-
html = html.replace(
|
1929
|
-
html = html.replace(
|
1930
|
-
html = html.replace(
|
1931
|
-
html = html.replace(
|
1932
|
-
html = html.replace(
|
1933
|
-
html = html.replace(
|
1995
|
+
html = html.replace(/<div(.*?[^>]) data-tagblock="redactor"(.*?[^>])>/gi, '<div$1$2>');
|
1996
|
+
html = html.replace(/<(.*?) data-verified="redactor"(.*?[^>])>/gi, '<$1$2>');
|
1997
|
+
html = html.replace(/<span(.*?[^>])\srel="(.*?[^>])"(.*?[^>])>/gi, '<span$1$3>');
|
1998
|
+
html = html.replace(/<img(.*?[^>])\srel="(.*?[^>])"(.*?[^>])>/gi, '<img$1$3>');
|
1999
|
+
html = html.replace(/<img(.*?[^>])\sstyle="" (.*?[^>])>'/gi, '<img$1 $2>');
|
2000
|
+
html = html.replace(/<img(.*?[^>])\sstyle (.*?[^>])>'/gi, '<img$1 $2>');
|
2001
|
+
html = html.replace(/<span class="redactor-invisible-space">(.*?)<\/span>/gi, '$1');
|
1934
2002
|
html = html.replace(/ data-save-url="(.*?[^>])"/gi, '');
|
1935
2003
|
|
1936
2004
|
// remove image resize
|
@@ -1964,8 +2032,6 @@
|
|
1964
2032
|
html = $.trim(html);
|
1965
2033
|
|
1966
2034
|
html = html.replace(/\$/g, '$');
|
1967
|
-
html = html.replace(/‘/g, '\'');
|
1968
|
-
html = html.replace(/’/g, '\'');
|
1969
2035
|
|
1970
2036
|
// convert dirty spaces
|
1971
2037
|
html = html.replace(/<span class="s1">/gi, '<span>');
|
@@ -1989,6 +2055,8 @@
|
|
1989
2055
|
{
|
1990
2056
|
html = html.replace(/”/g, '"');
|
1991
2057
|
html = html.replace(/“/g, '"');
|
2058
|
+
html = html.replace(/‘/g, '\'');
|
2059
|
+
html = html.replace(/’/g, '\'');
|
1992
2060
|
|
1993
2061
|
return this.clean.getPreCode(html);
|
1994
2062
|
}
|
@@ -2055,6 +2123,7 @@
|
|
2055
2123
|
html = this.clean.onPasteRemoveSpans(html);
|
2056
2124
|
html = this.clean.onPasteRemoveEmpty(html);
|
2057
2125
|
|
2126
|
+
|
2058
2127
|
html = this.clean.convertInline(html);
|
2059
2128
|
|
2060
2129
|
return html;
|
@@ -2199,23 +2268,16 @@
|
|
2199
2268
|
}
|
2200
2269
|
|
2201
2270
|
var options = {
|
2202
|
-
deniedTags: false,
|
2203
|
-
allowedTags: tags,
|
2271
|
+
deniedTags: (this.opts.deniedTags) ? this.opts.deniedTags : false,
|
2272
|
+
allowedTags: (this.opts.allowedTags) ? this.opts.allowedTags : tags,
|
2204
2273
|
removeComments: true,
|
2205
2274
|
removePhp: true,
|
2206
|
-
removeAttr: false,
|
2207
|
-
allowedAttr: attrAllowed,
|
2275
|
+
removeAttr: (this.opts.removeAttr) ? this.opts.removeAttr : false,
|
2276
|
+
allowedAttr: (this.opts.allowedAttr) ? this.opts.allowedAttr : attrAllowed,
|
2208
2277
|
removeEmpty: tagsEmpty
|
2209
2278
|
};
|
2210
2279
|
|
2211
|
-
// denied tags
|
2212
|
-
if (this.opts.deniedTags)
|
2213
|
-
{
|
2214
|
-
options.deniedTags = this.opts.deniedTags;
|
2215
|
-
}
|
2216
|
-
|
2217
2280
|
return this.tidy.load(html, options);
|
2218
|
-
|
2219
2281
|
},
|
2220
2282
|
onPasteRemoveEmpty: function(html)
|
2221
2283
|
{
|
@@ -2281,27 +2343,56 @@
|
|
2281
2343
|
},
|
2282
2344
|
savePreCode: function(html)
|
2283
2345
|
{
|
2284
|
-
|
2346
|
+
html = this.clean.savePreFormatting(html);
|
2347
|
+
html = this.clean.saveCodeFormatting(html);
|
2348
|
+
|
2349
|
+
return html;
|
2350
|
+
},
|
2351
|
+
savePreFormatting: function(html)
|
2352
|
+
{
|
2353
|
+
var pre = html.match(/<pre(.*?)>([\w\W]*?)<\/pre>/gi);
|
2285
2354
|
if (pre !== null)
|
2286
2355
|
{
|
2287
2356
|
$.each(pre, $.proxy(function(i,s)
|
2288
2357
|
{
|
2289
|
-
var arr = s.match(/<
|
2358
|
+
var arr = s.match(/<pre(.*?)>([\w\W]*?)<\/pre>/i);
|
2290
2359
|
|
2291
|
-
arr[
|
2292
|
-
arr[
|
2360
|
+
arr[2] = arr[2].replace(/<br\s?\/?>/g, '\n');
|
2361
|
+
arr[2] = arr[2].replace(/ /g, ' ');
|
2293
2362
|
|
2294
2363
|
if (this.opts.preSpaces)
|
2295
2364
|
{
|
2296
|
-
arr[
|
2365
|
+
arr[2] = arr[2].replace(/\t/g, Array(this.opts.preSpaces + 1).join(' '));
|
2297
2366
|
}
|
2298
2367
|
|
2299
|
-
arr[
|
2368
|
+
arr[2] = this.clean.encodeEntities(arr[2]);
|
2369
|
+
|
2370
|
+
// $ fix
|
2371
|
+
arr[2] = arr[2].replace(/\$/g, '$');
|
2372
|
+
|
2373
|
+
html = html.replace(s, '<pre' + arr[1] + '>' + arr[2] + '</pre>');
|
2374
|
+
|
2375
|
+
}, this));
|
2376
|
+
}
|
2377
|
+
|
2378
|
+
return html;
|
2379
|
+
},
|
2380
|
+
saveCodeFormatting: function(html)
|
2381
|
+
{
|
2382
|
+
var code = html.match(/<code(.*?[^>])>(.*?)<\/code>/gi);
|
2383
|
+
if (code !== null)
|
2384
|
+
{
|
2385
|
+
$.each(code, $.proxy(function(i,s)
|
2386
|
+
{
|
2387
|
+
var arr = s.match(/<code(.*?[^>])>(.*?)<\/code>/i);
|
2388
|
+
|
2389
|
+
arr[2] = arr[2].replace(/ /g, ' ');
|
2390
|
+
arr[2] = this.clean.encodeEntities(arr[2]);
|
2300
2391
|
|
2301
2392
|
// $ fix
|
2302
|
-
arr[
|
2393
|
+
arr[2] = arr[2].replace(/\$/g, '$');
|
2303
2394
|
|
2304
|
-
html = html.replace(s, '<' + arr[1] +
|
2395
|
+
html = html.replace(s, '<code' + arr[1] + '>' + arr[2] + '</code>');
|
2305
2396
|
|
2306
2397
|
}, this));
|
2307
2398
|
}
|
@@ -2323,7 +2414,7 @@
|
|
2323
2414
|
html = this.clean.getTextFromHtml(html);
|
2324
2415
|
html = html.replace(/\n/g, '<br />');
|
2325
2416
|
|
2326
|
-
if (this.opts.paragraphize && typeof paragraphize == 'undefined')
|
2417
|
+
if (this.opts.paragraphize && typeof paragraphize == 'undefined' && !this.utils.browser('mozilla'))
|
2327
2418
|
{
|
2328
2419
|
html = this.paragraphize.load(html);
|
2329
2420
|
}
|
@@ -2412,22 +2503,34 @@
|
|
2412
2503
|
});
|
2413
2504
|
|
2414
2505
|
},
|
2506
|
+
cleanEmptyParagraph: function()
|
2507
|
+
{
|
2508
|
+
var p = this.$editor.find("p").first();
|
2509
|
+
|
2510
|
+
if (this.utils.isEmpty(p.html()))
|
2511
|
+
{
|
2512
|
+
p.remove();
|
2513
|
+
}
|
2514
|
+
},
|
2415
2515
|
setVerified: function(html)
|
2416
2516
|
{
|
2417
2517
|
if (this.utils.browser('msie')) return html;
|
2418
2518
|
|
2419
2519
|
html = html.replace(new RegExp('<img(.*?[^>])>', 'gi'), '<img$1 data-verified="redactor">');
|
2420
|
-
html = html.replace(new RegExp('<span(.*?)>', 'gi'), '<span$1 data-verified="redactor">');
|
2520
|
+
html = html.replace(new RegExp('<span(.*?[^>])>', 'gi'), '<span$1 data-verified="redactor">');
|
2421
2521
|
|
2422
2522
|
var matches = html.match(new RegExp('<(span|img)(.*?)style="(.*?)"(.*?[^>])>', 'gi'));
|
2523
|
+
|
2423
2524
|
if (matches)
|
2424
2525
|
{
|
2425
2526
|
var len = matches.length;
|
2426
2527
|
for (var i = 0; i < len; i++)
|
2427
2528
|
{
|
2428
2529
|
try {
|
2530
|
+
|
2429
2531
|
var newTag = matches[i].replace(/style="(.*?)"/i, 'style="$1" rel="$1"');
|
2430
|
-
html = html.replace(
|
2532
|
+
html = html.replace(matches[i], newTag);
|
2533
|
+
|
2431
2534
|
}
|
2432
2535
|
catch (e) {}
|
2433
2536
|
}
|
@@ -2498,6 +2601,9 @@
|
|
2498
2601
|
html = html.replace(/<div(.*?)>([\w\W]*?)<\/div>/gi, '<p$1>$2</p>');
|
2499
2602
|
}
|
2500
2603
|
|
2604
|
+
html = html.replace(/<div(.*?[^>])>/gi, '');
|
2605
|
+
html = html.replace(/<\/div>/gi, '');
|
2606
|
+
|
2501
2607
|
return html;
|
2502
2608
|
},
|
2503
2609
|
replaceDivsToBr: function(html)
|
@@ -2540,6 +2646,8 @@
|
|
2540
2646
|
this.$editor.html(html);
|
2541
2647
|
this.code.sync();
|
2542
2648
|
|
2649
|
+
if (html !== '') this.placeholder.remove();
|
2650
|
+
|
2543
2651
|
setTimeout($.proxy(this.buffer.add, this), 15);
|
2544
2652
|
if (this.start === false) this.observe.load();
|
2545
2653
|
|
@@ -2590,8 +2698,22 @@
|
|
2590
2698
|
|
2591
2699
|
this.start = false;
|
2592
2700
|
|
2593
|
-
|
2701
|
+
if (this.autosave.html == false)
|
2702
|
+
{
|
2703
|
+
this.autosave.html = this.code.get();
|
2704
|
+
}
|
2705
|
+
|
2706
|
+
if (this.opts.codemirror)
|
2707
|
+
{
|
2708
|
+
this.$textarea.next('.CodeMirror').each(function(i, el)
|
2709
|
+
{
|
2710
|
+
el.CodeMirror.setValue(html);
|
2711
|
+
});
|
2712
|
+
}
|
2713
|
+
|
2714
|
+
//autosave
|
2594
2715
|
this.autosave.onChange();
|
2716
|
+
this.autosave.enable();
|
2595
2717
|
},
|
2596
2718
|
toggle: function()
|
2597
2719
|
{
|
@@ -2609,7 +2731,8 @@
|
|
2609
2731
|
this.code.offset = this.caret.getOffset();
|
2610
2732
|
var scroll = $(window).scrollTop();
|
2611
2733
|
|
2612
|
-
var
|
2734
|
+
var width = this.$editor.innerWidth(),
|
2735
|
+
height = this.$editor.innerHeight();
|
2613
2736
|
|
2614
2737
|
this.$editor.hide();
|
2615
2738
|
|
@@ -2619,17 +2742,33 @@
|
|
2619
2742
|
// indent code
|
2620
2743
|
html = this.tabifier.get(html);
|
2621
2744
|
|
2622
|
-
this.$textarea.val(html)
|
2623
|
-
this.$textarea.on('keydown.redactor-textarea-indenting', this.code.textareaIndenting);
|
2624
|
-
|
2625
|
-
$(window).scrollTop(scroll);
|
2745
|
+
this.$textarea.val(html);
|
2626
2746
|
|
2627
|
-
if (this
|
2747
|
+
if (this.opts.codemirror)
|
2628
2748
|
{
|
2629
|
-
this.$textarea
|
2749
|
+
this.$textarea.next('.CodeMirror').each(function(i, el)
|
2750
|
+
{
|
2751
|
+
$(el).show();
|
2752
|
+
el.CodeMirror.setValue(html);
|
2753
|
+
el.CodeMirror.setSize(width, height);
|
2754
|
+
el.CodeMirror.refresh();
|
2755
|
+
el.CodeMirror.focus();
|
2756
|
+
});
|
2630
2757
|
}
|
2758
|
+
else
|
2759
|
+
{
|
2760
|
+
this.$textarea.height(height).show().focus();
|
2761
|
+
this.$textarea.on('keydown.redactor-textarea-indenting', this.code.textareaIndenting);
|
2762
|
+
|
2763
|
+
$(window).scrollTop(scroll);
|
2631
2764
|
|
2632
|
-
|
2765
|
+
if (this.$textarea[0].setSelectionRange)
|
2766
|
+
{
|
2767
|
+
this.$textarea[0].setSelectionRange(0, 0);
|
2768
|
+
}
|
2769
|
+
|
2770
|
+
this.$textarea[0].scrollTop = 0;
|
2771
|
+
}
|
2633
2772
|
|
2634
2773
|
this.opts.visual = false;
|
2635
2774
|
|
@@ -2639,15 +2778,32 @@
|
|
2639
2778
|
},
|
2640
2779
|
showVisual: function()
|
2641
2780
|
{
|
2781
|
+
var html;
|
2782
|
+
|
2642
2783
|
if (this.opts.visual) return;
|
2643
2784
|
|
2644
|
-
|
2785
|
+
if (this.opts.codemirror)
|
2786
|
+
{
|
2787
|
+
this.$textarea.next('.CodeMirror').each(function(i, el)
|
2788
|
+
{
|
2789
|
+
html = el.CodeMirror.getValue();
|
2790
|
+
});
|
2791
|
+
}
|
2792
|
+
else
|
2793
|
+
{
|
2794
|
+
html = this.$textarea.hide().val();
|
2795
|
+
}
|
2645
2796
|
|
2646
2797
|
if (this.modified !== this.clean.removeSpaces(html))
|
2647
2798
|
{
|
2648
2799
|
this.code.set(html);
|
2649
2800
|
}
|
2650
2801
|
|
2802
|
+
if (this.opts.codemirror)
|
2803
|
+
{
|
2804
|
+
this.$textarea.next('.CodeMirror').hide();
|
2805
|
+
}
|
2806
|
+
|
2651
2807
|
this.$editor.show();
|
2652
2808
|
|
2653
2809
|
if (!this.utils.isEmpty(html))
|
@@ -2664,6 +2820,7 @@
|
|
2664
2820
|
|
2665
2821
|
this.observe.load();
|
2666
2822
|
this.opts.visual = true;
|
2823
|
+
this.core.setCallback('visual', html);
|
2667
2824
|
},
|
2668
2825
|
textareaIndenting: function(e)
|
2669
2826
|
{
|
@@ -2733,12 +2890,30 @@
|
|
2733
2890
|
this.$element.off('.redactor').removeData('redactor');
|
2734
2891
|
this.$editor.off('.redactor');
|
2735
2892
|
|
2893
|
+
$(document).off('click.redactor-image-delete.' + this.uuid);
|
2894
|
+
$(document).off('click.redactor-image-resize-hide.' + this.uuid);
|
2895
|
+
$(document).off('touchstart.redactor.' + this.uuid + ' click.redactor.' + this.uuid);
|
2896
|
+
$("body").off('scroll.redactor.' + this.uuid);
|
2897
|
+
$(this.opts.toolbarFixedTarget).off('scroll.redactor.' + this.uuid);
|
2898
|
+
|
2736
2899
|
// common
|
2737
2900
|
this.$editor.removeClass('redactor-editor redactor-linebreaks redactor-placeholder');
|
2738
2901
|
this.$editor.removeAttr('contenteditable');
|
2739
2902
|
|
2740
2903
|
var html = this.code.get();
|
2741
2904
|
|
2905
|
+
// dropdowns off
|
2906
|
+
this.$toolbar.find('a').each(function()
|
2907
|
+
{
|
2908
|
+
var $el = $(this);
|
2909
|
+
if ($el.data('dropdown'))
|
2910
|
+
{
|
2911
|
+
$el.data('dropdown').remove();
|
2912
|
+
$el.data('dropdown', {});
|
2913
|
+
}
|
2914
|
+
});
|
2915
|
+
|
2916
|
+
|
2742
2917
|
if (this.build.isTextarea())
|
2743
2918
|
{
|
2744
2919
|
this.$box.after(this.$element);
|
@@ -2777,21 +2952,31 @@
|
|
2777
2952
|
{
|
2778
2953
|
$.each(this.opts.formattingAdd, $.proxy(function(i,s)
|
2779
2954
|
{
|
2780
|
-
var name = s.tag
|
2781
|
-
|
2955
|
+
var name = s.tag,
|
2956
|
+
func;
|
2957
|
+
|
2958
|
+
if (typeof s['class'] != 'undefined')
|
2782
2959
|
{
|
2783
|
-
name = name + '-' + s
|
2960
|
+
name = name + '-' + s['class'];
|
2784
2961
|
}
|
2785
2962
|
|
2786
2963
|
s.type = (this.utils.isBlockTag(s.tag)) ? 'block' : 'inline';
|
2787
|
-
|
2964
|
+
|
2965
|
+
if (typeof s.func !== "undefined")
|
2966
|
+
{
|
2967
|
+
func = s.func;
|
2968
|
+
}
|
2969
|
+
else
|
2970
|
+
{
|
2971
|
+
func = (s.type == 'inline') ? 'inline.formatting' : 'block.formatting';
|
2972
|
+
}
|
2788
2973
|
|
2789
2974
|
if (this.opts.linebreaks && s.type == 'block' && s.tag == 'p') return;
|
2790
2975
|
|
2791
2976
|
this.formatting[name] = {
|
2792
2977
|
tag: s.tag,
|
2793
2978
|
style: s.style,
|
2794
|
-
'class': s
|
2979
|
+
'class': s['class'],
|
2795
2980
|
attr: s.attr,
|
2796
2981
|
data: s.data,
|
2797
2982
|
clear: s.clear
|
@@ -2898,7 +3083,6 @@
|
|
2898
3083
|
$dropdown.css({ position: 'absolute', left: left, top: top }).show();
|
2899
3084
|
}
|
2900
3085
|
|
2901
|
-
|
2902
3086
|
this.core.setCallback('dropdownShown', { dropdown: $dropdown, key: key, button: $button });
|
2903
3087
|
}
|
2904
3088
|
|
@@ -2930,7 +3114,7 @@
|
|
2930
3114
|
this.$toolbar.find('a.dropact').removeClass('redactor-act').removeClass('dropact');
|
2931
3115
|
|
2932
3116
|
$(document.body).removeClass('body-redactor-hidden').css('margin-right', 0);
|
2933
|
-
$('.redactor-dropdown').hide();
|
3117
|
+
$('.redactor-dropdown-' + this.uuid).hide();
|
2934
3118
|
this.core.setCallback('dropdownHide');
|
2935
3119
|
},
|
2936
3120
|
hide: function (e)
|
@@ -3032,8 +3216,7 @@
|
|
3032
3216
|
|
3033
3217
|
if (first[0].tagName == 'UL' || first[0].tagName == 'OL')
|
3034
3218
|
{
|
3035
|
-
|
3036
|
-
var child = first.children().first();
|
3219
|
+
var child = first.find('li').first();
|
3037
3220
|
if (!this.utils.isBlock(child) && child.text() === '')
|
3038
3221
|
{
|
3039
3222
|
// empty inline tag in li
|
@@ -3060,6 +3243,8 @@
|
|
3060
3243
|
if (this.utils.browser('mozilla') || this.utils.browser('msie'))
|
3061
3244
|
{
|
3062
3245
|
var last = this.$editor.children().last();
|
3246
|
+
|
3247
|
+
this.$editor.focus();
|
3063
3248
|
this.caret.setEnd(last);
|
3064
3249
|
}
|
3065
3250
|
else
|
@@ -3102,7 +3287,7 @@
|
|
3102
3287
|
},
|
3103
3288
|
showEdit: function($image)
|
3104
3289
|
{
|
3105
|
-
var $link = $image.closest('a');
|
3290
|
+
var $link = $image.closest('a', this.$editor[0]);
|
3106
3291
|
|
3107
3292
|
this.modal.load('imageEdit', this.lang.get('edit'), 705);
|
3108
3293
|
|
@@ -3179,7 +3364,7 @@
|
|
3179
3364
|
this.image.hideResize();
|
3180
3365
|
this.buffer.set();
|
3181
3366
|
|
3182
|
-
var $link = $image.closest('a');
|
3367
|
+
var $link = $image.closest('a', this.$editor[0]);
|
3183
3368
|
|
3184
3369
|
$image.attr('alt', $('#redactor-image-title').val());
|
3185
3370
|
|
@@ -3241,7 +3426,7 @@
|
|
3241
3426
|
}
|
3242
3427
|
|
3243
3428
|
$image.on('mousedown', $.proxy(this.image.hideResize, this));
|
3244
|
-
$image.on('click touchstart', $.proxy(function(e)
|
3429
|
+
$image.on('click.redactor touchstart', $.proxy(function(e)
|
3245
3430
|
{
|
3246
3431
|
this.observe.image = $image;
|
3247
3432
|
|
@@ -3249,8 +3434,8 @@
|
|
3249
3434
|
|
3250
3435
|
this.image.resizer = this.image.loadEditableControls($image);
|
3251
3436
|
|
3252
|
-
$(document).on('click.redactor-image-resize-hide', $.proxy(this.image.hideResize, this));
|
3253
|
-
this.$editor.on('click.redactor-image-resize-hide', $.proxy(this.image.hideResize, this));
|
3437
|
+
$(document).on('click.redactor-image-resize-hide.' + this.uuid, $.proxy(this.image.hideResize, this));
|
3438
|
+
this.$editor.on('click.redactor-image-resize-hide.' + this.uuid, $.proxy(this.image.hideResize, this));
|
3254
3439
|
|
3255
3440
|
// resize
|
3256
3441
|
if (!this.opts.imageResizable) return;
|
@@ -3307,8 +3492,11 @@
|
|
3307
3492
|
|
3308
3493
|
if (height < 50 || width < 100) return;
|
3309
3494
|
|
3495
|
+
var height = Math.round(this.image.resizeHandle.el.width() / this.image.resizeHandle.ratio);
|
3496
|
+
|
3497
|
+
this.image.resizeHandle.el.attr({width: width, height: height});
|
3310
3498
|
this.image.resizeHandle.el.width(width);
|
3311
|
-
this.image.resizeHandle.el.height(
|
3499
|
+
this.image.resizeHandle.el.height(height);
|
3312
3500
|
|
3313
3501
|
this.code.sync();
|
3314
3502
|
},
|
@@ -3352,7 +3540,7 @@
|
|
3352
3540
|
},
|
3353
3541
|
hideResize: function(e)
|
3354
3542
|
{
|
3355
|
-
if (e && $(e.target).closest('#redactor-image-box').length !== 0) return;
|
3543
|
+
if (e && $(e.target).closest('#redactor-image-box', this.$editor[0]).length !== 0) return;
|
3356
3544
|
if (e && e.target.tagName == 'IMG')
|
3357
3545
|
{
|
3358
3546
|
var $image = $(e.target);
|
@@ -3383,8 +3571,8 @@
|
|
3383
3571
|
return $(this).contents();
|
3384
3572
|
});
|
3385
3573
|
|
3386
|
-
$(document).off('click.redactor-image-resize-hide');
|
3387
|
-
this.$editor.off('click.redactor-image-resize-hide');
|
3574
|
+
$(document).off('click.redactor-image-resize-hide.' + this.uuid);
|
3575
|
+
this.$editor.off('click.redactor-image-resize-hide.' + this.uuid);
|
3388
3576
|
|
3389
3577
|
if (typeof this.image.resizeHandle !== 'undefined')
|
3390
3578
|
{
|
@@ -3464,8 +3652,8 @@
|
|
3464
3652
|
remove: function(image)
|
3465
3653
|
{
|
3466
3654
|
var $image = $(image);
|
3467
|
-
var $link = $image.closest('a');
|
3468
|
-
var $figure = $image.closest('figure');
|
3655
|
+
var $link = $image.closest('a', this.$editor[0]);
|
3656
|
+
var $figure = $image.closest('figure', this.$editor[0]);
|
3469
3657
|
var $parent = $image.parent();
|
3470
3658
|
if ($('#redactor-image-box').length !== 0)
|
3471
3659
|
{
|
@@ -3650,7 +3838,7 @@
|
|
3650
3838
|
|
3651
3839
|
var current = this.selection.getCurrent();
|
3652
3840
|
|
3653
|
-
var $item = $(current).closest('li');
|
3841
|
+
var $item = $(current).closest('li', this.$editor[0]);
|
3654
3842
|
var $parent = $item.parent();
|
3655
3843
|
if ($item.length !== 0 && $parent.length !== 0 && $parent[0].tagName == 'LI')
|
3656
3844
|
{
|
@@ -3714,7 +3902,7 @@
|
|
3714
3902
|
var type, value;
|
3715
3903
|
|
3716
3904
|
if (typeof this.formatting[name].style != 'undefined') type = 'style';
|
3717
|
-
else if (typeof this.formatting[name]
|
3905
|
+
else if (typeof this.formatting[name]['class'] != 'undefined') type = 'class';
|
3718
3906
|
|
3719
3907
|
if (type) value = this.formatting[name][type];
|
3720
3908
|
|
@@ -3734,11 +3922,24 @@
|
|
3734
3922
|
if (tag == tags[i]) tag = replaced[i];
|
3735
3923
|
}
|
3736
3924
|
|
3925
|
+
if (this.opts.allowedTags)
|
3926
|
+
{
|
3927
|
+
if ($.inArray(tag, this.opts.allowedTags) == -1) return;
|
3928
|
+
}
|
3929
|
+
else
|
3930
|
+
{
|
3931
|
+
if ($.inArray(tag, this.opts.deniedTags) !== -1) return;
|
3932
|
+
}
|
3933
|
+
|
3737
3934
|
this.inline.type = type || false;
|
3738
3935
|
this.inline.value = value || false;
|
3739
3936
|
|
3740
3937
|
this.buffer.set();
|
3741
|
-
|
3938
|
+
|
3939
|
+
if (!this.utils.browser('msie'))
|
3940
|
+
{
|
3941
|
+
this.$editor.focus();
|
3942
|
+
}
|
3742
3943
|
|
3743
3944
|
this.selection.get();
|
3744
3945
|
|
@@ -3754,19 +3955,23 @@
|
|
3754
3955
|
formatCollapsed: function(tag)
|
3755
3956
|
{
|
3756
3957
|
var current = this.selection.getCurrent();
|
3757
|
-
var $parent = $(current).closest(tag + '[data-redactor-tag=' + tag + ']');
|
3958
|
+
var $parent = $(current).closest(tag + '[data-redactor-tag=' + tag + ']', this.$editor[0]);
|
3758
3959
|
|
3759
3960
|
// inline there is
|
3760
3961
|
if ($parent.length !== 0 && (this.inline.type != 'style' && $parent[0].tagName != 'SPAN'))
|
3761
3962
|
{
|
3762
|
-
this.caret.setAfter($parent[0]);
|
3763
|
-
|
3764
3963
|
// remove empty
|
3765
|
-
if (
|
3964
|
+
if (this.utils.isEmpty($parent.text()))
|
3766
3965
|
{
|
3966
|
+
this.caret.setAfter($parent[0]);
|
3967
|
+
|
3767
3968
|
$parent.remove();
|
3768
3969
|
this.code.sync();
|
3769
3970
|
}
|
3971
|
+
else if (this.utils.isEndOfElement($parent))
|
3972
|
+
{
|
3973
|
+
this.caret.setAfter($parent[0]);
|
3974
|
+
}
|
3770
3975
|
|
3771
3976
|
return;
|
3772
3977
|
}
|
@@ -4358,6 +4563,8 @@
|
|
4358
4563
|
}
|
4359
4564
|
|
4360
4565
|
this.range.insertNode(frag);
|
4566
|
+
this.range.collapse(false);
|
4567
|
+
this.selection.addRange();
|
4361
4568
|
}
|
4362
4569
|
};
|
4363
4570
|
},
|
@@ -4404,7 +4611,7 @@
|
|
4404
4611
|
var $table = false;
|
4405
4612
|
if (this.keydown.block && this.keydown.block.tagName === 'TD')
|
4406
4613
|
{
|
4407
|
-
$table = $(this.keydown.block).closest('table');
|
4614
|
+
$table = $(this.keydown.block).closest('table', this.$editor[0]);
|
4408
4615
|
}
|
4409
4616
|
|
4410
4617
|
if ($table && $table.find('td').last()[0] === this.keydown.block)
|
@@ -4478,21 +4685,26 @@
|
|
4478
4685
|
current = this.selection.getCurrent();
|
4479
4686
|
$next = $(this.keydown.current).next();
|
4480
4687
|
|
4481
|
-
if (
|
4688
|
+
if ($next.length !== 0 && $next[0].tagName == 'BR')
|
4689
|
+
{
|
4690
|
+
return this.keydown.insertBreakLine(e);
|
4691
|
+
}
|
4692
|
+
else if (current !== false && $(current).hasClass('redactor-invisible-space'))
|
4482
4693
|
{
|
4483
4694
|
this.caret.setAfter(current);
|
4484
4695
|
$(current).contents().unwrap();
|
4696
|
+
|
4485
4697
|
return this.keydown.insertDblBreakLine(e);
|
4486
4698
|
}
|
4487
4699
|
else
|
4488
4700
|
{
|
4489
|
-
if (
|
4701
|
+
if (this.utils.isEndOfEditor())
|
4490
4702
|
{
|
4491
4703
|
return this.keydown.insertDblBreakLine(e);
|
4492
4704
|
}
|
4493
|
-
else if (
|
4705
|
+
else if ($next.length === 0 && current === false && typeof $next.context != 'undefined')
|
4494
4706
|
{
|
4495
|
-
return this.keydown.
|
4707
|
+
return this.keydown.insertBreakLine(e);
|
4496
4708
|
}
|
4497
4709
|
|
4498
4710
|
return this.keydown.insertBreakLine(e);
|
@@ -4503,16 +4715,34 @@
|
|
4503
4715
|
setTimeout($.proxy(this.keydown.replaceDivToBreakLine, this), 1);
|
4504
4716
|
}
|
4505
4717
|
// paragraphs
|
4506
|
-
else if (!this.opts.linebreaks && this.keydown.block
|
4718
|
+
else if (!this.opts.linebreaks && this.keydown.block)
|
4507
4719
|
{
|
4508
|
-
|
4720
|
+
if (this.keydown.block.tagName !== 'LI')
|
4721
|
+
{
|
4722
|
+
setTimeout($.proxy(this.keydown.replaceDivToParagraph, this), 1);
|
4723
|
+
}
|
4724
|
+
else
|
4725
|
+
{
|
4726
|
+
current = this.selection.getCurrent();
|
4727
|
+
var $parent = $(current).closest('li', this.$editor[0]);
|
4728
|
+
var $list = $parent.closest('ul,ol', this.$editor[0]);
|
4729
|
+
|
4730
|
+
if ($parent.length !== 0 && this.utils.isEmpty($parent.html()) && $list.next().length === 0 && this.utils.isEmpty($list.find("li").last().html()))
|
4731
|
+
{
|
4732
|
+
$list.find("li").last().remove();
|
4733
|
+
|
4734
|
+
var node = $(this.opts.emptyHtml);
|
4735
|
+
$list.after(node);
|
4736
|
+
this.caret.setStart(node);
|
4737
|
+
|
4738
|
+
return false;
|
4739
|
+
}
|
4740
|
+
}
|
4509
4741
|
}
|
4510
4742
|
else if (!this.opts.linebreaks && !this.keydown.block)
|
4511
4743
|
{
|
4512
4744
|
return this.keydown.insertParagraph(e);
|
4513
4745
|
}
|
4514
|
-
|
4515
|
-
|
4516
4746
|
}
|
4517
4747
|
|
4518
4748
|
// Shift+Enter or Ctrl+Enter
|
@@ -4531,6 +4761,12 @@
|
|
4531
4761
|
// image delete and backspace
|
4532
4762
|
if (key === this.keyCode.BACKSPACE || key === this.keyCode.DELETE)
|
4533
4763
|
{
|
4764
|
+
if (this.utils.browser('mozilla') && this.keydown.current && this.keydown.current.tagName === 'TD')
|
4765
|
+
{
|
4766
|
+
e.preventDefault();
|
4767
|
+
return false;
|
4768
|
+
}
|
4769
|
+
|
4534
4770
|
var nodes = this.selection.getNodes();
|
4535
4771
|
if (nodes)
|
4536
4772
|
{
|
@@ -4841,26 +5077,66 @@
|
|
4841
5077
|
e.stopPropagation();
|
4842
5078
|
|
4843
5079
|
this.selection.get();
|
5080
|
+
|
4844
5081
|
var br1 = document.createElement('br');
|
4845
5082
|
|
4846
|
-
this.
|
5083
|
+
if (this.utils.browser('msie'))
|
5084
|
+
{
|
5085
|
+
this.range.collapse(false);
|
5086
|
+
this.range.setEnd(this.range.endContainer, this.range.endOffset);
|
5087
|
+
}
|
5088
|
+
else
|
5089
|
+
{
|
5090
|
+
this.range.deleteContents();
|
5091
|
+
}
|
5092
|
+
|
4847
5093
|
this.range.insertNode(br1);
|
4848
5094
|
|
5095
|
+
// move br outside A tag
|
5096
|
+
var $parentA = $(br1).parent("a");
|
5097
|
+
|
5098
|
+
if ($parentA.length > 0)
|
5099
|
+
{
|
5100
|
+
$parentA.find(br1)
|
5101
|
+
.remove();
|
5102
|
+
|
5103
|
+
$parentA.after(br1);
|
5104
|
+
}
|
5105
|
+
|
4849
5106
|
if (dbl === true)
|
4850
5107
|
{
|
5108
|
+
var $next = $(br1).next();
|
5109
|
+
if ($next.length !== 0 && $next[0].tagName === 'BR' && this.utils.isEndOfEditor())
|
5110
|
+
{
|
5111
|
+
this.caret.setAfter(br1);
|
5112
|
+
this.code.sync();
|
5113
|
+
return false;
|
5114
|
+
}
|
5115
|
+
|
4851
5116
|
var br2 = document.createElement('br');
|
5117
|
+
|
4852
5118
|
this.range.insertNode(br2);
|
4853
5119
|
this.caret.setAfter(br2);
|
4854
5120
|
}
|
4855
5121
|
else
|
4856
5122
|
{
|
4857
|
-
this.
|
5123
|
+
this.keydown.insertBreakLineProcessingAfter(br1);
|
4858
5124
|
}
|
4859
5125
|
|
4860
5126
|
this.code.sync();
|
4861
|
-
|
4862
5127
|
return false;
|
4863
5128
|
},
|
5129
|
+
insertBreakLineProcessingAfter: function(node)
|
5130
|
+
{
|
5131
|
+
var space = this.utils.createSpaceElement();
|
5132
|
+
$(node).after(space);
|
5133
|
+
this.selection.selectElement(space);
|
5134
|
+
|
5135
|
+
$(space).replaceWith(function()
|
5136
|
+
{
|
5137
|
+
return $(this).contents();
|
5138
|
+
});
|
5139
|
+
},
|
4864
5140
|
removeInvisibleSpace: function()
|
4865
5141
|
{
|
4866
5142
|
var $current = $(this.keydown.current);
|
@@ -4873,9 +5149,9 @@
|
|
4873
5149
|
{
|
4874
5150
|
var $current = $(this.keydown.current);
|
4875
5151
|
var $parent = $(this.keydown.parent);
|
4876
|
-
var td = $current.closest('td');
|
5152
|
+
var td = $current.closest('td', this.$editor[0]);
|
4877
5153
|
|
4878
|
-
if (td.length !== 0 && $current.closest('li') && $parent.children('li').length === 1)
|
5154
|
+
if (td.length !== 0 && $current.closest('li', this.$editor[0]) && $parent.children('li').length === 1)
|
4879
5155
|
{
|
4880
5156
|
if (!this.utils.isEmpty($current.text())) return;
|
4881
5157
|
|
@@ -4902,7 +5178,6 @@
|
|
4902
5178
|
this.keyup.parent = this.selection.getParent();
|
4903
5179
|
var $parent = this.utils.isRedactorParent($(this.keyup.parent).parent());
|
4904
5180
|
|
4905
|
-
|
4906
5181
|
// callback
|
4907
5182
|
var keyupStop = this.core.setCallback('keyup', e);
|
4908
5183
|
if (keyupStop === false)
|
@@ -4931,13 +5206,8 @@
|
|
4931
5206
|
}
|
4932
5207
|
|
4933
5208
|
// linkify
|
4934
|
-
if (this.
|
4935
|
-
|
4936
|
-
this.formatLinkify(this.opts.linkProtocol, this.opts.convertLinks, this.opts.convertUrlLinks, this.opts.convertImageLinks, this.opts.convertVideoLinks, this.opts.linkSize);
|
4937
|
-
|
4938
|
-
this.observe.load();
|
4939
|
-
this.code.sync();
|
4940
|
-
}
|
5209
|
+
if (this.linkify.isEnabled() && this.linkify.isKey(key))
|
5210
|
+
this.linkify.format();
|
4941
5211
|
|
4942
5212
|
if (key === this.keyCode.DELETE || key === this.keyCode.BACKSPACE)
|
4943
5213
|
{
|
@@ -4958,7 +5228,10 @@
|
|
4958
5228
|
}
|
4959
5229
|
|
4960
5230
|
// remove empty paragraphs
|
4961
|
-
this.$editor.find('p').each($.proxy(
|
5231
|
+
this.$editor.find('p').each($.proxy(function(i, s)
|
5232
|
+
{
|
5233
|
+
this.utils.removeEmpty(i, $(s).html());
|
5234
|
+
}, this));
|
4962
5235
|
|
4963
5236
|
// remove invisible space
|
4964
5237
|
if (this.opts.linebreaks && this.keyup.current && this.keyup.current.tagName == 'DIV' && this.utils.isEmpty(this.keyup.current.innerHTML))
|
@@ -4972,10 +5245,6 @@
|
|
4972
5245
|
return this.keyup.formatEmpty(e);
|
4973
5246
|
}
|
4974
5247
|
},
|
4975
|
-
isLinkify: function(key)
|
4976
|
-
{
|
4977
|
-
return this.opts.convertLinks && (this.opts.convertUrlLinks || this.opts.convertImageLinks || this.opts.convertVideoLinks) && key === this.keyCode.ENTER && !this.utils.isCurrentOrParent('PRE');
|
4978
|
-
},
|
4979
5248
|
replaceToParagraph: function(clone)
|
4980
5249
|
{
|
4981
5250
|
var $current = $(this.keyup.current);
|
@@ -5156,23 +5425,26 @@
|
|
5156
5425
|
cleanUrl: function()
|
5157
5426
|
{
|
5158
5427
|
var thref = self.location.href.replace(/\/$/i, '');
|
5159
|
-
this.link.url = this.link.url.replace(thref, '');
|
5160
|
-
this.link.url = this.link.url.replace(/^\/#/, '#');
|
5161
|
-
this.link.url = this.link.url.replace('mailto:', '');
|
5162
5428
|
|
5163
|
-
|
5164
|
-
if (!this.opts.linkProtocol)
|
5429
|
+
if (typeof this.link.url !== "undefined")
|
5165
5430
|
{
|
5166
|
-
|
5167
|
-
this.link.url = this.link.url.replace(
|
5168
|
-
|
5431
|
+
this.link.url = this.link.url.replace(thref, '');
|
5432
|
+
this.link.url = this.link.url.replace(/^\/#/, '#');
|
5433
|
+
this.link.url = this.link.url.replace('mailto:', '');
|
5169
5434
|
|
5435
|
+
// remove host from href
|
5436
|
+
if (!this.opts.linkProtocol)
|
5437
|
+
{
|
5438
|
+
var re = new RegExp('^(http|ftp|https)://' + self.location.host, 'i');
|
5439
|
+
this.link.url = this.link.url.replace(re, '');
|
5440
|
+
}
|
5441
|
+
}
|
5170
5442
|
},
|
5171
5443
|
getData: function()
|
5172
5444
|
{
|
5173
5445
|
this.link.$node = false;
|
5174
5446
|
|
5175
|
-
var $el = $(this.selection.getCurrent()).closest('a');
|
5447
|
+
var $el = $(this.selection.getCurrent()).closest('a', this.$editor[0]);
|
5176
5448
|
if ($el.length !== 0 && $el[0].tagName === 'A')
|
5177
5449
|
{
|
5178
5450
|
this.link.$node = $el;
|
@@ -5191,6 +5463,8 @@
|
|
5191
5463
|
},
|
5192
5464
|
insert: function()
|
5193
5465
|
{
|
5466
|
+
this.placeholder.remove();
|
5467
|
+
|
5194
5468
|
var target = '';
|
5195
5469
|
var link = this.link.$inputUrl.val();
|
5196
5470
|
var text = this.link.$inputText.val();
|
@@ -5247,16 +5521,37 @@
|
|
5247
5521
|
{
|
5248
5522
|
this.buffer.set();
|
5249
5523
|
|
5250
|
-
this.link.$node
|
5524
|
+
var $link = this.link.$node,
|
5525
|
+
$el = $link.children();
|
5526
|
+
|
5527
|
+
if ($el.length > 0)
|
5528
|
+
{
|
5529
|
+
while ($el.length)
|
5530
|
+
{
|
5531
|
+
$el = $el.children();
|
5532
|
+
}
|
5533
|
+
|
5534
|
+
$el = $el.end();
|
5535
|
+
}
|
5536
|
+
else
|
5537
|
+
{
|
5538
|
+
$el = $link;
|
5539
|
+
}
|
5540
|
+
|
5541
|
+
$link.attr('href', link);
|
5542
|
+
$el.text(text);
|
5543
|
+
|
5251
5544
|
if (target !== '')
|
5252
5545
|
{
|
5253
|
-
|
5546
|
+
$link.attr('target', target);
|
5254
5547
|
}
|
5255
5548
|
else
|
5256
5549
|
{
|
5257
|
-
|
5550
|
+
$link.removeAttr('target');
|
5258
5551
|
}
|
5259
5552
|
|
5553
|
+
this.selection.selectElement($link);
|
5554
|
+
|
5260
5555
|
this.code.sync();
|
5261
5556
|
}
|
5262
5557
|
else
|
@@ -5278,20 +5573,36 @@
|
|
5278
5573
|
if (target !== '') $a.attr('target', target);
|
5279
5574
|
|
5280
5575
|
$a = $(this.insert.node($a));
|
5576
|
+
|
5577
|
+
if (this.selection.getText().match(/\s$/))
|
5578
|
+
{
|
5579
|
+
$a.after(" ");
|
5580
|
+
}
|
5581
|
+
|
5281
5582
|
this.selection.selectElement($a);
|
5282
5583
|
}
|
5283
5584
|
else
|
5284
5585
|
{
|
5285
5586
|
document.execCommand('createLink', false, link);
|
5286
5587
|
|
5287
|
-
$a = $(this.selection.getCurrent()).closest('a');
|
5588
|
+
$a = $(this.selection.getCurrent()).closest('a', this.$editor[0]);
|
5589
|
+
if (this.utils.browser('mozilla'))
|
5590
|
+
{
|
5591
|
+
$a = $('a[_moz_dirty=""]');
|
5592
|
+
}
|
5288
5593
|
|
5289
5594
|
if (target !== '') $a.attr('target', target);
|
5290
|
-
$a.removeAttr('style');
|
5595
|
+
$a.removeAttr('style').removeAttr('_moz_dirty');
|
5596
|
+
|
5597
|
+
if (this.selection.getText().match(/\s$/))
|
5598
|
+
{
|
5599
|
+
$a.after(" ");
|
5600
|
+
}
|
5291
5601
|
|
5292
|
-
if (this.link.text
|
5602
|
+
if (this.link.text !== '' || this.link.text != text)
|
5293
5603
|
{
|
5294
5604
|
$a.text(text);
|
5605
|
+
|
5295
5606
|
this.selection.selectElement($a);
|
5296
5607
|
}
|
5297
5608
|
}
|
@@ -5311,7 +5622,10 @@
|
|
5311
5622
|
},
|
5312
5623
|
unlink: function(e)
|
5313
5624
|
{
|
5314
|
-
if (typeof e != 'undefined' && e.preventDefault)
|
5625
|
+
if (typeof e != 'undefined' && e.preventDefault)
|
5626
|
+
{
|
5627
|
+
e.preventDefault();
|
5628
|
+
}
|
5315
5629
|
|
5316
5630
|
var nodes = this.selection.getNodes();
|
5317
5631
|
if (!nodes) return;
|
@@ -5321,11 +5635,8 @@
|
|
5321
5635
|
var len = nodes.length;
|
5322
5636
|
for (var i = 0; i < len; i++)
|
5323
5637
|
{
|
5324
|
-
|
5325
|
-
|
5326
|
-
var $node = $(nodes[i]);
|
5327
|
-
$node.replaceWith($node.contents());
|
5328
|
-
}
|
5638
|
+
var $node = $(nodes[i]).closest('a', this.$editor[0]);
|
5639
|
+
$node.replaceWith($node.contents());
|
5329
5640
|
}
|
5330
5641
|
|
5331
5642
|
// hide link's tooltip
|
@@ -5333,6 +5644,28 @@
|
|
5333
5644
|
|
5334
5645
|
this.code.sync();
|
5335
5646
|
|
5647
|
+
},
|
5648
|
+
toggleClass: function(className)
|
5649
|
+
{
|
5650
|
+
this.link.setClass(className, 'toggleClass');
|
5651
|
+
},
|
5652
|
+
addClass: function(className)
|
5653
|
+
{
|
5654
|
+
this.link.setClass(className, 'addClass');
|
5655
|
+
},
|
5656
|
+
removeClass: function(className)
|
5657
|
+
{
|
5658
|
+
this.link.setClass(className, 'removeClass');
|
5659
|
+
},
|
5660
|
+
setClass: function(className, func)
|
5661
|
+
{
|
5662
|
+
var links = this.selection.getInlinesTags(['a']);
|
5663
|
+
if (links === false) return;
|
5664
|
+
|
5665
|
+
$.each(links, function()
|
5666
|
+
{
|
5667
|
+
$(this)[func](className);
|
5668
|
+
});
|
5336
5669
|
}
|
5337
5670
|
};
|
5338
5671
|
},
|
@@ -5348,7 +5681,7 @@
|
|
5348
5681
|
this.selection.save();
|
5349
5682
|
|
5350
5683
|
var parent = this.selection.getParent();
|
5351
|
-
var $list = $(parent).closest('ol, ul');
|
5684
|
+
var $list = $(parent).closest('ol, ul', this.$editor[0]);
|
5352
5685
|
|
5353
5686
|
if (!this.utils.isRedactorParent($list) && $list.length !== 0)
|
5354
5687
|
{
|
@@ -5386,7 +5719,6 @@
|
|
5386
5719
|
}
|
5387
5720
|
}
|
5388
5721
|
|
5389
|
-
|
5390
5722
|
this.selection.restore();
|
5391
5723
|
this.code.sync();
|
5392
5724
|
},
|
@@ -5394,7 +5726,7 @@
|
|
5394
5726
|
{
|
5395
5727
|
var parent = this.selection.getParent();
|
5396
5728
|
var current = this.selection.getCurrent();
|
5397
|
-
var $td = $(current).closest('td, th');
|
5729
|
+
var $td = $(current).closest('td, th', this.$editor[0]);
|
5398
5730
|
|
5399
5731
|
if (this.utils.browser('msie') && this.opts.linebreaks)
|
5400
5732
|
{
|
@@ -5405,7 +5737,7 @@
|
|
5405
5737
|
document.execCommand('insert' + cmd);
|
5406
5738
|
}
|
5407
5739
|
|
5408
|
-
var $list = $(this.selection.getParent()).closest('ol, ul');
|
5740
|
+
var $list = $(this.selection.getParent()).closest('ol, ul', this.$editor[0]);
|
5409
5741
|
|
5410
5742
|
if ($td.length !== 0)
|
5411
5743
|
{
|
@@ -5492,13 +5824,13 @@
|
|
5492
5824
|
|
5493
5825
|
this.indent.fixEmptyIndent();
|
5494
5826
|
|
5495
|
-
if (!this.opts.linebreaks && $current.closest('li, th, td').length === 0)
|
5827
|
+
if (!this.opts.linebreaks && $current.closest('li, th, td', this.$editor[0]).length === 0)
|
5496
5828
|
{
|
5497
5829
|
document.execCommand('formatblock', false, 'p');
|
5498
5830
|
this.$editor.find('ul, ol, blockquote').each($.proxy(this.utils.removeEmpty, this));
|
5499
5831
|
}
|
5500
5832
|
|
5501
|
-
var $table = $(this.selection.getCurrent()).closest('table');
|
5833
|
+
var $table = $(this.selection.getCurrent()).closest('table', this.$editor[0]);
|
5502
5834
|
var $prev = $table.prev();
|
5503
5835
|
if (!this.opts.linebreaks && $table.length !== 0 && $prev.length !== 0 && $prev[0].tagName == 'BR')
|
5504
5836
|
{
|
@@ -5859,7 +6191,14 @@
|
|
5859
6191
|
var current = this.selection.getCurrent();
|
5860
6192
|
var parent = this.selection.getParent();
|
5861
6193
|
|
5862
|
-
|
6194
|
+
if (e !== false)
|
6195
|
+
{
|
6196
|
+
this.button.setInactiveAll();
|
6197
|
+
}
|
6198
|
+
else
|
6199
|
+
{
|
6200
|
+
this.button.setInactiveAll(btnName);
|
6201
|
+
}
|
5863
6202
|
|
5864
6203
|
if (e === false && btnName !== 'html')
|
5865
6204
|
{
|
@@ -5872,19 +6211,19 @@
|
|
5872
6211
|
|
5873
6212
|
$.each(this.opts.activeButtonsStates, $.proxy(function(key, value)
|
5874
6213
|
{
|
5875
|
-
var parentEl = $(parent).closest(key);
|
5876
|
-
var currentEl = $(current).closest(key);
|
6214
|
+
var parentEl = $(parent).closest(key, this.$editor[0]);
|
6215
|
+
var currentEl = $(current).closest(key, this.$editor[0]);
|
5877
6216
|
|
5878
6217
|
if (parentEl.length !== 0 && !this.utils.isRedactorParent(parentEl)) return;
|
5879
6218
|
if (!this.utils.isRedactorParent(currentEl)) return;
|
5880
|
-
if (parentEl.length !== 0 || currentEl.closest(key).length !== 0)
|
6219
|
+
if (parentEl.length !== 0 || currentEl.closest(key, this.$editor[0]).length !== 0)
|
5881
6220
|
{
|
5882
6221
|
this.button.setActive(value);
|
5883
6222
|
}
|
5884
6223
|
|
5885
6224
|
}, this));
|
5886
6225
|
|
5887
|
-
var $parent = $(parent).closest(this.opts.alignmentTags.toString().toLowerCase());
|
6226
|
+
var $parent = $(parent).closest(this.opts.alignmentTags.toString().toLowerCase(), this.$editor[0]);
|
5888
6227
|
if (this.utils.isRedactorParent(parent) && $parent.length)
|
5889
6228
|
{
|
5890
6229
|
var align = ($parent.css('text-align') === '') ? 'left' : $parent.css('text-align');
|
@@ -5903,7 +6242,7 @@
|
|
5903
6242
|
var $img = $(img);
|
5904
6243
|
|
5905
6244
|
// IE fix (when we clicked on an image and then press backspace IE does goes to image's url)
|
5906
|
-
$img.closest('a').on('click', function(e) { e.preventDefault(); });
|
6245
|
+
$img.closest('a', this.$editor[0]).on('click', function(e) { e.preventDefault(); });
|
5907
6246
|
|
5908
6247
|
if (this.utils.browser('msie')) $img.attr('unselectable', 'on');
|
5909
6248
|
|
@@ -5911,7 +6250,7 @@
|
|
5911
6250
|
|
5912
6251
|
}, this));
|
5913
6252
|
|
5914
|
-
$(document).on('click.redactor-image-delete', $.proxy(function(e)
|
6253
|
+
$(document).on('click.redactor-image-delete.' + this.uuid, $.proxy(function(e)
|
5915
6254
|
{
|
5916
6255
|
this.observe.image = false;
|
5917
6256
|
if (e.target.tagName == 'IMG' && this.utils.isRedactorParent(e.target))
|
@@ -5926,9 +6265,9 @@
|
|
5926
6265
|
{
|
5927
6266
|
if (!this.opts.linkTooltip) return;
|
5928
6267
|
|
5929
|
-
this.$editor.find('a').on('touchstart click', $.proxy(this.observe.showTooltip, this));
|
5930
|
-
this.$editor.on('touchstart click.redactor', $.proxy(this.observe.closeTooltip, this));
|
5931
|
-
$(document).on('touchstart click.redactor', $.proxy(this.observe.closeTooltip, this));
|
6268
|
+
this.$editor.find('a').on('touchstart.redactor.' + this.uuid + ' click.redactor.' + this.uuid, $.proxy(this.observe.showTooltip, this));
|
6269
|
+
this.$editor.on('touchstart.redactor.' + this.uuid + ' click.redactor.' + this.uuid, $.proxy(this.observe.closeTooltip, this));
|
6270
|
+
$(document).on('touchstart.redactor.' + this.uuid + ' click.redactor.' + this.uuid, $.proxy(this.observe.closeTooltip, this));
|
5932
6271
|
},
|
5933
6272
|
getTooltipPosition: function($link)
|
5934
6273
|
{
|
@@ -5936,20 +6275,18 @@
|
|
5936
6275
|
},
|
5937
6276
|
showTooltip: function(e)
|
5938
6277
|
{
|
5939
|
-
var $
|
5940
|
-
var $parent = $link.closest('a');
|
5941
|
-
var tag = ($link.length !== 0) ? $link[0].tagName : false;
|
6278
|
+
var $el = $(e.target);
|
5942
6279
|
|
5943
|
-
if ($
|
5944
|
-
|
5945
|
-
if (tag === 'IMG') return;
|
5946
|
-
else if (tag !== 'A') $link = $parent;
|
5947
|
-
}
|
6280
|
+
if ($el[0].tagName == 'IMG')
|
6281
|
+
return;
|
5948
6282
|
|
5949
|
-
if (
|
5950
|
-
|
6283
|
+
if ($el[0].tagName !== 'A')
|
6284
|
+
$el = $el.closest('a', this.$editor[0]);
|
6285
|
+
|
6286
|
+
if ($el[0].tagName !== 'A')
|
5951
6287
|
return;
|
5952
|
-
|
6288
|
+
|
6289
|
+
var $link = $el;
|
5953
6290
|
|
5954
6291
|
var pos = this.observe.getTooltipPosition($link);
|
5955
6292
|
var tooltip = $('<span class="redactor-link-tooltip"></span>');
|
@@ -5980,7 +6317,7 @@
|
|
5980
6317
|
e = e.originalEvent || e;
|
5981
6318
|
|
5982
6319
|
var target = e.target;
|
5983
|
-
var $parent = $(target).closest('a');
|
6320
|
+
var $parent = $(target).closest('a', this.$editor[0]);
|
5984
6321
|
if ($parent.length !== 0 && $parent[0].tagName === 'A' && target.tagName !== 'A')
|
5985
6322
|
{
|
5986
6323
|
return;
|
@@ -6003,10 +6340,6 @@
|
|
6003
6340
|
if (this.opts.linebreaks) return html;
|
6004
6341
|
if (html === '' || html === '<p></p>') return this.opts.emptyHtml;
|
6005
6342
|
|
6006
|
-
this.paragraphize.blocks = ['table', 'div', 'pre', 'form', 'ul', 'ol', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'dl', 'blockquote', 'figcaption',
|
6007
|
-
'address', 'section', 'header', 'footer', 'aside', 'article', 'object', 'style', 'script', 'iframe', 'select', 'input', 'textarea',
|
6008
|
-
'button', 'option', 'map', 'area', 'math', 'hr', 'fieldset', 'legend', 'hgroup', 'nav', 'figure', 'details', 'menu', 'summary', 'p'];
|
6009
|
-
|
6010
6343
|
html = html + "\n";
|
6011
6344
|
|
6012
6345
|
this.paragraphize.safes = [];
|
@@ -6021,7 +6354,7 @@
|
|
6021
6354
|
html = this.paragraphize.clear(html);
|
6022
6355
|
html = this.paragraphize.restoreSafes(html);
|
6023
6356
|
|
6024
|
-
html = html.replace(new RegExp('<br\\s?/?>\n?<(' + this.
|
6357
|
+
html = html.replace(new RegExp('<br\\s?/?>\n?<(' + this.opts.paragraphizeBlocks.join('|') + ')(.*?[^>])>', 'gi'), '<p><br /></p>\n<$1$2>');
|
6025
6358
|
|
6026
6359
|
return $.trim(html);
|
6027
6360
|
},
|
@@ -6037,7 +6370,7 @@
|
|
6037
6370
|
|
6038
6371
|
html = $div.html();
|
6039
6372
|
|
6040
|
-
$div.find(this.
|
6373
|
+
$div.find(this.opts.paragraphizeBlocks.join(', ')).each($.proxy(function(i,s)
|
6041
6374
|
{
|
6042
6375
|
this.paragraphize.z++;
|
6043
6376
|
this.paragraphize.safes[this.paragraphize.z] = s.outerHTML;
|
@@ -6066,7 +6399,9 @@
|
|
6066
6399
|
{
|
6067
6400
|
$.each(this.paragraphize.safes, function(i,s)
|
6068
6401
|
{
|
6402
|
+
s = (typeof s !== 'undefined') ? s.replace(/\$/g, '$') : s;
|
6069
6403
|
html = html.replace('{replace' + i + '}', s);
|
6404
|
+
|
6070
6405
|
});
|
6071
6406
|
|
6072
6407
|
return html;
|
@@ -6134,7 +6469,11 @@
|
|
6134
6469
|
return {
|
6135
6470
|
init: function(e)
|
6136
6471
|
{
|
6137
|
-
if (!this.opts.cleanOnPaste)
|
6472
|
+
if (!this.opts.cleanOnPaste)
|
6473
|
+
{
|
6474
|
+
setTimeout($.proxy(this.code.sync, this), 1);
|
6475
|
+
return;
|
6476
|
+
}
|
6138
6477
|
|
6139
6478
|
this.rtePaste = true;
|
6140
6479
|
|
@@ -6163,14 +6502,24 @@
|
|
6163
6502
|
|
6164
6503
|
$(window).off('scroll.redactor-freeze');
|
6165
6504
|
|
6166
|
-
|
6505
|
+
if (this.linkify.isEnabled())
|
6506
|
+
this.linkify.format();
|
6167
6507
|
|
6508
|
+
}, this), 1);
|
6168
6509
|
},
|
6169
6510
|
createPasteBox: function()
|
6170
6511
|
{
|
6171
6512
|
this.$pasteBox = $('<div>').html('').attr('contenteditable', 'true').css({ position: 'fixed', width: 0, top: 0, left: '-9999px' });
|
6172
6513
|
|
6173
|
-
this
|
6514
|
+
if (this.utils.browser('msie'))
|
6515
|
+
{
|
6516
|
+
this.$box.append(this.$pasteBox);
|
6517
|
+
}
|
6518
|
+
else
|
6519
|
+
{
|
6520
|
+
$('body').append(this.$pasteBox);
|
6521
|
+
}
|
6522
|
+
|
6174
6523
|
this.$pasteBox.focus();
|
6175
6524
|
},
|
6176
6525
|
insert: function(html)
|
@@ -6327,7 +6676,7 @@
|
|
6327
6676
|
|
6328
6677
|
return false;
|
6329
6678
|
},
|
6330
|
-
getInlines: function(nodes)
|
6679
|
+
getInlines: function(nodes, tags)
|
6331
6680
|
{
|
6332
6681
|
this.selection.get();
|
6333
6682
|
|
@@ -6337,9 +6686,18 @@
|
|
6337
6686
|
}
|
6338
6687
|
|
6339
6688
|
var inlines = [];
|
6340
|
-
nodes = (typeof nodes == 'undefined') ? this.selection.getNodes() : nodes;
|
6689
|
+
nodes = (typeof nodes == 'undefined' || nodes === false) ? this.selection.getNodes() : nodes;
|
6341
6690
|
var inlineTags = this.opts.inlineTags;
|
6342
6691
|
inlineTags.push('span');
|
6692
|
+
|
6693
|
+
if (typeof tags !== 'undefined')
|
6694
|
+
{
|
6695
|
+
for (var i = 0; i < tags.length; i++)
|
6696
|
+
{
|
6697
|
+
inlineTags.push(tags[i]);
|
6698
|
+
}
|
6699
|
+
}
|
6700
|
+
|
6343
6701
|
$.each(nodes, $.proxy(function(i,node)
|
6344
6702
|
{
|
6345
6703
|
if ($.inArray(node.tagName.toLowerCase(), inlineTags) != -1)
|
@@ -6351,6 +6709,28 @@
|
|
6351
6709
|
|
6352
6710
|
return (inlines.length === 0) ? false : inlines;
|
6353
6711
|
},
|
6712
|
+
getInlinesTags: function(tags)
|
6713
|
+
{
|
6714
|
+
this.selection.get();
|
6715
|
+
|
6716
|
+
if (this.range && this.range.collapsed)
|
6717
|
+
{
|
6718
|
+
return false;
|
6719
|
+
}
|
6720
|
+
|
6721
|
+
var inlines = [];
|
6722
|
+
var nodes = this.selection.getNodes();
|
6723
|
+
$.each(nodes, $.proxy(function(i,node)
|
6724
|
+
{
|
6725
|
+
if ($.inArray(node.tagName.toLowerCase(), tags) != -1)
|
6726
|
+
{
|
6727
|
+
inlines.push(node);
|
6728
|
+
}
|
6729
|
+
|
6730
|
+
}, this));
|
6731
|
+
|
6732
|
+
return (inlines.length === 0) ? false : inlines;
|
6733
|
+
},
|
6354
6734
|
getBlocks: function(nodes)
|
6355
6735
|
{
|
6356
6736
|
this.selection.get();
|
@@ -6567,7 +6947,12 @@
|
|
6567
6947
|
},
|
6568
6948
|
removeMarkers: function()
|
6569
6949
|
{
|
6570
|
-
this.$editor.find('span.redactor-selection-marker').
|
6950
|
+
this.$editor.find('span.redactor-selection-marker').each(function(i,s)
|
6951
|
+
{
|
6952
|
+
var text = $(s).text().replace(/[\u200B-\u200D\uFEFF]/g, '');
|
6953
|
+
if (text === '') $(s).remove();
|
6954
|
+
else $(s).replaceWith(function() { return $(this).contents(); });
|
6955
|
+
});
|
6571
6956
|
},
|
6572
6957
|
getText: function()
|
6573
6958
|
{
|
@@ -6593,6 +6978,34 @@
|
|
6593
6978
|
}
|
6594
6979
|
|
6595
6980
|
return this.clean.onSync(html);
|
6981
|
+
},
|
6982
|
+
replaceWithHtml: function(html)
|
6983
|
+
{
|
6984
|
+
html = this.selection.getMarkerAsHtml(1) + html + this.selection.getMarkerAsHtml(2);
|
6985
|
+
|
6986
|
+
this.selection.get();
|
6987
|
+
|
6988
|
+
if (window.getSelection && window.getSelection().getRangeAt)
|
6989
|
+
{
|
6990
|
+
this.range.deleteContents();
|
6991
|
+
var div = document.createElement("div");
|
6992
|
+
div.innerHTML = html;
|
6993
|
+
|
6994
|
+
var frag = document.createDocumentFragment(), child;
|
6995
|
+
while ((child = div.firstChild))
|
6996
|
+
{
|
6997
|
+
frag.appendChild(child);
|
6998
|
+
}
|
6999
|
+
|
7000
|
+
this.range.insertNode(frag);
|
7001
|
+
}
|
7002
|
+
else if (document.selection && document.selection.createRange)
|
7003
|
+
{
|
7004
|
+
this.range.pasteHTML(html);
|
7005
|
+
}
|
7006
|
+
|
7007
|
+
this.selection.restore();
|
7008
|
+
this.code.sync();
|
6596
7009
|
}
|
6597
7010
|
};
|
6598
7011
|
},
|
@@ -6710,7 +7123,7 @@
|
|
6710
7123
|
// clean setup
|
6711
7124
|
var ownLine = ['area', 'body', 'head', 'hr', 'i?frame', 'link', 'meta', 'noscript', 'style', 'script', 'table', 'tbody', 'thead', 'tfoot'];
|
6712
7125
|
var contOwnLine = ['li', 'dt', 'dt', 'h[1-6]', 'option', 'script'];
|
6713
|
-
var newLevel = ['blockquote', 'div', 'dl', 'fieldset', 'form', 'frameset', 'map', 'ol', '
|
7126
|
+
var newLevel = ['p', 'blockquote', 'div', 'dl', 'fieldset', 'form', 'frameset', 'map', 'ol', 'pre', 'select', 'td', 'th', 'tr', 'ul'];
|
6714
7127
|
|
6715
7128
|
this.tabifier.lineBefore = new RegExp('^<(/?' + ownLine.join('|/?' ) + '|' + contOwnLine.join('|') + ')[ >]');
|
6716
7129
|
this.tabifier.lineAfter = new RegExp('^<(br|/?' + ownLine.join('|/?' ) + '|/' + contOwnLine.join('|/') + ')[ >]');
|
@@ -6875,6 +7288,7 @@
|
|
6875
7288
|
placeTag: function (tag, out)
|
6876
7289
|
{
|
6877
7290
|
var nl = tag.match(this.tabifier.newLevel);
|
7291
|
+
|
6878
7292
|
if (tag.match(this.tabifier.lineBefore) || nl)
|
6879
7293
|
{
|
6880
7294
|
out = out.replace(/\s*$/, '');
|
@@ -6890,7 +7304,7 @@
|
|
6890
7304
|
if (tag.match(this.tabifier.lineAfter) || tag.match(this.tabifier.newLevel))
|
6891
7305
|
{
|
6892
7306
|
out = out.replace(/ *$/, '');
|
6893
|
-
out += '\n';
|
7307
|
+
//out += '\n';
|
6894
7308
|
}
|
6895
7309
|
|
6896
7310
|
return out;
|
@@ -6991,24 +7405,13 @@
|
|
6991
7405
|
replacement.push(this.tidy.settings.replaceTags[i][0]);
|
6992
7406
|
}
|
6993
7407
|
|
6994
|
-
|
7408
|
+
$.each(replacement, $.proxy(function(key, value)
|
6995
7409
|
{
|
6996
|
-
|
6997
|
-
$(s).replaceWith(function()
|
7410
|
+
this.tidy.$div.find(value).replaceWith(function()
|
6998
7411
|
{
|
6999
|
-
|
7000
|
-
|
7001
|
-
for (var i = 0; i < this.attributes.length; i++)
|
7002
|
-
{
|
7003
|
-
replaced.attr(this.attributes[i].name, this.attributes[i].value);
|
7004
|
-
}
|
7005
|
-
|
7006
|
-
return replaced;
|
7412
|
+
return $("<" + rTags[key] + " />", {html: $(this).html()});
|
7007
7413
|
});
|
7008
|
-
|
7009
7414
|
}, this));
|
7010
|
-
|
7011
|
-
return html;
|
7012
7415
|
},
|
7013
7416
|
replaceStyles: function()
|
7014
7417
|
{
|
@@ -7437,7 +7840,7 @@
|
|
7437
7840
|
if (!this.opts.toolbarFixed) return;
|
7438
7841
|
|
7439
7842
|
this.toolbar.observeScroll();
|
7440
|
-
$(this.opts.toolbarFixedTarget).on('scroll.redactor', $.proxy(this.toolbar.observeScroll, this));
|
7843
|
+
$(this.opts.toolbarFixedTarget).on('scroll.redactor.' + this.uuid, $.proxy(this.toolbar.observeScroll, this));
|
7441
7844
|
|
7442
7845
|
},
|
7443
7846
|
setOverflow: function()
|
@@ -7502,7 +7905,7 @@
|
|
7502
7905
|
{
|
7503
7906
|
var top = this.opts.toolbarFixedTopOffset + scrollTop - boxTop;
|
7504
7907
|
var left = 0;
|
7505
|
-
var end = boxTop + this.$box.height()
|
7908
|
+
var end = boxTop + this.$box.height() - 32;
|
7506
7909
|
var width = this.$box.innerWidth();
|
7507
7910
|
|
7508
7911
|
this.$toolbar.addClass('toolbar-fixed-box');
|
@@ -7513,6 +7916,9 @@
|
|
7513
7916
|
left: left
|
7514
7917
|
});
|
7515
7918
|
|
7919
|
+
if (scrollTop > end)
|
7920
|
+
$('.redactor-dropdown-' + this.uuid + ':visible').hide();
|
7921
|
+
|
7516
7922
|
this.toolbar.setDropdownsFixed();
|
7517
7923
|
this.$toolbar.css('visibility', (scrollTop < end) ? 'visible' : 'hidden');
|
7518
7924
|
},
|
@@ -7528,7 +7934,6 @@
|
|
7528
7934
|
|
7529
7935
|
this.toolbar.unsetDropdownsFixed();
|
7530
7936
|
this.$toolbar.removeClass('toolbar-fixed-box');
|
7531
|
-
|
7532
7937
|
},
|
7533
7938
|
setDropdownsFixed: function()
|
7534
7939
|
{
|
@@ -7540,7 +7945,7 @@
|
|
7540
7945
|
position = 'absolute';
|
7541
7946
|
}
|
7542
7947
|
|
7543
|
-
$('.redactor-dropdown').each(function()
|
7948
|
+
$('.redactor-dropdown-' + this.uuid).each(function()
|
7544
7949
|
{
|
7545
7950
|
$(this).css({ position: position, top: top + 'px' });
|
7546
7951
|
});
|
@@ -7548,7 +7953,7 @@
|
|
7548
7953
|
unsetDropdownsFixed: function()
|
7549
7954
|
{
|
7550
7955
|
var top = (this.$toolbar.innerHeight() + this.$toolbar.offset().top);
|
7551
|
-
$('.redactor-dropdown').each(function()
|
7956
|
+
$('.redactor-dropdown-' + this.uuid).each(function()
|
7552
7957
|
{
|
7553
7958
|
$(this).css({ position: 'absolute', top: top + 'px' });
|
7554
7959
|
});
|
@@ -7566,7 +7971,7 @@
|
|
7566
7971
|
this.upload.$el = $(id);
|
7567
7972
|
this.upload.$droparea = $('<div id="redactor-droparea" />');
|
7568
7973
|
|
7569
|
-
this.upload.$placeholdler = $('<div id="redactor-droparea-placeholder" />').text('
|
7974
|
+
this.upload.$placeholdler = $('<div id="redactor-droparea-placeholder" />').text(this.lang.get('upload_label'));
|
7570
7975
|
this.upload.$input = $('<input type="file" name="file" />');
|
7571
7976
|
|
7572
7977
|
this.upload.$placeholdler.append(this.upload.$input);
|
@@ -7627,6 +8032,7 @@
|
|
7627
8032
|
}
|
7628
8033
|
|
7629
8034
|
this.progress.show();
|
8035
|
+
this.core.setCallback('uploadStart', e, formData);
|
7630
8036
|
this.upload.sendData(formData, e);
|
7631
8037
|
},
|
7632
8038
|
setConfig: function(file)
|
@@ -7677,6 +8083,7 @@
|
|
7677
8083
|
|
7678
8084
|
var xhr = new XMLHttpRequest();
|
7679
8085
|
xhr.open('POST', this.upload.url);
|
8086
|
+
xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
|
7680
8087
|
|
7681
8088
|
// complete
|
7682
8089
|
xhr.onreadystatechange = $.proxy(function()
|
@@ -7914,6 +8321,7 @@
|
|
7914
8321
|
html = html.replace(/\s/g, '');
|
7915
8322
|
html = html.replace(/^<p>[^\W\w\D\d]*?<\/p>$/i, '');
|
7916
8323
|
html = html.replace(/<iframe(.*?[^>])>$/i, 'iframe');
|
8324
|
+
html = html.replace(/<source(.*?[^>])>$/i, 'source');
|
7917
8325
|
|
7918
8326
|
// remove empty tags
|
7919
8327
|
if (removeEmptyTags !== false)
|
@@ -7978,12 +8386,13 @@
|
|
7978
8386
|
},
|
7979
8387
|
removeEmpty: function(i, s)
|
7980
8388
|
{
|
7981
|
-
var $s = $(s);
|
8389
|
+
var $s = $($.parseHTML(s));
|
7982
8390
|
|
7983
8391
|
$s.find('.redactor-invisible-space').removeAttr('style').removeAttr('class');
|
7984
8392
|
|
7985
|
-
if ($s.find('hr, br, img, iframe').length !== 0) return;
|
8393
|
+
if ($s.find('hr, br, img, iframe, source').length !== 0) return;
|
7986
8394
|
var text = $.trim($s.text());
|
8395
|
+
|
7987
8396
|
if (this.utils.isEmpty(text, false))
|
7988
8397
|
{
|
7989
8398
|
$s.remove();
|
@@ -7993,8 +8402,6 @@
|
|
7993
8402
|
// save and restore scroll
|
7994
8403
|
saveScroll: function()
|
7995
8404
|
{
|
7996
|
-
if (this.utils.isSelectAll()) return;
|
7997
|
-
|
7998
8405
|
this.saveEditorScroll = this.$editor.scrollTop();
|
7999
8406
|
this.saveBodyScroll = $(window).scrollTop();
|
8000
8407
|
|
@@ -8039,6 +8446,8 @@
|
|
8039
8446
|
|
8040
8447
|
return $(this).contents();
|
8041
8448
|
});
|
8449
|
+
|
8450
|
+
return $(node);
|
8042
8451
|
},
|
8043
8452
|
replaceToTag: function(node, tag, removeInlineTags)
|
8044
8453
|
{
|
@@ -8071,13 +8480,16 @@
|
|
8071
8480
|
|
8072
8481
|
return (offset === 0) ? true : false;
|
8073
8482
|
},
|
8074
|
-
isEndOfElement: function()
|
8483
|
+
isEndOfElement: function(element)
|
8075
8484
|
{
|
8076
|
-
|
8077
|
-
|
8485
|
+
if (typeof element == 'undefined')
|
8486
|
+
{
|
8487
|
+
var element = this.selection.getBlock();
|
8488
|
+
if (!element) return false;
|
8489
|
+
}
|
8078
8490
|
|
8079
|
-
var offset = this.caret.getOffsetOfElement(
|
8080
|
-
var text = $.trim($(
|
8491
|
+
var offset = this.caret.getOffsetOfElement(element);
|
8492
|
+
var text = $.trim($(element).text()).replace(/\n\r\n/g, '');
|
8081
8493
|
|
8082
8494
|
return (offset == text.length) ? true : false;
|
8083
8495
|
},
|
@@ -8086,7 +8498,7 @@
|
|
8086
8498
|
var block = this.$editor[0];
|
8087
8499
|
|
8088
8500
|
var offset = this.caret.getOffsetOfElement(block);
|
8089
|
-
var text = $.trim($(block).
|
8501
|
+
var text = $.trim($(block).html().replace(/(<([^>]+)>)/gi,''));
|
8090
8502
|
|
8091
8503
|
return (offset == text.length) ? true : false;
|
8092
8504
|
},
|
@@ -8108,7 +8520,7 @@
|
|
8108
8520
|
// tag detection
|
8109
8521
|
isTag: function(current, tag)
|
8110
8522
|
{
|
8111
|
-
var element = $(current).closest(tag);
|
8523
|
+
var element = $(current).closest(tag, this.$editor[0]);
|
8112
8524
|
if (element.length == 1)
|
8113
8525
|
{
|
8114
8526
|
return element[0];
|
@@ -8209,104 +8621,148 @@
|
|
8209
8621
|
|
8210
8622
|
if (browser == 'safari') return (typeof match[3] != 'undefined') ? match[3] == 'safari' : false;
|
8211
8623
|
if (browser == 'version') return match[2];
|
8212
|
-
if (browser == 'webkit') return (match[1] == 'chrome' || match[1] == 'webkit');
|
8624
|
+
if (browser == 'webkit') return (match[1] == 'chrome' || match[1] == 'opr' || match[1] == 'webkit');
|
8213
8625
|
if (match[1] == 'rv') return browser == 'msie';
|
8214
8626
|
if (match[1] == 'opr') return browser == 'webkit';
|
8215
8627
|
|
8216
8628
|
return browser == match[1];
|
8217
8629
|
}
|
8218
8630
|
};
|
8219
|
-
}
|
8220
|
-
|
8221
|
-
|
8222
|
-
|
8223
|
-
|
8224
|
-
|
8225
|
-
|
8226
|
-
|
8227
|
-
|
8228
|
-
|
8631
|
+
},
|
8632
|
+
linkify: function()
|
8633
|
+
{
|
8634
|
+
return {
|
8635
|
+
isKey: function(key)
|
8636
|
+
{
|
8637
|
+
return key == this.keyCode.ENTER || key == this.keyCode.SPACE;
|
8638
|
+
},
|
8639
|
+
isEnabled: function()
|
8640
|
+
{
|
8641
|
+
return this.opts.convertLinks && (this.opts.convertUrlLinks || this.opts.convertImageLinks || this.opts.convertVideoLinks) && !this.utils.isCurrentOrParent('PRE');
|
8642
|
+
},
|
8643
|
+
format: function()
|
8644
|
+
{
|
8645
|
+
var linkify = this.linkify,
|
8646
|
+
opts = this.opts;
|
8229
8647
|
|
8230
|
-
|
8231
|
-
|
8232
|
-
|
8233
|
-
|
8234
|
-
|
8235
|
-
|
8236
|
-
|
8648
|
+
this.$editor
|
8649
|
+
.find(":not(iframe,img,a,pre)")
|
8650
|
+
.addBack()
|
8651
|
+
.contents()
|
8652
|
+
.filter(function()
|
8653
|
+
{
|
8654
|
+
return this.nodeType === 3 && $.trim(this.nodeValue) != "" && !$(this).parent().is("pre") && (this.nodeValue.match(opts.linkify.regexps.youtube) || this.nodeValue.match(opts.linkify.regexps.vimeo) || this.nodeValue.match(opts.linkify.regexps.image) || this.nodeValue.match(opts.linkify.regexps.url));
|
8655
|
+
})
|
8656
|
+
.each(function()
|
8657
|
+
{
|
8658
|
+
var text = $(this).text(),
|
8659
|
+
html = text;
|
8237
8660
|
|
8238
|
-
|
8239
|
-
|
8240
|
-
|
8241
|
-
|
8661
|
+
if (opts.convertVideoLinks && (html.match(opts.linkify.regexps.youtube) || html.match(opts.linkify.regexps.vimeo)) )
|
8662
|
+
{
|
8663
|
+
html = linkify.convertVideoLinks(html);
|
8664
|
+
}
|
8665
|
+
else if (opts.convertImageLinks && html.match(opts.linkify.regexps.image))
|
8666
|
+
{
|
8667
|
+
html = linkify.convertImages(html);
|
8668
|
+
}
|
8669
|
+
else if (opts.convertUrlLinks)
|
8670
|
+
{
|
8671
|
+
html = linkify.convertLinks(html);
|
8672
|
+
}
|
8242
8673
|
|
8243
|
-
|
8244
|
-
|
8245
|
-
|
8674
|
+
$(this).before(text.replace(text, html))
|
8675
|
+
.remove();
|
8676
|
+
});
|
8246
8677
|
|
8247
|
-
|
8248
|
-
|
8678
|
+
this.linkify.after();
|
8679
|
+
},
|
8680
|
+
convertVideoLinks: function(html)
|
8249
8681
|
{
|
8250
8682
|
var iframeStart = '<iframe width="500" height="281" src="',
|
8251
8683
|
iframeEnd = '" frameborder="0" allowfullscreen></iframe>';
|
8252
8684
|
|
8253
|
-
if (html.match(
|
8685
|
+
if (html.match(this.opts.linkify.regexps.youtube))
|
8254
8686
|
{
|
8255
|
-
html = html.replace(
|
8256
|
-
$(n).after(html).remove();
|
8687
|
+
html = html.replace(this.opts.linkify.regexps.youtube, iframeStart + '//www.youtube.com/embed/$1' + iframeEnd);
|
8257
8688
|
}
|
8258
|
-
|
8689
|
+
|
8690
|
+
if (html.match(this.opts.linkify.regexps.vimeo))
|
8259
8691
|
{
|
8260
|
-
html = html.replace(
|
8261
|
-
$(n).after(html).remove();
|
8692
|
+
html = html.replace(this.opts.linkify.regexps.vimeo, iframeStart + '//player.vimeo.com/video/$2' + iframeEnd);
|
8262
8693
|
}
|
8263
|
-
}
|
8264
8694
|
|
8265
|
-
|
8266
|
-
|
8695
|
+
return html;
|
8696
|
+
},
|
8697
|
+
convertImages: function(html)
|
8267
8698
|
{
|
8268
|
-
|
8699
|
+
var matches = html.match(this.opts.linkify.regexps.image);
|
8269
8700
|
|
8270
|
-
|
8271
|
-
|
8272
|
-
|
8273
|
-
|
8274
|
-
// link
|
8275
|
-
if (html.search(/\$/g) != -1) html = html.replace(/\$/g, '$');
|
8701
|
+
if (matches)
|
8702
|
+
{
|
8703
|
+
html = html.replace(html, '<img src="' + matches + '" />');
|
8704
|
+
}
|
8276
8705
|
|
8277
|
-
|
8278
|
-
|
8706
|
+
return html;
|
8707
|
+
},
|
8708
|
+
convertLinks: function(html)
|
8279
8709
|
{
|
8710
|
+
var matches = html.match(this.opts.linkify.regexps.url);
|
8280
8711
|
|
8281
|
-
|
8282
|
-
for (var z = 0; z < len; z++)
|
8712
|
+
if (matches)
|
8283
8713
|
{
|
8284
|
-
|
8285
|
-
if (matches[z].match(/\.$/) !== null) matches[z] = matches[z].replace(/\.$/, '');
|
8714
|
+
matches = $.grep(matches, function(v, k) { return $.inArray(v, matches) === k; });
|
8286
8715
|
|
8287
|
-
var
|
8288
|
-
var text = href;
|
8716
|
+
var length = matches.length;
|
8289
8717
|
|
8290
|
-
var
|
8291
|
-
|
8718
|
+
for (var i = 0; i < length; i++)
|
8719
|
+
{
|
8720
|
+
var href = matches[i],
|
8721
|
+
text = href,
|
8722
|
+
linkProtocol = this.opts.linkProtocol + '://';
|
8292
8723
|
|
8293
|
-
|
8294
|
-
|
8724
|
+
if (href.match(/(https?|ftp):\/\//i) !== null)
|
8725
|
+
{
|
8726
|
+
linkProtocol = "";
|
8727
|
+
}
|
8295
8728
|
|
8296
|
-
|
8297
|
-
|
8729
|
+
if (text.length > this.opts.linkSize)
|
8730
|
+
{
|
8731
|
+
text = text.substring(0, this.opts.linkSize) + '...';
|
8732
|
+
}
|
8298
8733
|
|
8299
|
-
|
8734
|
+
text = decodeURIComponent(text);
|
8735
|
+
|
8736
|
+
var regexB = "\\b";
|
8737
|
+
|
8738
|
+
if ($.inArray(href.slice(-1), ["/", "&", "="]) != -1)
|
8739
|
+
{
|
8740
|
+
regexB = "";
|
8741
|
+
}
|
8742
|
+
|
8743
|
+
// escaping url
|
8744
|
+
var regexp = new RegExp('(' + href.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&") + regexB + ')', 'g');
|
8745
|
+
|
8746
|
+
html = html.replace(regexp, '<a href="' + linkProtocol + $.trim(href) + '">' + $.trim(text) + '</a>');
|
8747
|
+
}
|
8300
8748
|
}
|
8301
8749
|
|
8302
|
-
|
8750
|
+
return html;
|
8751
|
+
},
|
8752
|
+
after: function()
|
8753
|
+
{
|
8754
|
+
this.observe.load();
|
8755
|
+
this.code.sync();
|
8303
8756
|
}
|
8304
8757
|
}
|
8305
|
-
else if (n.nodeType === 1 && !/^(pre|a|button|textarea)$/i.test(n.tagName))
|
8306
|
-
{
|
8307
|
-
$.Redactor.fn.formatLinkify.call(n, protocol, convertLinks, convertUrlLinks, convertImageLinks, convertVideoLinks, linkSize);
|
8308
|
-
}
|
8309
8758
|
}
|
8310
8759
|
};
|
8311
8760
|
|
8761
|
+
$(window).on('load.tools.redactor', function()
|
8762
|
+
{
|
8763
|
+
$('[data-tools="redactor"]').redactor();
|
8764
|
+
});
|
8765
|
+
|
8766
|
+
// constructor
|
8767
|
+
Redactor.prototype.init.prototype = Redactor.prototype;
|
8312
8768
|
})(jQuery);
|