godmin-redactor 0.1.3 → 0.1.4

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 65352739aa6cdabe2cb3e41848357c3371b8599f
4
- data.tar.gz: 15ff8cd3aac81debd346f5f8d851b414d94e7627
3
+ metadata.gz: dc9aa37f6e1cd37c6e518d2e65067f6ef9827921
4
+ data.tar.gz: b156ee408955cc6ca2d02ed387b1208eba9ce388
5
5
  SHA512:
6
- metadata.gz: c2c01d1cbd3cb01b4987c26676062b45fad788ca58c1d93c7adcc9be6cd259a7d190e1680b4ac173eae7c680d54c0243e2b405f2cae72558854aed706b56f9df
7
- data.tar.gz: a41d8d157f881e27e63a787f680513121b70607242de4a6b48c14b28554b0adb7607780d00ed376f64f7f2ba343bca1d13acd3ad2e5d71f0cf02a9c129c4401f
6
+ metadata.gz: 1492aa70c8393c5f9a33bb54cbee6b46b50aaa5e5d1526b0b57dca6053b10acc4ca40ee58b72e3b13f2d2cac1347a0eaeb28e5ae53ca55e8299e2134ea09cd5a
7
+ data.tar.gz: fade5a57d94424e8360832aa560d9c88829aab23a38b8e1e38363c5e22691cff876f591136169afac74b09b4ba05e23c77c9f305af1b171f306cfe696fa13307
data/CHANGELOG.md CHANGED
@@ -1,5 +1,9 @@
1
1
  # Changelog
2
2
 
