godmin-redactor 0.1.5 → 0.1.6

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 07fb2c75131f74dd1adbefe3e8f87b1e97576236
4
- data.tar.gz: c5c1a71dd696a399d7976718201a7acf63ef1b13
3
+ metadata.gz: cdfeae6aa3856d2e782d7df23e7de45d312c99a4
4
+ data.tar.gz: 274f2a198d6d8926200ef5c5bf2b1f0d10fa626d
5
5
  SHA512:
6
- metadata.gz: c64cc49bb96f385fd1e9121945d3327b30a7dfbfd786aabaab31170f0f083e4b265774c64bc8d37ce81b4ef9bccd7f42606159e2ec89719717b7bb2ba8f8fa36
7
- data.tar.gz: a83d00d9a3005b1be71b0bf4aa1895f4a03e41415b175b7fd1572cb49fb14223de0292dd607becd6707443e334ea8b6fe7454d17b12d632221604822eee5e3ab
6
+ metadata.gz: d1a4c25694b0ba36b5a3db43013e214e2622b1fc1e92f5f47809bff4ac99f05a452bfe31bad711740be53cceb9ed9a152c525ea8e83cdd2a9814a2c62f79fb7c
7
+ data.tar.gz: ee9b7e9d546f21cfa04feb8adf68f59c61a3d41d3777a0bcc00ee513fedbc8a42565e984c97e928a6ecc17613d229f21dab8e8ba334d2c1760006544a2895d47
data/CHANGELOG.md CHANGED
@@ -1,5 +1,9 @@
1
1
  # Changelog
2
2
 
