medium-editor-rails 0.13.1 → 1.0.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/CHANGELOG.md +7 -0
- data/LICENSE.txt +1 -1
- data/README.md +1 -1
- data/lib/medium-editor-rails/version.rb +2 -2
- data/vendor/assets/javascripts/medium-editor.js +315 -51
- data/vendor/assets/stylesheets/medium-editor/medium-editor.css +8 -3
- data/vendor/assets/stylesheets/medium-editor/themes/bootstrap.css +2 -4
- data/vendor/assets/stylesheets/medium-editor/themes/default.css +2 -7
- data/vendor/assets/stylesheets/medium-editor/themes/flat.css +1 -2
- data/vendor/assets/stylesheets/medium-editor/themes/mani.css +1 -4
- data/vendor/assets/stylesheets/medium-editor/themes/roman.css +1 -4
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bfa61058f24f4aaef259ebf7d18b0669562b4e92
|
4
|
+
data.tar.gz: e8c632c87912135a6b0a00a8a2d730e1ef4e3c87
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1cc900d59e3b0a79d9c7e0ca7bf95dc2e099c11d19225984932df294d37596c5ca8f01a4a70c0951ca6fb897daab4edb17cbe670d6c864cf97efcfe38a7c4986
|
7
|
+
data.tar.gz: e38c565f410987e53920976f1aea84cddf77ce65403f0c4ade06d4106a6af53c9fef55a2c6427c9293a82e3805a2078eadff6f9080a4a0827ae28d73df78d9eb
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,12 @@
|
|
1
1
|
|
2
2
|
#### [Current]
|
3
|
+
* [fb35ea2](../../commit/fb35ea2) - __(Ahmet Sezgin Duran)__ Bump versions 1.0.0 and 2.0.0
|
4
|
+
* [937e1f2](../../commit/937e1f2) - __(Ahmet Sezgin Duran)__ Merge tag '0.13.1' into develop
|
5
|
+
|
6
|
+
0.13.1 0.13.1
|
7
|
+
|
8
|
+
#### 0.13.1
|
9
|
+
* [d7b25bb](../../commit/d7b25bb) - __(Ahmet Sezgin Duran)__ Bump versions 0.13.1 and 1.9.13
|
3
10
|
* [c6b96b2](../../commit/c6b96b2) - __(Ahmet Sezgin Duran)__ Update Medium Editor files
|
4
11
|
* [8c242a1](../../commit/8c242a1) - __(Ahmet Sezgin Duran)__ Merge tag '0.13.0' into develop
|
5
12
|
|
data/LICENSE.txt
CHANGED
data/README.md
CHANGED
@@ -8,7 +8,7 @@ This gem integrates [Medium Editor](https://github.com/daviferreira/medium-edito
|
|
8
8
|
|
9
9
|
## Version
|
10
10
|
|
11
|
-
The latest version of Medium Editor bundled by this gem is [
|
11
|
+
The latest version of Medium Editor bundled by this gem is [2.0.0](https://github.com/daviferreira/medium-editor/releases)
|
12
12
|
|
13
13
|
## Installation
|
14
14
|
|
@@ -108,6 +108,39 @@ else if (typeof define === 'function' && define.amd) {
|
|
108
108
|
return !!(obj && obj.nodeType === 1);
|
109
109
|
}
|
110
110
|
|
111
|
+
// http://stackoverflow.com/questions/6690752/insert-html-at-caret-in-a-contenteditable-div
|
112
|
+
function insertHTMLCommand(doc, html) {
|
113
|
+
var selection, range, el, fragment, node, lastNode;
|
114
|
+
|
115
|
+
if (doc.queryCommandSupported('insertHTML')) {
|
116
|
+
return doc.execCommand('insertHTML', false, html);
|
117
|
+
}
|
118
|
+
|
119
|
+
selection = window.getSelection();
|
120
|
+
if (selection.getRangeAt && selection.rangeCount) {
|
121
|
+
range = selection.getRangeAt(0);
|
122
|
+
range.deleteContents();
|
123
|
+
|
124
|
+
el = doc.createElement("div");
|
125
|
+
el.innerHTML = html;
|
126
|
+
fragment = doc.createDocumentFragment();
|
127
|
+
while (el.firstChild) {
|
128
|
+
node = el.firstChild;
|
129
|
+
lastNode = fragment.appendChild(node);
|
130
|
+
}
|
131
|
+
range.insertNode(fragment);
|
132
|
+
|
133
|
+
// Preserve the selection:
|
134
|
+
if (lastNode) {
|
135
|
+
range = range.cloneRange();
|
136
|
+
range.setStartAfter(lastNode);
|
137
|
+
range.collapse(true);
|
138
|
+
selection.removeAllRanges();
|
139
|
+
selection.addRange(range);
|
140
|
+
}
|
141
|
+
}
|
142
|
+
}
|
143
|
+
|
111
144
|
MediumEditor.prototype = {
|
112
145
|
defaults: {
|
113
146
|
allowMultiParagraphSelection: true,
|
@@ -124,6 +157,8 @@ else if (typeof define === 'function' && define.amd) {
|
|
124
157
|
disableDoubleReturn: false,
|
125
158
|
disableToolbar: false,
|
126
159
|
disableEditing: false,
|
160
|
+
disableAnchorForm: false,
|
161
|
+
disablePlaceholders: false,
|
127
162
|
elementsContainer: false,
|
128
163
|
contentWindow: window,
|
129
164
|
ownerDocument: document,
|
@@ -146,6 +181,8 @@ else if (typeof define === 'function' && define.amd) {
|
|
146
181
|
isIE: ((navigator.appName === 'Microsoft Internet Explorer') || ((navigator.appName === 'Netscape') && (new RegExp('Trident/.*rv:([0-9]{1,}[.0-9]{0,})').exec(navigator.userAgent) !== null))),
|
147
182
|
|
148
183
|
init: function (elements, options) {
|
184
|
+
var uniqueId = 1;
|
185
|
+
|
149
186
|
this.options = extend(options, this.defaults);
|
150
187
|
this.setElementSelection(elements);
|
151
188
|
if (this.elements.length === 0) {
|
@@ -155,7 +192,13 @@ else if (typeof define === 'function' && define.amd) {
|
|
155
192
|
if (!this.options.elementsContainer) {
|
156
193
|
this.options.elementsContainer = document.body;
|
157
194
|
}
|
158
|
-
|
195
|
+
|
196
|
+
while (this.options.elementsContainer.querySelector('#medium-editor-toolbar-' + uniqueId)) {
|
197
|
+
uniqueId = uniqueId + 1;
|
198
|
+
}
|
199
|
+
|
200
|
+
this.id = uniqueId;
|
201
|
+
|
159
202
|
return this.setup();
|
160
203
|
},
|
161
204
|
|
@@ -166,6 +209,7 @@ else if (typeof define === 'function' && define.amd) {
|
|
166
209
|
.bindSelect()
|
167
210
|
.bindPaste()
|
168
211
|
.setPlaceholders()
|
212
|
+
.bindElementActions()
|
169
213
|
.bindWindowActions()
|
170
214
|
.passInstance();
|
171
215
|
},
|
@@ -204,7 +248,7 @@ else if (typeof define === 'function' && define.amd) {
|
|
204
248
|
this.elements[i].setAttribute('data-placeholder', this.options.placeholder);
|
205
249
|
}
|
206
250
|
this.elements[i].setAttribute('data-medium-element', true);
|
207
|
-
this.bindParagraphCreation(i)
|
251
|
+
this.bindParagraphCreation(i);
|
208
252
|
if (!this.options.disableToolbar && !this.elements[i].getAttribute('data-disable-toolbar')) {
|
209
253
|
addToolbar = true;
|
210
254
|
}
|
@@ -231,6 +275,114 @@ else if (typeof define === 'function' && define.amd) {
|
|
231
275
|
}
|
232
276
|
},
|
233
277
|
|
278
|
+
bindBlur: function(i) {
|
279
|
+
var self = this,
|
280
|
+
timeout,
|
281
|
+
blurFunction = function(e){
|
282
|
+
// If it's not part of the editor, or the toolbar
|
283
|
+
if ( e.target !== self.toolbar
|
284
|
+
&& e.target !== self.elements[0]
|
285
|
+
&& !isDescendant(self.elements[0], e.target)
|
286
|
+
&& !isDescendant(self.toolbar, e.target)
|
287
|
+
&& !isDescendant(self.anchorPreview, e.target)) {
|
288
|
+
|
289
|
+
// Activate the placeholder
|
290
|
+
if (!self.options.disablePlaceholders) {
|
291
|
+
self.placeholderWrapper(self.elements[0], e);
|
292
|
+
}
|
293
|
+
|
294
|
+
clearTimeout(timeout);
|
295
|
+
// Hide the toolbar after a small delay so we can prevent this on toolbar click
|
296
|
+
timeout = setTimeout(function(){
|
297
|
+
if ( !self.keepToolbarAlive ) {
|
298
|
+
self.hideToolbarActions();
|
299
|
+
}
|
300
|
+
}, 200);
|
301
|
+
}
|
302
|
+
};
|
303
|
+
|
304
|
+
// Hide the toolbar when focusing outside of the editor.
|
305
|
+
this.on(document.body, 'click', blurFunction, true);
|
306
|
+
this.on(document.body, 'focus', blurFunction, true);
|
307
|
+
|
308
|
+
return this;
|
309
|
+
},
|
310
|
+
|
311
|
+
bindKeypress: function(i) {
|
312
|
+
if (this.options.disablePlaceholders) {
|
313
|
+
return this;
|
314
|
+
}
|
315
|
+
|
316
|
+
var self = this;
|
317
|
+
|
318
|
+
// Set up the keypress events
|
319
|
+
this.on(this.elements[i], 'keypress', function(event){
|
320
|
+
self.placeholderWrapper(this,event);
|
321
|
+
});
|
322
|
+
|
323
|
+
return this;
|
324
|
+
},
|
325
|
+
|
326
|
+
bindClick: function(i) {
|
327
|
+
var self = this;
|
328
|
+
|
329
|
+
this.on(this.elements[i], 'click', function(){
|
330
|
+
if (!self.options.disablePlaceholders) {
|
331
|
+
// Remove placeholder
|
332
|
+
this.classList.remove('medium-editor-placeholder');
|
333
|
+
}
|
334
|
+
|
335
|
+
if ( self.options.staticToolbar ) {
|
336
|
+
self.setToolbarPosition();
|
337
|
+
}
|
338
|
+
});
|
339
|
+
|
340
|
+
return this;
|
341
|
+
},
|
342
|
+
|
343
|
+
/**
|
344
|
+
* This handles blur and keypress events on elements
|
345
|
+
* Including Placeholders, and tooldbar hiding on blur
|
346
|
+
*/
|
347
|
+
bindElementActions: function() {
|
348
|
+
var i;
|
349
|
+
|
350
|
+
for (i = 0; i < this.elements.length; i += 1) {
|
351
|
+
|
352
|
+
if (!this.options.disablePlaceholders) {
|
353
|
+
// Active all of the placeholders
|
354
|
+
this.activatePlaceholder(this.elements[i]);
|
355
|
+
}
|
356
|
+
|
357
|
+
// Bind the return and tab keypress events
|
358
|
+
this.bindReturn(i)
|
359
|
+
.bindTab(i)
|
360
|
+
.bindBlur(i)
|
361
|
+
.bindClick(i)
|
362
|
+
.bindKeypress(i);
|
363
|
+
|
364
|
+
}
|
365
|
+
|
366
|
+
return this;
|
367
|
+
},
|
368
|
+
|
369
|
+
// Two functions to handle placeholders
|
370
|
+
activatePlaceholder: function (el) {
|
371
|
+
|
372
|
+
if (!(el.querySelector('img')) &&
|
373
|
+
!(el.querySelector('blockquote')) &&
|
374
|
+
el.textContent.replace(/^\s+|\s+$/g, '') === '') {
|
375
|
+
|
376
|
+
el.classList.add('medium-editor-placeholder');
|
377
|
+
}
|
378
|
+
},
|
379
|
+
placeholderWrapper: function (el, e) {
|
380
|
+
el.classList.remove('medium-editor-placeholder');
|
381
|
+
if (e.type !== 'keypress') {
|
382
|
+
this.activatePlaceholder(el);
|
383
|
+
}
|
384
|
+
},
|
385
|
+
|
234
386
|
serialize: function () {
|
235
387
|
var i,
|
236
388
|
elementid,
|
@@ -296,9 +448,10 @@ else if (typeof define === 'function' && define.amd) {
|
|
296
448
|
bindParagraphCreation: function (index) {
|
297
449
|
var self = this;
|
298
450
|
this.on(this.elements[index], 'keypress', function (e) {
|
299
|
-
var node
|
451
|
+
var node,
|
300
452
|
tagName;
|
301
453
|
if (e.which === 32) {
|
454
|
+
node = getSelectionStart.call(self);
|
302
455
|
tagName = node.tagName.toLowerCase();
|
303
456
|
if (tagName === 'a') {
|
304
457
|
document.execCommand('unlink', false, null);
|
@@ -358,7 +511,7 @@ else if (typeof define === 'function' && define.amd) {
|
|
358
511
|
e.preventDefault();
|
359
512
|
} else if (self.options.disableDoubleReturn || this.getAttribute('data-disable-double-return')) {
|
360
513
|
var node = getSelectionStart.call(self);
|
361
|
-
if (node && node.
|
514
|
+
if (node && node.textContent === '\n') {
|
362
515
|
e.preventDefault();
|
363
516
|
}
|
364
517
|
}
|
@@ -487,13 +640,15 @@ else if (typeof define === 'function' && define.amd) {
|
|
487
640
|
}
|
488
641
|
this.toolbar = this.createToolbar();
|
489
642
|
this.keepToolbarAlive = false;
|
490
|
-
this.anchorForm = this.toolbar.querySelector('.medium-editor-toolbar-form-anchor');
|
491
|
-
this.anchorInput = this.anchorForm.querySelector('input.medium-editor-toolbar-anchor-input');
|
492
|
-
this.anchorTarget = this.anchorForm.querySelector('input.medium-editor-toolbar-anchor-target');
|
493
|
-
this.anchorButton = this.anchorForm.querySelector('input.medium-editor-toolbar-anchor-button');
|
494
643
|
this.toolbarActions = this.toolbar.querySelector('.medium-editor-toolbar-actions');
|
495
644
|
this.anchorPreview = this.createAnchorPreview();
|
496
645
|
|
646
|
+
if (!this.options.disableAnchorForm) {
|
647
|
+
this.anchorForm = this.toolbar.querySelector('.medium-editor-toolbar-form-anchor');
|
648
|
+
this.anchorInput = this.anchorForm.querySelector('input.medium-editor-toolbar-anchor-input');
|
649
|
+
this.anchorTarget = this.anchorForm.querySelector('input.medium-editor-toolbar-anchor-target');
|
650
|
+
this.anchorButton = this.anchorForm.querySelector('input.medium-editor-toolbar-anchor-button');
|
651
|
+
}
|
497
652
|
return this;
|
498
653
|
},
|
499
654
|
|
@@ -501,8 +656,17 @@ else if (typeof define === 'function' && define.amd) {
|
|
501
656
|
var toolbar = document.createElement('div');
|
502
657
|
toolbar.id = 'medium-editor-toolbar-' + this.id;
|
503
658
|
toolbar.className = 'medium-editor-toolbar';
|
659
|
+
|
660
|
+
if ( this.options.staticToolbar ) {
|
661
|
+
toolbar.className += " static-toolbar";
|
662
|
+
} else {
|
663
|
+
toolbar.className += " stalker-toolbar";
|
664
|
+
}
|
665
|
+
|
504
666
|
toolbar.appendChild(this.toolbarButtons());
|
505
|
-
|
667
|
+
if (!this.options.disableAnchorForm) {
|
668
|
+
toolbar.appendChild(this.toolbarFormAnchor());
|
669
|
+
}
|
506
670
|
this.options.elementsContainer.appendChild(toolbar);
|
507
671
|
return toolbar;
|
508
672
|
},
|
@@ -516,7 +680,7 @@ else if (typeof define === 'function' && define.amd) {
|
|
516
680
|
btn,
|
517
681
|
ext;
|
518
682
|
|
519
|
-
ul.id = 'medium-editor-toolbar-actions';
|
683
|
+
ul.id = 'medium-editor-toolbar-actions' + this.id;
|
520
684
|
ul.className = 'medium-editor-toolbar-actions clearfix';
|
521
685
|
|
522
686
|
for (i = 0; i < btns.length; i += 1) {
|
@@ -576,7 +740,7 @@ else if (typeof define === 'function' && define.amd) {
|
|
576
740
|
|
577
741
|
|
578
742
|
anchor.className = 'medium-editor-toolbar-form-anchor';
|
579
|
-
anchor.id = 'medium-editor-toolbar-form-anchor';
|
743
|
+
anchor.id = 'medium-editor-toolbar-form-anchor-' + this.id;
|
580
744
|
anchor.appendChild(input);
|
581
745
|
|
582
746
|
anchor.appendChild(save);
|
@@ -601,7 +765,7 @@ else if (typeof define === 'function' && define.amd) {
|
|
601
765
|
this.checkSelectionWrapper = function (e) {
|
602
766
|
|
603
767
|
// Do not close the toolbar when bluring the editable area and clicking into the anchor form
|
604
|
-
if (e && self.clickingIntoArchorForm(e)) {
|
768
|
+
if (!self.options.disableAnchorForm && e && self.clickingIntoArchorForm(e)) {
|
605
769
|
return false;
|
606
770
|
}
|
607
771
|
|
@@ -616,6 +780,7 @@ else if (typeof define === 'function' && define.amd) {
|
|
616
780
|
for (i = 0; i < this.elements.length; i += 1) {
|
617
781
|
this.on(this.elements[i], 'keyup', this.checkSelectionWrapper);
|
618
782
|
this.on(this.elements[i], 'blur', this.checkSelectionWrapper);
|
783
|
+
this.on(this.elements[i], 'click', this.checkSelectionWrapper);
|
619
784
|
}
|
620
785
|
return this;
|
621
786
|
},
|
@@ -627,14 +792,23 @@ else if (typeof define === 'function' && define.amd) {
|
|
627
792
|
if (this.keepToolbarAlive !== true && !this.options.disableToolbar) {
|
628
793
|
|
629
794
|
newSelection = this.options.contentWindow.getSelection();
|
630
|
-
if (newSelection.toString().trim() === '' ||
|
795
|
+
if ((!this.options.updateOnEmptySelection && newSelection.toString().trim() === '') ||
|
631
796
|
(this.options.allowMultiParagraphSelection === false && this.hasMultiParagraphs()) ||
|
632
797
|
this.selectionInContentEditableFalse()) {
|
633
|
-
|
798
|
+
|
799
|
+
if ( !this.options.staticToolbar ) {
|
800
|
+
this.hideToolbarActions();
|
801
|
+
} else if (this.anchorForm && this.anchorForm.style.display === 'block') {
|
802
|
+
this.setToolbarButtonStates();
|
803
|
+
this.showToolbarActions();
|
804
|
+
}
|
805
|
+
|
634
806
|
} else {
|
635
807
|
selectionElement = this.getSelectionElement();
|
636
808
|
if (!selectionElement || selectionElement.getAttribute('data-disable-toolbar')) {
|
637
|
-
this.
|
809
|
+
if ( !this.options.staticToolbar ) {
|
810
|
+
this.hideToolbarActions();
|
811
|
+
}
|
638
812
|
} else {
|
639
813
|
this.checkSelectionElement(newSelection, selectionElement);
|
640
814
|
}
|
@@ -672,7 +846,10 @@ else if (typeof define === 'function' && define.amd) {
|
|
672
846
|
return;
|
673
847
|
}
|
674
848
|
}
|
675
|
-
|
849
|
+
|
850
|
+
if ( !this.options.staticToolbar ) {
|
851
|
+
this.hideToolbarActions();
|
852
|
+
}
|
676
853
|
},
|
677
854
|
|
678
855
|
findMatchingSelectionParent: function(testElementFunction) {
|
@@ -716,28 +893,71 @@ else if (typeof define === 'function' && define.amd) {
|
|
716
893
|
},
|
717
894
|
|
718
895
|
setToolbarPosition: function () {
|
719
|
-
|
720
|
-
|
721
|
-
|
722
|
-
|
723
|
-
|
724
|
-
|
725
|
-
|
726
|
-
|
727
|
-
|
728
|
-
|
729
|
-
|
730
|
-
|
731
|
-
|
732
|
-
|
733
|
-
|
896
|
+
// document.documentElement for IE 9
|
897
|
+
var scrollTop = (document.documentElement && document.documentElement.scrollTop) || document.body.scrollTop,
|
898
|
+
container = this.elements[0],
|
899
|
+
containerRect = container.getBoundingClientRect(),
|
900
|
+
containerTop = containerRect.top + scrollTop,
|
901
|
+
buttonHeight = 50,
|
902
|
+
selection = window.getSelection(),
|
903
|
+
range,
|
904
|
+
boundary,
|
905
|
+
middleBoundary,
|
906
|
+
defaultLeft = (this.options.diffLeft) - (this.toolbar.offsetWidth / 2),
|
907
|
+
halfOffsetWidth = this.toolbar.offsetWidth / 2;
|
908
|
+
|
909
|
+
if ( selection.focusNode === null ) {
|
910
|
+
return this;
|
734
911
|
}
|
735
|
-
|
736
|
-
|
737
|
-
|
738
|
-
|
739
|
-
|
740
|
-
this.
|
912
|
+
|
913
|
+
this.toolbar.classList.add('medium-editor-toolbar-active');
|
914
|
+
|
915
|
+
if ( this.options.staticToolbar ) {
|
916
|
+
|
917
|
+
if ( this.options.stickyToolbar ) {
|
918
|
+
|
919
|
+
// If it's beyond the height of the editor, position it at the bottom of the editor
|
920
|
+
if ( scrollTop > (containerTop + this.elements[0].offsetHeight - this.toolbar.offsetHeight)) {
|
921
|
+
this.toolbar.style.top = (containerTop + this.elements[0].offsetHeight) + 'px';
|
922
|
+
}
|
923
|
+
// Stick the toolbar to the top of the window
|
924
|
+
else if ( scrollTop > (containerTop - this.toolbar.offsetHeight) ) {
|
925
|
+
this.toolbar.classList.add('sticky-toolbar');
|
926
|
+
this.toolbar.style.top = "0px";
|
927
|
+
}
|
928
|
+
// Normal static toolbar position
|
929
|
+
else {
|
930
|
+
this.toolbar.classList.remove('sticky-toolbar');
|
931
|
+
this.toolbar.style.top = containerTop - this.toolbar.offsetHeight + "px";
|
932
|
+
}
|
933
|
+
|
934
|
+
} else {
|
935
|
+
this.toolbar.style.top = containerTop - this.toolbar.offsetHeight + "px";
|
936
|
+
}
|
937
|
+
|
938
|
+
this.toolbar.style.left = containerRect.left + "px";
|
939
|
+
|
940
|
+
} else if (!selection.isCollapsed) {
|
941
|
+
range = selection.getRangeAt(0);
|
942
|
+
boundary = range.getBoundingClientRect();
|
943
|
+
middleBoundary = (boundary.left + boundary.right) / 2;
|
944
|
+
|
945
|
+
if (boundary.top < buttonHeight) {
|
946
|
+
this.toolbar.classList.add('medium-toolbar-arrow-over');
|
947
|
+
this.toolbar.classList.remove('medium-toolbar-arrow-under');
|
948
|
+
this.toolbar.style.top = buttonHeight + boundary.bottom - this.options.diffTop + this.options.contentWindow.pageYOffset - this.toolbar.offsetHeight + 'px';
|
949
|
+
} else {
|
950
|
+
this.toolbar.classList.add('medium-toolbar-arrow-under');
|
951
|
+
this.toolbar.classList.remove('medium-toolbar-arrow-over');
|
952
|
+
this.toolbar.style.top = boundary.top + this.options.diffTop + this.options.contentWindow.pageYOffset - this.toolbar.offsetHeight + 'px';
|
953
|
+
}
|
954
|
+
if (middleBoundary < halfOffsetWidth) {
|
955
|
+
this.toolbar.style.left = defaultLeft + halfOffsetWidth + 'px';
|
956
|
+
} else if ((this.options.contentWindow.innerWidth - middleBoundary) < halfOffsetWidth) {
|
957
|
+
this.toolbar.style.left = this.options.contentWindow.innerWidth + defaultLeft - halfOffsetWidth + 'px';
|
958
|
+
} else {
|
959
|
+
this.toolbar.style.left = defaultLeft + middleBoundary + 'px';
|
960
|
+
}
|
741
961
|
}
|
742
962
|
|
743
963
|
this.hideAnchorPreview();
|
@@ -817,7 +1037,9 @@ else if (typeof define === 'function' && define.amd) {
|
|
817
1037
|
this.setToolbarPosition();
|
818
1038
|
this.setToolbarButtonStates();
|
819
1039
|
} else if (action === 'anchor') {
|
820
|
-
this.
|
1040
|
+
if (!this.options.disableAnchorForm) {
|
1041
|
+
this.triggerAnchorAction(e);
|
1042
|
+
}
|
821
1043
|
} else if (action === 'image') {
|
822
1044
|
this.options.ownerDocument.execCommand('insertImage', false, this.options.contentWindow.getSelection());
|
823
1045
|
} else {
|
@@ -852,7 +1074,7 @@ else if (typeof define === 'function' && define.amd) {
|
|
852
1074
|
if (selectedParentElement.tagName &&
|
853
1075
|
selectedParentElement.tagName.toLowerCase() === 'a') {
|
854
1076
|
this.options.ownerDocument.execCommand('unlink', false, null);
|
855
|
-
} else {
|
1077
|
+
} else if (this.anchorForm) {
|
856
1078
|
if (this.anchorForm.style.display === 'block') {
|
857
1079
|
this.showToolbarActions();
|
858
1080
|
} else {
|
@@ -917,15 +1139,20 @@ else if (typeof define === 'function' && define.amd) {
|
|
917
1139
|
|
918
1140
|
hideToolbarActions: function () {
|
919
1141
|
this.keepToolbarAlive = false;
|
920
|
-
if (this.toolbar !== undefined) {
|
1142
|
+
if (this.toolbar !== undefined && this.toolbar.classList.contains('medium-editor-toolbar-active')) {
|
921
1143
|
this.toolbar.classList.remove('medium-editor-toolbar-active');
|
1144
|
+
if (this.onHideToolbar) {
|
1145
|
+
this.onHideToolbar();
|
1146
|
+
}
|
922
1147
|
}
|
923
1148
|
},
|
924
1149
|
|
925
1150
|
showToolbarActions: function () {
|
926
1151
|
var self = this,
|
927
1152
|
timer;
|
928
|
-
this.anchorForm
|
1153
|
+
if (this.anchorForm) {
|
1154
|
+
this.anchorForm.style.display = 'none';
|
1155
|
+
}
|
929
1156
|
this.toolbarActions.style.display = 'block';
|
930
1157
|
this.keepToolbarAlive = false;
|
931
1158
|
clearTimeout(timer);
|
@@ -945,6 +1172,10 @@ else if (typeof define === 'function' && define.amd) {
|
|
945
1172
|
},
|
946
1173
|
|
947
1174
|
showAnchorForm: function (link_value) {
|
1175
|
+
if (!this.anchorForm) {
|
1176
|
+
return;
|
1177
|
+
}
|
1178
|
+
|
948
1179
|
this.toolbarActions.style.display = 'none';
|
949
1180
|
this.saveSelection();
|
950
1181
|
this.anchorForm.style.display = 'block';
|
@@ -955,6 +1186,10 @@ else if (typeof define === 'function' && define.amd) {
|
|
955
1186
|
},
|
956
1187
|
|
957
1188
|
bindAnchorForm: function () {
|
1189
|
+
if (!this.anchorForm) {
|
1190
|
+
return this;
|
1191
|
+
}
|
1192
|
+
|
958
1193
|
var linkCancel = this.anchorForm.querySelector('a.medium-editor-toobar-anchor-close'),
|
959
1194
|
linkSave = this.anchorForm.querySelector('a.medium-editor-toobar-anchor-save'),
|
960
1195
|
self = this;
|
@@ -1140,7 +1375,7 @@ else if (typeof define === 'function' && define.amd) {
|
|
1140
1375
|
},
|
1141
1376
|
|
1142
1377
|
anchorPreviewClickHandler: function (e) {
|
1143
|
-
if (this.activeAnchor) {
|
1378
|
+
if (!this.options.disableAnchorForm && this.activeAnchor) {
|
1144
1379
|
|
1145
1380
|
var self = this,
|
1146
1381
|
range = this.options.ownerDocument.createRange(),
|
@@ -1294,6 +1529,18 @@ else if (typeof define === 'function' && define.amd) {
|
|
1294
1529
|
}
|
1295
1530
|
}, 100);
|
1296
1531
|
};
|
1532
|
+
|
1533
|
+
// Add a scroll event for sticky toolbar
|
1534
|
+
if ( this.options.staticToolbar && this.options.stickyToolbar ) {
|
1535
|
+
|
1536
|
+
// On scroll, re-position the toolbar
|
1537
|
+
this.on(window, 'scroll', function() {
|
1538
|
+
if (self.toolbar && self.toolbar.classList.contains('medium-editor-toolbar-active')) {
|
1539
|
+
self.setToolbarPosition();
|
1540
|
+
}
|
1541
|
+
}, true);
|
1542
|
+
}
|
1543
|
+
|
1297
1544
|
this.on(this.options.contentWindow, 'resize', this.windowResizeHandler);
|
1298
1545
|
return this;
|
1299
1546
|
},
|
@@ -1340,21 +1587,34 @@ else if (typeof define === 'function' && define.amd) {
|
|
1340
1587
|
this.pasteWrapper = function (e) {
|
1341
1588
|
var paragraphs,
|
1342
1589
|
html = '',
|
1343
|
-
p
|
1590
|
+
p,
|
1591
|
+
dataFormatHTML = 'text/html',
|
1592
|
+
dataFormatPlain = 'text/plain';
|
1344
1593
|
|
1345
1594
|
this.classList.remove('medium-editor-placeholder');
|
1346
1595
|
if (!self.options.forcePlainText && !self.options.cleanPastedHTML) {
|
1347
1596
|
return this;
|
1348
1597
|
}
|
1349
1598
|
|
1599
|
+
if (window.clipboardData && e.clipboardData === undefined) {
|
1600
|
+
e.clipboardData = window.clipboardData;
|
1601
|
+
// If window.clipboardData exists, but e.clipboardData doesn't exist,
|
1602
|
+
// we're probably in IE. IE only has two possibilities for clipboard
|
1603
|
+
// data format: 'Text' and 'URL'.
|
1604
|
+
//
|
1605
|
+
// Of the two, we want 'Text':
|
1606
|
+
dataFormatHTML = 'Text';
|
1607
|
+
dataFormatPlain = 'Text';
|
1608
|
+
}
|
1609
|
+
|
1350
1610
|
if (e.clipboardData && e.clipboardData.getData && !e.defaultPrevented) {
|
1351
1611
|
e.preventDefault();
|
1352
1612
|
|
1353
|
-
if (self.options.cleanPastedHTML && e.clipboardData.getData(
|
1354
|
-
return self.cleanPaste(e.clipboardData.getData(
|
1613
|
+
if (self.options.cleanPastedHTML && e.clipboardData.getData(dataFormatHTML)) {
|
1614
|
+
return self.cleanPaste(e.clipboardData.getData(dataFormatHTML));
|
1355
1615
|
}
|
1356
1616
|
if (!(self.options.disableReturn || this.getAttribute('data-disable-return'))) {
|
1357
|
-
paragraphs = e.clipboardData.getData(
|
1617
|
+
paragraphs = e.clipboardData.getData(dataFormatPlain).split(/[\r\n]/g);
|
1358
1618
|
for (p = 0; p < paragraphs.length; p += 1) {
|
1359
1619
|
if (paragraphs[p] !== '') {
|
1360
1620
|
if (navigator.userAgent.match(/firefox/i) && p === 0) {
|
@@ -1364,10 +1624,10 @@ else if (typeof define === 'function' && define.amd) {
|
|
1364
1624
|
}
|
1365
1625
|
}
|
1366
1626
|
}
|
1367
|
-
self.options.ownerDocument
|
1627
|
+
insertHTMLCommand(self.options.ownerDocument, html);
|
1368
1628
|
} else {
|
1369
|
-
html = self.htmlEntities(e.clipboardData.getData(
|
1370
|
-
self.options.ownerDocument
|
1629
|
+
html = self.htmlEntities(e.clipboardData.getData(dataFormatPlain));
|
1630
|
+
insertHTMLCommand(self.options.ownerDocument, html);
|
1371
1631
|
}
|
1372
1632
|
}
|
1373
1633
|
};
|
@@ -1378,6 +1638,10 @@ else if (typeof define === 'function' && define.amd) {
|
|
1378
1638
|
},
|
1379
1639
|
|
1380
1640
|
setPlaceholders: function () {
|
1641
|
+
if (this.options.disablePlaceholders) {
|
1642
|
+
return this;
|
1643
|
+
}
|
1644
|
+
|
1381
1645
|
var i,
|
1382
1646
|
activatePlaceholder = function (el) {
|
1383
1647
|
if (!(el.querySelector('img')) &&
|
@@ -1515,7 +1779,7 @@ else if (typeof define === 'function' && define.amd) {
|
|
1515
1779
|
return (el && (el.tagName.toLowerCase() === 'p' || el.tagName.toLowerCase() === 'div'));
|
1516
1780
|
},
|
1517
1781
|
filterCommonBlocks: function (el) {
|
1518
|
-
if (/^\s*$/.test(el.
|
1782
|
+
if (/^\s*$/.test(el.textContent)) {
|
1519
1783
|
el.parentNode.removeChild(el);
|
1520
1784
|
}
|
1521
1785
|
},
|
@@ -1585,7 +1849,7 @@ else if (typeof define === 'function' && define.amd) {
|
|
1585
1849
|
if (/^\s*$/.test()) {
|
1586
1850
|
el.parentNode.removeChild(el);
|
1587
1851
|
} else {
|
1588
|
-
el.parentNode.replaceChild(this.options.ownerDocument.createTextNode(el.
|
1852
|
+
el.parentNode.replaceChild(this.options.ownerDocument.createTextNode(el.textContent), el);
|
1589
1853
|
}
|
1590
1854
|
|
1591
1855
|
}
|
@@ -116,12 +116,17 @@
|
|
116
116
|
cursor: pointer; }
|
117
117
|
|
118
118
|
.medium-editor-toolbar-active, .medium-editor-anchor-preview-active {
|
119
|
-
visibility: visible;
|
119
|
+
visibility: visible; }
|
120
|
+
|
121
|
+
.sticky-toolbar {
|
122
|
+
position: fixed;
|
123
|
+
top: 1px; }
|
124
|
+
|
125
|
+
.stalker-toolbar {
|
120
126
|
-webkit-animation: pop-upwards 160ms forwards linear;
|
121
127
|
-ms-animation: pop-upwards 160ms forwards linear;
|
122
128
|
animation: pop-upwards 160ms forwards linear;
|
123
|
-
|
124
|
-
transition: top 0.075s ease-out, left 0.075s ease-out; }
|
129
|
+
transition: top 0.075s ease-out, left 0.075s ease-out; }
|
125
130
|
|
126
131
|
.medium-editor-action-bold {
|
127
132
|
font-weight: bolder; }
|
@@ -9,8 +9,7 @@
|
|
9
9
|
border: 1px solid #357ebd;
|
10
10
|
background-color: #428bca;
|
11
11
|
border-radius: 4px;
|
12
|
-
|
13
|
-
transition: top 0.075s ease-out, left 0.075s ease-out; }
|
12
|
+
transition: top 0.075s ease-out, left 0.075s ease-out; }
|
14
13
|
.medium-editor-toolbar li button {
|
15
14
|
min-width: 60px;
|
16
15
|
height: 60px;
|
@@ -19,8 +18,7 @@
|
|
19
18
|
background-color: transparent;
|
20
19
|
color: #fff;
|
21
20
|
box-sizing: border-box;
|
22
|
-
|
23
|
-
transition: background-color 0.2s ease-in, color 0.2s ease-in; }
|
21
|
+
transition: background-color 0.2s ease-in, color 0.2s ease-in; }
|
24
22
|
.medium-editor-toolbar li button:hover {
|
25
23
|
background-color: #3276b1;
|
26
24
|
color: #fff; }
|
@@ -9,12 +9,10 @@
|
|
9
9
|
.medium-editor-toolbar {
|
10
10
|
border: 1px solid #000;
|
11
11
|
background-color: #242424;
|
12
|
-
background: -webkit-linear-gradient(bottom, #242424, rgba(36, 36, 36, 0.75));
|
13
12
|
background: linear-gradient(bottom, #242424, rgba(36, 36, 36, 0.75));
|
14
13
|
border-radius: 5px;
|
15
14
|
box-shadow: 0 0 3px #000;
|
16
|
-
|
17
|
-
transition: top 0.075s ease-out, left 0.075s ease-out; }
|
15
|
+
transition: top 0.075s ease-out, left 0.075s ease-out; }
|
18
16
|
.medium-editor-toolbar li button {
|
19
17
|
min-width: 50px;
|
20
18
|
height: 50px;
|
@@ -24,11 +22,9 @@
|
|
24
22
|
border-left: 1px solid rgba(255, 255, 255, 0.1);
|
25
23
|
background-color: #242424;
|
26
24
|
color: #fff;
|
27
|
-
background: -webkit-linear-gradient(bottom, #242424, rgba(36, 36, 36, 0.89));
|
28
25
|
background: linear-gradient(bottom, #242424, rgba(36, 36, 36, 0.89));
|
29
26
|
box-shadow: 0 2px 2px rgba(0, 0, 0, 0.3);
|
30
|
-
|
31
|
-
transition: background-color 0.2s ease-in; }
|
27
|
+
transition: background-color 0.2s ease-in; }
|
32
28
|
.medium-editor-toolbar li button:hover {
|
33
29
|
background-color: #000;
|
34
30
|
color: yellow; }
|
@@ -41,7 +37,6 @@
|
|
41
37
|
.medium-editor-toolbar li .medium-editor-button-active {
|
42
38
|
background-color: #000;
|
43
39
|
color: #fff;
|
44
|
-
background: -webkit-linear-gradient(bottom, #242424, rgba(0, 0, 0, 0.89));
|
45
40
|
background: linear-gradient(bottom, #242424, rgba(0, 0, 0, 0.89)); }
|
46
41
|
|
47
42
|
.medium-editor-toolbar-form-anchor {
|
@@ -17,8 +17,7 @@
|
|
17
17
|
border-right: 1px solid #9ccea6;
|
18
18
|
background-color: transparent;
|
19
19
|
color: #fff;
|
20
|
-
|
21
|
-
transition: background-color 0.2s ease-in, color 0.2s ease-in; }
|
20
|
+
transition: background-color 0.2s ease-in, color 0.2s ease-in; }
|
22
21
|
.medium-editor-toolbar li button:hover {
|
23
22
|
background-color: #346a3f;
|
24
23
|
color: #fff; }
|
@@ -5,7 +5,6 @@
|
|
5
5
|
border: 1px solid #cdd6e0;
|
6
6
|
background-color: #dee7f0;
|
7
7
|
background-color: rgba(222, 231, 240, 0.95);
|
8
|
-
background: -webkit-linear-gradient(bottom, #dee7f0, #ffffff);
|
9
8
|
background: linear-gradient(bottom, #dee7f0, #ffffff);
|
10
9
|
border-radius: 2px;
|
11
10
|
box-shadow: 0 2px 6px rgba(0, 0, 0, 0.45); }
|
@@ -16,8 +15,7 @@
|
|
16
15
|
border-right: 1px solid #cdd6e0;
|
17
16
|
background-color: transparent;
|
18
17
|
color: #40648a;
|
19
|
-
|
20
|
-
transition: background-color 0.2s ease-in, color 0.2s ease-in; }
|
18
|
+
transition: background-color 0.2s ease-in, color 0.2s ease-in; }
|
21
19
|
.medium-editor-toolbar li button:hover {
|
22
20
|
background-color: #5c90c7;
|
23
21
|
background-color: rgba(92, 144, 199, 0.45);
|
@@ -32,7 +30,6 @@
|
|
32
30
|
background-color: #5c90c7;
|
33
31
|
background-color: rgba(92, 144, 199, 0.45);
|
34
32
|
color: #000;
|
35
|
-
background: -webkit-linear-gradient(bottom, #dee7f0, rgba(0, 0, 0, 0.1));
|
36
33
|
background: linear-gradient(bottom, #dee7f0, rgba(0, 0, 0, 0.1)); }
|
37
34
|
|
38
35
|
.medium-editor-toolbar-form-anchor {
|
@@ -14,11 +14,9 @@
|
|
14
14
|
background-color: transparent;
|
15
15
|
color: #889aac;
|
16
16
|
box-shadow: inset 0 0 3px #f8f8e6;
|
17
|
-
background: -webkit-linear-gradient(top, #fff, rgba(0, 0, 0, 0.1));
|
18
17
|
background: linear-gradient(top, #fff, rgba(0, 0, 0, 0.1));
|
19
18
|
text-shadow: 1px 4px 6px #def, 0 0 0 #000, 1px 4px 6px #def;
|
20
|
-
|
21
|
-
transition: background-color 0.2s ease-in; }
|
19
|
+
transition: background-color 0.2s ease-in; }
|
22
20
|
.medium-editor-toolbar li button:hover {
|
23
21
|
background-color: #fff;
|
24
22
|
color: #000;
|
@@ -33,7 +31,6 @@
|
|
33
31
|
background-color: #ccc;
|
34
32
|
color: #000;
|
35
33
|
color: rgba(0, 0, 0, 0.8);
|
36
|
-
background: -webkit-linear-gradient(bottom, #fff, rgba(0, 0, 0, 0.2));
|
37
34
|
background: linear-gradient(bottom, #fff, rgba(0, 0, 0, 0.2)); }
|
38
35
|
|
39
36
|
.medium-editor-toolbar-form-anchor {
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: medium-editor-rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ahmet Sezgin Duran
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2015-01-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: railties
|
@@ -83,7 +83,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
83
83
|
version: '0'
|
84
84
|
requirements: []
|
85
85
|
rubyforge_project:
|
86
|
-
rubygems_version: 2.4.
|
86
|
+
rubygems_version: 2.4.4
|
87
87
|
signing_key:
|
88
88
|
specification_version: 4
|
89
89
|
summary: Medium Editor integrated in Rails asset pipeline
|