3
+ ### 0.1.4 - 2015-03-30
4
+ Features
5
+ - Update to [Redactor version 10.0.9](http://imperavi.com/redactor/log/)
6
+
3
7
  ### 0.1.3 - 2015-03-27
4
8
  Features
5
9
  - Updates Swedish translation (It's called "Brödtext")
@@ -1,5 +1,5 @@
1
1
  module Godmin
2
2
  module Redactor
3
- VERSION = "0.1.3"
3
+ VERSION = "0.1.4"
4
4
  end
5
5
  end
@@ -1,6 +1,6 @@
1
1
  /*
2
- Redactor v10.0.7
3
- Updated: January 31, 2015
2
+ Redactor v10.0.9
3
+ Updated: March 16, 2015
4
4
 
5
5
  http://imperavi.com/redactor/
6
6
 
@@ -94,7 +94,7 @@
94
94
 
95
95
  // Functionality
96
96
  $.Redactor = Redactor;
97
- $.Redactor.VERSION = '10.0.7';
97
+ $.Redactor.VERSION = '10.0.9';
98
98
  $.Redactor.modules = ['alignment', 'autosave', 'block', 'buffer', 'build', 'button',
99
99
  'caret', 'clean', 'code', 'core', 'dropdown', 'file', 'focus',
100
100
  'image', 'indent', 'inline', 'insert', 'keydown', 'keyup',
@@ -135,6 +135,7 @@
135
135
  autosaveName: false,
136
136
  autosaveInterval: 60, // seconds
137
137
  autosaveOnChange: false,
138
+ autosaveFields: false,
138
139
 
139
140
  linkTooltip: true,
140
141
  linkProtocol: 'http',
@@ -191,7 +192,7 @@
191
192
 
192
193
  tabifier: true,
193
194
 
194
- deniedTags: ['html', 'head', 'link', 'body', 'meta', 'script', 'style', 'applet'],
195
+ deniedTags: ['script', 'style'],
195
196
  allowedTags: false, // or array
196
197
 
197
198
  removeComments: false,
@@ -323,7 +324,9 @@
323
324
  underline: 'Underline',
324
325
  alignment: 'Alignment',
325
326
  filename: 'Name (optional)',
326
- edit: 'Edit'
327
+ edit: 'Edit',
328
+ upload_label: 'Drop file here or '
329
+
327
330
  }
328
331
  }
329
332
  };
@@ -371,6 +374,16 @@
371
374
  // setup allowed and denied tags
372
375
  this.tidy.setupAllowed();
373
376
 
377
+ // setup denied tags
378
+ if (this.opts.deniedTags !== false)
379
+ {
380
+ var tags = ['html', 'head', 'link', 'body', 'meta', 'applet'];
381
+ for (var i = 0; i < tags.length; i++)
382
+ {
383
+ this.opts.deniedTags.push(tags[i]);
384
+ }
385
+ }
386
+
374
387
  // load lang
375
388
  this.lang.load();
376
389
 
@@ -541,7 +554,8 @@
541
554
  // data
542
555
  var data = {};
543
556
  data['name'] = this.autosave.name;
544
- data[this.autosave.name] = escape(encodeURIComponent(this.autosave.source));
557
+ data[this.autosave.name] = this.autosave.source;
558
+ data = this.autosave.getHiddenFields(data);
545
559
 
546
560
  // ajax
547
561
  var jsxhr = $.ajax({
@@ -552,6 +566,23 @@
552
566
 
553
567
  jsxhr.done(this.autosave.success);
554
568
  },
569
+ getHiddenFields: function(data)
570
+ {
571
+ if (this.opts.autosaveFields === false || typeof this.opts.autosaveFields !== 'object')
572
+ {
573
+ return data;
574
+ }
575
+
576
+ $.each(this.opts.autosaveFields, $.proxy(function(k, v)
577
+ {
578
+ if (v !== null && v.toString().indexOf('#') === 0) v = $(v).val();
579
+ data[k] = v;
580
+
581
+ }, this));
582
+
583
+ return data;
584
+
585
+ },
555
586
  success: function(data)
556
587
  {
557
588
  var json;
@@ -586,7 +617,7 @@
586
617
 
587
618
  if (typeof this.formatting[name].data != 'undefined') type = 'data';
588
619
  else if (typeof this.formatting[name].attr != 'undefined') type = 'attr';
589
- else if (typeof this.formatting[name].class != 'undefined') type = 'class';
620
+ else if (typeof this.formatting[name]['class'] != 'undefined') type = 'class';
590
621
 
591
622
  if (typeof this.formatting[name].clear != 'undefined')
592
623
  {
@@ -701,6 +732,11 @@
701
732
  this.block.toggle($(block));
702
733
  }
703
734
 
735
+ if (typeof this.block.type == 'undefined' && typeof this.block.value == 'undefined')
736
+ {
737
+ $(block).removeAttr('class').removeAttr('style');
738
+ }
739
+
704
740
  },
705
741
  setMultiple: function(tag)
706
742
  {
@@ -777,14 +813,20 @@
777
813
  {
778
814
  $.each(this.block.blocks, $.proxy(function(i,s)
779
815
  {
816
+ var $formatted = false;
780
817
  if (this.opts.linebreaks)
781
818
  {
782
819
  $(s).prepend('<br>').append('<br>');
783
- this.utils.replaceWithContents(s);
820
+ $formatted = this.utils.replaceWithContents(s);
784
821
  }
785
822
  else
786
823
  {
787
- this.utils.replaceToTag(s, 'p');
824
+ $formatted = this.utils.replaceToTag(s, 'p');
825
+ }
826
+
827
+ if ($formatted && typeof this.block.type == 'undefined' && typeof this.block.value == 'undefined')
828
+ {
829
+ $formatted.removeAttr('class').removeAttr('style');
788
830
  }
789
831
 
790
832
  }, this));
@@ -831,6 +873,11 @@
831
873
  if (this.block.isRemoveInline) this.utils.removeInlineTags($formatted);
832
874
  if (tag == 'p' || this.block.headTag) $formatted.find('p').contents().unwrap();
833
875
 
876
+ if (typeof this.block.type == 'undefined' && typeof this.block.value == 'undefined')
877
+ {
878
+ $formatted.removeAttr('class').removeAttr('style');
879
+ }
880
+
834
881
 
835
882
  }, this));
836
883
  }
@@ -1422,7 +1469,7 @@
1422
1469
  // dropdown
1423
1470
  if (btnObject.dropdown)
1424
1471
  {
1425
- var $dropdown = $('<div class="redactor-dropdown redactor-dropdown-box-' + btnName + '" style="display: none;">');
1472
+ var $dropdown = $('<div class="redactor-dropdown redactor-dropdown-' + this.uuid + ' redactor-dropdown-box-' + btnName + '" style="display: none;">');
1426
1473
  $button.data('dropdown', $dropdown);
1427
1474
  this.dropdown.build(btnName, $dropdown, btnObject.dropdown);
1428
1475
  }
@@ -1525,7 +1572,7 @@
1525
1572
  },
1526
1573
  setInactiveAll: function(key)
1527
1574
  {
1528
- if (typeof key == 'undefined')
1575
+ if (typeof key === 'undefined')
1529
1576
  {
1530
1577
  this.$toolbar.find('a.re-icon').removeClass('redactor-act');
1531
1578
  }
@@ -1572,7 +1619,7 @@
1572
1619
  var key = $btn.attr('rel');
1573
1620
  this.button.addCallback($btn, 'dropdown');
1574
1621
 
1575
- var $dropdown = $('<div class="redactor-dropdown redactor-dropdown-box-' + key + '" style="display: none;">');
1622
+ var $dropdown = $('<div class="redactor-dropdown redactor-dropdown-' + this.uuid + ' redactor-dropdown-box-' + key + '" style="display: none;">');
1576
1623
  $btn.data('dropdown', $dropdown);
1577
1624
 
1578
1625
  // build dropdown
@@ -1596,6 +1643,7 @@
1596
1643
  if (!this.opts.toolbar) return;
1597
1644
 
1598
1645
  var btn = this.button.build(key, { title: title });
1646
+ btn.addClass('redactor-btn-image');
1599
1647
  this.$toolbar.prepend($('<li>').append(btn));
1600
1648
 
1601
1649
  return btn;
@@ -1605,6 +1653,7 @@
1605
1653
  if (!this.opts.toolbar) return;
1606
1654
 
1607
1655
  var btn = this.button.build(key, { title: title });
1656
+ btn.addClass('redactor-btn-image');
1608
1657
  var $btn = this.button.get(afterkey);
1609
1658
 
1610
1659
  if ($btn.length !== 0) $btn.parent().after($('<li>').append(btn));
@@ -1617,6 +1666,7 @@
1617
1666
  if (!this.opts.toolbar) return;
1618
1667
 
1619
1668
  var btn = this.button.build(key, { title: title });
1669
+ btn.addClass('redactor-btn-image');
1620
1670
  var $btn = this.button.get(beforekey);
1621
1671
 
1622
1672
  if ($btn.length !== 0) $btn.parent().before($('<li>').append(btn));
@@ -1840,9 +1890,9 @@
1840
1890
 
1841
1891
  // replace dollar sign to entity
1842
1892
  html = html.replace(/\$/g, '&#36;');
1843
- html = html.replace(/”/g, '"');
1844
- html = html.replace(/‘/g, '\'');
1845
- html = html.replace(/’/g, '\'');
1893
+
1894
+ // replace special characters in links
1895
+ html = html.replace(/<a href="(.*?[^>]?)®(.*?[^>]?)">/gi, '<a href="$1&reg$2">');
1846
1896
 
1847
1897
  if (this.opts.replaceDivs) html = this.clean.replaceDivs(html);
1848
1898
  if (this.opts.linebreaks) html = this.clean.replaceParagraphsToBr(html);
@@ -1964,8 +2014,6 @@
1964
2014
  html = $.trim(html);
1965
2015
 
1966
2016
  html = html.replace(/\$/g, '&#36;');
1967
- html = html.replace(/‘/g, '\'');
1968
- html = html.replace(/’/g, '\'');
1969
2017
 
1970
2018
  // convert dirty spaces
1971
2019
  html = html.replace(/<span class="s1">/gi, '<span>');
@@ -1989,6 +2037,8 @@
1989
2037
  {
1990
2038
  html = html.replace(/”/g, '"');
1991
2039
  html = html.replace(/“/g, '"');
2040
+ html = html.replace(/‘/g, '\'');
2041
+ html = html.replace(/’/g, '\'');
1992
2042
 
1993
2043
  return this.clean.getPreCode(html);
1994
2044
  }
@@ -2055,6 +2105,7 @@
2055
2105
  html = this.clean.onPasteRemoveSpans(html);
2056
2106
  html = this.clean.onPasteRemoveEmpty(html);
2057
2107
 
2108
+
2058
2109
  html = this.clean.convertInline(html);
2059
2110
 
2060
2111
  return html;
@@ -2214,6 +2265,12 @@
2214
2265
  options.deniedTags = this.opts.deniedTags;
2215
2266
  }
2216
2267
 
2268
+ // allowed tags
2269
+ if (this.opts.allowedTags)
2270
+ {
2271
+ options.allowedTags = this.opts.allowedTags;
2272
+ }
2273
+
2217
2274
  return this.tidy.load(html, options);
2218
2275
 
2219
2276
  },
@@ -2281,27 +2338,56 @@
2281
2338
  },
2282
2339
  savePreCode: function(html)
2283
2340
  {
2284
- var pre = html.match(/<(pre|code)(.*?)>([\w\W]*?)<\/(pre|code)>/gi);
2341
+ html = this.clean.savePreFormatting(html);
2342
+ html = this.clean.saveCodeFormatting(html);
2343
+
2344
+ return html;
2345
+ },
2346
+ savePreFormatting: function(html)
2347
+ {
2348
+ var pre = html.match(/<pre(.*?)>([\w\W]*?)<\/pre>/gi);
2285
2349
  if (pre !== null)
2286
2350
  {
2287
2351
  $.each(pre, $.proxy(function(i,s)
2288
2352
  {
2289
- var arr = s.match(/<(pre|code)(.*?)>([\w\W]*?)<\/(pre|code)>/i);
2353
+ var arr = s.match(/<pre(.*?)>([\w\W]*?)<\/pre>/i);
2290
2354
 
2291
- arr[3] = arr[3].replace(/<br\s?\/?>/g, '\n');
2292
- arr[3] = arr[3].replace(/&nbsp;/g, ' ');
2355
+ arr[2] = arr[2].replace(/<br\s?\/?>/g, '\n');
2356
+ arr[2] = arr[2].replace(/&nbsp;/g, ' ');
2293
2357
 
2294
2358
  if (this.opts.preSpaces)
2295
2359
  {
2296
- arr[3] = arr[3].replace(/\t/g, Array(this.opts.preSpaces + 1).join(' '));
2360
+ arr[2] = arr[2].replace(/\t/g, Array(this.opts.preSpaces + 1).join(' '));
2297
2361
  }
2298
2362
 
2299
- arr[3] = this.clean.encodeEntities(arr[3]);
2363
+ arr[2] = this.clean.encodeEntities(arr[2]);
2300
2364
 
2301
2365
  // $ fix
2302
- arr[3] = arr[3].replace(/\$/g, '&#36;');
2366
+ arr[2] = arr[2].replace(/\$/g, '&#36;');
2303
2367
 
2304
- html = html.replace(s, '<' + arr[1] + arr[2] + '>' + arr[3] + '</' + arr[1] + '>');
2368
+ html = html.replace(s, '<pre' + arr[1] + '>' + arr[2] + '</pre>');
2369
+
2370
+ }, this));
2371
+ }
2372
+
2373
+ return html;
2374
+ },
2375
+ saveCodeFormatting: function(html)
2376
+ {
2377
+ var code = html.match(/<code(.*?[^>])>(.*?)<\/code>/gi);
2378
+ if (code !== null)
2379
+ {
2380
+ $.each(code, $.proxy(function(i,s)
2381
+ {
2382
+ var arr = s.match(/<code(.*?[^>])>(.*?)<\/code>/i);
2383
+
2384
+ arr[2] = arr[2].replace(/&nbsp;/g, ' ');
2385
+ arr[2] = this.clean.encodeEntities(arr[2]);
2386
+
2387
+ // $ fix
2388
+ arr[2] = arr[2].replace(/\$/g, '&#36;');
2389
+
2390
+ html = html.replace(s, '<code' + arr[1] + '>' + arr[2] + '</code>');
2305
2391
 
2306
2392
  }, this));
2307
2393
  }
@@ -2323,7 +2409,7 @@
2323
2409
  html = this.clean.getTextFromHtml(html);
2324
2410
  html = html.replace(/\n/g, '<br />');
2325
2411
 
2326
- if (this.opts.paragraphize && typeof paragraphize == 'undefined')
2412
+ if (this.opts.paragraphize && typeof paragraphize == 'undefined' && !this.utils.browser('mozilla'))
2327
2413
  {
2328
2414
  html = this.paragraphize.load(html);
2329
2415
  }
@@ -2417,17 +2503,20 @@
2417
2503
  if (this.utils.browser('msie')) return html;
2418
2504
 
2419
2505
  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">');
2506
+ html = html.replace(new RegExp('<span(.*?[^>])>', 'gi'), '<span$1 data-verified="redactor">');
2421
2507
 
2422
2508
  var matches = html.match(new RegExp('<(span|img)(.*?)style="(.*?)"(.*?[^>])>', 'gi'));
2509
+
2423
2510
  if (matches)
2424
2511
  {
2425
2512
  var len = matches.length;
2426
2513
  for (var i = 0; i < len; i++)
2427
2514
  {
2428
2515
  try {
2516
+
2429
2517
  var newTag = matches[i].replace(/style="(.*?)"/i, 'style="$1" rel="$1"');
2430
- html = html.replace(new RegExp(matches[i], 'gi'), newTag);
2518
+ html = html.replace(matches[i], newTag);
2519
+
2431
2520
  }
2432
2521
  catch (e) {}
2433
2522
  }
@@ -2498,6 +2587,9 @@
2498
2587
  html = html.replace(/<div(.*?)>([\w\W]*?)<\/div>/gi, '<p$1>$2</p>');
2499
2588
  }
2500
2589
 
2590
+ html = html.replace(/<div(.*?[^>])>/gi, '');
2591
+ html = html.replace(/<\/div>/gi, '');
2592
+
2501
2593
  return html;
2502
2594
  },
2503
2595
  replaceDivsToBr: function(html)
@@ -2540,6 +2632,8 @@
2540
2632
  this.$editor.html(html);
2541
2633
  this.code.sync();
2542
2634
 
2635
+ if (html !== '') this.placeholder.remove();
2636
+
2543
2637
  setTimeout($.proxy(this.buffer.add, this), 15);
2544
2638
  if (this.start === false) this.observe.load();
2545
2639
 
@@ -2664,6 +2758,7 @@
2664
2758
 
2665
2759
  this.observe.load();
2666
2760
  this.opts.visual = true;
2761
+ this.core.setCallback('visual', html);
2667
2762
  },
2668
2763
  textareaIndenting: function(e)
2669
2764
  {
@@ -2733,12 +2828,30 @@
2733
2828
  this.$element.off('.redactor').removeData('redactor');
2734
2829
  this.$editor.off('.redactor');
2735
2830
 
2831
+ $(document).off('click.redactor-image-delete.' + this.uuid);
2832
+ $(document).off('click.redactor-image-resize-hide.' + this.uuid);
2833
+ $(document).off('touchstart.redactor.' + this.uuid + ' click.redactor.' + this.uuid);
2834
+ $("body").off('scroll.redactor.' + this.uuid);
2835
+ $(this.opts.toolbarFixedTarget).off('scroll.redactor.' + this.uuid);
2836
+
2736
2837
  // common
2737
2838
  this.$editor.removeClass('redactor-editor redactor-linebreaks redactor-placeholder');
2738
2839
  this.$editor.removeAttr('contenteditable');
2739
2840
 
2740
2841
  var html = this.code.get();
2741
2842
 
2843
+ // dropdowns off
2844
+ this.$toolbar.find('a').each(function()
2845
+ {
2846
+ var $el = $(this);
2847
+ if ($el.data('dropdown'))
2848
+ {
2849
+ $el.data('dropdown').remove();
2850
+ $el.data('dropdown', {});
2851
+ }
2852
+ });
2853
+
2854
+
2742
2855
  if (this.build.isTextarea())
2743
2856
  {
2744
2857
  this.$box.after(this.$element);
@@ -2778,9 +2891,9 @@
2778
2891
  $.each(this.opts.formattingAdd, $.proxy(function(i,s)
2779
2892
  {
2780
2893
  var name = s.tag;
2781
- if (typeof s.class != 'undefined')
2894
+ if (typeof s['class'] != 'undefined')
2782
2895
  {
2783
- name = name + '-' + s.class;
2896
+ name = name + '-' + s['class'];
2784
2897
  }
2785
2898
 
2786
2899
  s.type = (this.utils.isBlockTag(s.tag)) ? 'block' : 'inline';
@@ -2791,7 +2904,7 @@
2791
2904
  this.formatting[name] = {
2792
2905
  tag: s.tag,
2793
2906
  style: s.style,
2794
- 'class': s.class,
2907
+ 'class': s['class'],
2795
2908
  attr: s.attr,
2796
2909
  data: s.data,
2797
2910
  clear: s.clear
@@ -2898,7 +3011,6 @@
2898
3011
  $dropdown.css({ position: 'absolute', left: left, top: top }).show();
2899
3012
  }
2900
3013
 
2901
-
2902
3014
  this.core.setCallback('dropdownShown', { dropdown: $dropdown, key: key, button: $button });
2903
3015
  }
2904
3016
 
@@ -2930,7 +3042,7 @@
2930
3042
  this.$toolbar.find('a.dropact').removeClass('redactor-act').removeClass('dropact');
2931
3043
 
2932
3044
  $(document.body).removeClass('body-redactor-hidden').css('margin-right', 0);
2933
- $('.redactor-dropdown').hide();
3045
+ $('.redactor-dropdown-' + this.uuid).hide();
2934
3046
  this.core.setCallback('dropdownHide');
2935
3047
  },
2936
3048
  hide: function (e)
@@ -3032,8 +3144,7 @@
3032
3144
 
3033
3145
  if (first[0].tagName == 'UL' || first[0].tagName == 'OL')
3034
3146
  {
3035
- first = first.find('li').first();
3036
- var child = first.children().first();
3147
+ var child = first.find('li').first();
3037
3148
  if (!this.utils.isBlock(child) && child.text() === '')
3038
3149
  {
3039
3150
  // empty inline tag in li
@@ -3060,6 +3171,8 @@
3060
3171
  if (this.utils.browser('mozilla') || this.utils.browser('msie'))
3061
3172
  {
3062
3173
  var last = this.$editor.children().last();
3174
+
3175
+ this.$editor.focus();
3063
3176
  this.caret.setEnd(last);
3064
3177
  }
3065
3178
  else
@@ -3241,7 +3354,7 @@
3241
3354
  }
3242
3355
 
3243
3356
  $image.on('mousedown', $.proxy(this.image.hideResize, this));
3244
- $image.on('click touchstart', $.proxy(function(e)
3357
+ $image.on('click.redactor touchstart', $.proxy(function(e)
3245
3358
  {
3246
3359
  this.observe.image = $image;
3247
3360
 
@@ -3249,8 +3362,8 @@
3249
3362
 
3250
3363
  this.image.resizer = this.image.loadEditableControls($image);
3251
3364
 
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));
3365
+ $(document).on('click.redactor-image-resize-hide.' + this.uuid, $.proxy(this.image.hideResize, this));
3366
+ this.$editor.on('click.redactor-image-resize-hide.' + this.uuid, $.proxy(this.image.hideResize, this));
3254
3367
 
3255
3368
  // resize
3256
3369
  if (!this.opts.imageResizable) return;
@@ -3383,8 +3496,8 @@
3383
3496
  return $(this).contents();
3384
3497
  });
3385
3498
 
3386
- $(document).off('click.redactor-image-resize-hide');
3387
- this.$editor.off('click.redactor-image-resize-hide');
3499
+ $(document).off('click.redactor-image-resize-hide.' + this.uuid);
3500
+ this.$editor.off('click.redactor-image-resize-hide.' + this.uuid);
3388
3501
 
3389
3502
  if (typeof this.image.resizeHandle !== 'undefined')
3390
3503
  {
@@ -3714,7 +3827,7 @@
3714
3827
  var type, value;
3715
3828
 
3716
3829
  if (typeof this.formatting[name].style != 'undefined') type = 'style';
3717
- else if (typeof this.formatting[name].class != 'undefined') type = 'class';
3830
+ else if (typeof this.formatting[name]['class'] != 'undefined') type = 'class';
3718
3831
 
3719
3832
  if (type) value = this.formatting[name][type];
3720
3833
 
@@ -3738,7 +3851,11 @@
3738
3851
  this.inline.value = value || false;
3739
3852
 
3740
3853
  this.buffer.set();
3741
- this.$editor.focus();
3854
+
3855
+ if (!this.utils.browser('msie'))
3856
+ {
3857
+ this.$editor.focus();
3858
+ }
3742
3859
 
3743
3860
  this.selection.get();
3744
3861
 
@@ -3759,14 +3876,18 @@
3759
3876
  // inline there is
3760
3877
  if ($parent.length !== 0 && (this.inline.type != 'style' && $parent[0].tagName != 'SPAN'))
3761
3878
  {
3762
- this.caret.setAfter($parent[0]);
3763
-
3764
3879
  // remove empty
3765
- if ( this.utils.isEmpty($parent.text()))
3880
+ if (this.utils.isEmpty($parent.text()))
3766
3881
  {
3882
+ this.caret.setAfter($parent[0]);
3883
+
3767
3884
  $parent.remove();
3768
3885
  this.code.sync();
3769
3886
  }
3887
+ else if (this.utils.isEndOfElement($parent))
3888
+ {
3889
+ this.caret.setAfter($parent[0]);
3890
+ }
3770
3891
 
3771
3892
  return;
3772
3893
  }
@@ -4358,6 +4479,8 @@
4358
4479
  }
4359
4480
 
4360
4481
  this.range.insertNode(frag);
4482
+ this.range.collapse(false);
4483
+ this.selection.addRange();
4361
4484
  }
4362
4485
  };
4363
4486
  },
@@ -4478,21 +4601,28 @@
4478
4601
  current = this.selection.getCurrent();
4479
4602
  $next = $(this.keydown.current).next();
4480
4603
 
4481
- if (current !== false && $(current).hasClass('redactor-invisible-space'))
4604
+
4605
+
4606
+ if ($next.length !== 0 && $next[0].tagName == 'BR')
4607
+ {
4608
+ return this.keydown.insertBreakLine(e);
4609
+ }
4610
+ else if (current !== false && $(current).hasClass('redactor-invisible-space'))
4482
4611
  {
4483
4612
  this.caret.setAfter(current);
4484
4613
  $(current).contents().unwrap();
4614
+
4485
4615
  return this.keydown.insertDblBreakLine(e);
4486
4616
  }
4487
4617
  else
4488
4618
  {
4489
- if ($next.length === 0 && current === false && typeof $next.context != 'undefined')
4619
+ if (this.utils.isEndOfEditor())
4490
4620
  {
4491
4621
  return this.keydown.insertDblBreakLine(e);
4492
4622
  }
4493
- else if (this.utils.isEndOfEditor())
4623
+ else if ($next.length === 0 && current === false && typeof $next.context != 'undefined')
4494
4624
  {
4495
- return this.keydown.insertDblBreakLine(e);
4625
+ return this.keydown.insertBreakLine(e);
4496
4626
  }
4497
4627
 
4498
4628
  return this.keydown.insertBreakLine(e);
@@ -4503,16 +4633,32 @@
4503
4633
  setTimeout($.proxy(this.keydown.replaceDivToBreakLine, this), 1);
4504
4634
  }
4505
4635
  // paragraphs
4506
- else if (!this.opts.linebreaks && this.keydown.block && this.keydown.block.tagName !== 'LI')
4636
+ else if (!this.opts.linebreaks && this.keydown.block)
4507
4637
  {
4508
- setTimeout($.proxy(this.keydown.replaceDivToParagraph, this), 1);
4638
+ if (this.keydown.block.tagName !== 'LI')
4639
+ {
4640
+ setTimeout($.proxy(this.keydown.replaceDivToParagraph, this), 1);
4641
+ }
4642
+ else
4643
+ {
4644
+ current = this.selection.getCurrent();
4645
+ var $parent = $(current).closest('li');
4646
+ var $list = $parent.closest('ul,ol');
4647
+
4648
+ if ($parent.length !== 0 && this.utils.isEmpty($parent.html()) && $list.next().length === 0)
4649
+ {
4650
+ var node = $(this.opts.emptyHtml);
4651
+ $list.after(node);
4652
+ this.caret.setStart(node);
4653
+
4654
+ return false;
4655
+ }
4656
+ }
4509
4657
  }
4510
4658
  else if (!this.opts.linebreaks && !this.keydown.block)
4511
4659
  {
4512
4660
  return this.keydown.insertParagraph(e);
4513
4661
  }
4514
-
4515
-
4516
4662
  }
4517
4663
 
4518
4664
  // Shift+Enter or Ctrl+Enter
@@ -4531,6 +4677,12 @@
4531
4677
  // image delete and backspace
4532
4678
  if (key === this.keyCode.BACKSPACE || key === this.keyCode.DELETE)
4533
4679
  {
4680
+ if (this.utils.browser('mozilla') && this.keydown.current && this.keydown.current.tagName === 'TD')
4681
+ {
4682
+ e.preventDefault();
4683
+ return false;
4684
+ }
4685
+
4534
4686
  var nodes = this.selection.getNodes();
4535
4687
  if (nodes)
4536
4688
  {
@@ -4843,24 +4995,52 @@
4843
4995
  this.selection.get();
4844
4996
  var br1 = document.createElement('br');
4845
4997
 
4846
- this.range.deleteContents();
4998
+ if (this.utils.browser('msie'))
4999
+ {
5000
+ this.range.collapse(false);
5001
+ this.range.setEnd(this.range.endContainer, this.range.endOffset);
5002
+ }
5003
+ else
5004
+ {
5005
+ this.range.deleteContents();
5006
+ }
5007
+
4847
5008
  this.range.insertNode(br1);
4848
5009
 
4849
5010
  if (dbl === true)
4850
5011
  {
5012
+
5013
+ var $next = $(br1).next();
5014
+ if ($next.length !== 0 && $next[0].tagName === 'BR' && this.utils.isEndOfEditor())
5015
+ {
5016
+ this.caret.setAfter(br1);
5017
+ this.code.sync();
5018
+ return false;
5019
+ }
5020
+
4851
5021
  var br2 = document.createElement('br');
4852
5022
  this.range.insertNode(br2);
4853
5023
  this.caret.setAfter(br2);
4854
5024
  }
4855
5025
  else
4856
5026
  {
4857
- this.caret.setAfter(br1);
5027
+ this.keydown.insertBreakLineProcessingAfter(br1);
4858
5028
  }
4859
5029
 
4860
5030
  this.code.sync();
4861
-
4862
5031
  return false;
4863
5032
  },
5033
+ insertBreakLineProcessingAfter: function(node)
5034
+ {
5035
+ var space = this.utils.createSpaceElement();
5036
+ $(node).after(space);
5037
+ this.selection.selectElement(space);
5038
+
5039
+ $(space).replaceWith(function()
5040
+ {
5041
+ return $(this).contents();
5042
+ });
5043
+ },
4864
5044
  removeInvisibleSpace: function()
4865
5045
  {
4866
5046
  var $current = $(this.keydown.current);
@@ -4902,7 +5082,6 @@
4902
5082
  this.keyup.parent = this.selection.getParent();
4903
5083
  var $parent = this.utils.isRedactorParent($(this.keyup.parent).parent());
4904
5084
 
4905
-
4906
5085
  // callback
4907
5086
  var keyupStop = this.core.setCallback('keyup', e);
4908
5087
  if (keyupStop === false)
@@ -5285,12 +5464,17 @@
5285
5464
  document.execCommand('createLink', false, link);
5286
5465
 
5287
5466
  $a = $(this.selection.getCurrent()).closest('a');
5467
+ if (this.utils.browser('mozilla'))
5468
+ {
5469
+ $a = $('a[_moz_dirty=""]');
5470
+ }
5288
5471
 
5289
5472
  if (target !== '') $a.attr('target', target);
5290
- $a.removeAttr('style');
5473
+ $a.removeAttr('style').removeAttr('_moz_dirty');
5291
5474
 
5292
- if (this.link.text === '' || this.link.text != text)
5475
+ if (this.link.text !== '' || this.link.text != text)
5293
5476
  {
5477
+
5294
5478
  $a.text(text);
5295
5479
  this.selection.selectElement($a);
5296
5480
  }
@@ -5311,7 +5495,10 @@
5311
5495
  },
5312
5496
  unlink: function(e)
5313
5497
  {
5314
- if (typeof e != 'undefined' && e.preventDefault) e.preventDefault();
5498
+ if (typeof e != 'undefined' && e.preventDefault)
5499
+ {
5500
+ e.preventDefault();
5501
+ }
5315
5502
 
5316
5503
  var nodes = this.selection.getNodes();
5317
5504
  if (!nodes) return;
@@ -5321,11 +5508,8 @@
5321
5508
  var len = nodes.length;
5322
5509
  for (var i = 0; i < len; i++)
5323
5510
  {
5324
- if (nodes[i].tagName == 'A')
5325
- {
5326
- var $node = $(nodes[i]);
5327
- $node.replaceWith($node.contents());
5328
- }
5511
+ var $node = $(nodes[i]).closest('a');
5512
+ $node.replaceWith($node.contents());
5329
5513
  }
5330
5514
 
5331
5515
  // hide link's tooltip
@@ -5333,6 +5517,28 @@
5333
5517
 
5334
5518
  this.code.sync();
5335
5519
 
5520
+ },
5521
+ toggleClass: function(className)
5522
+ {
5523
+ this.link.setClass(className, 'toggleClass');
5524
+ },
5525
+ addClass: function(className)
5526
+ {
5527
+ this.link.setClass(className, 'addClass');
5528
+ },
5529
+ removeClass: function(className)
5530
+ {
5531
+ this.link.setClass(className, 'removeClass');
5532
+ },
5533
+ setClass: function(className, func)
5534
+ {
5535
+ var links = this.selection.getInlinesTags(['a']);
5536
+ if (links === false) return;
5537
+
5538
+ $.each(links, function()
5539
+ {
5540
+ $(this)[func](className);
5541
+ });
5336
5542
  }
5337
5543
  };
5338
5544
  },
@@ -5859,7 +6065,14 @@
5859
6065
  var current = this.selection.getCurrent();
5860
6066
  var parent = this.selection.getParent();
5861
6067
 
5862
- this.button.setInactiveAll(btnName);
6068
+ if (e !== false)
6069
+ {
6070
+ this.button.setInactiveAll();
6071
+ }
6072
+ else
6073
+ {
6074
+ this.button.setInactiveAll(btnName);
6075
+ }
5863
6076
 
5864
6077
  if (e === false && btnName !== 'html')
5865
6078
  {
@@ -5911,7 +6124,7 @@
5911
6124
 
5912
6125
  }, this));
5913
6126
 
5914
- $(document).on('click.redactor-image-delete', $.proxy(function(e)
6127
+ $(document).on('click.redactor-image-delete.' + this.uuid, $.proxy(function(e)
5915
6128
  {
5916
6129
  this.observe.image = false;
5917
6130
  if (e.target.tagName == 'IMG' && this.utils.isRedactorParent(e.target))
@@ -5926,9 +6139,9 @@
5926
6139
  {
5927
6140
  if (!this.opts.linkTooltip) return;
5928
6141
 
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));
6142
+ this.$editor.find('a').on('touchstart.redactor.' + this.uuid + ' click.redactor.' + this.uuid, $.proxy(this.observe.showTooltip, this));
6143
+ this.$editor.on('touchstart.redactor.' + this.uuid + ' click.redactor.' + this.uuid, $.proxy(this.observe.closeTooltip, this));
6144
+ $(document).on('touchstart.redactor.' + this.uuid + ' click.redactor.' + this.uuid, $.proxy(this.observe.closeTooltip, this));
5932
6145
  },
5933
6146
  getTooltipPosition: function($link)
5934
6147
  {
@@ -6066,7 +6279,9 @@
6066
6279
  {
6067
6280
  $.each(this.paragraphize.safes, function(i,s)
6068
6281
  {
6282
+ s = (typeof s !== 'undefined') ? s.replace(/\$/g, '&#36;') : s;
6069
6283
  html = html.replace('{replace' + i + '}', s);
6284
+
6070
6285
  });
6071
6286
 
6072
6287
  return html;
@@ -6134,7 +6349,11 @@
6134
6349
  return {
6135
6350
  init: function(e)
6136
6351
  {
6137
- if (!this.opts.cleanOnPaste) return;
6352
+ if (!this.opts.cleanOnPaste)
6353
+ {
6354
+ setTimeout($.proxy(this.code.sync, this), 1);
6355
+ return;
6356
+ }
6138
6357
 
6139
6358
  this.rtePaste = true;
6140
6359
 
@@ -6170,7 +6389,15 @@
6170
6389
  {
6171
6390
  this.$pasteBox = $('<div>').html('').attr('contenteditable', 'true').css({ position: 'fixed', width: 0, top: 0, left: '-9999px' });
6172
6391
 
6173
- this.$box.parent().append(this.$pasteBox);
6392
+ if (this.utils.browser('msie'))
6393
+ {
6394
+ this.$box.append(this.$pasteBox);
6395
+ }
6396
+ else
6397
+ {
6398
+ $('body').append(this.$pasteBox);
6399
+ }
6400
+
6174
6401
  this.$pasteBox.focus();
6175
6402
  },
6176
6403
  insert: function(html)
@@ -6327,7 +6554,7 @@
6327
6554
 
6328
6555
  return false;
6329
6556
  },
6330
- getInlines: function(nodes)
6557
+ getInlines: function(nodes, tags)
6331
6558
  {
6332
6559
  this.selection.get();
6333
6560
 
@@ -6337,9 +6564,18 @@
6337
6564
  }
6338
6565
 
6339
6566
  var inlines = [];
6340
- nodes = (typeof nodes == 'undefined') ? this.selection.getNodes() : nodes;
6567
+ nodes = (typeof nodes == 'undefined' || nodes === false) ? this.selection.getNodes() : nodes;
6341
6568
  var inlineTags = this.opts.inlineTags;
6342
6569
  inlineTags.push('span');
6570
+
6571
+ if (typeof tags !== 'undefined')
6572
+ {
6573
+ for (var i = 0; i < tags.length; i++)
6574
+ {
6575
+ inlineTags.push(tags[i]);
6576
+ }
6577
+ }
6578
+
6343
6579
  $.each(nodes, $.proxy(function(i,node)
6344
6580
  {
6345
6581
  if ($.inArray(node.tagName.toLowerCase(), inlineTags) != -1)
@@ -6351,6 +6587,28 @@
6351
6587
 
6352
6588
  return (inlines.length === 0) ? false : inlines;
6353
6589
  },
6590
+ getInlinesTags: function(tags)
6591
+ {
6592
+ this.selection.get();
6593
+
6594
+ if (this.range && this.range.collapsed)
6595
+ {
6596
+ return false;
6597
+ }
6598
+
6599
+ var inlines = [];
6600
+ var nodes = this.selection.getNodes();
6601
+ $.each(nodes, $.proxy(function(i,node)
6602
+ {
6603
+ if ($.inArray(node.tagName.toLowerCase(), tags) != -1)
6604
+ {
6605
+ inlines.push(node);
6606
+ }
6607
+
6608
+ }, this));
6609
+
6610
+ return (inlines.length === 0) ? false : inlines;
6611
+ },
6354
6612
  getBlocks: function(nodes)
6355
6613
  {
6356
6614
  this.selection.get();
@@ -6567,7 +6825,12 @@
6567
6825
  },
6568
6826
  removeMarkers: function()
6569
6827
  {
6570
- this.$editor.find('span.redactor-selection-marker').remove();
6828
+ this.$editor.find('span.redactor-selection-marker').each(function(i,s)
6829
+ {
6830
+ var text = $(s).text().replace(/[\u200B-\u200D\uFEFF]/g, '');
6831
+ if (text === '') $(s).remove();
6832
+ else $(s).replaceWith(function() { return $(this).contents(); });
6833
+ });
6571
6834
  },
6572
6835
  getText: function()
6573
6836
  {
@@ -6593,6 +6856,34 @@
6593
6856
  }
6594
6857
 
6595
6858
  return this.clean.onSync(html);
6859
+ },
6860
+ replaceWithHtml: function(html)
6861
+ {
6862
+ html = this.selection.getMarkerAsHtml(1) + html + this.selection.getMarkerAsHtml(2);
6863
+
6864
+ this.selection.get();
6865
+
6866
+ if (window.getSelection && window.getSelection().getRangeAt)
6867
+ {
6868
+ this.range.deleteContents();
6869
+ var div = document.createElement("div");
6870
+ div.innerHTML = html;
6871
+
6872
+ var frag = document.createDocumentFragment(), child;
6873
+ while ((child = div.firstChild))
6874
+ {
6875
+ frag.appendChild(child);
6876
+ }
6877
+
6878
+ this.range.insertNode(frag);
6879
+ }
6880
+ else if (document.selection && document.selection.createRange)
6881
+ {
6882
+ this.range.pasteHTML(html);
6883
+ }
6884
+
6885
+ this.selection.restore();
6886
+ this.code.sync();
6596
6887
  }
6597
6888
  };
6598
6889
  },
@@ -6710,7 +7001,7 @@
6710
7001
  // clean setup
6711
7002
  var ownLine = ['area', 'body', 'head', 'hr', 'i?frame', 'link', 'meta', 'noscript', 'style', 'script', 'table', 'tbody', 'thead', 'tfoot'];
6712
7003
  var contOwnLine = ['li', 'dt', 'dt', 'h[1-6]', 'option', 'script'];
6713
- var newLevel = ['blockquote', 'div', 'dl', 'fieldset', 'form', 'frameset', 'map', 'ol', 'p', 'pre', 'select', 'td', 'th', 'tr', 'ul'];
7004
+ var newLevel = ['p', 'blockquote', 'div', 'dl', 'fieldset', 'form', 'frameset', 'map', 'ol', 'pre', 'select', 'td', 'th', 'tr', 'ul'];
6714
7005
 
6715
7006
  this.tabifier.lineBefore = new RegExp('^<(/?' + ownLine.join('|/?' ) + '|' + contOwnLine.join('|') + ')[ >]');
6716
7007
  this.tabifier.lineAfter = new RegExp('^<(br|/?' + ownLine.join('|/?' ) + '|/' + contOwnLine.join('|/') + ')[ >]');
@@ -6875,6 +7166,7 @@
6875
7166
  placeTag: function (tag, out)
6876
7167
  {
6877
7168
  var nl = tag.match(this.tabifier.newLevel);
7169
+
6878
7170
  if (tag.match(this.tabifier.lineBefore) || nl)
6879
7171
  {
6880
7172
  out = out.replace(/\s*$/, '');
@@ -6890,7 +7182,7 @@
6890
7182
  if (tag.match(this.tabifier.lineAfter) || tag.match(this.tabifier.newLevel))
6891
7183
  {
6892
7184
  out = out.replace(/ *$/, '');
6893
- out += '\n';
7185
+ //out += '\n';
6894
7186
  }
6895
7187
 
6896
7188
  return out;
@@ -7437,7 +7729,7 @@
7437
7729
  if (!this.opts.toolbarFixed) return;
7438
7730
 
7439
7731
  this.toolbar.observeScroll();
7440
- $(this.opts.toolbarFixedTarget).on('scroll.redactor', $.proxy(this.toolbar.observeScroll, this));
7732
+ $(this.opts.toolbarFixedTarget).on('scroll.redactor.' + this.uuid, $.proxy(this.toolbar.observeScroll, this));
7441
7733
 
7442
7734
  },
7443
7735
  setOverflow: function()
@@ -7502,7 +7794,7 @@
7502
7794
  {
7503
7795
  var top = this.opts.toolbarFixedTopOffset + scrollTop - boxTop;
7504
7796
  var left = 0;
7505
- var end = boxTop + this.$box.height() + 30;
7797
+ var end = boxTop + this.$box.height() - 32;
7506
7798
  var width = this.$box.innerWidth();
7507
7799
 
7508
7800
  this.$toolbar.addClass('toolbar-fixed-box');
@@ -7529,6 +7821,7 @@
7529
7821
  this.toolbar.unsetDropdownsFixed();
7530
7822
  this.$toolbar.removeClass('toolbar-fixed-box');
7531
7823
 
7824
+
7532
7825
  },
7533
7826
  setDropdownsFixed: function()
7534
7827
  {
@@ -7540,7 +7833,7 @@
7540
7833
  position = 'absolute';
7541
7834
  }
7542
7835
 
7543
- $('.redactor-dropdown').each(function()
7836
+ $('.redactor-dropdown-' + this.uuid).each(function()
7544
7837
  {
7545
7838
  $(this).css({ position: position, top: top + 'px' });
7546
7839
  });
@@ -7548,7 +7841,7 @@
7548
7841
  unsetDropdownsFixed: function()
7549
7842
  {
7550
7843
  var top = (this.$toolbar.innerHeight() + this.$toolbar.offset().top);
7551
- $('.redactor-dropdown').each(function()
7844
+ $('.redactor-dropdown-' + this.uuid).each(function()
7552
7845
  {
7553
7846
  $(this).css({ position: 'absolute', top: top + 'px' });
7554
7847
  });
@@ -7566,7 +7859,7 @@
7566
7859
  this.upload.$el = $(id);
7567
7860
  this.upload.$droparea = $('<div id="redactor-droparea" />');
7568
7861
 
7569
- this.upload.$placeholdler = $('<div id="redactor-droparea-placeholder" />').text('Drop file here or ');
7862
+ this.upload.$placeholdler = $('<div id="redactor-droparea-placeholder" />').text(this.lang.get('upload_label'));
7570
7863
  this.upload.$input = $('<input type="file" name="file" />');
7571
7864
 
7572
7865
  this.upload.$placeholdler.append(this.upload.$input);
@@ -7627,6 +7920,7 @@
7627
7920
  }
7628
7921
 
7629
7922
  this.progress.show();
7923
+ this.core.setCallback('uploadStart', e, formData);
7630
7924
  this.upload.sendData(formData, e);
7631
7925
  },
7632
7926
  setConfig: function(file)
@@ -7914,6 +8208,7 @@
7914
8208
  html = html.replace(/\s/g, '');
7915
8209
  html = html.replace(/^<p>[^\W\w\D\d]*?<\/p>$/i, '');
7916
8210
  html = html.replace(/<iframe(.*?[^>])>$/i, 'iframe');
8211
+ html = html.replace(/<source(.*?[^>])>$/i, 'source');
7917
8212
 
7918
8213
  // remove empty tags
7919
8214
  if (removeEmptyTags !== false)
@@ -7982,7 +8277,7 @@
7982
8277
 
7983
8278
  $s.find('.redactor-invisible-space').removeAttr('style').removeAttr('class');
7984
8279
 
7985
- if ($s.find('hr, br, img, iframe').length !== 0) return;
8280
+ if ($s.find('hr, br, img, iframe, source').length !== 0) return;
7986
8281
  var text = $.trim($s.text());
7987
8282
  if (this.utils.isEmpty(text, false))
7988
8283
  {
@@ -7993,8 +8288,6 @@
7993
8288
  // save and restore scroll
7994
8289
  saveScroll: function()
7995
8290
  {
7996
- if (this.utils.isSelectAll()) return;
7997
-
7998
8291
  this.saveEditorScroll = this.$editor.scrollTop();
7999
8292
  this.saveBodyScroll = $(window).scrollTop();
8000
8293
 
@@ -8039,6 +8332,8 @@
8039
8332
 
8040
8333
  return $(this).contents();
8041
8334
  });
8335
+
8336
+ return $(node);
8042
8337
  },
8043
8338
  replaceToTag: function(node, tag, removeInlineTags)
8044
8339
  {
@@ -8071,13 +8366,16 @@
8071
8366
 
8072
8367
  return (offset === 0) ? true : false;
8073
8368
  },
8074
- isEndOfElement: function()
8369
+ isEndOfElement: function(element)
8075
8370
  {
8076
- var block = this.selection.getBlock();
8077
- if (!block) return false;
8371
+ if (typeof element == 'undefined')
8372
+ {
8373
+ var element = this.selection.getBlock();
8374
+ if (!element) return false;
8375
+ }
8078
8376
 
8079
- var offset = this.caret.getOffsetOfElement(block);
8080
- var text = $.trim($(block).text()).replace(/\n\r\n/g, '');
8377
+ var offset = this.caret.getOffsetOfElement(element);
8378
+ var text = $.trim($(element).text()).replace(/\n\r\n/g, '');
8081
8379
 
8082
8380
  return (offset == text.length) ? true : false;
8083
8381
  },
@@ -8086,7 +8384,7 @@
8086
8384
  var block = this.$editor[0];
8087
8385
 
8088
8386
  var offset = this.caret.getOffsetOfElement(block);
8089
- var text = $.trim($(block).text()).replace(/\n\r\n/g, '');
8387
+ var text = $.trim($(block).html().replace(/(<([^>]+)>)/gi,''));
8090
8388
 
8091
8389
  return (offset == text.length) ? true : false;
8092
8390
  },
@@ -8209,7 +8507,7 @@
8209
8507
 
8210
8508
  if (browser == 'safari') return (typeof match[3] != 'undefined') ? match[3] == 'safari' : false;
8211
8509
  if (browser == 'version') return match[2];
8212
- if (browser == 'webkit') return (match[1] == 'chrome' || match[1] == 'webkit');
8510
+ if (browser == 'webkit') return (match[1] == 'chrome' || match[1] == 'opr' || match[1] == 'webkit');
8213
8511
  if (match[1] == 'rv') return browser == 'msie';
8214
8512
  if (match[1] == 'opr') return browser == 'webkit';
8215
8513
 
@@ -8233,7 +8531,7 @@
8233
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\\-\\.%_\\+=\\?&;]*)?)';
8234
8532
  var regex = new RegExp(urlCheck, 'gi');
8235
8533
  var rProtocol = /(https?|ftp):\/\//i;
8236
- var urlImage = /(https?:\/\/.*\.(?:png|jpg|jpeg|gif))/gi;
8534
+ var urlImage = new RegExp('(?:([^:/?#]+):)?(?:\/\/([^/?#]*))?([^?#]*\\.(?:jpg|gif|png))(?:\\?([^#]*))?(?:#(.*))?', 'gi');
8237
8535
 
8238
8536
  var childNodes = (this.$editor ? this.$editor[0] : this).childNodes, i = childNodes.length;
8239
8537
  while (i--)
@@ -8265,7 +8563,8 @@
8265
8563
  // image
8266
8564
  if (convertImageLinks && html && html.match(urlImage))
8267
8565
  {
8268
- html = html.replace(urlImage, '<img src="$1" />');
8566
+ var matches = html.match(urlImage);
8567
+ html = html.replace(urlImage, '<img src="' + matches + '" />');
8269
8568
 
8270
8569
  $(n).after(html).remove();
8271
8570
  return;
@@ -8277,7 +8576,6 @@
8277
8576
  var matches = html.match(regex);
8278
8577
  if (convertUrlLinks && html && matches)
8279
8578
  {
8280
-
8281
8579
  var len = matches.length;
8282
8580
  for (var z = 0; z < len; z++)
8283
8581
  {
@@ -8296,7 +8594,26 @@
8296
8594
  if (text.length > linkSize) text = text.substring(0, linkSize) + '...';
8297
8595
  text = text.replace(/&#36;/g, '$').replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
8298
8596
 
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++)
8604
+ {
8605
+ buffer[i] = links[i];
8606
+ html = html.replace(links[i], '{abuffer' + i + '}');
8607
+ }
8608
+ }
8609
+
8299
8610
  html = html.replace(href, '<a href=\"' + addProtocol + $.trim(href) + '\">' + $.trim(text) + '</a>' + space);
8611
+
8612
+ // rebuffer
8613
+ $.each(buffer, function(i,s)
8614
+ {
8615
+ html = html.replace('{abuffer' + i + '}', s);
8616
+ });
8300
8617
  }
8301
8618
 
8302
8619
  $(n).after(html).remove();
@@ -8309,4 +8626,4 @@
8309
8626
  }
8310
8627
  };
8311
8628
 
8312
- })(jQuery);
8629
+ })(jQuery);
@@ -38,29 +38,31 @@
38
38
  .redactor-box textarea:focus {
39
39
  outline: none;
40
40
  }
41
- /*
42
- Z-index setup
43
- */
44
41
  .redactor-editor,
45
42
  .redactor-box {
46
43
  background: #fff;
47
44
  }
45
+ /*
46
+ Z-index setup
47
+ */
48
48
  .redactor-editor,
49
49
  .redactor-box,
50
50
  .redactor-box textarea {
51
- z-index: auto !important;
51
+ z-index: auto;
52
52
  }
53
53
  .redactor-box-fullscreen {
54
- z-index: 1052 !important;
54
+ z-index: 1051;
55
+ }
56
+ .redactor-toolbar {
57
+ z-index: 100;
55
58
  }
56
- .redactor-toolbar,
57
59
  .redactor-dropdown {
58
- z-index: 1053 !important;
60
+ z-index: 1052;
59
61
  }
60
62
  #redactor-modal-overlay,
61
63
  #redactor-modal-box,
62
64
  #redactor-modal {
63
- z-index: 1054 !important;
65
+ z-index: 1053;
64
66
  }
65
67
  /*
66
68
  Resize
@@ -111,6 +113,9 @@ body .redactor-box-fullscreen {
111
113
  .redactor-editor:focus {
112
114
  outline: none;
113
115
  }
116
+ .toolbar-fixed-box + .redactor-editor {
117
+ padding-top: 32px !important;
118
+ }
114
119
  /*
115
120
  Placeholder
116
121
  */
@@ -650,7 +655,7 @@ body .redactor-box-fullscreen {
650
655
  padding-left: 0;
651
656
  list-style: none;
652
657
  max-height: 250px;
653
- overflow-x: scroll;
658
+ overflow-x: auto;
654
659
  }
655
660
  #redactor-modal #redactor-modal-list li {
656
661
  border-bottom: 1px solid #ddd;
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.3
4
+ version: 0.1.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Varvet
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-03-27 00:00:00.000000000 Z
11
+ date: 2015-03-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: godmin