3
+ ### 0.1.6 - 2015-05-21
4
+ Features
5
+ - Update to [Redactor version 10.1.1](http://imperavi.com/redactor/log/)
6
+
3
7
  ### 0.1.5 - 2015-04-15
4
8
  Issues
5
9
  - Moves vendor assets into sub directory (#2)
@@ -27,13 +27,12 @@ Godmin.Redactor = (function() {
27
27
  }
28
28
 
29
29
  function initializeRedactor($el) {
30
- $el.each(function() {
31
- $(this).redactor($(this).data("options"));
32
- });
30
+ $el.redactor($el.data("options"));
33
31
  }
34
32
 
35
33
  return {
36
- initialize: initialize
34
+ initialize: initialize,
35
+ initializeRedactor: initializeRedactor
37
36
  };
38
37
  })();
39
38
 
@@ -1,5 +1,5 @@
1
1
  module Godmin
2
2
  module Redactor
3
- VERSION = "0.1.5"
3
+ VERSION = "0.1.6"
4
4
  end
5
5
  end
@@ -1,6 +1,6 @@
1
1
  /*
2
- Redactor v10.0.9
3
- Updated: March 16, 2015
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.0.9';
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
 
@@ -195,6 +192,10 @@
195
192
  deniedTags: ['script', 'style'],
196
193
  allowedTags: false, // or array
197
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
+
198
199
  removeComments: false,
199
200
  replaceTags: [
200
201
  ['strike', 'del']
@@ -328,7 +329,18 @@
328
329
  upload_label: 'Drop file here or '
329
330
 
330
331
  }
331
- }
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
332
344
  };
333
345
 
334
346
  // Functionality
@@ -529,11 +541,11 @@
529
541
  autosave: function()
530
542
  {
531
543
  return {
544
+ html: false,
532
545
  enable: function()
533
546
  {
534
547
  if (!this.opts.autosave) return;
535
548
 
536
- this.autosave.html = false;
537
549
  this.autosave.name = (this.opts.autosaveName) ? this.opts.autosaveName : this.$textarea.attr('name');
538
550
 
539
551
  if (this.opts.autosaveOnChange) return;
@@ -549,7 +561,7 @@
549
561
  this.autosave.source = this.code.get();
550
562
 
551
563
  if (this.autosave.html === this.autosave.source) return;
552
- if (this.utils.isEmpty(this.autosave.source)) return;
564
+ //if (this.utils.isEmpty(this.autosave.source)) return;
553
565
 
554
566
  // data
555
567
  var data = {};
@@ -940,7 +952,7 @@
940
952
  },
941
953
  formatListToBlockquote: function()
942
954
  {
943
- var block = $(this.block.blocks[0]).closest('ul, ol');
955
+ var block = $(this.block.blocks[0]).closest('ul, ol', this.$editor[0]);
944
956
 
945
957
  $(block).find('ul, ol').contents().unwrap();
946
958
  $(block).find('li').append($('<br>')).contents().unwrap();
@@ -1033,10 +1045,10 @@
1033
1045
  },
1034
1046
  formatTableWrapping: function($formatted)
1035
1047
  {
1036
- if ($formatted.closest('table').length === 0) return;
1048
+ if ($formatted.closest('table', this.$editor[0]).length === 0) return;
1037
1049
 
1038
- if ($formatted.closest('tr').length === 0) $formatted.wrap('<tr>');
1039
- 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)
1040
1052
  {
1041
1053
  $formatted.wrap('<td>');
1042
1054
  }
@@ -1349,6 +1361,9 @@
1349
1361
  // paste
1350
1362
  this.$editor.on('paste.redactor', $.proxy(this.paste.init, this));
1351
1363
 
1364
+ // cut
1365
+ this.$editor.on('cut.redactor', $.proxy(this.code.sync, this));
1366
+
1352
1367
  // keydown
1353
1368
  this.$editor.on('keydown.redactor', $.proxy(this.keydown.init, this));
1354
1369
 
@@ -1395,8 +1410,11 @@
1395
1410
  },
1396
1411
  setHelpers: function()
1397
1412
  {
1398
- // autosave
1399
- this.autosave.enable();
1413
+ // linkify
1414
+ if (this.linkify.isEnabled())
1415
+ {
1416
+ this.linkify.format();
1417
+ }
1400
1418
 
1401
1419
  // placeholder
1402
1420
  this.placeholder.enable();
@@ -1974,13 +1992,13 @@
1974
1992
  html = html.replace(new RegExp('<br\\s?/?></li>', 'gi'), '</li>');
1975
1993
  html = html.replace(new RegExp('</li><br\\s?/?>', 'gi'), '</li>');
1976
1994
  // remove verified
1977
- html = html.replace(new RegExp('<div(.*?[^>]) data-tagblock="redactor"(.*?[^>])>', 'gi'), '<div$1$2>');
1978
- html = html.replace(new RegExp('<(.*?) data-verified="redactor"(.*?[^>])>', 'gi'), '<$1$2>');
1979
- html = html.replace(new RegExp('<span(.*?[^>])\srel="(.*?[^>])"(.*?[^>])>', 'gi'), '<span$1$3>');
1980
- html = html.replace(new RegExp('<img(.*?[^>])\srel="(.*?[^>])"(.*?[^>])>', 'gi'), '<img$1$3>');
1981
- html = html.replace(new RegExp('<img(.*?[^>])\sstyle="" (.*?[^>])>', 'gi'), '<img$1 $2>');
1982
- html = html.replace(new RegExp('<img(.*?[^>])\sstyle (.*?[^>])>', 'gi'), '<img$1 $2>');
1983
- html = html.replace(new RegExp('<span class="redactor-invisible-space">(.*?)</span>', 'gi'), '$1');
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');
1984
2002
  html = html.replace(/ data-save-url="(.*?[^>])"/gi, '');
1985
2003
 
1986
2004
  // remove image resize
@@ -2250,29 +2268,16 @@
2250
2268
  }
2251
2269
 
2252
2270
  var options = {
2253
- deniedTags: false,
2254
- allowedTags: tags,
2271
+ deniedTags: (this.opts.deniedTags) ? this.opts.deniedTags : false,
2272
+ allowedTags: (this.opts.allowedTags) ? this.opts.allowedTags : tags,
2255
2273
  removeComments: true,
2256
2274
  removePhp: true,
2257
- removeAttr: false,
2258
- allowedAttr: attrAllowed,
2275
+ removeAttr: (this.opts.removeAttr) ? this.opts.removeAttr : false,
2276
+ allowedAttr: (this.opts.allowedAttr) ? this.opts.allowedAttr : attrAllowed,
2259
2277
  removeEmpty: tagsEmpty
2260
2278
  };
2261
2279
 
2262
- // denied tags
2263
- if (this.opts.deniedTags)
2264
- {
2265
- options.deniedTags = this.opts.deniedTags;
2266
- }
2267
-
2268
- // allowed tags
2269
- if (this.opts.allowedTags)
2270
- {
2271
- options.allowedTags = this.opts.allowedTags;
2272
- }
2273
-
2274
2280
  return this.tidy.load(html, options);
2275
-
2276
2281
  },
2277
2282
  onPasteRemoveEmpty: function(html)
2278
2283
  {
@@ -2498,6 +2503,15 @@
2498
2503
  });
2499
2504
 
2500
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
+ },
2501
2515
  setVerified: function(html)
2502
2516
  {
2503
2517
  if (this.utils.browser('msie')) return html;
@@ -2684,8 +2698,22 @@
2684
2698
 
2685
2699
  this.start = false;
2686
2700
 
2687
- // autosave on change
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
2688
2715
  this.autosave.onChange();
2716
+ this.autosave.enable();
2689
2717
  },
2690
2718
  toggle: function()
2691
2719
  {
@@ -2703,7 +2731,8 @@
2703
2731
  this.code.offset = this.caret.getOffset();
2704
2732
  var scroll = $(window).scrollTop();
2705
2733
 
2706
- var height = this.$editor.innerHeight();
2734
+ var width = this.$editor.innerWidth(),
2735
+ height = this.$editor.innerHeight();
2707
2736
 
2708
2737
  this.$editor.hide();
2709
2738
 
@@ -2713,17 +2742,33 @@
2713
2742
  // indent code
2714
2743
  html = this.tabifier.get(html);
2715
2744
 
2716
- this.$textarea.val(html).height(height).show().focus();
2717
- this.$textarea.on('keydown.redactor-textarea-indenting', this.code.textareaIndenting);
2718
-
2719
- $(window).scrollTop(scroll);
2745
+ this.$textarea.val(html);
2720
2746
 
2721
- if (this.$textarea[0].setSelectionRange)
2747
+ if (this.opts.codemirror)
2722
2748
  {
2723
- this.$textarea[0].setSelectionRange(0, 0);
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
+ });
2724
2757
  }
2758
+ else
2759
+ {
2760
+ this.$textarea.height(height).show().focus();
2761
+ this.$textarea.on('keydown.redactor-textarea-indenting', this.code.textareaIndenting);
2725
2762
 
2726
- this.$textarea[0].scrollTop = 0;
2763
+ $(window).scrollTop(scroll);
2764
+
2765
+ if (this.$textarea[0].setSelectionRange)
2766
+ {
2767
+ this.$textarea[0].setSelectionRange(0, 0);
2768
+ }
2769
+
2770
+ this.$textarea[0].scrollTop = 0;
2771
+ }
2727
2772
 
2728
2773
  this.opts.visual = false;
2729
2774
 
@@ -2733,15 +2778,32 @@
2733
2778
  },
2734
2779
  showVisual: function()
2735
2780
  {
2781
+ var html;
2782
+
2736
2783
  if (this.opts.visual) return;
2737
2784
 
2738
- var html = this.$textarea.hide().val();
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
+ }
2739
2796
 
2740
2797
  if (this.modified !== this.clean.removeSpaces(html))
2741
2798
  {
2742
2799
  this.code.set(html);
2743
2800
  }
2744
2801
 
2802
+ if (this.opts.codemirror)
2803
+ {
2804
+ this.$textarea.next('.CodeMirror').hide();
2805
+ }
2806
+
2745
2807
  this.$editor.show();
2746
2808
 
2747
2809
  if (!this.utils.isEmpty(html))
@@ -2890,14 +2952,24 @@
2890
2952
  {
2891
2953
  $.each(this.opts.formattingAdd, $.proxy(function(i,s)
2892
2954
  {
2893
- var name = s.tag;
2955
+ var name = s.tag,
2956
+ func;
2957
+
2894
2958
  if (typeof s['class'] != 'undefined')
2895
2959
  {
2896
2960
  name = name + '-' + s['class'];
2897
2961
  }
2898
2962
 
2899
2963
  s.type = (this.utils.isBlockTag(s.tag)) ? 'block' : 'inline';
2900
- var func = (s.type == 'inline') ? 'inline.formatting' : 'block.formatting';
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
+ }
2901
2973
 
2902
2974
  if (this.opts.linebreaks && s.type == 'block' && s.tag == 'p') return;
2903
2975
 
@@ -3215,7 +3287,7 @@
3215
3287
  },
3216
3288
  showEdit: function($image)
3217
3289
  {
3218
- var $link = $image.closest('a');
3290
+ var $link = $image.closest('a', this.$editor[0]);
3219
3291
 
3220
3292
  this.modal.load('imageEdit', this.lang.get('edit'), 705);
3221
3293
 
@@ -3292,7 +3364,7 @@
3292
3364
  this.image.hideResize();
3293
3365
  this.buffer.set();
3294
3366
 
3295
- var $link = $image.closest('a');
3367
+ var $link = $image.closest('a', this.$editor[0]);
3296
3368
 
3297
3369
  $image.attr('alt', $('#redactor-image-title').val());
3298
3370
 
@@ -3420,8 +3492,11 @@
3420
3492
 
3421
3493
  if (height < 50 || width < 100) return;
3422
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});
3423
3498
  this.image.resizeHandle.el.width(width);
3424
- this.image.resizeHandle.el.height(this.image.resizeHandle.el.width()/this.image.resizeHandle.ratio);
3499
+ this.image.resizeHandle.el.height(height);
3425
3500
 
3426
3501
  this.code.sync();
3427
3502
  },
@@ -3465,7 +3540,7 @@
3465
3540
  },
3466
3541
  hideResize: function(e)
3467
3542
  {
3468
- 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;
3469
3544
  if (e && e.target.tagName == 'IMG')
3470
3545
  {
3471
3546
  var $image = $(e.target);
@@ -3577,8 +3652,8 @@
3577
3652
  remove: function(image)
3578
3653
  {
3579
3654
  var $image = $(image);
3580
- var $link = $image.closest('a');
3581
- var $figure = $image.closest('figure');
3655
+ var $link = $image.closest('a', this.$editor[0]);
3656
+ var $figure = $image.closest('figure', this.$editor[0]);
3582
3657
  var $parent = $image.parent();
3583
3658
  if ($('#redactor-image-box').length !== 0)
3584
3659
  {
@@ -3763,7 +3838,7 @@
3763
3838
 
3764
3839
  var current = this.selection.getCurrent();
3765
3840
 
3766
- var $item = $(current).closest('li');
3841
+ var $item = $(current).closest('li', this.$editor[0]);
3767
3842
  var $parent = $item.parent();
3768
3843
  if ($item.length !== 0 && $parent.length !== 0 && $parent[0].tagName == 'LI')
3769
3844
  {
@@ -3847,6 +3922,15 @@
3847
3922
  if (tag == tags[i]) tag = replaced[i];
3848
3923
  }
3849
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
+
3850
3934
  this.inline.type = type || false;
3851
3935
  this.inline.value = value || false;
3852
3936
 
@@ -3871,7 +3955,7 @@
3871
3955
  formatCollapsed: function(tag)
3872
3956
  {
3873
3957
  var current = this.selection.getCurrent();
3874
- var $parent = $(current).closest(tag + '[data-redactor-tag=' + tag + ']');
3958
+ var $parent = $(current).closest(tag + '[data-redactor-tag=' + tag + ']', this.$editor[0]);
3875
3959
 
3876
3960
  // inline there is
3877
3961
  if ($parent.length !== 0 && (this.inline.type != 'style' && $parent[0].tagName != 'SPAN'))
@@ -4527,7 +4611,7 @@
4527
4611
  var $table = false;
4528
4612
  if (this.keydown.block && this.keydown.block.tagName === 'TD')
4529
4613
  {
4530
- $table = $(this.keydown.block).closest('table');
4614
+ $table = $(this.keydown.block).closest('table', this.$editor[0]);
4531
4615
  }
4532
4616
 
4533
4617
  if ($table && $table.find('td').last()[0] === this.keydown.block)
@@ -4601,8 +4685,6 @@
4601
4685
  current = this.selection.getCurrent();
4602
4686
  $next = $(this.keydown.current).next();
4603
4687
 
4604
-
4605
-
4606
4688
  if ($next.length !== 0 && $next[0].tagName == 'BR')
4607
4689
  {
4608
4690
  return this.keydown.insertBreakLine(e);
@@ -4642,11 +4724,13 @@
4642
4724
  else
4643
4725
  {
4644
4726
  current = this.selection.getCurrent();
4645
- var $parent = $(current).closest('li');
4646
- var $list = $parent.closest('ul,ol');
4727
+ var $parent = $(current).closest('li', this.$editor[0]);
4728
+ var $list = $parent.closest('ul,ol', this.$editor[0]);
4647
4729
 
4648
- if ($parent.length !== 0 && this.utils.isEmpty($parent.html()) && $list.next().length === 0)
4730
+ if ($parent.length !== 0 && this.utils.isEmpty($parent.html()) && $list.next().length === 0 && this.utils.isEmpty($list.find("li").last().html()))
4649
4731
  {
4732
+ $list.find("li").last().remove();
4733
+
4650
4734
  var node = $(this.opts.emptyHtml);
4651
4735
  $list.after(node);
4652
4736
  this.caret.setStart(node);
@@ -4993,6 +5077,7 @@
4993
5077
  e.stopPropagation();
4994
5078
 
4995
5079
  this.selection.get();
5080
+
4996
5081
  var br1 = document.createElement('br');
4997
5082
 
4998
5083
  if (this.utils.browser('msie'))
@@ -5007,9 +5092,19 @@
5007
5092
 
5008
5093
  this.range.insertNode(br1);
5009
5094
 
5010
- if (dbl === true)
5095
+ // move br outside A tag
5096
+ var $parentA = $(br1).parent("a");
5097
+
5098
+ if ($parentA.length > 0)
5011
5099
  {
5100
+ $parentA.find(br1)
5101
+ .remove();
5012
5102
 
5103
+ $parentA.after(br1);
5104
+ }
5105
+
5106
+ if (dbl === true)
5107
+ {
5013
5108
  var $next = $(br1).next();
5014
5109
  if ($next.length !== 0 && $next[0].tagName === 'BR' && this.utils.isEndOfEditor())
5015
5110
  {
@@ -5019,6 +5114,7 @@
5019
5114
  }
5020
5115
 
5021
5116
  var br2 = document.createElement('br');
5117
+
5022
5118
  this.range.insertNode(br2);
5023
5119
  this.caret.setAfter(br2);
5024
5120
  }
@@ -5053,9 +5149,9 @@
5053
5149
  {
5054
5150
  var $current = $(this.keydown.current);
5055
5151
  var $parent = $(this.keydown.parent);
5056
- var td = $current.closest('td');
5152
+ var td = $current.closest('td', this.$editor[0]);
5057
5153
 
5058
- 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)
5059
5155
  {
5060
5156
  if (!this.utils.isEmpty($current.text())) return;
5061
5157
 
@@ -5110,13 +5206,8 @@
5110
5206
  }
5111
5207
 
5112
5208
  // linkify
5113
- if (this.keyup.isLinkify(key))
5114
- {
5115
- this.formatLinkify(this.opts.linkProtocol, this.opts.convertLinks, this.opts.convertUrlLinks, this.opts.convertImageLinks, this.opts.convertVideoLinks, this.opts.linkSize);
5116
-
5117
- this.observe.load();
5118
- this.code.sync();
5119
- }
5209
+ if (this.linkify.isEnabled() && this.linkify.isKey(key))
5210
+ this.linkify.format();
5120
5211
 
5121
5212
  if (key === this.keyCode.DELETE || key === this.keyCode.BACKSPACE)
5122
5213
  {
@@ -5137,7 +5228,10 @@
5137
5228
  }
5138
5229
 
5139
5230
  // remove empty paragraphs
5140
- this.$editor.find('p').each($.proxy(this.utils.removeEmpty, this));
5231
+ this.$editor.find('p').each($.proxy(function(i, s)
5232
+ {
5233
+ this.utils.removeEmpty(i, $(s).html());
5234
+ }, this));
5141
5235
 
5142
5236
  // remove invisible space
5143
5237
  if (this.opts.linebreaks && this.keyup.current && this.keyup.current.tagName == 'DIV' && this.utils.isEmpty(this.keyup.current.innerHTML))
@@ -5151,10 +5245,6 @@
5151
5245
  return this.keyup.formatEmpty(e);
5152
5246
  }
5153
5247
  },
5154
- isLinkify: function(key)
5155
- {
5156
- return this.opts.convertLinks && (this.opts.convertUrlLinks || this.opts.convertImageLinks || this.opts.convertVideoLinks) && key === this.keyCode.ENTER && !this.utils.isCurrentOrParent('PRE');
5157
- },
5158
5248
  replaceToParagraph: function(clone)
5159
5249
  {
5160
5250
  var $current = $(this.keyup.current);
@@ -5335,23 +5425,26 @@
5335
5425
  cleanUrl: function()
5336
5426
  {
5337
5427
  var thref = self.location.href.replace(/\/$/i, '');
5338
- this.link.url = this.link.url.replace(thref, '');
5339
- this.link.url = this.link.url.replace(/^\/#/, '#');
5340
- this.link.url = this.link.url.replace('mailto:', '');
5341
5428
 
5342
- // remove host from href
5343
- if (!this.opts.linkProtocol)
5429
+ if (typeof this.link.url !== "undefined")
5344
5430
  {
5345
- var re = new RegExp('^(http|ftp|https)://' + self.location.host, 'i');
5346
- this.link.url = this.link.url.replace(re, '');
5347
- }
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:', '');
5348
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
+ }
5349
5442
  },
5350
5443
  getData: function()
5351
5444
  {
5352
5445
  this.link.$node = false;
5353
5446
 
5354
- var $el = $(this.selection.getCurrent()).closest('a');
5447
+ var $el = $(this.selection.getCurrent()).closest('a', this.$editor[0]);
5355
5448
  if ($el.length !== 0 && $el[0].tagName === 'A')
5356
5449
  {
5357
5450
  this.link.$node = $el;
@@ -5370,6 +5463,8 @@
5370
5463
  },
5371
5464
  insert: function()
5372
5465
  {
5466
+ this.placeholder.remove();
5467
+
5373
5468
  var target = '';
5374
5469
  var link = this.link.$inputUrl.val();
5375
5470
  var text = this.link.$inputText.val();
@@ -5426,16 +5521,37 @@
5426
5521
  {
5427
5522
  this.buffer.set();
5428
5523
 
5429
- this.link.$node.text(text).attr('href', link);
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
+
5430
5544
  if (target !== '')
5431
5545
  {
5432
- this.link.$node.attr('target', target);
5546
+ $link.attr('target', target);
5433
5547
  }
5434
5548
  else
5435
5549
  {
5436
- this.link.$node.removeAttr('target');
5550
+ $link.removeAttr('target');
5437
5551
  }
5438
5552
 
5553
+ this.selection.selectElement($link);
5554
+
5439
5555
  this.code.sync();
5440
5556
  }
5441
5557
  else
@@ -5457,13 +5573,19 @@
5457
5573
  if (target !== '') $a.attr('target', target);
5458
5574
 
5459
5575
  $a = $(this.insert.node($a));
5576
+
5577
+ if (this.selection.getText().match(/\s$/))
5578
+ {
5579
+ $a.after(" ");
5580
+ }
5581
+
5460
5582
  this.selection.selectElement($a);
5461
5583
  }
5462
5584
  else
5463
5585
  {
5464
5586
  document.execCommand('createLink', false, link);
5465
5587
 
5466
- $a = $(this.selection.getCurrent()).closest('a');
5588
+ $a = $(this.selection.getCurrent()).closest('a', this.$editor[0]);
5467
5589
  if (this.utils.browser('mozilla'))
5468
5590
  {
5469
5591
  $a = $('a[_moz_dirty=""]');
@@ -5472,10 +5594,15 @@
5472
5594
  if (target !== '') $a.attr('target', target);
5473
5595
  $a.removeAttr('style').removeAttr('_moz_dirty');
5474
5596
 
5475
- if (this.link.text !== '' || this.link.text != text)
5597
+ if (this.selection.getText().match(/\s$/))
5476
5598
  {
5599
+ $a.after(" ");
5600
+ }
5477
5601
 
5602
+ if (this.link.text !== '' || this.link.text != text)
5603
+ {
5478
5604
  $a.text(text);
5605
+
5479
5606
  this.selection.selectElement($a);
5480
5607
  }
5481
5608
  }
@@ -5508,7 +5635,7 @@
5508
5635
  var len = nodes.length;
5509
5636
  for (var i = 0; i < len; i++)
5510
5637
  {
5511
- var $node = $(nodes[i]).closest('a');
5638
+ var $node = $(nodes[i]).closest('a', this.$editor[0]);
5512
5639
  $node.replaceWith($node.contents());
5513
5640
  }
5514
5641
 
@@ -5554,7 +5681,7 @@
5554
5681
  this.selection.save();
5555
5682
 
5556
5683
  var parent = this.selection.getParent();
5557
- var $list = $(parent).closest('ol, ul');
5684
+ var $list = $(parent).closest('ol, ul', this.$editor[0]);
5558
5685
 
5559
5686
  if (!this.utils.isRedactorParent($list) && $list.length !== 0)
5560
5687
  {
@@ -5592,7 +5719,6 @@
5592
5719
  }
5593
5720
  }
5594
5721
 
5595
-
5596
5722
  this.selection.restore();
5597
5723
  this.code.sync();
5598
5724
  },
@@ -5600,7 +5726,7 @@
5600
5726
  {
5601
5727
  var parent = this.selection.getParent();
5602
5728
  var current = this.selection.getCurrent();
5603
- var $td = $(current).closest('td, th');
5729
+ var $td = $(current).closest('td, th', this.$editor[0]);
5604
5730
 
5605
5731
  if (this.utils.browser('msie') && this.opts.linebreaks)
5606
5732
  {
@@ -5611,7 +5737,7 @@
5611
5737
  document.execCommand('insert' + cmd);
5612
5738
  }
5613
5739
 
5614
- var $list = $(this.selection.getParent()).closest('ol, ul');
5740
+ var $list = $(this.selection.getParent()).closest('ol, ul', this.$editor[0]);
5615
5741
 
5616
5742
  if ($td.length !== 0)
5617
5743
  {
@@ -5698,13 +5824,13 @@
5698
5824
 
5699
5825
  this.indent.fixEmptyIndent();
5700
5826
 
5701
- 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)
5702
5828
  {
5703
5829
  document.execCommand('formatblock', false, 'p');
5704
5830
  this.$editor.find('ul, ol, blockquote').each($.proxy(this.utils.removeEmpty, this));
5705
5831
  }
5706
5832
 
5707
- var $table = $(this.selection.getCurrent()).closest('table');
5833
+ var $table = $(this.selection.getCurrent()).closest('table', this.$editor[0]);
5708
5834
  var $prev = $table.prev();
5709
5835
  if (!this.opts.linebreaks && $table.length !== 0 && $prev.length !== 0 && $prev[0].tagName == 'BR')
5710
5836
  {
@@ -6085,19 +6211,19 @@
6085
6211
 
6086
6212
  $.each(this.opts.activeButtonsStates, $.proxy(function(key, value)
6087
6213
  {
6088
- var parentEl = $(parent).closest(key);
6089
- var currentEl = $(current).closest(key);
6214
+ var parentEl = $(parent).closest(key, this.$editor[0]);
6215
+ var currentEl = $(current).closest(key, this.$editor[0]);
6090
6216
 
6091
6217
  if (parentEl.length !== 0 && !this.utils.isRedactorParent(parentEl)) return;
6092
6218
  if (!this.utils.isRedactorParent(currentEl)) return;
6093
- if (parentEl.length !== 0 || currentEl.closest(key).length !== 0)
6219
+ if (parentEl.length !== 0 || currentEl.closest(key, this.$editor[0]).length !== 0)
6094
6220
  {
6095
6221
  this.button.setActive(value);
6096
6222
  }
6097
6223
 
6098
6224
  }, this));
6099
6225
 
6100
- var $parent = $(parent).closest(this.opts.alignmentTags.toString().toLowerCase());
6226
+ var $parent = $(parent).closest(this.opts.alignmentTags.toString().toLowerCase(), this.$editor[0]);
6101
6227
  if (this.utils.isRedactorParent(parent) && $parent.length)
6102
6228
  {
6103
6229
  var align = ($parent.css('text-align') === '') ? 'left' : $parent.css('text-align');
@@ -6116,7 +6242,7 @@
6116
6242
  var $img = $(img);
6117
6243
 
6118
6244
  // IE fix (when we clicked on an image and then press backspace IE does goes to image's url)
6119
- $img.closest('a').on('click', function(e) { e.preventDefault(); });
6245
+ $img.closest('a', this.$editor[0]).on('click', function(e) { e.preventDefault(); });
6120
6246
 
6121
6247
  if (this.utils.browser('msie')) $img.attr('unselectable', 'on');
6122
6248
 
@@ -6149,20 +6275,18 @@
6149
6275
  },
6150
6276
  showTooltip: function(e)
6151
6277
  {
6152
- var $link = $(e.target);
6153
- var $parent = $link.closest('a');
6154
- var tag = ($link.length !== 0) ? $link[0].tagName : false;
6278
+ var $el = $(e.target);
6155
6279
 
6156
- if ($parent[0].tagName === 'A')
6157
- {
6158
- if (tag === 'IMG') return;
6159
- else if (tag !== 'A') $link = $parent;
6160
- }
6280
+ if ($el[0].tagName == 'IMG')
6281
+ return;
6161
6282
 
6162
- if (tag !== 'A')
6163
- {
6283
+ if ($el[0].tagName !== 'A')
6284
+ $el = $el.closest('a', this.$editor[0]);
6285
+
6286
+ if ($el[0].tagName !== 'A')
6164
6287
  return;
6165
- }
6288
+
6289
+ var $link = $el;
6166
6290
 
6167
6291
  var pos = this.observe.getTooltipPosition($link);
6168
6292
  var tooltip = $('<span class="redactor-link-tooltip"></span>');
@@ -6193,7 +6317,7 @@
6193
6317
  e = e.originalEvent || e;
6194
6318
 
6195
6319
  var target = e.target;
6196
- var $parent = $(target).closest('a');
6320
+ var $parent = $(target).closest('a', this.$editor[0]);
6197
6321
  if ($parent.length !== 0 && $parent[0].tagName === 'A' && target.tagName !== 'A')
6198
6322
  {
6199
6323
  return;
@@ -6216,10 +6340,6 @@
6216
6340
  if (this.opts.linebreaks) return html;
6217
6341
  if (html === '' || html === '<p></p>') return this.opts.emptyHtml;
6218
6342
 
6219
- this.paragraphize.blocks = ['table', 'div', 'pre', 'form', 'ul', 'ol', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'dl', 'blockquote', 'figcaption',
6220
- 'address', 'section', 'header', 'footer', 'aside', 'article', 'object', 'style', 'script', 'iframe', 'select', 'input', 'textarea',
6221
- 'button', 'option', 'map', 'area', 'math', 'hr', 'fieldset', 'legend', 'hgroup', 'nav', 'figure', 'details', 'menu', 'summary', 'p'];
6222
-
6223
6343
  html = html + "\n";
6224
6344
 
6225
6345
  this.paragraphize.safes = [];
@@ -6234,7 +6354,7 @@
6234
6354
  html = this.paragraphize.clear(html);
6235
6355
  html = this.paragraphize.restoreSafes(html);
6236
6356
 
6237
- html = html.replace(new RegExp('<br\\s?/?>\n?<(' + this.paragraphize.blocks.join('|') + ')(.*?[^>])>', 'gi'), '<p><br /></p>\n<$1$2>');
6357
+ html = html.replace(new RegExp('<br\\s?/?>\n?<(' + this.opts.paragraphizeBlocks.join('|') + ')(.*?[^>])>', 'gi'), '<p><br /></p>\n<$1$2>');
6238
6358
 
6239
6359
  return $.trim(html);
6240
6360
  },
@@ -6250,7 +6370,7 @@
6250
6370
 
6251
6371
  html = $div.html();
6252
6372
 
6253
- $div.find(this.paragraphize.blocks.join(', ')).each($.proxy(function(i,s)
6373
+ $div.find(this.opts.paragraphizeBlocks.join(', ')).each($.proxy(function(i,s)
6254
6374
  {
6255
6375
  this.paragraphize.z++;
6256
6376
  this.paragraphize.safes[this.paragraphize.z] = s.outerHTML;
@@ -6382,8 +6502,10 @@
6382
6502
 
6383
6503
  $(window).off('scroll.redactor-freeze');
6384
6504
 
6385
- }, this), 1);
6505
+ if (this.linkify.isEnabled())
6506
+ this.linkify.format();
6386
6507
 
6508
+ }, this), 1);
6387
6509
  },
6388
6510
  createPasteBox: function()
6389
6511
  {
@@ -7283,24 +7405,13 @@
7283
7405
  replacement.push(this.tidy.settings.replaceTags[i][0]);
7284
7406
  }
7285
7407
 
7286
- this.tidy.$div.find(replacement.join(',')).each($.proxy(function(n,s)
7408
+ $.each(replacement, $.proxy(function(key, value)
7287
7409
  {
7288
- var tag = rTags[n];
7289
- $(s).replaceWith(function()
7410
+ this.tidy.$div.find(value).replaceWith(function()
7290
7411
  {
7291
- var replaced = $('<' + tag + ' />').append($(this).contents());
7292
-
7293
- for (var i = 0; i < this.attributes.length; i++)
7294
- {
7295
- replaced.attr(this.attributes[i].name, this.attributes[i].value);
7296
- }
7297
-
7298
- return replaced;
7412
+ return $("<" + rTags[key] + " />", {html: $(this).html()});
7299
7413
  });
7300
-
7301
7414
  }, this));
7302
-
7303
- return html;
7304
7415
  },
7305
7416
  replaceStyles: function()
7306
7417
  {
@@ -7805,6 +7916,9 @@
7805
7916
  left: left
7806
7917
  });
7807
7918
 
7919
+ if (scrollTop > end)
7920
+ $('.redactor-dropdown-' + this.uuid + ':visible').hide();
7921
+
7808
7922
  this.toolbar.setDropdownsFixed();
7809
7923
  this.$toolbar.css('visibility', (scrollTop < end) ? 'visible' : 'hidden');
7810
7924
  },
@@ -7820,8 +7934,6 @@
7820
7934
 
7821
7935
  this.toolbar.unsetDropdownsFixed();
7822
7936
  this.$toolbar.removeClass('toolbar-fixed-box');
7823
-
7824
-
7825
7937
  },
7826
7938
  setDropdownsFixed: function()
7827
7939
  {
@@ -7971,6 +8083,7 @@
7971
8083
 
7972
8084
  var xhr = new XMLHttpRequest();
7973
8085
  xhr.open('POST', this.upload.url);
8086
+ xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
7974
8087
 
7975
8088
  // complete
7976
8089
  xhr.onreadystatechange = $.proxy(function()
@@ -8273,12 +8386,13 @@
8273
8386
  },
8274
8387
  removeEmpty: function(i, s)
8275
8388
  {
8276
- var $s = $(s);
8389
+ var $s = $($.parseHTML(s));
8277
8390
 
8278
8391
  $s.find('.redactor-invisible-space').removeAttr('style').removeAttr('class');
8279
8392
 
8280
8393
  if ($s.find('hr, br, img, iframe, source').length !== 0) return;
8281
8394
  var text = $.trim($s.text());
8395
+
8282
8396
  if (this.utils.isEmpty(text, false))
8283
8397
  {
8284
8398
  $s.remove();
@@ -8406,7 +8520,7 @@
8406
8520
  // tag detection
8407
8521
  isTag: function(current, tag)
8408
8522
  {
8409
- var element = $(current).closest(tag);
8523
+ var element = $(current).closest(tag, this.$editor[0]);
8410
8524
  if (element.length == 1)
8411
8525
  {
8412
8526
  return element[0];
@@ -8514,116 +8628,141 @@
8514
8628
  return browser == match[1];
8515
8629
  }
8516
8630
  };
8517
- }
8518
- };
8519
-
8520
- $(window).on('load.tools.redactor', function()
8521
- {
8522
- $('[data-tools="redactor"]').redactor();
8523
- });
8524
-
8525
- // constructor
8526
- Redactor.prototype.init.prototype = Redactor.prototype;
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;
8527
8647
 
8528
- // LINKIFY
8529
- $.Redactor.fn.formatLinkify = function(protocol, convertLinks, convertUrlLinks, convertImageLinks, convertVideoLinks, linkSize)
8530
- {
8531
- var urlCheck = '((?:http[s]?:\\/\\/(?:www\\.)?|www\\.){1}(?:[0-9A-Za-z\\-%_]+\\.)+[a-zA-Z]{2,}(?::[0-9]+)?(?:(?:/[0-9A-Za-z\\-#\\.%\+_]*)+)?(?:\\?(?:[0-9A-Za-z\\-\\.%_]+(?:=[0-9A-Za-z\\-\\.%_\\+]*)?)?(?:&(?:[0-9A-Za-z\\-\\.%_]+(?:=[0-9A-Za-z\\-\\.%_\\+]*)?)?)*)?(?:#[0-9A-Za-z\\-\\.%_\\+=\\?&;]*)?)';
8532
- var regex = new RegExp(urlCheck, 'gi');
8533
- var rProtocol = /(https?|ftp):\/\//i;
8534
- var urlImage = new RegExp('(?:([^:/?#]+):)?(?:\/\/([^/?#]*))?([^?#]*\\.(?:jpg|gif|png))(?:\\?([^#]*))?(?:#(.*))?', 'gi');
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;
8535
8660
 
8536
- var childNodes = (this.$editor ? this.$editor[0] : this).childNodes, i = childNodes.length;
8537
- while (i--)
8538
- {
8539
- var n = childNodes[i];
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
+ }
8540
8673
 
8541
- if (n.nodeType === 3 && n.parentNode !== 'PRE')
8542
- {
8543
- var html = n.nodeValue;
8674
+ $(this).before(text.replace(text, html))
8675
+ .remove();
8676
+ });
8544
8677
 
8545
- // youtube & vimeo
8546
- if (convertVideoLinks && html)
8678
+ this.linkify.after();
8679
+ },
8680
+ convertVideoLinks: function(html)
8547
8681
  {
8548
8682
  var iframeStart = '<iframe width="500" height="281" src="',
8549
8683
  iframeEnd = '" frameborder="0" allowfullscreen></iframe>';
8550
8684
 
8551
- if (html.match(reUrlYoutube))
8685
+ if (html.match(this.opts.linkify.regexps.youtube))
8552
8686
  {
8553
- html = html.replace(reUrlYoutube, iframeStart + '//www.youtube.com/embed/$1' + iframeEnd);
8554
- $(n).after(html).remove();
8687
+ html = html.replace(this.opts.linkify.regexps.youtube, iframeStart + '//www.youtube.com/embed/$1' + iframeEnd);
8555
8688
  }
8556
- else if (html.match(reUrlVimeo))
8689
+
8690
+ if (html.match(this.opts.linkify.regexps.vimeo))
8557
8691
  {
8558
- html = html.replace(reUrlVimeo, iframeStart + '//player.vimeo.com/video/$2' + iframeEnd);
8559
- $(n).after(html).remove();
8692
+ html = html.replace(this.opts.linkify.regexps.vimeo, iframeStart + '//player.vimeo.com/video/$2' + iframeEnd);
8560
8693
  }
8561
- }
8562
8694
 
8563
- // image
8564
- if (convertImageLinks && html && html.match(urlImage))
8695
+ return html;
8696
+ },
8697
+ convertImages: function(html)
8565
8698
  {
8566
- var matches = html.match(urlImage);
8567
- html = html.replace(urlImage, '<img src="' + matches + '" />');
8699
+ var matches = html.match(this.opts.linkify.regexps.image);
8568
8700
 
8569
- $(n).after(html).remove();
8570
- return;
8571
- }
8572
-
8573
- // link
8574
- if (html.search(/\$/g) != -1) html = html.replace(/\$/g, '&#36;');
8701
+ if (matches)
8702
+ {
8703
+ html = html.replace(html, '<img src="' + matches + '" />');
8704
+ }
8575
8705
 
8576
- var matches = html.match(regex);
8577
- if (convertUrlLinks && html && matches)
8706
+ return html;
8707
+ },
8708
+ convertLinks: function(html)
8578
8709
  {
8579
- var len = matches.length;
8580
- for (var z = 0; z < len; z++)
8710
+ var matches = html.match(this.opts.linkify.regexps.url);
8711
+
8712
+ if (matches)
8581
8713
  {
8582
- // remove dot in the end
8583
- if (matches[z].match(/\.$/) !== null) matches[z] = matches[z].replace(/\.$/, '');
8714
+ matches = $.grep(matches, function(v, k) { return $.inArray(v, matches) === k; });
8584
8715
 
8585
- var href = matches[z];
8586
- var text = href;
8716
+ var length = matches.length;
8587
8717
 
8588
- var space = '';
8589
- if (href.match(/\s$/) !== null) space = ' ';
8718
+ for (var i = 0; i < length; i++)
8719
+ {
8720
+ var href = matches[i],
8721
+ text = href,
8722
+ linkProtocol = this.opts.linkProtocol + '://';
8590
8723
 
8591
- var addProtocol = protocol + '://';
8592
- if (href.match(rProtocol) !== null) addProtocol = '';
8724
+ if (href.match(/(https?|ftp):\/\//i) !== null)
8725
+ {
8726
+ linkProtocol = "";
8727
+ }
8593
8728
 
8594
- if (text.length > linkSize) text = text.substring(0, linkSize) + '...';
8595
- text = text.replace(/&#36;/g, '$').replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
8729
+ if (text.length > this.opts.linkSize)
8730
+ {
8731
+ text = text.substring(0, this.opts.linkSize) + '...';
8732
+ }
8596
8733
 
8597
- // buffer
8598
- var buffer = [];
8599
- var links = html.match('<a(.*?)</a>');
8600
- if (links !== null)
8601
- {
8602
- var len = links.length;
8603
- for (i = 0; i < len; i++)
8734
+ text = decodeURIComponent(text);
8735
+
8736
+ var regexB = "\\b";
8737
+
8738
+ if ($.inArray(href.slice(-1), ["/", "&", "="]) != -1)
8604
8739
  {
8605
- buffer[i] = links[i];
8606
- html = html.replace(links[i], '{abuffer' + i + '}');
8740
+ regexB = "";
8607
8741
  }
8608
- }
8609
8742
 
8610
- html = html.replace(href, '<a href=\"' + addProtocol + $.trim(href) + '\">' + $.trim(text) + '</a>' + space);
8743
+ // escaping url
8744
+ var regexp = new RegExp('(' + href.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&") + regexB + ')', 'g');
8611
8745
 
8612
- // rebuffer
8613
- $.each(buffer, function(i,s)
8614
- {
8615
- html = html.replace('{abuffer' + i + '}', s);
8616
- });
8746
+ html = html.replace(regexp, '<a href="' + linkProtocol + $.trim(href) + '">' + $.trim(text) + '</a>');
8747
+ }
8617
8748
  }
8618
8749
 
8619
- $(n).after(html).remove();
8750
+ return html;
8751
+ },
8752
+ after: function()
8753
+ {
8754
+ this.observe.load();
8755
+ this.code.sync();
8620
8756
  }
8621
8757
  }
8622
- else if (n.nodeType === 1 && !/^(pre|a|button|textarea)$/i.test(n.tagName))
8623
- {
8624
- $.Redactor.fn.formatLinkify.call(n, protocol, convertLinks, convertUrlLinks, convertImageLinks, convertVideoLinks, linkSize);
8625
- }
8626
8758
  }
8627
8759
  };
8628
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;
8629
8768
  })(jQuery);
@@ -227,6 +227,12 @@ body .redactor-box-fullscreen {
227
227
  background-color: transparent !important;
228
228
  cursor: default;
229
229
  }
230
+ /*
231
+ CodeMirror
232
+ */
233
+ .redactor-box .CodeMirror {
234
+ display: none;
235
+ }
230
236
  /*
231
237
  Icons
232
238
  */
@@ -845,6 +851,12 @@ body .redactor-box-fullscreen {
845
851
  padding-left: 2em;
846
852
  border: none;
847
853
  }
854
+ .redactor-editor ol ol li {
855
+ list-style-type: lower-alpha;
856
+ }
857
+ .redactor-editor ol ol ol li {
858
+ list-style-type: lower-roman;
859
+ }
848
860
  .redactor-editor dl dt {
849
861
  font-weight: bold;
850
862
  }
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: godmin-redactor
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.5
4
+ version: 0.1.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Varvet
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-04-15 00:00:00.000000000 Z
11
+ date: 2015-05-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: godmin