bootsy 2.0.8 → 2.0.9
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/README.md +1 -1
- data/app/assets/javascripts/bootsy/wysihtml5.js +409 -408
- data/lib/bootsy/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0700c9ebccb580e9c29f62368ff77fd0f1653a6f
|
4
|
+
data.tar.gz: b2c537eb973c476363fbd6bf771c8841ba9e3a9b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ace2b6003ce07536e4993dc83a4dfd693b4da7e7ea6abc1987682e5a2cc4603eb7be47cef062b04761c9a82b837aaf7764f9867ad4b11cb3923531e68912da47
|
7
|
+
data.tar.gz: ecddbe09bc4c69e46550e254bab66de1736dec64ba15790ba2b1024f6d63f1411048dcc92a938c395da210d2d28e98eef21be6816473f9c2742e6519882553c9
|
data/README.md
CHANGED
@@ -10,7 +10,7 @@
|
|
10
10
|
*/
|
11
11
|
var wysihtml5 = {
|
12
12
|
version: "0.3.0",
|
13
|
-
|
13
|
+
|
14
14
|
// namespaces
|
15
15
|
commands: {},
|
16
16
|
dom: {},
|
@@ -19,14 +19,14 @@ var wysihtml5 = {
|
|
19
19
|
lang: {},
|
20
20
|
selection: {},
|
21
21
|
views: {},
|
22
|
-
|
22
|
+
|
23
23
|
INVISIBLE_SPACE: "\uFEFF",
|
24
|
-
|
24
|
+
|
25
25
|
EMPTY_FUNCTION: function() {},
|
26
|
-
|
26
|
+
|
27
27
|
ELEMENT_NODE: 1,
|
28
28
|
TEXT_NODE: 3,
|
29
|
-
|
29
|
+
|
30
30
|
BACKSPACE_KEY: 8,
|
31
31
|
ENTER_KEY: 13,
|
32
32
|
ESCAPE_KEY: 27,
|
@@ -701,7 +701,7 @@ rangy.createModule("DomUtil", function(api, module) {
|
|
701
701
|
var dom = api.dom;
|
702
702
|
var DomPosition = dom.DomPosition;
|
703
703
|
var DOMException = api.DOMException;
|
704
|
-
|
704
|
+
|
705
705
|
/*----------------------------------------------------------------------------------------------------------------*/
|
706
706
|
|
707
707
|
// Utility functions
|
@@ -2972,7 +2972,8 @@ rangy.createModule("DomUtil", function(api, module) {
|
|
2972
2972
|
if (implementsControlRange && implementsDocSelection && sel.docSelection.type == CONTROL) {
|
2973
2973
|
updateControlSelection(sel);
|
2974
2974
|
} else {
|
2975
|
-
|
2975
|
+
// patched for FF here - @glebm
|
2976
|
+
sel._ranges.length = sel.rangeCount = (sel.nativeSelection ? sel.nativeSelection.rangeCount : 0);
|
2976
2977
|
if (sel.rangeCount) {
|
2977
2978
|
for (var i = 0, len = sel.rangeCount; i < len; ++i) {
|
2978
2979
|
sel._ranges[i] = new api.WrappedRange(sel.nativeSelection.getRangeAt(i));
|
@@ -3255,7 +3256,7 @@ var Base = function() {
|
|
3255
3256
|
|
3256
3257
|
Base.extend = function(_instance, _static) { // subclass
|
3257
3258
|
var extend = Base.prototype.extend;
|
3258
|
-
|
3259
|
+
|
3259
3260
|
// build the prototype
|
3260
3261
|
Base._prototyping = true;
|
3261
3262
|
var proto = new this;
|
@@ -3264,7 +3265,7 @@ Base.extend = function(_instance, _static) { // subclass
|
|
3264
3265
|
// call this method from any other method to invoke that method's ancestor
|
3265
3266
|
};
|
3266
3267
|
delete Base._prototyping;
|
3267
|
-
|
3268
|
+
|
3268
3269
|
// create the wrapper for the constructor function
|
3269
3270
|
//var constructor = proto.constructor.valueOf(); //-dean
|
3270
3271
|
var constructor = proto.constructor;
|
@@ -3279,7 +3280,7 @@ Base.extend = function(_instance, _static) { // subclass
|
|
3279
3280
|
}
|
3280
3281
|
}
|
3281
3282
|
};
|
3282
|
-
|
3283
|
+
|
3283
3284
|
// build the class interface
|
3284
3285
|
klass.ancestor = this;
|
3285
3286
|
klass.extend = this.extend;
|
@@ -3297,7 +3298,7 @@ Base.extend = function(_instance, _static) { // subclass
|
|
3297
3298
|
return klass;
|
3298
3299
|
};
|
3299
3300
|
|
3300
|
-
Base.prototype = {
|
3301
|
+
Base.prototype = {
|
3301
3302
|
extend: function(source, value) {
|
3302
3303
|
if (arguments.length > 1) { // extending with a name/value pair
|
3303
3304
|
var ancestor = this[source];
|
@@ -3356,7 +3357,7 @@ Base = Base.extend({
|
|
3356
3357
|
}, {
|
3357
3358
|
ancestor: Object,
|
3358
3359
|
version: "1.1",
|
3359
|
-
|
3360
|
+
|
3360
3361
|
forEach: function(object, block, context) {
|
3361
3362
|
for (var key in object) {
|
3362
3363
|
if (this.prototype[key] === undefined) {
|
@@ -3364,7 +3365,7 @@ Base = Base.extend({
|
|
3364
3365
|
}
|
3365
3366
|
}
|
3366
3367
|
},
|
3367
|
-
|
3368
|
+
|
3368
3369
|
implement: function() {
|
3369
3370
|
for (var i = 0; i < arguments.length; i++) {
|
3370
3371
|
if (typeof arguments[i] == "function") {
|
@@ -3377,7 +3378,7 @@ Base = Base.extend({
|
|
3377
3378
|
}
|
3378
3379
|
return this;
|
3379
3380
|
},
|
3380
|
-
|
3381
|
+
|
3381
3382
|
toString: function() {
|
3382
3383
|
return String(this.valueOf());
|
3383
3384
|
}
|
@@ -3393,15 +3394,15 @@ wysihtml5.browser = (function() {
|
|
3393
3394
|
isWebKit = userAgent.indexOf("AppleWebKit/") !== -1,
|
3394
3395
|
isChrome = userAgent.indexOf("Chrome/") !== -1,
|
3395
3396
|
isOpera = userAgent.indexOf("Opera/") !== -1;
|
3396
|
-
|
3397
|
+
|
3397
3398
|
function iosVersion(userAgent) {
|
3398
3399
|
return ((/ipad|iphone|ipod/.test(userAgent) && userAgent.match(/ os (\d+).+? like mac os x/)) || [, 0])[1];
|
3399
3400
|
}
|
3400
|
-
|
3401
|
+
|
3401
3402
|
return {
|
3402
3403
|
// Static variable needed, publicly accessible, to be able override it in unit tests
|
3403
3404
|
USER_AGENT: userAgent,
|
3404
|
-
|
3405
|
+
|
3405
3406
|
/**
|
3406
3407
|
* Exclude browsers that are not capable of displaying and handling
|
3407
3408
|
* contentEditable as desired:
|
@@ -3420,22 +3421,22 @@ wysihtml5.browser = (function() {
|
|
3420
3421
|
hasQuerySelectorSupport = document.querySelector && document.querySelectorAll,
|
3421
3422
|
// contentEditable is unusable in mobile browsers (tested iOS 4.2.2, Android 2.2, Opera Mobile, WebOS 3.05)
|
3422
3423
|
isIncompatibleMobileBrowser = (this.isIos() && iosVersion(userAgent) < 5) || userAgent.indexOf("opera mobi") !== -1 || userAgent.indexOf("hpwos/") !== -1;
|
3423
|
-
|
3424
|
+
|
3424
3425
|
return hasContentEditableSupport
|
3425
3426
|
&& hasEditingApiSupport
|
3426
3427
|
&& hasQuerySelectorSupport
|
3427
3428
|
&& !isIncompatibleMobileBrowser;
|
3428
3429
|
},
|
3429
|
-
|
3430
|
+
|
3430
3431
|
isTouchDevice: function() {
|
3431
3432
|
return this.supportsEvent("touchmove");
|
3432
3433
|
},
|
3433
|
-
|
3434
|
+
|
3434
3435
|
isIos: function() {
|
3435
3436
|
var userAgent = this.USER_AGENT.toLowerCase();
|
3436
3437
|
return userAgent.indexOf("webkit") !== -1 && userAgent.indexOf("mobile") !== -1;
|
3437
3438
|
},
|
3438
|
-
|
3439
|
+
|
3439
3440
|
/**
|
3440
3441
|
* Whether the browser supports sandboxed iframes
|
3441
3442
|
* Currently only IE 6+ offers such feature <iframe security="restricted">
|
@@ -3474,7 +3475,7 @@ wysihtml5.browser = (function() {
|
|
3474
3475
|
hasCurrentStyleProperty: function() {
|
3475
3476
|
return "currentStyle" in testElement;
|
3476
3477
|
},
|
3477
|
-
|
3478
|
+
|
3478
3479
|
/**
|
3479
3480
|
* Firefox on OSX navigates through history when hitting CMD + Arrow right/left
|
3480
3481
|
*/
|
@@ -3506,7 +3507,7 @@ wysihtml5.browser = (function() {
|
|
3506
3507
|
supportsEventsInIframeCorrectly: function() {
|
3507
3508
|
return !isOpera;
|
3508
3509
|
},
|
3509
|
-
|
3510
|
+
|
3510
3511
|
/**
|
3511
3512
|
* Everything below IE9 doesn't know how to treat HTML5 tags
|
3512
3513
|
*
|
@@ -3545,7 +3546,7 @@ wysihtml5.browser = (function() {
|
|
3545
3546
|
"insertUnorderedList": isIE || isOpera || isWebKit,
|
3546
3547
|
"insertOrderedList": isIE || isOpera || isWebKit
|
3547
3548
|
};
|
3548
|
-
|
3549
|
+
|
3549
3550
|
// Firefox throws errors for queryCommandSupported, so we have to build up our own object of supported commands
|
3550
3551
|
var supported = {
|
3551
3552
|
"insertHTML": isGecko
|
@@ -3662,14 +3663,14 @@ wysihtml5.browser = (function() {
|
|
3662
3663
|
supportsSelectionModify: function() {
|
3663
3664
|
return "getSelection" in window && "modify" in window.getSelection();
|
3664
3665
|
},
|
3665
|
-
|
3666
|
+
|
3666
3667
|
/**
|
3667
3668
|
* Opera needs a white space after a <br> in order to position the caret correctly
|
3668
3669
|
*/
|
3669
3670
|
needsSpaceAfterLineBreak: function() {
|
3670
3671
|
return isOpera;
|
3671
3672
|
},
|
3672
|
-
|
3673
|
+
|
3673
3674
|
/**
|
3674
3675
|
* Whether the browser supports the speech api on the given element
|
3675
3676
|
* See http://mikepultz.com/2011/03/accessing-google-speech-api-chrome-11/
|
@@ -3684,7 +3685,7 @@ wysihtml5.browser = (function() {
|
|
3684
3685
|
var chromeVersion = userAgent.match(/Chrome\/(\d+)/) || [, 0];
|
3685
3686
|
return chromeVersion[1] >= 11 && ("onwebkitspeechchange" in input || "speech" in input);
|
3686
3687
|
},
|
3687
|
-
|
3688
|
+
|
3688
3689
|
/**
|
3689
3690
|
* IE9 crashes when setting a getter via Object.defineProperty on XMLHttpRequest or XDomainRequest
|
3690
3691
|
* See https://connect.microsoft.com/ie/feedback/details/650112
|
@@ -3693,21 +3694,21 @@ wysihtml5.browser = (function() {
|
|
3693
3694
|
crashesWhenDefineProperty: function(property) {
|
3694
3695
|
return isIE && (property === "XMLHttpRequest" || property === "XDomainRequest");
|
3695
3696
|
},
|
3696
|
-
|
3697
|
+
|
3697
3698
|
/**
|
3698
3699
|
* IE is the only browser who fires the "focus" event not immediately when .focus() is called on an element
|
3699
3700
|
*/
|
3700
3701
|
doesAsyncFocus: function() {
|
3701
3702
|
return isIE;
|
3702
3703
|
},
|
3703
|
-
|
3704
|
+
|
3704
3705
|
/**
|
3705
3706
|
* In IE it's impssible for the user and for the selection library to set the caret after an <img> when it's the lastChild in the document
|
3706
3707
|
*/
|
3707
3708
|
hasProblemsSettingCaretAfterImg: function() {
|
3708
3709
|
return isIE;
|
3709
3710
|
},
|
3710
|
-
|
3711
|
+
|
3711
3712
|
hasUndoInContextMenu: function() {
|
3712
3713
|
return isGecko || isChrome || isOpera;
|
3713
3714
|
}
|
@@ -3731,7 +3732,7 @@ wysihtml5.browser = (function() {
|
|
3731
3732
|
return false;
|
3732
3733
|
}
|
3733
3734
|
},
|
3734
|
-
|
3735
|
+
|
3735
3736
|
/**
|
3736
3737
|
* Substract one array from another
|
3737
3738
|
*
|
@@ -3751,10 +3752,10 @@ wysihtml5.browser = (function() {
|
|
3751
3752
|
}
|
3752
3753
|
return newArr;
|
3753
3754
|
},
|
3754
|
-
|
3755
|
+
|
3755
3756
|
/**
|
3756
3757
|
* Return a clean native array
|
3757
|
-
*
|
3758
|
+
*
|
3758
3759
|
* Following will convert a Live NodeList to a proper Array
|
3759
3760
|
* @example
|
3760
3761
|
* var childNodes = wysihtml5.lang.array(document.body.childNodes).get();
|
@@ -3825,11 +3826,11 @@ wysihtml5.browser = (function() {
|
|
3825
3826
|
}
|
3826
3827
|
return this;
|
3827
3828
|
},
|
3828
|
-
|
3829
|
+
|
3829
3830
|
get: function() {
|
3830
3831
|
return obj;
|
3831
3832
|
},
|
3832
|
-
|
3833
|
+
|
3833
3834
|
/**
|
3834
3835
|
* @example
|
3835
3836
|
* wysihtml5.lang.object({ foo: 1 }).clone();
|
@@ -3843,7 +3844,7 @@ wysihtml5.browser = (function() {
|
|
3843
3844
|
}
|
3844
3845
|
return newObj;
|
3845
3846
|
},
|
3846
|
-
|
3847
|
+
|
3847
3848
|
/**
|
3848
3849
|
* @example
|
3849
3850
|
* wysihtml5.lang.object([]).isArray();
|
@@ -3867,7 +3868,7 @@ wysihtml5.browser = (function() {
|
|
3867
3868
|
trim: function() {
|
3868
3869
|
return str.replace(WHITE_SPACE_START, "").replace(WHITE_SPACE_END, "");
|
3869
3870
|
},
|
3870
|
-
|
3871
|
+
|
3871
3872
|
/**
|
3872
3873
|
* @example
|
3873
3874
|
* wysihtml5.lang.string("Hello #{name}").interpolate({ name: "Christopher" });
|
@@ -3879,7 +3880,7 @@ wysihtml5.browser = (function() {
|
|
3879
3880
|
}
|
3880
3881
|
return str;
|
3881
3882
|
},
|
3882
|
-
|
3883
|
+
|
3883
3884
|
/**
|
3884
3885
|
* @example
|
3885
3886
|
* wysihtml5.lang.string("Hello Tom").replace("Tom").with("Hans");
|
@@ -3923,7 +3924,7 @@ wysihtml5.browser = (function() {
|
|
3923
3924
|
TRAILING_CHAR_REG_EXP = /([^\w\/\-](,?))$/i,
|
3924
3925
|
MAX_DISPLAY_LENGTH = 100,
|
3925
3926
|
BRACKETS = { ")": "(", "]": "[", "}": "{" };
|
3926
|
-
|
3927
|
+
|
3927
3928
|
function autoLink(element) {
|
3928
3929
|
if (_hasParentThatShouldBeIgnored(element)) {
|
3929
3930
|
return element;
|
@@ -3935,7 +3936,7 @@ wysihtml5.browser = (function() {
|
|
3935
3936
|
|
3936
3937
|
return _parseNode(element);
|
3937
3938
|
}
|
3938
|
-
|
3939
|
+
|
3939
3940
|
/**
|
3940
3941
|
* This is basically a rebuild of
|
3941
3942
|
* the rails auto_link_urls text helper
|
@@ -3959,11 +3960,11 @@ wysihtml5.browser = (function() {
|
|
3959
3960
|
if (realUrl.substr(0, 4) === "www.") {
|
3960
3961
|
realUrl = "http://" + realUrl;
|
3961
3962
|
}
|
3962
|
-
|
3963
|
+
|
3963
3964
|
return '<a href="' + realUrl + '">' + displayUrl + '</a>' + punctuation;
|
3964
3965
|
});
|
3965
3966
|
}
|
3966
|
-
|
3967
|
+
|
3967
3968
|
/**
|
3968
3969
|
* Creates or (if already cached) returns a temp element
|
3969
3970
|
* for the given document object
|
@@ -3975,26 +3976,26 @@ wysihtml5.browser = (function() {
|
|
3975
3976
|
}
|
3976
3977
|
return tempElement;
|
3977
3978
|
}
|
3978
|
-
|
3979
|
+
|
3979
3980
|
/**
|
3980
3981
|
* Replaces the original text nodes with the newly auto-linked dom tree
|
3981
3982
|
*/
|
3982
3983
|
function _wrapMatchesInNode(textNode) {
|
3983
3984
|
var parentNode = textNode.parentNode,
|
3984
3985
|
tempElement = _getTempElement(parentNode.ownerDocument);
|
3985
|
-
|
3986
|
+
|
3986
3987
|
// We need to insert an empty/temporary <span /> to fix IE quirks
|
3987
3988
|
// Elsewise IE would strip white space in the beginning
|
3988
3989
|
tempElement.innerHTML = "<span></span>" + _convertUrlsToLinks(textNode.data);
|
3989
3990
|
tempElement.removeChild(tempElement.firstChild);
|
3990
|
-
|
3991
|
+
|
3991
3992
|
while (tempElement.firstChild) {
|
3992
3993
|
// inserts tempElement.firstChild before textNode
|
3993
3994
|
parentNode.insertBefore(tempElement.firstChild, textNode);
|
3994
3995
|
}
|
3995
3996
|
parentNode.removeChild(textNode);
|
3996
3997
|
}
|
3997
|
-
|
3998
|
+
|
3998
3999
|
function _hasParentThatShouldBeIgnored(node) {
|
3999
4000
|
var nodeName;
|
4000
4001
|
while (node.parentNode) {
|
@@ -4008,35 +4009,35 @@ wysihtml5.browser = (function() {
|
|
4008
4009
|
}
|
4009
4010
|
return false;
|
4010
4011
|
}
|
4011
|
-
|
4012
|
+
|
4012
4013
|
function _parseNode(element) {
|
4013
4014
|
if (IGNORE_URLS_IN.contains(element.nodeName)) {
|
4014
4015
|
return;
|
4015
4016
|
}
|
4016
|
-
|
4017
|
+
|
4017
4018
|
if (element.nodeType === wysihtml5.TEXT_NODE && element.data.match(URL_REG_EXP)) {
|
4018
4019
|
_wrapMatchesInNode(element);
|
4019
4020
|
return;
|
4020
4021
|
}
|
4021
|
-
|
4022
|
+
|
4022
4023
|
var childNodes = wysihtml5.lang.array(element.childNodes).get(),
|
4023
4024
|
childNodesLength = childNodes.length,
|
4024
4025
|
i = 0;
|
4025
|
-
|
4026
|
+
|
4026
4027
|
for (; i<childNodesLength; i++) {
|
4027
4028
|
_parseNode(childNodes[i]);
|
4028
4029
|
}
|
4029
|
-
|
4030
|
+
|
4030
4031
|
return element;
|
4031
4032
|
}
|
4032
|
-
|
4033
|
+
|
4033
4034
|
wysihtml5.dom.autoLink = autoLink;
|
4034
|
-
|
4035
|
+
|
4035
4036
|
// Reveal url reg exp to the outside
|
4036
4037
|
wysihtml5.dom.autoLink.URL_REG_EXP = URL_REG_EXP;
|
4037
4038
|
})(wysihtml5);(function(wysihtml5) {
|
4038
4039
|
var api = wysihtml5.dom;
|
4039
|
-
|
4040
|
+
|
4040
4041
|
api.addClass = function(element, className) {
|
4041
4042
|
var classList = element.classList;
|
4042
4043
|
if (classList) {
|
@@ -4047,22 +4048,22 @@ wysihtml5.browser = (function() {
|
|
4047
4048
|
}
|
4048
4049
|
element.className += " " + className;
|
4049
4050
|
};
|
4050
|
-
|
4051
|
+
|
4051
4052
|
api.removeClass = function(element, className) {
|
4052
4053
|
var classList = element.classList;
|
4053
4054
|
if (classList) {
|
4054
4055
|
return classList.remove(className);
|
4055
4056
|
}
|
4056
|
-
|
4057
|
+
|
4057
4058
|
element.className = element.className.replace(new RegExp("(^|\\s+)" + className + "(\\s+|$)"), " ");
|
4058
4059
|
};
|
4059
|
-
|
4060
|
+
|
4060
4061
|
api.hasClass = function(element, className) {
|
4061
4062
|
var classList = element.classList;
|
4062
4063
|
if (classList) {
|
4063
4064
|
return classList.contains(className);
|
4064
4065
|
}
|
4065
|
-
|
4066
|
+
|
4066
4067
|
var elementClassName = element.className;
|
4067
4068
|
return (elementClassName.length > 0 && (elementClassName == className || new RegExp("(^|\\s)" + className + "(\\s|$)").test(elementClassName)));
|
4068
4069
|
};
|
@@ -4114,17 +4115,17 @@ wysihtml5.dom.convertToList = (function() {
|
|
4114
4115
|
list.appendChild(listItem);
|
4115
4116
|
return listItem;
|
4116
4117
|
}
|
4117
|
-
|
4118
|
+
|
4118
4119
|
function _createList(doc, type) {
|
4119
4120
|
return doc.createElement(type);
|
4120
4121
|
}
|
4121
|
-
|
4122
|
+
|
4122
4123
|
function convertToList(element, listType) {
|
4123
4124
|
if (element.nodeName === "UL" || element.nodeName === "OL" || element.nodeName === "MENU") {
|
4124
4125
|
// Already a list
|
4125
4126
|
return element;
|
4126
4127
|
}
|
4127
|
-
|
4128
|
+
|
4128
4129
|
var doc = element.ownerDocument,
|
4129
4130
|
list = _createList(doc, listType),
|
4130
4131
|
lineBreaks = element.querySelectorAll("br"),
|
@@ -4138,7 +4139,7 @@ wysihtml5.dom.convertToList = (function() {
|
|
4138
4139
|
isLineBreak,
|
4139
4140
|
currentListItem,
|
4140
4141
|
i;
|
4141
|
-
|
4142
|
+
|
4142
4143
|
// First find <br> at the end of inline elements and move them behind them
|
4143
4144
|
for (i=0; i<lineBreaksLength; i++) {
|
4144
4145
|
lineBreak = lineBreaks[i];
|
@@ -4150,16 +4151,16 @@ wysihtml5.dom.convertToList = (function() {
|
|
4150
4151
|
wysihtml5.dom.insert(lineBreak).after(lineBreak.parentNode);
|
4151
4152
|
}
|
4152
4153
|
}
|
4153
|
-
|
4154
|
+
|
4154
4155
|
childNodes = wysihtml5.lang.array(element.childNodes).get();
|
4155
4156
|
childNodesLength = childNodes.length;
|
4156
|
-
|
4157
|
+
|
4157
4158
|
for (i=0; i<childNodesLength; i++) {
|
4158
4159
|
currentListItem = currentListItem || _createListItem(doc, list);
|
4159
4160
|
childNode = childNodes[i];
|
4160
4161
|
isBlockElement = wysihtml5.dom.getStyle("display").from(childNode) === "block";
|
4161
4162
|
isLineBreak = childNode.nodeName === "BR";
|
4162
|
-
|
4163
|
+
|
4163
4164
|
if (isBlockElement) {
|
4164
4165
|
// Append blockElement to current <li> if empty, otherwise create a new one
|
4165
4166
|
currentListItem = currentListItem.firstChild ? _createListItem(doc, list) : currentListItem;
|
@@ -4167,27 +4168,27 @@ wysihtml5.dom.convertToList = (function() {
|
|
4167
4168
|
currentListItem = null;
|
4168
4169
|
continue;
|
4169
4170
|
}
|
4170
|
-
|
4171
|
+
|
4171
4172
|
if (isLineBreak) {
|
4172
4173
|
// Only create a new list item in the next iteration when the current one has already content
|
4173
4174
|
currentListItem = currentListItem.firstChild ? null : currentListItem;
|
4174
4175
|
continue;
|
4175
4176
|
}
|
4176
|
-
|
4177
|
+
|
4177
4178
|
currentListItem.appendChild(childNode);
|
4178
4179
|
}
|
4179
|
-
|
4180
|
+
|
4180
4181
|
element.parentNode.replaceChild(list, element);
|
4181
4182
|
return list;
|
4182
4183
|
}
|
4183
|
-
|
4184
|
+
|
4184
4185
|
return convertToList;
|
4185
4186
|
})();/**
|
4186
4187
|
* Copy a set of attributes from one element to another
|
4187
4188
|
*
|
4188
4189
|
* @param {Array} attributesToCopy List of attributes which should be copied
|
4189
4190
|
* @return {Object} Returns an object which offers the "from" method which can be invoked with the element where to
|
4190
|
-
* copy the attributes from., this again returns an object which provides a method named "to" which can be invoked
|
4191
|
+
* copy the attributes from., this again returns an object which provides a method named "to" which can be invoked
|
4191
4192
|
* with the element where to copy the attributes to (see example)
|
4192
4193
|
*
|
4193
4194
|
* @example
|
@@ -4225,7 +4226,7 @@ wysihtml5.dom.copyAttributes = function(attributesToCopy) {
|
|
4225
4226
|
*
|
4226
4227
|
* @param {Array} stylesToCopy List of styles which should be copied
|
4227
4228
|
* @return {Object} Returns an object which offers the "from" method which can be invoked with the element where to
|
4228
|
-
* copy the styles from., this again returns an object which provides a method named "to" which can be invoked
|
4229
|
+
* copy the styles from., this again returns an object which provides a method named "to" which can be invoked
|
4229
4230
|
* with the element where to copy the styles to (see example)
|
4230
4231
|
*
|
4231
4232
|
* @example
|
@@ -4236,21 +4237,21 @@ wysihtml5.dom.copyAttributes = function(attributesToCopy) {
|
|
4236
4237
|
*
|
4237
4238
|
*/
|
4238
4239
|
(function(dom) {
|
4239
|
-
|
4240
|
+
|
4240
4241
|
/**
|
4241
4242
|
* Mozilla, WebKit and Opera recalculate the computed width when box-sizing: boder-box; is set
|
4242
|
-
* So if an element has "width: 200px; -moz-box-sizing: border-box; border: 1px;" then
|
4243
|
+
* So if an element has "width: 200px; -moz-box-sizing: border-box; border: 1px;" then
|
4243
4244
|
* its computed css width will be 198px
|
4244
4245
|
*/
|
4245
4246
|
var BOX_SIZING_PROPERTIES = ["-webkit-box-sizing", "-moz-box-sizing", "-ms-box-sizing", "box-sizing"];
|
4246
|
-
|
4247
|
+
|
4247
4248
|
var shouldIgnoreBoxSizingBorderBox = function(element) {
|
4248
4249
|
if (hasBoxSizingBorderBox(element)) {
|
4249
4250
|
return parseInt(dom.getStyle("width").from(element), 10) < element.offsetWidth;
|
4250
4251
|
}
|
4251
4252
|
return false;
|
4252
4253
|
};
|
4253
|
-
|
4254
|
+
|
4254
4255
|
var hasBoxSizingBorderBox = function(element) {
|
4255
4256
|
var i = 0,
|
4256
4257
|
length = BOX_SIZING_PROPERTIES.length;
|
@@ -4260,14 +4261,14 @@ wysihtml5.dom.copyAttributes = function(attributesToCopy) {
|
|
4260
4261
|
}
|
4261
4262
|
}
|
4262
4263
|
};
|
4263
|
-
|
4264
|
+
|
4264
4265
|
dom.copyStyles = function(stylesToCopy) {
|
4265
4266
|
return {
|
4266
4267
|
from: function(element) {
|
4267
4268
|
if (shouldIgnoreBoxSizingBorderBox(element)) {
|
4268
4269
|
stylesToCopy = wysihtml5.lang.array(stylesToCopy).without(BOX_SIZING_PROPERTIES);
|
4269
4270
|
}
|
4270
|
-
|
4271
|
+
|
4271
4272
|
var cssText = "",
|
4272
4273
|
length = stylesToCopy.length,
|
4273
4274
|
i = 0,
|
@@ -4276,7 +4277,7 @@ wysihtml5.dom.copyAttributes = function(attributesToCopy) {
|
|
4276
4277
|
property = stylesToCopy[i];
|
4277
4278
|
cssText += property + ":" + dom.getStyle(property).from(element) + ";";
|
4278
4279
|
}
|
4279
|
-
|
4280
|
+
|
4280
4281
|
return {
|
4281
4282
|
to: function(element) {
|
4282
4283
|
dom.setStyles(cssText).on(element);
|
@@ -4295,12 +4296,12 @@ wysihtml5.dom.copyAttributes = function(attributesToCopy) {
|
|
4295
4296
|
* });
|
4296
4297
|
*/
|
4297
4298
|
(function(wysihtml5) {
|
4298
|
-
|
4299
|
+
|
4299
4300
|
wysihtml5.dom.delegate = function(container, selector, eventName, handler) {
|
4300
4301
|
return wysihtml5.dom.observe(container, eventName, function(event) {
|
4301
4302
|
var target = event.target,
|
4302
4303
|
match = wysihtml5.lang.array(container.querySelectorAll(selector));
|
4303
|
-
|
4304
|
+
|
4304
4305
|
while (target && target !== container) {
|
4305
4306
|
if (match.contains(target)) {
|
4306
4307
|
handler.call(target, event);
|
@@ -4310,13 +4311,13 @@ wysihtml5.dom.copyAttributes = function(attributesToCopy) {
|
|
4310
4311
|
}
|
4311
4312
|
});
|
4312
4313
|
};
|
4313
|
-
|
4314
|
+
|
4314
4315
|
})(wysihtml5);/**
|
4315
4316
|
* Returns the given html wrapped in a div element
|
4316
4317
|
*
|
4317
4318
|
* Fixing IE's inability to treat unknown elements (HTML5 section, article, ...) correctly
|
4318
4319
|
* when inserted via innerHTML
|
4319
|
-
*
|
4320
|
+
*
|
4320
4321
|
* @param {String} html The html which should be wrapped in a dom element
|
4321
4322
|
* @param {Obejct} [context] Document object of the context the html belongs to
|
4322
4323
|
*
|
@@ -4324,7 +4325,7 @@ wysihtml5.dom.copyAttributes = function(attributesToCopy) {
|
|
4324
4325
|
* wysihtml5.dom.getAsDom("<article>foo</article>");
|
4325
4326
|
*/
|
4326
4327
|
wysihtml5.dom.getAsDom = (function() {
|
4327
|
-
|
4328
|
+
|
4328
4329
|
var _innerHTMLShiv = function(html, context) {
|
4329
4330
|
var tempElement = context.createElement("div");
|
4330
4331
|
tempElement.style.display = "none";
|
@@ -4334,7 +4335,7 @@ wysihtml5.dom.getAsDom = (function() {
|
|
4334
4335
|
context.body.removeChild(tempElement);
|
4335
4336
|
return tempElement;
|
4336
4337
|
};
|
4337
|
-
|
4338
|
+
|
4338
4339
|
/**
|
4339
4340
|
* Make sure IE supports HTML5 tags, which is accomplished by simply creating one instance of each element
|
4340
4341
|
*/
|
@@ -4347,8 +4348,8 @@ wysihtml5.dom.getAsDom = (function() {
|
|
4347
4348
|
}
|
4348
4349
|
context._wysihtml5_supportsHTML5Tags = true;
|
4349
4350
|
};
|
4350
|
-
|
4351
|
-
|
4351
|
+
|
4352
|
+
|
4352
4353
|
/**
|
4353
4354
|
* List of html5 tags
|
4354
4355
|
* taken from http://simon.html5.org/html5-elements
|
@@ -4358,7 +4359,7 @@ wysihtml5.dom.getAsDom = (function() {
|
|
4358
4359
|
"figure", "footer", "header", "hgroup", "keygen", "mark", "meter", "nav", "output", "progress",
|
4359
4360
|
"rp", "rt", "ruby", "svg", "section", "source", "summary", "time", "track", "video", "wbr"
|
4360
4361
|
];
|
4361
|
-
|
4362
|
+
|
4362
4363
|
return function(html, context) {
|
4363
4364
|
context = context || document;
|
4364
4365
|
var tempElement;
|
@@ -4390,23 +4391,23 @@ wysihtml5.dom.getAsDom = (function() {
|
|
4390
4391
|
* var coloredElement = wysihtml5.dom.getParentElement(myTextNode, { nodeName: "SPAN", className: "wysiwyg-color-red", classRegExp: /wysiwyg-color-[a-z]/g });
|
4391
4392
|
*/
|
4392
4393
|
wysihtml5.dom.getParentElement = (function() {
|
4393
|
-
|
4394
|
+
|
4394
4395
|
function _isSameNodeName(nodeName, desiredNodeNames) {
|
4395
4396
|
if (!desiredNodeNames || !desiredNodeNames.length) {
|
4396
4397
|
return true;
|
4397
4398
|
}
|
4398
|
-
|
4399
|
+
|
4399
4400
|
if (typeof(desiredNodeNames) === "string") {
|
4400
4401
|
return nodeName === desiredNodeNames;
|
4401
4402
|
} else {
|
4402
4403
|
return wysihtml5.lang.array(desiredNodeNames).contains(nodeName);
|
4403
4404
|
}
|
4404
4405
|
}
|
4405
|
-
|
4406
|
+
|
4406
4407
|
function _isElement(node) {
|
4407
4408
|
return node.nodeType === wysihtml5.ELEMENT_NODE;
|
4408
4409
|
}
|
4409
|
-
|
4410
|
+
|
4410
4411
|
function _hasClassName(element, className, classRegExp) {
|
4411
4412
|
var classNames = (element.className || "").match(classRegExp) || [];
|
4412
4413
|
if (!className) {
|
@@ -4414,7 +4415,7 @@ wysihtml5.dom.getParentElement = (function() {
|
|
4414
4415
|
}
|
4415
4416
|
return classNames[classNames.length - 1] === className;
|
4416
4417
|
}
|
4417
|
-
|
4418
|
+
|
4418
4419
|
function _getParentElementWithNodeName(node, nodeName, levels) {
|
4419
4420
|
while (levels-- && node && node.nodeName !== "BODY") {
|
4420
4421
|
if (_isSameNodeName(node.nodeName, nodeName)) {
|
@@ -4424,7 +4425,7 @@ wysihtml5.dom.getParentElement = (function() {
|
|
4424
4425
|
}
|
4425
4426
|
return null;
|
4426
4427
|
}
|
4427
|
-
|
4428
|
+
|
4428
4429
|
function _getParentElementWithNodeNameAndClassName(node, nodeName, className, classRegExp, levels) {
|
4429
4430
|
while (levels-- && node && node.nodeName !== "BODY") {
|
4430
4431
|
if (_isElement(node) &&
|
@@ -4436,7 +4437,7 @@ wysihtml5.dom.getParentElement = (function() {
|
|
4436
4437
|
}
|
4437
4438
|
return null;
|
4438
4439
|
}
|
4439
|
-
|
4440
|
+
|
4440
4441
|
return function(node, matchingSet, levels) {
|
4441
4442
|
levels = levels || 50; // Go max 50 nodes upwards from current node
|
4442
4443
|
if (matchingSet.className || matchingSet.classRegExp) {
|
@@ -4465,20 +4466,20 @@ wysihtml5.dom.getStyle = (function() {
|
|
4465
4466
|
"float": ("styleFloat" in document.createElement("div").style) ? "styleFloat" : "cssFloat"
|
4466
4467
|
},
|
4467
4468
|
REG_EXP_CAMELIZE = /\-[a-z]/g;
|
4468
|
-
|
4469
|
+
|
4469
4470
|
function camelize(str) {
|
4470
4471
|
return str.replace(REG_EXP_CAMELIZE, function(match) {
|
4471
4472
|
return match.charAt(1).toUpperCase();
|
4472
4473
|
});
|
4473
4474
|
}
|
4474
|
-
|
4475
|
+
|
4475
4476
|
return function(property) {
|
4476
4477
|
return {
|
4477
4478
|
from: function(element) {
|
4478
4479
|
if (element.nodeType !== wysihtml5.ELEMENT_NODE) {
|
4479
4480
|
return;
|
4480
4481
|
}
|
4481
|
-
|
4482
|
+
|
4482
4483
|
var doc = element.ownerDocument,
|
4483
4484
|
camelizedProperty = stylePropertyMapping[property] || camelize(property),
|
4484
4485
|
style = element.style,
|
@@ -4487,7 +4488,7 @@ wysihtml5.dom.getStyle = (function() {
|
|
4487
4488
|
if (styleValue) {
|
4488
4489
|
return styleValue;
|
4489
4490
|
}
|
4490
|
-
|
4491
|
+
|
4491
4492
|
// currentStyle is no standard and only supported by Opera and IE but it has one important advantage over the standard-compliant
|
4492
4493
|
// window.getComputedStyle, since it returns css property values in their original unit:
|
4493
4494
|
// If you set an elements width to "50%", window.getComputedStyle will give you it's current width in px while currentStyle
|
@@ -4535,18 +4536,18 @@ wysihtml5.dom.getStyle = (function() {
|
|
4535
4536
|
wysihtml5.dom.hasElementWithTagName = (function() {
|
4536
4537
|
var LIVE_CACHE = {},
|
4537
4538
|
DOCUMENT_IDENTIFIER = 1;
|
4538
|
-
|
4539
|
+
|
4539
4540
|
function _getDocumentIdentifier(doc) {
|
4540
4541
|
return doc._wysihtml5_identifier || (doc._wysihtml5_identifier = DOCUMENT_IDENTIFIER++);
|
4541
4542
|
}
|
4542
|
-
|
4543
|
+
|
4543
4544
|
return function(doc, tagName) {
|
4544
4545
|
var key = _getDocumentIdentifier(doc) + ":" + tagName,
|
4545
4546
|
cacheEntry = LIVE_CACHE[key];
|
4546
4547
|
if (!cacheEntry) {
|
4547
4548
|
cacheEntry = LIVE_CACHE[key] = doc.getElementsByTagName(tagName);
|
4548
4549
|
}
|
4549
|
-
|
4550
|
+
|
4550
4551
|
return cacheEntry.length > 0;
|
4551
4552
|
};
|
4552
4553
|
})();/**
|
@@ -4566,7 +4567,7 @@ wysihtml5.dom.hasElementWithTagName = (function() {
|
|
4566
4567
|
function _getDocumentIdentifier(doc) {
|
4567
4568
|
return doc._wysihtml5_identifier || (doc._wysihtml5_identifier = DOCUMENT_IDENTIFIER++);
|
4568
4569
|
}
|
4569
|
-
|
4570
|
+
|
4570
4571
|
wysihtml5.dom.hasElementWithClassName = function(doc, className) {
|
4571
4572
|
// getElementsByClassName is not supported by IE<9
|
4572
4573
|
// but is sometimes mocked via library code (which then doesn't return live node lists)
|
@@ -4588,18 +4589,18 @@ wysihtml5.dom.insert = function(elementToInsert) {
|
|
4588
4589
|
after: function(element) {
|
4589
4590
|
element.parentNode.insertBefore(elementToInsert, element.nextSibling);
|
4590
4591
|
},
|
4591
|
-
|
4592
|
+
|
4592
4593
|
before: function(element) {
|
4593
4594
|
element.parentNode.insertBefore(elementToInsert, element);
|
4594
4595
|
},
|
4595
|
-
|
4596
|
+
|
4596
4597
|
into: function(element) {
|
4597
4598
|
element.appendChild(elementToInsert);
|
4598
4599
|
}
|
4599
4600
|
};
|
4600
4601
|
};wysihtml5.dom.insertCSS = function(rules) {
|
4601
4602
|
rules = rules.join("\n");
|
4602
|
-
|
4603
|
+
|
4603
4604
|
return {
|
4604
4605
|
into: function(doc) {
|
4605
4606
|
var head = doc.head || doc.getElementsByTagName("head")[0],
|
@@ -4626,12 +4627,12 @@ wysihtml5.dom.insert = function(elementToInsert) {
|
|
4626
4627
|
*/
|
4627
4628
|
wysihtml5.dom.observe = function(element, eventNames, handler) {
|
4628
4629
|
eventNames = typeof(eventNames) === "string" ? [eventNames] : eventNames;
|
4629
|
-
|
4630
|
+
|
4630
4631
|
var handlerWrapper,
|
4631
4632
|
eventName,
|
4632
4633
|
i = 0,
|
4633
4634
|
length = eventNames.length;
|
4634
|
-
|
4635
|
+
|
4635
4636
|
for (; i<length; i++) {
|
4636
4637
|
eventName = eventNames[i];
|
4637
4638
|
if (element.addEventListener) {
|
@@ -4652,7 +4653,7 @@ wysihtml5.dom.observe = function(element, eventNames, handler) {
|
|
4652
4653
|
element.attachEvent("on" + eventName, handlerWrapper);
|
4653
4654
|
}
|
4654
4655
|
}
|
4655
|
-
|
4656
|
+
|
4656
4657
|
return {
|
4657
4658
|
stop: function() {
|
4658
4659
|
var eventName,
|
@@ -4721,7 +4722,7 @@ wysihtml5.dom.observe = function(element, eventNames, handler) {
|
|
4721
4722
|
* // => '<p class="red">foo</p><p>bar</p>'
|
4722
4723
|
*/
|
4723
4724
|
wysihtml5.dom.parse = (function() {
|
4724
|
-
|
4725
|
+
|
4725
4726
|
/**
|
4726
4727
|
* It's not possible to use a XMLParser/DOMParser as HTML5 is not always well-formed XML
|
4727
4728
|
* new DOMParser().parseFromString('<img src="foo.gif">') will cause a parseError since the
|
@@ -4738,27 +4739,27 @@ wysihtml5.dom.parse = (function() {
|
|
4738
4739
|
WHITE_SPACE_REG_EXP = /\s+/,
|
4739
4740
|
defaultRules = { tags: {}, classes: {} },
|
4740
4741
|
currentRules = {};
|
4741
|
-
|
4742
|
+
|
4742
4743
|
/**
|
4743
4744
|
* Iterates over all childs of the element, recreates them, appends them into a document fragment
|
4744
4745
|
* which later replaces the entire body content
|
4745
4746
|
*/
|
4746
4747
|
function parse(elementOrHtml, rules, context, cleanUp) {
|
4747
4748
|
wysihtml5.lang.object(currentRules).merge(defaultRules).merge(rules).get();
|
4748
|
-
|
4749
|
+
|
4749
4750
|
context = context || elementOrHtml.ownerDocument || document;
|
4750
4751
|
var fragment = context.createDocumentFragment(),
|
4751
4752
|
isString = typeof(elementOrHtml) === "string",
|
4752
4753
|
element,
|
4753
4754
|
newNode,
|
4754
4755
|
firstChild;
|
4755
|
-
|
4756
|
+
|
4756
4757
|
if (isString) {
|
4757
4758
|
element = wysihtml5.dom.getAsDom(elementOrHtml, context);
|
4758
4759
|
} else {
|
4759
4760
|
element = elementOrHtml;
|
4760
4761
|
}
|
4761
|
-
|
4762
|
+
|
4762
4763
|
while (element.firstChild) {
|
4763
4764
|
firstChild = element.firstChild;
|
4764
4765
|
element.removeChild(firstChild);
|
@@ -4767,16 +4768,16 @@ wysihtml5.dom.parse = (function() {
|
|
4767
4768
|
fragment.appendChild(newNode);
|
4768
4769
|
}
|
4769
4770
|
}
|
4770
|
-
|
4771
|
+
|
4771
4772
|
// Clear element contents
|
4772
4773
|
element.innerHTML = "";
|
4773
|
-
|
4774
|
+
|
4774
4775
|
// Insert new DOM tree
|
4775
4776
|
element.appendChild(fragment);
|
4776
|
-
|
4777
|
+
|
4777
4778
|
return isString ? wysihtml5.quirks.getCorrectInnerHTML(element) : element;
|
4778
4779
|
}
|
4779
|
-
|
4780
|
+
|
4780
4781
|
function _convert(oldNode, cleanUp) {
|
4781
4782
|
var oldNodeType = oldNode.nodeType,
|
4782
4783
|
oldChilds = oldNode.childNodes,
|
@@ -4784,20 +4785,20 @@ wysihtml5.dom.parse = (function() {
|
|
4784
4785
|
newNode,
|
4785
4786
|
method = NODE_TYPE_MAPPING[oldNodeType],
|
4786
4787
|
i = 0;
|
4787
|
-
|
4788
|
+
|
4788
4789
|
newNode = method && method(oldNode);
|
4789
|
-
|
4790
|
+
|
4790
4791
|
if (!newNode) {
|
4791
4792
|
return null;
|
4792
4793
|
}
|
4793
|
-
|
4794
|
+
|
4794
4795
|
for (i=0; i<oldChildsLength; i++) {
|
4795
4796
|
newChild = _convert(oldChilds[i], cleanUp);
|
4796
4797
|
if (newChild) {
|
4797
4798
|
newNode.appendChild(newChild);
|
4798
4799
|
}
|
4799
4800
|
}
|
4800
|
-
|
4801
|
+
|
4801
4802
|
// Cleanup senseless <span> elements
|
4802
4803
|
if (cleanUp &&
|
4803
4804
|
newNode.childNodes.length <= 1 &&
|
@@ -4805,10 +4806,10 @@ wysihtml5.dom.parse = (function() {
|
|
4805
4806
|
!newNode.attributes.length) {
|
4806
4807
|
return newNode.firstChild;
|
4807
4808
|
}
|
4808
|
-
|
4809
|
+
|
4809
4810
|
return newNode;
|
4810
4811
|
}
|
4811
|
-
|
4812
|
+
|
4812
4813
|
function _handleElement(oldNode) {
|
4813
4814
|
var rule,
|
4814
4815
|
newNode,
|
@@ -4816,7 +4817,7 @@ wysihtml5.dom.parse = (function() {
|
|
4816
4817
|
tagRules = currentRules.tags,
|
4817
4818
|
nodeName = oldNode.nodeName.toLowerCase(),
|
4818
4819
|
scopeName = oldNode.scopeName;
|
4819
|
-
|
4820
|
+
|
4820
4821
|
/**
|
4821
4822
|
* We already parsed that element
|
4822
4823
|
* ignore it! (yes, this sometimes happens in IE8 when the html is invalid)
|
@@ -4825,11 +4826,11 @@ wysihtml5.dom.parse = (function() {
|
|
4825
4826
|
return null;
|
4826
4827
|
}
|
4827
4828
|
oldNode._wysihtml5 = 1;
|
4828
|
-
|
4829
|
+
|
4829
4830
|
if (oldNode.className === "wysihtml5-temp") {
|
4830
4831
|
return null;
|
4831
4832
|
}
|
4832
|
-
|
4833
|
+
|
4833
4834
|
/**
|
4834
4835
|
* IE is the only browser who doesn't include the namespace in the
|
4835
4836
|
* nodeName, that's why we have to prepend it by ourselves
|
@@ -4839,7 +4840,7 @@ wysihtml5.dom.parse = (function() {
|
|
4839
4840
|
if (scopeName && scopeName != "HTML") {
|
4840
4841
|
nodeName = scopeName + ":" + nodeName;
|
4841
4842
|
}
|
4842
|
-
|
4843
|
+
|
4843
4844
|
/**
|
4844
4845
|
* Repair node
|
4845
4846
|
* IE is a bit bitchy when it comes to invalid nested markup which includes unclosed tags
|
@@ -4852,13 +4853,13 @@ wysihtml5.dom.parse = (function() {
|
|
4852
4853
|
nodeName = "div";
|
4853
4854
|
}
|
4854
4855
|
}
|
4855
|
-
|
4856
|
+
|
4856
4857
|
if (nodeName in tagRules) {
|
4857
4858
|
rule = tagRules[nodeName];
|
4858
4859
|
if (!rule || rule.remove) {
|
4859
4860
|
return null;
|
4860
4861
|
}
|
4861
|
-
|
4862
|
+
|
4862
4863
|
rule = typeof(rule) === "string" ? { rename_tag: rule } : rule;
|
4863
4864
|
} else if (oldNode.firstChild) {
|
4864
4865
|
rule = { rename_tag: DEFAULT_NODE_NAME };
|
@@ -4866,14 +4867,14 @@ wysihtml5.dom.parse = (function() {
|
|
4866
4867
|
// Remove empty unknown elements
|
4867
4868
|
return null;
|
4868
4869
|
}
|
4869
|
-
|
4870
|
+
|
4870
4871
|
newNode = oldNode.ownerDocument.createElement(rule.rename_tag || nodeName);
|
4871
4872
|
_handleAttributes(oldNode, newNode, rule);
|
4872
|
-
|
4873
|
+
|
4873
4874
|
oldNode = null;
|
4874
4875
|
return newNode;
|
4875
4876
|
}
|
4876
|
-
|
4877
|
+
|
4877
4878
|
function _handleAttributes(oldNode, newNode, rule) {
|
4878
4879
|
var attributes = {}, // fresh new set of attributes to set on newNode
|
4879
4880
|
setClass = rule.set_class, // classes to set
|
@@ -4893,11 +4894,11 @@ wysihtml5.dom.parse = (function() {
|
|
4893
4894
|
attributeName,
|
4894
4895
|
newAttributeValue,
|
4895
4896
|
method;
|
4896
|
-
|
4897
|
+
|
4897
4898
|
if (setAttributes) {
|
4898
4899
|
attributes = wysihtml5.lang.object(setAttributes).clone();
|
4899
4900
|
}
|
4900
|
-
|
4901
|
+
|
4901
4902
|
if (checkAttributes) {
|
4902
4903
|
for (attributeName in checkAttributes) {
|
4903
4904
|
method = attributeCheckMethods[checkAttributes[attributeName]];
|
@@ -4910,11 +4911,11 @@ wysihtml5.dom.parse = (function() {
|
|
4910
4911
|
}
|
4911
4912
|
}
|
4912
4913
|
}
|
4913
|
-
|
4914
|
+
|
4914
4915
|
if (setClass) {
|
4915
4916
|
classes.push(setClass);
|
4916
4917
|
}
|
4917
|
-
|
4918
|
+
|
4918
4919
|
if (addClass) {
|
4919
4920
|
for (attributeName in addClass) {
|
4920
4921
|
method = addClassMethods[addClass[attributeName]];
|
@@ -4927,10 +4928,10 @@ wysihtml5.dom.parse = (function() {
|
|
4927
4928
|
}
|
4928
4929
|
}
|
4929
4930
|
}
|
4930
|
-
|
4931
|
+
|
4931
4932
|
// make sure that wysihtml5 temp class doesn't get stripped out
|
4932
4933
|
allowedClasses["_wysihtml5-temp-placeholder"] = 1;
|
4933
|
-
|
4934
|
+
|
4934
4935
|
// add old classes last
|
4935
4936
|
oldClasses = oldNode.getAttribute("class");
|
4936
4937
|
if (oldClasses) {
|
@@ -4943,7 +4944,7 @@ wysihtml5.dom.parse = (function() {
|
|
4943
4944
|
newClasses.push(currentClass);
|
4944
4945
|
}
|
4945
4946
|
}
|
4946
|
-
|
4947
|
+
|
4947
4948
|
// remove duplicate entries and preserve class specificity
|
4948
4949
|
newClassesLength = newClasses.length;
|
4949
4950
|
while (newClassesLength--) {
|
@@ -4952,11 +4953,11 @@ wysihtml5.dom.parse = (function() {
|
|
4952
4953
|
newUniqueClasses.unshift(currentClass);
|
4953
4954
|
}
|
4954
4955
|
}
|
4955
|
-
|
4956
|
+
|
4956
4957
|
if (newUniqueClasses.length) {
|
4957
4958
|
attributes["class"] = newUniqueClasses.join(" ");
|
4958
4959
|
}
|
4959
|
-
|
4960
|
+
|
4960
4961
|
// set attributes on newNode
|
4961
4962
|
for (attributeName in attributes) {
|
4962
4963
|
// Setting attributes can cause a js error in IE under certain circumstances
|
@@ -4966,7 +4967,7 @@ wysihtml5.dom.parse = (function() {
|
|
4966
4967
|
newNode.setAttribute(attributeName, attributes[attributeName]);
|
4967
4968
|
} catch(e) {}
|
4968
4969
|
}
|
4969
|
-
|
4970
|
+
|
4970
4971
|
// IE8 sometimes loses the width/height attributes when those are set before the "src"
|
4971
4972
|
// so we make sure to set them again
|
4972
4973
|
if (attributes.src) {
|
@@ -4978,7 +4979,7 @@ wysihtml5.dom.parse = (function() {
|
|
4978
4979
|
}
|
4979
4980
|
}
|
4980
4981
|
}
|
4981
|
-
|
4982
|
+
|
4982
4983
|
/**
|
4983
4984
|
* IE gives wrong results for hasAttribute/getAttribute, for example:
|
4984
4985
|
* var td = document.createElement("td");
|
@@ -5001,13 +5002,13 @@ wysihtml5.dom.parse = (function() {
|
|
5001
5002
|
var outerHTML = node.outerHTML.toLowerCase(),
|
5002
5003
|
// TODO: This might not work for attributes without value: <input disabled>
|
5003
5004
|
hasAttribute = outerHTML.indexOf(" " + attributeName + "=") != -1;
|
5004
|
-
|
5005
|
+
|
5005
5006
|
return hasAttribute ? node.getAttribute(attributeName) : null;
|
5006
5007
|
} else{
|
5007
5008
|
return node.getAttribute(attributeName);
|
5008
5009
|
}
|
5009
5010
|
}
|
5010
|
-
|
5011
|
+
|
5011
5012
|
/**
|
5012
5013
|
* Check whether the given node is a proper loaded image
|
5013
5014
|
* FIXME: Returns undefined when unknown (Chrome, Safari)
|
@@ -5021,12 +5022,12 @@ wysihtml5.dom.parse = (function() {
|
|
5021
5022
|
}
|
5022
5023
|
}
|
5023
5024
|
}
|
5024
|
-
|
5025
|
+
|
5025
5026
|
function _handleText(oldNode) {
|
5026
5027
|
return oldNode.ownerDocument.createTextNode(oldNode.data);
|
5027
5028
|
}
|
5028
|
-
|
5029
|
-
|
5029
|
+
|
5030
|
+
|
5030
5031
|
// ------------ attribute checks ------------ \\
|
5031
5032
|
var attributeCheckMethods = {
|
5032
5033
|
url: (function() {
|
@@ -5064,7 +5065,7 @@ wysihtml5.dom.parse = (function() {
|
|
5064
5065
|
});
|
5065
5066
|
};
|
5066
5067
|
})(),
|
5067
|
-
|
5068
|
+
|
5068
5069
|
alt: (function() {
|
5069
5070
|
var REG_EXP = /[^ a-z0-9_\-]/gi;
|
5070
5071
|
return function(attributeValue) {
|
@@ -5074,7 +5075,7 @@ wysihtml5.dom.parse = (function() {
|
|
5074
5075
|
return attributeValue.replace(REG_EXP, "");
|
5075
5076
|
};
|
5076
5077
|
})(),
|
5077
|
-
|
5078
|
+
|
5078
5079
|
numbers: (function() {
|
5079
5080
|
var REG_EXP = /\D/g;
|
5080
5081
|
return function(attributeValue) {
|
@@ -5083,7 +5084,7 @@ wysihtml5.dom.parse = (function() {
|
|
5083
5084
|
};
|
5084
5085
|
})()
|
5085
5086
|
};
|
5086
|
-
|
5087
|
+
|
5087
5088
|
// ------------ class converter (converts an html attribute to a class name) ------------ \\
|
5088
5089
|
var addClassMethods = {
|
5089
5090
|
align_img: (function() {
|
@@ -5095,7 +5096,7 @@ wysihtml5.dom.parse = (function() {
|
|
5095
5096
|
return mapping[String(attributeValue).toLowerCase()];
|
5096
5097
|
};
|
5097
5098
|
})(),
|
5098
|
-
|
5099
|
+
|
5099
5100
|
align_text: (function() {
|
5100
5101
|
var mapping = {
|
5101
5102
|
left: "wysiwyg-text-align-left",
|
@@ -5107,7 +5108,7 @@ wysihtml5.dom.parse = (function() {
|
|
5107
5108
|
return mapping[String(attributeValue).toLowerCase()];
|
5108
5109
|
};
|
5109
5110
|
})(),
|
5110
|
-
|
5111
|
+
|
5111
5112
|
clear_br: (function() {
|
5112
5113
|
var mapping = {
|
5113
5114
|
left: "wysiwyg-clear-left",
|
@@ -5119,7 +5120,7 @@ wysihtml5.dom.parse = (function() {
|
|
5119
5120
|
return mapping[String(attributeValue).toLowerCase()];
|
5120
5121
|
};
|
5121
5122
|
})(),
|
5122
|
-
|
5123
|
+
|
5123
5124
|
size_font: (function() {
|
5124
5125
|
var mapping = {
|
5125
5126
|
"1": "wysiwyg-font-size-xx-small",
|
@@ -5137,7 +5138,7 @@ wysihtml5.dom.parse = (function() {
|
|
5137
5138
|
};
|
5138
5139
|
})()
|
5139
5140
|
};
|
5140
|
-
|
5141
|
+
|
5141
5142
|
return parse;
|
5142
5143
|
})();
|
5143
5144
|
/**
|
@@ -5195,7 +5196,7 @@ wysihtml5.dom.renameElement = function(element, newNodeName) {
|
|
5195
5196
|
return newElement;
|
5196
5197
|
};/**
|
5197
5198
|
* Takes an element, removes it and replaces it with it's childs
|
5198
|
-
*
|
5199
|
+
*
|
5199
5200
|
* @param {Object} node The node which to replace with it's child nodes
|
5200
5201
|
* @example
|
5201
5202
|
* <div id="foo">
|
@@ -5210,12 +5211,12 @@ wysihtml5.dom.replaceWithChildNodes = function(node) {
|
|
5210
5211
|
if (!node.parentNode) {
|
5211
5212
|
return;
|
5212
5213
|
}
|
5213
|
-
|
5214
|
+
|
5214
5215
|
if (!node.firstChild) {
|
5215
5216
|
node.parentNode.removeChild(node);
|
5216
5217
|
return;
|
5217
5218
|
}
|
5218
|
-
|
5219
|
+
|
5219
5220
|
var fragment = node.ownerDocument.createDocumentFragment();
|
5220
5221
|
while (node.firstChild) {
|
5221
5222
|
fragment.appendChild(node.firstChild);
|
@@ -5249,21 +5250,21 @@ wysihtml5.dom.replaceWithChildNodes = function(node) {
|
|
5249
5250
|
function _isBlockElement(node) {
|
5250
5251
|
return dom.getStyle("display").from(node) === "block";
|
5251
5252
|
}
|
5252
|
-
|
5253
|
+
|
5253
5254
|
function _isLineBreak(node) {
|
5254
5255
|
return node.nodeName === "BR";
|
5255
5256
|
}
|
5256
|
-
|
5257
|
+
|
5257
5258
|
function _appendLineBreak(element) {
|
5258
5259
|
var lineBreak = element.ownerDocument.createElement("br");
|
5259
5260
|
element.appendChild(lineBreak);
|
5260
5261
|
}
|
5261
|
-
|
5262
|
+
|
5262
5263
|
function resolveList(list) {
|
5263
5264
|
if (list.nodeName !== "MENU" && list.nodeName !== "UL" && list.nodeName !== "OL") {
|
5264
5265
|
return;
|
5265
5266
|
}
|
5266
|
-
|
5267
|
+
|
5267
5268
|
var doc = list.ownerDocument,
|
5268
5269
|
fragment = doc.createDocumentFragment(),
|
5269
5270
|
previousSibling = list.previousElementSibling || list.previousSibling,
|
@@ -5272,11 +5273,11 @@ wysihtml5.dom.replaceWithChildNodes = function(node) {
|
|
5272
5273
|
isLastChild,
|
5273
5274
|
shouldAppendLineBreak,
|
5274
5275
|
listItem;
|
5275
|
-
|
5276
|
+
|
5276
5277
|
if (previousSibling && !_isBlockElement(previousSibling)) {
|
5277
5278
|
_appendLineBreak(fragment);
|
5278
5279
|
}
|
5279
|
-
|
5280
|
+
|
5280
5281
|
while (listItem = list.firstChild) {
|
5281
5282
|
lastChild = listItem.lastChild;
|
5282
5283
|
while (firstChild = listItem.firstChild) {
|
@@ -5288,12 +5289,12 @@ wysihtml5.dom.replaceWithChildNodes = function(node) {
|
|
5288
5289
|
_appendLineBreak(fragment);
|
5289
5290
|
}
|
5290
5291
|
}
|
5291
|
-
|
5292
|
+
|
5292
5293
|
listItem.parentNode.removeChild(listItem);
|
5293
5294
|
}
|
5294
5295
|
list.parentNode.replaceChild(fragment, list);
|
5295
5296
|
}
|
5296
|
-
|
5297
|
+
|
5297
5298
|
dom.resolveList = resolveList;
|
5298
5299
|
})(wysihtml5.dom);/**
|
5299
5300
|
* Sandbox for executing javascript, parsing css styles and doing dom operations in a secure way
|
@@ -5345,7 +5346,7 @@ wysihtml5.dom.replaceWithChildNodes = function(node) {
|
|
5345
5346
|
"referrer",
|
5346
5347
|
"write", "open", "close"
|
5347
5348
|
];
|
5348
|
-
|
5349
|
+
|
5349
5350
|
wysihtml5.dom.Sandbox = Base.extend(
|
5350
5351
|
/** @scope wysihtml5.dom.Sandbox.prototype */ {
|
5351
5352
|
|
@@ -5354,12 +5355,12 @@ wysihtml5.dom.replaceWithChildNodes = function(node) {
|
|
5354
5355
|
this.config = wysihtml5.lang.object({}).merge(config).get();
|
5355
5356
|
this.iframe = this._createIframe();
|
5356
5357
|
},
|
5357
|
-
|
5358
|
+
|
5358
5359
|
insertInto: function(element) {
|
5359
5360
|
if (typeof(element) === "string") {
|
5360
5361
|
element = doc.getElementById(element);
|
5361
5362
|
}
|
5362
|
-
|
5363
|
+
|
5363
5364
|
element.appendChild(this.iframe);
|
5364
5365
|
},
|
5365
5366
|
|
@@ -5395,7 +5396,7 @@ wysihtml5.dom.replaceWithChildNodes = function(node) {
|
|
5395
5396
|
* In order to make this happen we need to set the "allow-scripts" flag.
|
5396
5397
|
* A combination of allow-scripts and allow-same-origin is almost the same as setting no sandbox attribute at all.
|
5397
5398
|
* - Chrome & Safari, doesn't seem to support sandboxing correctly when the iframe's html is inlined (no physical document)
|
5398
|
-
* - IE needs to have the security="restricted" attribute set before the iframe is
|
5399
|
+
* - IE needs to have the security="restricted" attribute set before the iframe is
|
5399
5400
|
* inserted into the dom tree
|
5400
5401
|
* - Believe it or not but in IE "security" in document.createElement("iframe") is false, even
|
5401
5402
|
* though it supports it
|
@@ -5472,7 +5473,7 @@ wysihtml5.dom.replaceWithChildNodes = function(node) {
|
|
5472
5473
|
|
5473
5474
|
if (!wysihtml5.browser.supportsSandboxedIframes()) {
|
5474
5475
|
// Unset a bunch of sensitive variables
|
5475
|
-
// Please note: This isn't hack safe!
|
5476
|
+
// Please note: This isn't hack safe!
|
5476
5477
|
// It more or less just takes care of basic attacks and prevents accidental theft of sensitive information
|
5477
5478
|
// IE is secure though, which is the most important thing, since IE is the only browser, who
|
5478
5479
|
// takes over scripts & styles into contentEditable elements when copied from external websites
|
@@ -5487,7 +5488,7 @@ wysihtml5.dom.replaceWithChildNodes = function(node) {
|
|
5487
5488
|
for (i=0, length=documentProperties.length; i<length; i++) {
|
5488
5489
|
this._unset(iframeDocument, documentProperties[i]);
|
5489
5490
|
}
|
5490
|
-
// This doesn't work in Safari 5
|
5491
|
+
// This doesn't work in Safari 5
|
5491
5492
|
// See http://stackoverflow.com/questions/992461/is-it-possible-to-override-document-cookie-in-webkit
|
5492
5493
|
this._unset(iframeDocument, "cookie", "", true);
|
5493
5494
|
}
|
@@ -5661,11 +5662,11 @@ wysihtml5.quirks.cleanPastedHTML = (function() {
|
|
5661
5662
|
// When pasting underlined links <a> into a contentEditable, IE thinks, it has to insert <u> to keep the styling
|
5662
5663
|
"a u": wysihtml5.dom.replaceWithChildNodes
|
5663
5664
|
};
|
5664
|
-
|
5665
|
+
|
5665
5666
|
function cleanPastedHTML(elementOrHtml, rules, context) {
|
5666
5667
|
rules = rules || defaultRules;
|
5667
5668
|
context = context || elementOrHtml.ownerDocument || document;
|
5668
|
-
|
5669
|
+
|
5669
5670
|
var element,
|
5670
5671
|
isString = typeof(elementOrHtml) === "string",
|
5671
5672
|
method,
|
@@ -5678,7 +5679,7 @@ wysihtml5.quirks.cleanPastedHTML = (function() {
|
|
5678
5679
|
} else {
|
5679
5680
|
element = elementOrHtml;
|
5680
5681
|
}
|
5681
|
-
|
5682
|
+
|
5682
5683
|
for (i in rules) {
|
5683
5684
|
matches = element.querySelectorAll(i);
|
5684
5685
|
method = rules[i];
|
@@ -5687,12 +5688,12 @@ wysihtml5.quirks.cleanPastedHTML = (function() {
|
|
5687
5688
|
method(matches[j]);
|
5688
5689
|
}
|
5689
5690
|
}
|
5690
|
-
|
5691
|
+
|
5691
5692
|
matches = elementOrHtml = rules = null;
|
5692
|
-
|
5693
|
+
|
5693
5694
|
return isString ? element.innerHTML : element;
|
5694
5695
|
}
|
5695
|
-
|
5696
|
+
|
5696
5697
|
return cleanPastedHTML;
|
5697
5698
|
})();/**
|
5698
5699
|
* IE and Opera leave an empty paragraph in the contentEditable element after clearing it
|
@@ -5703,7 +5704,7 @@ wysihtml5.quirks.cleanPastedHTML = (function() {
|
|
5703
5704
|
*/
|
5704
5705
|
(function(wysihtml5) {
|
5705
5706
|
var dom = wysihtml5.dom;
|
5706
|
-
|
5707
|
+
|
5707
5708
|
wysihtml5.quirks.ensureProperClearing = (function() {
|
5708
5709
|
var clearIfNecessary = function(event) {
|
5709
5710
|
var element = this;
|
@@ -5790,7 +5791,7 @@ wysihtml5.quirks.cleanPastedHTML = (function() {
|
|
5790
5791
|
if (innerHTML.indexOf(TILDE_ESCAPED) === -1) {
|
5791
5792
|
return innerHTML;
|
5792
5793
|
}
|
5793
|
-
|
5794
|
+
|
5794
5795
|
var elementsWithTilde = element.querySelectorAll("[href*='~'], [src*='~']"),
|
5795
5796
|
url,
|
5796
5797
|
urlToSearch,
|
@@ -5818,7 +5819,7 @@ wysihtml5.quirks.cleanPastedHTML = (function() {
|
|
5818
5819
|
var dom = wysihtml5.dom,
|
5819
5820
|
USE_NATIVE_LINE_BREAK_WHEN_CARET_INSIDE_TAGS = ["LI", "P", "H1", "H2", "H3", "H4", "H5", "H6"],
|
5820
5821
|
LIST_TAGS = ["UL", "OL", "MENU"];
|
5821
|
-
|
5822
|
+
|
5822
5823
|
wysihtml5.quirks.insertLineBreakOnReturn = function(composer) {
|
5823
5824
|
function unwrap(selectedNode) {
|
5824
5825
|
var parentElement = dom.getParentElement(selectedNode, { nodeName: ["P", "DIV"] }, 2);
|
@@ -5867,7 +5868,7 @@ wysihtml5.quirks.cleanPastedHTML = (function() {
|
|
5867
5868
|
setTimeout(function() {
|
5868
5869
|
unwrap(composer.selection.getSelectedNode());
|
5869
5870
|
}, 0);
|
5870
|
-
}
|
5871
|
+
}
|
5871
5872
|
return;
|
5872
5873
|
}
|
5873
5874
|
|
@@ -5876,7 +5877,7 @@ wysihtml5.quirks.cleanPastedHTML = (function() {
|
|
5876
5877
|
event.preventDefault();
|
5877
5878
|
}
|
5878
5879
|
}
|
5879
|
-
|
5880
|
+
|
5880
5881
|
// keypress doesn't fire when you hit backspace
|
5881
5882
|
dom.observe(composer.element.ownerDocument, "keydown", keyDown);
|
5882
5883
|
};
|
@@ -5890,11 +5891,11 @@ wysihtml5.quirks.cleanPastedHTML = (function() {
|
|
5890
5891
|
*/
|
5891
5892
|
(function(wysihtml5) {
|
5892
5893
|
var CLASS_NAME = "wysihtml5-quirks-redraw";
|
5893
|
-
|
5894
|
+
|
5894
5895
|
wysihtml5.quirks.redraw = function(element) {
|
5895
5896
|
wysihtml5.dom.addClass(element, CLASS_NAME);
|
5896
5897
|
wysihtml5.dom.removeClass(element, CLASS_NAME);
|
5897
|
-
|
5898
|
+
|
5898
5899
|
// Following hack is needed for firefox to make sure that image resize handles are properly removed
|
5899
5900
|
try {
|
5900
5901
|
var doc = element.ownerDocument;
|
@@ -5910,7 +5911,7 @@ wysihtml5.quirks.cleanPastedHTML = (function() {
|
|
5910
5911
|
*/
|
5911
5912
|
(function(wysihtml5) {
|
5912
5913
|
var dom = wysihtml5.dom;
|
5913
|
-
|
5914
|
+
|
5914
5915
|
function _getCumulativeOffsetTop(element) {
|
5915
5916
|
var top = 0;
|
5916
5917
|
if (element.parentNode) {
|
@@ -5921,18 +5922,18 @@ wysihtml5.quirks.cleanPastedHTML = (function() {
|
|
5921
5922
|
}
|
5922
5923
|
return top;
|
5923
5924
|
}
|
5924
|
-
|
5925
|
+
|
5925
5926
|
wysihtml5.Selection = Base.extend(
|
5926
5927
|
/** @scope wysihtml5.Selection.prototype */ {
|
5927
5928
|
constructor: function(editor) {
|
5928
5929
|
// Make sure that our external range library is initialized
|
5929
5930
|
window.rangy.init();
|
5930
|
-
|
5931
|
+
|
5931
5932
|
this.editor = editor;
|
5932
5933
|
this.composer = editor.composer;
|
5933
5934
|
this.doc = this.composer.doc;
|
5934
5935
|
},
|
5935
|
-
|
5936
|
+
|
5936
5937
|
/**
|
5937
5938
|
* Get the current selection as a bookmark to be able to later restore it
|
5938
5939
|
*
|
@@ -6057,23 +6058,23 @@ wysihtml5.quirks.cleanPastedHTML = (function() {
|
|
6057
6058
|
placeholderHTML = '<span class="' + className + '">' + wysihtml5.INVISIBLE_SPACE + '</span>',
|
6058
6059
|
range = this.getRange(this.doc),
|
6059
6060
|
newRange;
|
6060
|
-
|
6061
|
+
|
6061
6062
|
// Nothing selected, execute and say goodbye
|
6062
6063
|
if (!range) {
|
6063
6064
|
method(body, body);
|
6064
6065
|
return;
|
6065
6066
|
}
|
6066
|
-
|
6067
|
+
|
6067
6068
|
var node = range.createContextualFragment(placeholderHTML);
|
6068
6069
|
range.insertNode(node);
|
6069
|
-
|
6070
|
+
|
6070
6071
|
// Make sure that a potential error doesn't cause our placeholder element to be left as a placeholder
|
6071
6072
|
try {
|
6072
6073
|
method(range.startContainer, range.endContainer);
|
6073
6074
|
} catch(e3) {
|
6074
6075
|
setTimeout(function() { throw e3; }, 0);
|
6075
6076
|
}
|
6076
|
-
|
6077
|
+
|
6077
6078
|
caretPlaceholder = this.doc.querySelector("." + className);
|
6078
6079
|
if (caretPlaceholder) {
|
6079
6080
|
newRange = rangy.createRange(this.doc);
|
@@ -6138,13 +6139,13 @@ wysihtml5.quirks.cleanPastedHTML = (function() {
|
|
6138
6139
|
try { newRange.setEnd(rangeBackup.endContainer, rangeBackup.endOffset); } catch(e2) {}
|
6139
6140
|
try { this.setSelection(newRange); } catch(e3) {}
|
6140
6141
|
},
|
6141
|
-
|
6142
|
+
|
6142
6143
|
set: function(node, offset) {
|
6143
6144
|
var newRange = rangy.createRange(this.doc);
|
6144
6145
|
newRange.setStart(node, offset || 0);
|
6145
6146
|
this.setSelection(newRange);
|
6146
6147
|
},
|
6147
|
-
|
6148
|
+
|
6148
6149
|
/**
|
6149
6150
|
* Insert html at the caret position and move the cursor after the inserted html
|
6150
6151
|
*
|
@@ -6309,7 +6310,7 @@ wysihtml5.quirks.cleanPastedHTML = (function() {
|
|
6309
6310
|
return [];
|
6310
6311
|
}
|
6311
6312
|
},
|
6312
|
-
|
6313
|
+
|
6313
6314
|
getRange: function() {
|
6314
6315
|
var selection = this.getSelection();
|
6315
6316
|
return selection && selection.rangeCount && selection.getRangeAt(0);
|
@@ -6325,7 +6326,7 @@ wysihtml5.quirks.cleanPastedHTML = (function() {
|
|
6325
6326
|
return selection.setSingleRange(range);
|
6326
6327
|
}
|
6327
6328
|
});
|
6328
|
-
|
6329
|
+
|
6329
6330
|
})(wysihtml5);
|
6330
6331
|
/**
|
6331
6332
|
* Inspired by the rangy CSS Applier module written by Tim Down and licensed under the MIT license.
|
@@ -6337,14 +6338,14 @@ wysihtml5.quirks.cleanPastedHTML = (function() {
|
|
6337
6338
|
*/
|
6338
6339
|
(function(wysihtml5, rangy) {
|
6339
6340
|
var defaultTagName = "span";
|
6340
|
-
|
6341
|
+
|
6341
6342
|
var REG_EXP_WHITE_SPACE = /\s+/g;
|
6342
|
-
|
6343
|
+
|
6343
6344
|
function hasClass(el, cssClass, regExp) {
|
6344
6345
|
if (!el.className) {
|
6345
6346
|
return false;
|
6346
6347
|
}
|
6347
|
-
|
6348
|
+
|
6348
6349
|
var matchingClassNames = el.className.match(regExp) || [];
|
6349
6350
|
return matchingClassNames[matchingClassNames.length - 1] === cssClass;
|
6350
6351
|
}
|
@@ -6363,7 +6364,7 @@ wysihtml5.quirks.cleanPastedHTML = (function() {
|
|
6363
6364
|
el.className = el.className.replace(regExp, "");
|
6364
6365
|
}
|
6365
6366
|
}
|
6366
|
-
|
6367
|
+
|
6367
6368
|
function hasSameClasses(el1, el2) {
|
6368
6369
|
return el1.className.replace(REG_EXP_WHITE_SPACE, " ") == el2.className.replace(REG_EXP_WHITE_SPACE, " ");
|
6369
6370
|
}
|
@@ -6436,7 +6437,7 @@ wysihtml5.quirks.cleanPastedHTML = (function() {
|
|
6436
6437
|
}
|
6437
6438
|
return (descendantNode == node) ? newNode : splitNodeAt(node, newNode.parentNode, rangy.dom.getNodeIndex(newNode));
|
6438
6439
|
}
|
6439
|
-
|
6440
|
+
|
6440
6441
|
function Merge(firstNode) {
|
6441
6442
|
this.isElementMerge = (firstNode.nodeType == wysihtml5.ELEMENT_NODE);
|
6442
6443
|
this.firstTextNode = this.isElementMerge ? firstNode.lastChild : firstNode;
|
@@ -6552,7 +6553,7 @@ wysihtml5.quirks.cleanPastedHTML = (function() {
|
|
6552
6553
|
range.setEnd(rangeEndNode, rangeEndOffset);
|
6553
6554
|
}
|
6554
6555
|
},
|
6555
|
-
|
6556
|
+
|
6556
6557
|
getAdjacentMergeableTextNode: function(node, forward) {
|
6557
6558
|
var isTextNode = (node.nodeType == wysihtml5.TEXT_NODE);
|
6558
6559
|
var el = isTextNode ? node.parentNode : node;
|
@@ -6573,7 +6574,7 @@ wysihtml5.quirks.cleanPastedHTML = (function() {
|
|
6573
6574
|
}
|
6574
6575
|
return null;
|
6575
6576
|
},
|
6576
|
-
|
6577
|
+
|
6577
6578
|
areElementsMergeable: function(el1, el2) {
|
6578
6579
|
return rangy.dom.arrayContains(this.tagNames, (el1.tagName || "").toLowerCase())
|
6579
6580
|
&& rangy.dom.arrayContains(this.tagNames, (el2.tagName || "").toLowerCase())
|
@@ -6620,7 +6621,7 @@ wysihtml5.quirks.cleanPastedHTML = (function() {
|
|
6620
6621
|
ancestorWithClass = splitNodeAt(ancestorWithClass, range.startContainer, range.startOffset);
|
6621
6622
|
}
|
6622
6623
|
}
|
6623
|
-
|
6624
|
+
|
6624
6625
|
if (this.similarClassRegExp) {
|
6625
6626
|
removeClass(ancestorWithClass, this.similarClassRegExp);
|
6626
6627
|
}
|
@@ -6639,10 +6640,10 @@ wysihtml5.quirks.cleanPastedHTML = (function() {
|
|
6639
6640
|
return;
|
6640
6641
|
} catch(e) {}
|
6641
6642
|
}
|
6642
|
-
|
6643
|
+
|
6643
6644
|
range.splitBoundaries();
|
6644
6645
|
textNodes = range.getNodes([wysihtml5.TEXT_NODE]);
|
6645
|
-
|
6646
|
+
|
6646
6647
|
if (textNodes.length) {
|
6647
6648
|
var textNode;
|
6648
6649
|
|
@@ -6652,11 +6653,11 @@ wysihtml5.quirks.cleanPastedHTML = (function() {
|
|
6652
6653
|
this.applyToTextNode(textNode);
|
6653
6654
|
}
|
6654
6655
|
}
|
6655
|
-
|
6656
|
+
|
6656
6657
|
range.setStart(textNodes[0], 0);
|
6657
6658
|
textNode = textNodes[textNodes.length - 1];
|
6658
6659
|
range.setEnd(textNode, textNode.length);
|
6659
|
-
|
6660
|
+
|
6660
6661
|
if (this.normalize) {
|
6661
6662
|
this.postApply(textNodes, range);
|
6662
6663
|
}
|
@@ -6675,7 +6676,7 @@ wysihtml5.quirks.cleanPastedHTML = (function() {
|
|
6675
6676
|
range.selectNode(node);
|
6676
6677
|
textNodes = [node];
|
6677
6678
|
}
|
6678
|
-
|
6679
|
+
|
6679
6680
|
for (var i = 0, len = textNodes.length; i < len; ++i) {
|
6680
6681
|
textNode = textNodes[i];
|
6681
6682
|
ancestorWithClass = this.getAncestorWithClass(textNode);
|
@@ -6683,7 +6684,7 @@ wysihtml5.quirks.cleanPastedHTML = (function() {
|
|
6683
6684
|
this.undoToTextNode(textNode, range, ancestorWithClass);
|
6684
6685
|
}
|
6685
6686
|
}
|
6686
|
-
|
6687
|
+
|
6687
6688
|
if (len == 1) {
|
6688
6689
|
this.selectNode(range, textNodes[0]);
|
6689
6690
|
} else {
|
@@ -6696,7 +6697,7 @@ wysihtml5.quirks.cleanPastedHTML = (function() {
|
|
6696
6697
|
}
|
6697
6698
|
}
|
6698
6699
|
},
|
6699
|
-
|
6700
|
+
|
6700
6701
|
selectNode: function(range, node) {
|
6701
6702
|
var isElement = node.nodeType === wysihtml5.ELEMENT_NODE,
|
6702
6703
|
canHaveHTML = "canHaveHTML" in node ? node.canHaveHTML : true,
|
@@ -6715,7 +6716,7 @@ wysihtml5.quirks.cleanPastedHTML = (function() {
|
|
6715
6716
|
range.setEndAfter(node);
|
6716
6717
|
}
|
6717
6718
|
},
|
6718
|
-
|
6719
|
+
|
6719
6720
|
getTextSelectedByRange: function(textNode, range) {
|
6720
6721
|
var textRange = range.cloneRange();
|
6721
6722
|
textRange.selectNodeContents(textNode);
|
@@ -6735,7 +6736,7 @@ wysihtml5.quirks.cleanPastedHTML = (function() {
|
|
6735
6736
|
ancestor = this.getAncestorWithClass(range.startContainer);
|
6736
6737
|
return ancestor ? [ancestor] : false;
|
6737
6738
|
}
|
6738
|
-
|
6739
|
+
|
6739
6740
|
for (var i = 0, len = textNodes.length, selectedText; i < len; ++i) {
|
6740
6741
|
selectedText = this.getTextSelectedByRange(textNodes[i], range);
|
6741
6742
|
ancestor = this.getAncestorWithClass(textNodes[i]);
|
@@ -6758,10 +6759,10 @@ wysihtml5.quirks.cleanPastedHTML = (function() {
|
|
6758
6759
|
};
|
6759
6760
|
|
6760
6761
|
wysihtml5.selection.HTMLApplier = HTMLApplier;
|
6761
|
-
|
6762
|
+
|
6762
6763
|
})(wysihtml5, rangy);/**
|
6763
6764
|
* Rich Text Query/Formatting Commands
|
6764
|
-
*
|
6765
|
+
*
|
6765
6766
|
* @example
|
6766
6767
|
* var commands = new wysihtml5.Commands(editor);
|
6767
6768
|
*/
|
@@ -6772,7 +6773,7 @@ wysihtml5.Commands = Base.extend(
|
|
6772
6773
|
this.composer = editor.composer;
|
6773
6774
|
this.doc = this.composer.doc;
|
6774
6775
|
},
|
6775
|
-
|
6776
|
+
|
6776
6777
|
/**
|
6777
6778
|
* Check whether the browser supports the given command
|
6778
6779
|
*
|
@@ -6783,7 +6784,7 @@ wysihtml5.Commands = Base.extend(
|
|
6783
6784
|
support: function(command) {
|
6784
6785
|
return wysihtml5.browser.supportsCommand(this.doc, command);
|
6785
6786
|
},
|
6786
|
-
|
6787
|
+
|
6787
6788
|
/**
|
6788
6789
|
* Check whether the browser supports the given command
|
6789
6790
|
*
|
@@ -6797,9 +6798,9 @@ wysihtml5.Commands = Base.extend(
|
|
6797
6798
|
args = wysihtml5.lang.array(arguments).get(),
|
6798
6799
|
method = obj && obj.exec,
|
6799
6800
|
result = null;
|
6800
|
-
|
6801
|
+
|
6801
6802
|
this.editor.fire("beforecommand:composer");
|
6802
|
-
|
6803
|
+
|
6803
6804
|
if (method) {
|
6804
6805
|
args.unshift(this.composer);
|
6805
6806
|
result = method.apply(obj, args);
|
@@ -6809,11 +6810,11 @@ wysihtml5.Commands = Base.extend(
|
|
6809
6810
|
result = this.doc.execCommand(command, false, value);
|
6810
6811
|
} catch(e) {}
|
6811
6812
|
}
|
6812
|
-
|
6813
|
+
|
6813
6814
|
this.editor.fire("aftercommand:composer");
|
6814
6815
|
return result;
|
6815
6816
|
},
|
6816
|
-
|
6817
|
+
|
6817
6818
|
/**
|
6818
6819
|
* Check whether the current command is active
|
6819
6820
|
* If the caret is within a bold text, then calling this with command "bold" should return true
|
@@ -6860,7 +6861,7 @@ wysihtml5.commands.bold = {
|
|
6860
6861
|
var undef,
|
6861
6862
|
NODE_NAME = "A",
|
6862
6863
|
dom = wysihtml5.dom;
|
6863
|
-
|
6864
|
+
|
6864
6865
|
function _removeFormat(composer, anchors) {
|
6865
6866
|
var length = anchors.length,
|
6866
6867
|
i = 0,
|
@@ -6923,7 +6924,7 @@ wysihtml5.commands.bold = {
|
|
6923
6924
|
}
|
6924
6925
|
composer.selection.setAfter(elementToSetCaretAfter);
|
6925
6926
|
}
|
6926
|
-
|
6927
|
+
|
6927
6928
|
wysihtml5.commands.createLink = {
|
6928
6929
|
/**
|
6929
6930
|
* TODO: Use HTMLApplier or formatInline here
|
@@ -6931,7 +6932,7 @@ wysihtml5.commands.bold = {
|
|
6931
6932
|
* Turns selection into a link
|
6932
6933
|
* If selection is already a link, it removes the link and wraps it with a <code> element
|
6933
6934
|
* The <code> element is needed to avoid auto linking
|
6934
|
-
*
|
6935
|
+
*
|
6935
6936
|
* @example
|
6936
6937
|
* // either ...
|
6937
6938
|
* wysihtml5.commands.createLink.exec(composer, "createLink", "http://www.google.de");
|
@@ -6964,7 +6965,7 @@ wysihtml5.commands.bold = {
|
|
6964
6965
|
(function(wysihtml5) {
|
6965
6966
|
var undef,
|
6966
6967
|
REG_EXP = /wysiwyg-font-size-[0-9a-z\-]+/g;
|
6967
|
-
|
6968
|
+
|
6968
6969
|
wysihtml5.commands.fontSize = {
|
6969
6970
|
exec: function(composer, command, size) {
|
6970
6971
|
return wysihtml5.commands.formatInline.exec(composer, command, "span", "wysiwyg-font-size-" + size, REG_EXP);
|
@@ -6986,7 +6987,7 @@ wysihtml5.commands.bold = {
|
|
6986
6987
|
*/
|
6987
6988
|
(function(wysihtml5) {
|
6988
6989
|
var REG_EXP = /wysiwyg-color-[0-9a-z]+/g;
|
6989
|
-
|
6990
|
+
|
6990
6991
|
wysihtml5.commands.foreColor = {
|
6991
6992
|
exec: function(composer, command, color) {
|
6992
6993
|
return wysihtml5.commands.formatInline.exec(composer, command, "span", "wysiwyg-color-" + color, REG_EXP);
|
@@ -7003,7 +7004,7 @@ wysihtml5.commands.bold = {
|
|
7003
7004
|
// when the caret is within a H1 and the H4 is invoked, the H1 should turn into H4
|
7004
7005
|
// instead of creating a H4 within a H1 which would result in semantically invalid html
|
7005
7006
|
BLOCK_ELEMENTS_GROUP = ["H1", "H2", "H3", "H4", "H5", "H6", "P", "BLOCKQUOTE", DEFAULT_NODE_NAME];
|
7006
|
-
|
7007
|
+
|
7007
7008
|
/**
|
7008
7009
|
* Remove similiar classes (based on classRegExp)
|
7009
7010
|
* and add the desired class name
|
@@ -7145,7 +7146,7 @@ wysihtml5.commands.bold = {
|
|
7145
7146
|
function _hasClasses(element) {
|
7146
7147
|
return !!wysihtml5.lang.string(element.className).trim();
|
7147
7148
|
}
|
7148
|
-
|
7149
|
+
|
7149
7150
|
wysihtml5.commands.formatBlock = {
|
7150
7151
|
exec: function(composer, command, nodeName, className, classRegExp) {
|
7151
7152
|
var doc = composer.doc,
|
@@ -7223,12 +7224,12 @@ wysihtml5.commands.bold = {
|
|
7223
7224
|
* abcdefg|
|
7224
7225
|
* output:
|
7225
7226
|
* abcdefg<b>|</b>
|
7226
|
-
*
|
7227
|
+
*
|
7227
7228
|
* #2 unformatted text selected:
|
7228
7229
|
* abc|deg|h
|
7229
7230
|
* output:
|
7230
7231
|
* abc<b>|deg|</b>h
|
7231
|
-
*
|
7232
|
+
*
|
7232
7233
|
* #3 unformatted text selected across boundaries:
|
7233
7234
|
* ab|c <span>defg|h</span>
|
7234
7235
|
* output:
|
@@ -7258,12 +7259,12 @@ wysihtml5.commands.bold = {
|
|
7258
7259
|
"i": "em"
|
7259
7260
|
},
|
7260
7261
|
htmlApplier = {};
|
7261
|
-
|
7262
|
+
|
7262
7263
|
function _getTagNames(tagName) {
|
7263
7264
|
var alias = ALIAS_MAPPING[tagName];
|
7264
7265
|
return alias ? [tagName.toLowerCase(), alias.toLowerCase()] : [tagName.toLowerCase()];
|
7265
7266
|
}
|
7266
|
-
|
7267
|
+
|
7267
7268
|
function _getApplier(tagName, className, classRegExp) {
|
7268
7269
|
var identifier = tagName + ":" + className;
|
7269
7270
|
if (!htmlApplier[identifier]) {
|
@@ -7271,7 +7272,7 @@ wysihtml5.commands.bold = {
|
|
7271
7272
|
}
|
7272
7273
|
return htmlApplier[identifier];
|
7273
7274
|
}
|
7274
|
-
|
7275
|
+
|
7275
7276
|
wysihtml5.commands.formatInline = {
|
7276
7277
|
exec: function(composer, command, tagName, className, classRegExp) {
|
7277
7278
|
var range = composer.selection.getRange();
|
@@ -7321,12 +7322,12 @@ wysihtml5.commands.bold = {
|
|
7321
7322
|
};
|
7322
7323
|
(function(wysihtml5) {
|
7323
7324
|
var NODE_NAME = "IMG";
|
7324
|
-
|
7325
|
+
|
7325
7326
|
wysihtml5.commands.insertImage = {
|
7326
7327
|
/**
|
7327
7328
|
* Inserts an <img>
|
7328
7329
|
* If selection is already an image link, it removes it
|
7329
|
-
*
|
7330
|
+
*
|
7330
7331
|
* @example
|
7331
7332
|
* // either ...
|
7332
7333
|
* wysihtml5.commands.insertImage.exec(composer, "insertImage", "http://www.google.de/logo.jpg");
|
@@ -7361,7 +7362,7 @@ wysihtml5.commands.bold = {
|
|
7361
7362
|
}
|
7362
7363
|
|
7363
7364
|
image = doc.createElement(NODE_NAME);
|
7364
|
-
|
7365
|
+
|
7365
7366
|
for (i in value) {
|
7366
7367
|
if (i === "className") {
|
7367
7368
|
i = "class";
|
@@ -7422,7 +7423,7 @@ wysihtml5.commands.bold = {
|
|
7422
7423
|
};
|
7423
7424
|
})(wysihtml5);(function(wysihtml5) {
|
7424
7425
|
var LINE_BREAK = "<br>" + (wysihtml5.browser.needsSpaceAfterLineBreak() ? " " : "");
|
7425
|
-
|
7426
|
+
|
7426
7427
|
wysihtml5.commands.insertLineBreak = {
|
7427
7428
|
exec: function(composer, command) {
|
7428
7429
|
if (composer.commands.support(command)) {
|
@@ -7448,12 +7449,12 @@ wysihtml5.commands.bold = {
|
|
7448
7449
|
tempClassName = "_wysihtml5-temp-" + new Date().getTime(),
|
7449
7450
|
isEmpty,
|
7450
7451
|
tempElement;
|
7451
|
-
|
7452
|
+
|
7452
7453
|
if (composer.commands.support(command)) {
|
7453
7454
|
doc.execCommand(command, false, null);
|
7454
7455
|
return;
|
7455
7456
|
}
|
7456
|
-
|
7457
|
+
|
7457
7458
|
if (list) {
|
7458
7459
|
// Unwrap list
|
7459
7460
|
// <ol><li>foo</li><li>bar</li></ol>
|
@@ -7483,7 +7484,7 @@ wysihtml5.commands.bold = {
|
|
7483
7484
|
}
|
7484
7485
|
}
|
7485
7486
|
},
|
7486
|
-
|
7487
|
+
|
7487
7488
|
state: function(composer) {
|
7488
7489
|
var selectedNode = composer.selection.getSelectedNode();
|
7489
7490
|
return wysihtml5.dom.getParentElement(selectedNode, { nodeName: "OL" });
|
@@ -7497,12 +7498,12 @@ wysihtml5.commands.bold = {
|
|
7497
7498
|
tempClassName = "_wysihtml5-temp-" + new Date().getTime(),
|
7498
7499
|
isEmpty,
|
7499
7500
|
tempElement;
|
7500
|
-
|
7501
|
+
|
7501
7502
|
if (composer.commands.support(command)) {
|
7502
7503
|
doc.execCommand(command, false, null);
|
7503
7504
|
return;
|
7504
7505
|
}
|
7505
|
-
|
7506
|
+
|
7506
7507
|
if (list) {
|
7507
7508
|
// Unwrap list
|
7508
7509
|
// <ul><li>foo</li><li>bar</li></ul>
|
@@ -7532,7 +7533,7 @@ wysihtml5.commands.bold = {
|
|
7532
7533
|
}
|
7533
7534
|
}
|
7534
7535
|
},
|
7535
|
-
|
7536
|
+
|
7536
7537
|
state: function(composer) {
|
7537
7538
|
var selectedNode = composer.selection.getSelectedNode();
|
7538
7539
|
return wysihtml5.dom.getParentElement(selectedNode, { nodeName: "UL" });
|
@@ -7553,7 +7554,7 @@ wysihtml5.commands.bold = {
|
|
7553
7554
|
};(function(wysihtml5) {
|
7554
7555
|
var CLASS_NAME = "wysiwyg-text-align-center",
|
7555
7556
|
REG_EXP = /wysiwyg-text-align-[0-9a-z]+/g;
|
7556
|
-
|
7557
|
+
|
7557
7558
|
wysihtml5.commands.justifyCenter = {
|
7558
7559
|
exec: function(composer, command) {
|
7559
7560
|
return wysihtml5.commands.formatBlock.exec(composer, "formatBlock", null, CLASS_NAME, REG_EXP);
|
@@ -7566,7 +7567,7 @@ wysihtml5.commands.bold = {
|
|
7566
7567
|
})(wysihtml5);(function(wysihtml5) {
|
7567
7568
|
var CLASS_NAME = "wysiwyg-text-align-left",
|
7568
7569
|
REG_EXP = /wysiwyg-text-align-[0-9a-z]+/g;
|
7569
|
-
|
7570
|
+
|
7570
7571
|
wysihtml5.commands.justifyLeft = {
|
7571
7572
|
exec: function(composer, command) {
|
7572
7573
|
return wysihtml5.commands.formatBlock.exec(composer, "formatBlock", null, CLASS_NAME, REG_EXP);
|
@@ -7579,7 +7580,7 @@ wysihtml5.commands.bold = {
|
|
7579
7580
|
})(wysihtml5);(function(wysihtml5) {
|
7580
7581
|
var CLASS_NAME = "wysiwyg-text-align-right",
|
7581
7582
|
REG_EXP = /wysiwyg-text-align-[0-9a-z]+/g;
|
7582
|
-
|
7583
|
+
|
7583
7584
|
wysihtml5.commands.justifyRight = {
|
7584
7585
|
exec: function(composer, command) {
|
7585
7586
|
return wysihtml5.commands.formatBlock.exec(composer, "formatBlock", null, CLASS_NAME, REG_EXP);
|
@@ -7592,7 +7593,7 @@ wysihtml5.commands.bold = {
|
|
7592
7593
|
})(wysihtml5);(function(wysihtml5) {
|
7593
7594
|
var CLASS_NAME = "wysiwyg-text-align-justify",
|
7594
7595
|
REG_EXP = /wysiwyg-text-align-[0-9a-z]+/g;
|
7595
|
-
|
7596
|
+
|
7596
7597
|
wysihtml5.commands.justifyFull = {
|
7597
7598
|
exec: function(composer, command) {
|
7598
7599
|
return wysihtml5.commands.formatBlock.exec(composer, "formatBlock", null, CLASS_NAME, REG_EXP);
|
@@ -7642,45 +7643,45 @@ wysihtml5.commands.redo = {
|
|
7642
7643
|
UNDO_HTML = '<span id="_wysihtml5-undo" class="_wysihtml5-temp">' + wysihtml5.INVISIBLE_SPACE + '</span>',
|
7643
7644
|
REDO_HTML = '<span id="_wysihtml5-redo" class="_wysihtml5-temp">' + wysihtml5.INVISIBLE_SPACE + '</span>',
|
7644
7645
|
dom = wysihtml5.dom;
|
7645
|
-
|
7646
|
+
|
7646
7647
|
function cleanTempElements(doc) {
|
7647
7648
|
var tempElement;
|
7648
7649
|
while (tempElement = doc.querySelector("._wysihtml5-temp")) {
|
7649
7650
|
tempElement.parentNode.removeChild(tempElement);
|
7650
7651
|
}
|
7651
7652
|
}
|
7652
|
-
|
7653
|
+
|
7653
7654
|
wysihtml5.UndoManager = wysihtml5.lang.Dispatcher.extend(
|
7654
7655
|
/** @scope wysihtml5.UndoManager.prototype */ {
|
7655
7656
|
constructor: function(editor) {
|
7656
7657
|
this.editor = editor;
|
7657
7658
|
this.composer = editor.composer;
|
7658
7659
|
this.element = this.composer.element;
|
7659
|
-
|
7660
|
+
|
7660
7661
|
this.position = 0;
|
7661
7662
|
this.historyStr = [];
|
7662
7663
|
this.historyDom = [];
|
7663
|
-
|
7664
|
+
|
7664
7665
|
this.transact();
|
7665
|
-
|
7666
|
+
|
7666
7667
|
this._observe();
|
7667
7668
|
},
|
7668
|
-
|
7669
|
+
|
7669
7670
|
_observe: function() {
|
7670
7671
|
var that = this,
|
7671
7672
|
doc = this.composer.sandbox.getDocument(),
|
7672
7673
|
lastKey;
|
7673
|
-
|
7674
|
+
|
7674
7675
|
// Catch CTRL+Z and CTRL+Y
|
7675
7676
|
dom.observe(this.element, "keydown", function(event) {
|
7676
7677
|
if (event.altKey || (!event.ctrlKey && !event.metaKey)) {
|
7677
7678
|
return;
|
7678
7679
|
}
|
7679
|
-
|
7680
|
+
|
7680
7681
|
var keyCode = event.keyCode,
|
7681
7682
|
isUndo = keyCode === Z_KEY && !event.shiftKey,
|
7682
7683
|
isRedo = (keyCode === Z_KEY && event.shiftKey) || (keyCode === Y_KEY);
|
7683
|
-
|
7684
|
+
|
7684
7685
|
if (isUndo) {
|
7685
7686
|
that.undo();
|
7686
7687
|
event.preventDefault();
|
@@ -7689,21 +7690,21 @@ wysihtml5.commands.redo = {
|
|
7689
7690
|
event.preventDefault();
|
7690
7691
|
}
|
7691
7692
|
});
|
7692
|
-
|
7693
|
+
|
7693
7694
|
// Catch delete and backspace
|
7694
7695
|
dom.observe(this.element, "keydown", function(event) {
|
7695
7696
|
var keyCode = event.keyCode;
|
7696
7697
|
if (keyCode === lastKey) {
|
7697
7698
|
return;
|
7698
7699
|
}
|
7699
|
-
|
7700
|
+
|
7700
7701
|
lastKey = keyCode;
|
7701
|
-
|
7702
|
+
|
7702
7703
|
if (keyCode === BACKSPACE_KEY || keyCode === DELETE_KEY) {
|
7703
7704
|
that.transact();
|
7704
7705
|
}
|
7705
7706
|
});
|
7706
|
-
|
7707
|
+
|
7707
7708
|
// Now this is very hacky:
|
7708
7709
|
// These days browsers don't offer a undo/redo event which we could hook into
|
7709
7710
|
// to be notified when the user hits undo/redo in the contextmenu.
|
@@ -7716,7 +7717,7 @@ wysihtml5.commands.redo = {
|
|
7716
7717
|
cleanTempElements(doc);
|
7717
7718
|
clearInterval(interval);
|
7718
7719
|
};
|
7719
|
-
|
7720
|
+
|
7720
7721
|
dom.observe(this.element, "contextmenu", function() {
|
7721
7722
|
cleanUp();
|
7722
7723
|
that.composer.selection.executeAndRestoreSimple(function() {
|
@@ -7748,104 +7749,104 @@ wysihtml5.commands.redo = {
|
|
7748
7749
|
}
|
7749
7750
|
});
|
7750
7751
|
}
|
7751
|
-
|
7752
|
+
|
7752
7753
|
this.editor
|
7753
7754
|
.observe("newword:composer", function() {
|
7754
7755
|
that.transact();
|
7755
7756
|
})
|
7756
|
-
|
7757
|
+
|
7757
7758
|
.observe("beforecommand:composer", function() {
|
7758
7759
|
that.transact();
|
7759
7760
|
});
|
7760
7761
|
},
|
7761
|
-
|
7762
|
+
|
7762
7763
|
transact: function() {
|
7763
7764
|
var previousHtml = this.historyStr[this.position - 1],
|
7764
7765
|
currentHtml = this.composer.getValue();
|
7765
|
-
|
7766
|
+
|
7766
7767
|
if (currentHtml === previousHtml) {
|
7767
7768
|
return;
|
7768
7769
|
}
|
7769
|
-
|
7770
|
+
|
7770
7771
|
var length = this.historyStr.length = this.historyDom.length = this.position;
|
7771
7772
|
if (length > MAX_HISTORY_ENTRIES) {
|
7772
7773
|
this.historyStr.shift();
|
7773
7774
|
this.historyDom.shift();
|
7774
7775
|
this.position--;
|
7775
7776
|
}
|
7776
|
-
|
7777
|
+
|
7777
7778
|
this.position++;
|
7778
|
-
|
7779
|
+
|
7779
7780
|
var range = this.composer.selection.getRange(),
|
7780
7781
|
node = range.startContainer || this.element,
|
7781
7782
|
offset = range.startOffset || 0,
|
7782
7783
|
element,
|
7783
7784
|
position;
|
7784
|
-
|
7785
|
+
|
7785
7786
|
if (node.nodeType === wysihtml5.ELEMENT_NODE) {
|
7786
7787
|
element = node;
|
7787
7788
|
} else {
|
7788
7789
|
element = node.parentNode;
|
7789
7790
|
position = this.getChildNodeIndex(element, node);
|
7790
7791
|
}
|
7791
|
-
|
7792
|
+
|
7792
7793
|
element.setAttribute(DATA_ATTR_OFFSET, offset);
|
7793
7794
|
if (typeof(position) !== "undefined") {
|
7794
7795
|
element.setAttribute(DATA_ATTR_NODE, position);
|
7795
7796
|
}
|
7796
|
-
|
7797
|
+
|
7797
7798
|
var clone = this.element.cloneNode(!!currentHtml);
|
7798
7799
|
this.historyDom.push(clone);
|
7799
7800
|
this.historyStr.push(currentHtml);
|
7800
|
-
|
7801
|
+
|
7801
7802
|
element.removeAttribute(DATA_ATTR_OFFSET);
|
7802
7803
|
element.removeAttribute(DATA_ATTR_NODE);
|
7803
7804
|
},
|
7804
|
-
|
7805
|
+
|
7805
7806
|
undo: function() {
|
7806
7807
|
this.transact();
|
7807
|
-
|
7808
|
+
|
7808
7809
|
if (!this.undoPossible()) {
|
7809
7810
|
return;
|
7810
7811
|
}
|
7811
|
-
|
7812
|
+
|
7812
7813
|
this.set(this.historyDom[--this.position - 1]);
|
7813
7814
|
this.editor.fire("undo:composer");
|
7814
7815
|
},
|
7815
|
-
|
7816
|
+
|
7816
7817
|
redo: function() {
|
7817
7818
|
if (!this.redoPossible()) {
|
7818
7819
|
return;
|
7819
7820
|
}
|
7820
|
-
|
7821
|
+
|
7821
7822
|
this.set(this.historyDom[++this.position - 1]);
|
7822
7823
|
this.editor.fire("redo:composer");
|
7823
7824
|
},
|
7824
|
-
|
7825
|
+
|
7825
7826
|
undoPossible: function() {
|
7826
7827
|
return this.position > 1;
|
7827
7828
|
},
|
7828
|
-
|
7829
|
+
|
7829
7830
|
redoPossible: function() {
|
7830
7831
|
return this.position < this.historyStr.length;
|
7831
7832
|
},
|
7832
|
-
|
7833
|
+
|
7833
7834
|
set: function(historyEntry) {
|
7834
7835
|
this.element.innerHTML = "";
|
7835
|
-
|
7836
|
+
|
7836
7837
|
var i = 0,
|
7837
7838
|
childNodes = historyEntry.childNodes,
|
7838
7839
|
length = historyEntry.childNodes.length;
|
7839
|
-
|
7840
|
+
|
7840
7841
|
for (; i<length; i++) {
|
7841
7842
|
this.element.appendChild(childNodes[i].cloneNode(true));
|
7842
7843
|
}
|
7843
|
-
|
7844
|
+
|
7844
7845
|
// Restore selection
|
7845
7846
|
var offset,
|
7846
7847
|
node,
|
7847
7848
|
position;
|
7848
|
-
|
7849
|
+
|
7849
7850
|
if (historyEntry.hasAttribute(DATA_ATTR_OFFSET)) {
|
7850
7851
|
offset = historyEntry.getAttribute(DATA_ATTR_OFFSET);
|
7851
7852
|
position = historyEntry.getAttribute(DATA_ATTR_NODE);
|
@@ -7857,14 +7858,14 @@ wysihtml5.commands.redo = {
|
|
7857
7858
|
node.removeAttribute(DATA_ATTR_OFFSET);
|
7858
7859
|
node.removeAttribute(DATA_ATTR_NODE);
|
7859
7860
|
}
|
7860
|
-
|
7861
|
+
|
7861
7862
|
if (position !== null) {
|
7862
7863
|
node = this.getChildNodeByIndex(node, +position);
|
7863
7864
|
}
|
7864
|
-
|
7865
|
+
|
7865
7866
|
this.composer.selection.set(node, offset);
|
7866
7867
|
},
|
7867
|
-
|
7868
|
+
|
7868
7869
|
getChildNodeIndex: function(parent, child) {
|
7869
7870
|
var i = 0,
|
7870
7871
|
childNodes = parent.childNodes,
|
@@ -7875,7 +7876,7 @@ wysihtml5.commands.redo = {
|
|
7875
7876
|
}
|
7876
7877
|
}
|
7877
7878
|
},
|
7878
|
-
|
7879
|
+
|
7879
7880
|
getChildNodeByIndex: function(parent, index) {
|
7880
7881
|
return parent.childNodes[index];
|
7881
7882
|
}
|
@@ -7890,10 +7891,10 @@ wysihtml5.views.View = Base.extend(
|
|
7890
7891
|
this.parent = parent;
|
7891
7892
|
this.element = textareaElement;
|
7892
7893
|
this.config = config;
|
7893
|
-
|
7894
|
+
|
7894
7895
|
this._observeViewChange();
|
7895
7896
|
},
|
7896
|
-
|
7897
|
+
|
7897
7898
|
_observeViewChange: function() {
|
7898
7899
|
var that = this;
|
7899
7900
|
this.parent.observe("beforeload", function() {
|
@@ -7909,34 +7910,34 @@ wysihtml5.views.View = Base.extend(
|
|
7909
7910
|
});
|
7910
7911
|
});
|
7911
7912
|
},
|
7912
|
-
|
7913
|
+
|
7913
7914
|
focus: function() {
|
7914
7915
|
if (this.element.ownerDocument.querySelector(":focus") === this.element) {
|
7915
7916
|
return;
|
7916
7917
|
}
|
7917
|
-
|
7918
|
+
|
7918
7919
|
try { this.element.focus(); } catch(e) {}
|
7919
7920
|
},
|
7920
|
-
|
7921
|
+
|
7921
7922
|
hide: function() {
|
7922
7923
|
this.element.style.display = "none";
|
7923
7924
|
},
|
7924
|
-
|
7925
|
+
|
7925
7926
|
show: function() {
|
7926
7927
|
this.element.style.display = "";
|
7927
7928
|
},
|
7928
|
-
|
7929
|
+
|
7929
7930
|
disable: function() {
|
7930
7931
|
this.element.setAttribute("disabled", "disabled");
|
7931
7932
|
},
|
7932
|
-
|
7933
|
+
|
7933
7934
|
enable: function() {
|
7934
7935
|
this.element.removeAttribute("disabled");
|
7935
7936
|
}
|
7936
7937
|
});(function(wysihtml5) {
|
7937
7938
|
var dom = wysihtml5.dom,
|
7938
7939
|
browser = wysihtml5.browser;
|
7939
|
-
|
7940
|
+
|
7940
7941
|
wysihtml5.views.Composer = wysihtml5.views.View.extend(
|
7941
7942
|
/** @scope wysihtml5.views.Composer.prototype */ {
|
7942
7943
|
name: "composer",
|
@@ -7956,7 +7957,7 @@ wysihtml5.views.View = Base.extend(
|
|
7956
7957
|
|
7957
7958
|
getValue: function(parse) {
|
7958
7959
|
var value = this.isEmpty() ? "" : wysihtml5.quirks.getCorrectInnerHTML(this.element);
|
7959
|
-
|
7960
|
+
|
7960
7961
|
if (parse) {
|
7961
7962
|
value = this.parent.parse(value);
|
7962
7963
|
}
|
@@ -7973,7 +7974,7 @@ wysihtml5.views.View = Base.extend(
|
|
7973
7974
|
if (parse) {
|
7974
7975
|
html = this.parent.parse(html);
|
7975
7976
|
}
|
7976
|
-
|
7977
|
+
|
7977
7978
|
try {
|
7978
7979
|
this.element.innerHTML = html;
|
7979
7980
|
} catch (e) {
|
@@ -8014,9 +8015,9 @@ wysihtml5.views.View = Base.extend(
|
|
8014
8015
|
if (wysihtml5.browser.doesAsyncFocus() && this.hasPlaceholderSet()) {
|
8015
8016
|
this.clear();
|
8016
8017
|
}
|
8017
|
-
|
8018
|
+
|
8018
8019
|
this.base();
|
8019
|
-
|
8020
|
+
|
8020
8021
|
var lastChild = this.element.lastChild;
|
8021
8022
|
if (setToEnd && lastChild) {
|
8022
8023
|
if (lastChild.nodeName === "BR") {
|
@@ -8038,7 +8039,7 @@ wysihtml5.views.View = Base.extend(
|
|
8038
8039
|
isEmpty: function() {
|
8039
8040
|
var innerHTML = this.element.innerHTML,
|
8040
8041
|
elementsWithVisualValue = "blockquote, ul, ol, img, embed, object, table, iframe, svg, video, audio, button, input, select, textarea";
|
8041
|
-
return innerHTML === "" ||
|
8042
|
+
return innerHTML === "" ||
|
8042
8043
|
innerHTML === this.CARET_HACK ||
|
8043
8044
|
this.hasPlaceholderSet() ||
|
8044
8045
|
(this.getTextContent() === "" && !this.element.querySelector(elementsWithVisualValue));
|
@@ -8046,17 +8047,17 @@ wysihtml5.views.View = Base.extend(
|
|
8046
8047
|
|
8047
8048
|
_initSandbox: function() {
|
8048
8049
|
var that = this;
|
8049
|
-
|
8050
|
+
|
8050
8051
|
this.sandbox = new dom.Sandbox(function() {
|
8051
8052
|
that._create();
|
8052
8053
|
}, {
|
8053
8054
|
stylesheets: this.config.stylesheets
|
8054
8055
|
});
|
8055
8056
|
this.iframe = this.sandbox.getIframe();
|
8056
|
-
|
8057
|
+
|
8057
8058
|
var textareaElement = this.textarea.element;
|
8058
8059
|
dom.insert(this.iframe).after(textareaElement);
|
8059
|
-
|
8060
|
+
|
8060
8061
|
// Create hidden field which tells the server after submit, that the user used an wysiwyg editor
|
8061
8062
|
if (textareaElement.form) {
|
8062
8063
|
var hiddenField = document.createElement("input");
|
@@ -8069,23 +8070,23 @@ wysihtml5.views.View = Base.extend(
|
|
8069
8070
|
|
8070
8071
|
_create: function() {
|
8071
8072
|
var that = this;
|
8072
|
-
|
8073
|
+
|
8073
8074
|
this.doc = this.sandbox.getDocument();
|
8074
8075
|
this.element = this.doc.body;
|
8075
8076
|
this.textarea = this.parent.textarea;
|
8076
8077
|
this.element.innerHTML = this.textarea.getValue(true);
|
8077
8078
|
this.enable();
|
8078
|
-
|
8079
|
+
|
8079
8080
|
// Make sure our selection handler is ready
|
8080
8081
|
this.selection = new wysihtml5.Selection(this.parent);
|
8081
|
-
|
8082
|
+
|
8082
8083
|
// Make sure commands dispatcher is ready
|
8083
8084
|
this.commands = new wysihtml5.Commands(this.parent);
|
8084
8085
|
|
8085
8086
|
dom.copyAttributes([
|
8086
8087
|
"className", "spellcheck", "title", "lang", "dir", "accessKey"
|
8087
8088
|
]).from(this.textarea.element).to(this.element);
|
8088
|
-
|
8089
|
+
|
8089
8090
|
dom.addClass(this.element, this.config.composerClassName);
|
8090
8091
|
|
8091
8092
|
// Make the editor look like the original textarea, by syncing styles
|
@@ -8108,7 +8109,7 @@ wysihtml5.views.View = Base.extend(
|
|
8108
8109
|
if (placeholderText) {
|
8109
8110
|
dom.simulatePlaceholder(this.parent, this, placeholderText);
|
8110
8111
|
}
|
8111
|
-
|
8112
|
+
|
8112
8113
|
// Make sure that the browser avoids using inline styles whenever possible
|
8113
8114
|
this.commands.exec("styleWithCSS", false);
|
8114
8115
|
|
@@ -8164,7 +8165,7 @@ wysihtml5.views.View = Base.extend(
|
|
8164
8165
|
dom.autoLink(endContainer.parentNode);
|
8165
8166
|
});
|
8166
8167
|
});
|
8167
|
-
|
8168
|
+
|
8168
8169
|
dom.observe(this.element, "blur", function() {
|
8169
8170
|
dom.autoLink(that.element);
|
8170
8171
|
});
|
@@ -8225,11 +8226,11 @@ wysihtml5.views.View = Base.extend(
|
|
8225
8226
|
style = target.style,
|
8226
8227
|
i = 0,
|
8227
8228
|
property;
|
8228
|
-
|
8229
|
+
|
8229
8230
|
if (target.nodeName !== "IMG") {
|
8230
8231
|
return;
|
8231
8232
|
}
|
8232
|
-
|
8233
|
+
|
8233
8234
|
for (; i<propertiesLength; i++) {
|
8234
8235
|
property = properties[i];
|
8235
8236
|
if (style[property]) {
|
@@ -8237,13 +8238,13 @@ wysihtml5.views.View = Base.extend(
|
|
8237
8238
|
style[property] = "";
|
8238
8239
|
}
|
8239
8240
|
}
|
8240
|
-
|
8241
|
+
|
8241
8242
|
// After resizing IE sometimes forgets to remove the old resize handles
|
8242
8243
|
wysihtml5.quirks.redraw(element);
|
8243
8244
|
};
|
8244
|
-
|
8245
|
+
|
8245
8246
|
this.commands.exec("enableObjectResizing", true);
|
8246
|
-
|
8247
|
+
|
8247
8248
|
// IE sets inline styles after resizing objects
|
8248
8249
|
// The following lines make sure that the width/height css properties
|
8249
8250
|
// are copied over to the width/height attributes
|
@@ -8253,7 +8254,7 @@ wysihtml5.views.View = Base.extend(
|
|
8253
8254
|
dom.observe(element, "DOMAttrModified", adoptStyles);
|
8254
8255
|
}
|
8255
8256
|
},
|
8256
|
-
|
8257
|
+
|
8257
8258
|
_initUndoManager: function() {
|
8258
8259
|
this.undoManager = new wysihtml5.UndoManager(this.parent);
|
8259
8260
|
}
|
@@ -8310,13 +8311,13 @@ wysihtml5.views.View = Base.extend(
|
|
8310
8311
|
"body { min-height: 100%; padding: 0; margin: 0; margin-top: -1px; padding-top: 1px; }",
|
8311
8312
|
"._wysihtml5-temp { display: none; }",
|
8312
8313
|
wysihtml5.browser.isGecko ?
|
8313
|
-
"body.placeholder { color: graytext !important; }" :
|
8314
|
+
"body.placeholder { color: graytext !important; }" :
|
8314
8315
|
"body.placeholder { color: #a9a9a9 !important; }",
|
8315
8316
|
"body[disabled] { background-color: #eee !important; color: #999 !important; cursor: default !important; }",
|
8316
8317
|
// Ensure that user see's broken images and can delete them
|
8317
8318
|
"img:-moz-broken { -moz-force-broken-image-icon: 1; height: 24px; width: 24px; }"
|
8318
8319
|
];
|
8319
|
-
|
8320
|
+
|
8320
8321
|
/**
|
8321
8322
|
* With "setActive" IE offers a smart way of focusing elements without scrolling them into view:
|
8322
8323
|
* http://msdn.microsoft.com/en-us/library/ms536738(v=vs.85).aspx
|
@@ -8340,7 +8341,7 @@ wysihtml5.views.View = Base.extend(
|
|
8340
8341
|
left: elementStyle.left,
|
8341
8342
|
WebkitUserSelect: elementStyle.WebkitUserSelect
|
8342
8343
|
};
|
8343
|
-
|
8344
|
+
|
8344
8345
|
dom.setStyles({
|
8345
8346
|
position: "absolute",
|
8346
8347
|
top: "-99999px",
|
@@ -8348,11 +8349,11 @@ wysihtml5.views.View = Base.extend(
|
|
8348
8349
|
// Don't ask why but temporarily setting -webkit-user-select to none makes the whole thing performing smoother
|
8349
8350
|
WebkitUserSelect: "none"
|
8350
8351
|
}).on(element);
|
8351
|
-
|
8352
|
+
|
8352
8353
|
element.focus();
|
8353
|
-
|
8354
|
+
|
8354
8355
|
dom.setStyles(originalStyles).on(element);
|
8355
|
-
|
8356
|
+
|
8356
8357
|
if (win.scrollTo) {
|
8357
8358
|
// Some browser extensions unset this method to prevent annoyances
|
8358
8359
|
// "Better PopUp Blocker" for Chrome http://code.google.com/p/betterpopupblocker/source/browse/trunk/blockStart.js#100
|
@@ -8361,8 +8362,8 @@ wysihtml5.views.View = Base.extend(
|
|
8361
8362
|
}
|
8362
8363
|
}
|
8363
8364
|
};
|
8364
|
-
|
8365
|
-
|
8365
|
+
|
8366
|
+
|
8366
8367
|
wysihtml5.views.Composer.prototype.style = function() {
|
8367
8368
|
var that = this,
|
8368
8369
|
originalActiveElement = doc.querySelector(":focus"),
|
@@ -8371,47 +8372,47 @@ wysihtml5.views.View = Base.extend(
|
|
8371
8372
|
originalPlaceholder = hasPlaceholder && textareaElement.getAttribute("placeholder");
|
8372
8373
|
this.focusStylesHost = this.focusStylesHost || HOST_TEMPLATE.cloneNode(false);
|
8373
8374
|
this.blurStylesHost = this.blurStylesHost || HOST_TEMPLATE.cloneNode(false);
|
8374
|
-
|
8375
|
+
|
8375
8376
|
// Remove placeholder before copying (as the placeholder has an affect on the computed style)
|
8376
8377
|
if (hasPlaceholder) {
|
8377
8378
|
textareaElement.removeAttribute("placeholder");
|
8378
8379
|
}
|
8379
|
-
|
8380
|
+
|
8380
8381
|
if (textareaElement === originalActiveElement) {
|
8381
8382
|
textareaElement.blur();
|
8382
8383
|
}
|
8383
|
-
|
8384
|
+
|
8384
8385
|
// --------- iframe styles (has to be set before editor styles, otherwise IE9 sets wrong fontFamily on blurStylesHost) ---------
|
8385
8386
|
dom.copyStyles(BOX_FORMATTING).from(textareaElement).to(this.iframe).andTo(this.blurStylesHost);
|
8386
|
-
|
8387
|
+
|
8387
8388
|
// --------- editor styles ---------
|
8388
8389
|
dom.copyStyles(TEXT_FORMATTING).from(textareaElement).to(this.element).andTo(this.blurStylesHost);
|
8389
|
-
|
8390
|
+
|
8390
8391
|
// --------- apply standard rules ---------
|
8391
8392
|
dom.insertCSS(ADDITIONAL_CSS_RULES).into(this.element.ownerDocument);
|
8392
|
-
|
8393
|
+
|
8393
8394
|
// --------- :focus styles ---------
|
8394
8395
|
focusWithoutScrolling(textareaElement);
|
8395
8396
|
dom.copyStyles(BOX_FORMATTING).from(textareaElement).to(this.focusStylesHost);
|
8396
8397
|
dom.copyStyles(TEXT_FORMATTING).from(textareaElement).to(this.focusStylesHost);
|
8397
|
-
|
8398
|
+
|
8398
8399
|
// Make sure that we don't change the display style of the iframe when copying styles oblur/onfocus
|
8399
8400
|
// this is needed for when the change_view event is fired where the iframe is hidden and then
|
8400
8401
|
// the blur event fires and re-displays it
|
8401
8402
|
var boxFormattingStyles = wysihtml5.lang.array(BOX_FORMATTING).without(["display"]);
|
8402
|
-
|
8403
|
+
|
8403
8404
|
// --------- restore focus ---------
|
8404
8405
|
if (originalActiveElement) {
|
8405
8406
|
originalActiveElement.focus();
|
8406
8407
|
} else {
|
8407
8408
|
textareaElement.blur();
|
8408
8409
|
}
|
8409
|
-
|
8410
|
+
|
8410
8411
|
// --------- restore placeholder ---------
|
8411
8412
|
if (hasPlaceholder) {
|
8412
8413
|
textareaElement.setAttribute("placeholder", originalPlaceholder);
|
8413
8414
|
}
|
8414
|
-
|
8415
|
+
|
8415
8416
|
// When copying styles, we only get the computed style which is never returned in percent unit
|
8416
8417
|
// Therefore we've to recalculate style onresize
|
8417
8418
|
if (!wysihtml5.browser.hasCurrentStyleProperty()) {
|
@@ -8434,7 +8435,7 @@ wysihtml5.views.View = Base.extend(
|
|
8434
8435
|
textareaElement.style.display = originalTextareaDisplayStyle;
|
8435
8436
|
});
|
8436
8437
|
}
|
8437
|
-
|
8438
|
+
|
8438
8439
|
// --------- Sync focus/blur styles ---------
|
8439
8440
|
this.parent.observe("focus:composer", function() {
|
8440
8441
|
dom.copyStyles(boxFormattingStyles) .from(that.focusStylesHost).to(that.iframe);
|
@@ -8445,7 +8446,7 @@ wysihtml5.views.View = Base.extend(
|
|
8445
8446
|
dom.copyStyles(boxFormattingStyles) .from(that.blurStylesHost).to(that.iframe);
|
8446
8447
|
dom.copyStyles(TEXT_FORMATTING) .from(that.blurStylesHost).to(that.element);
|
8447
8448
|
});
|
8448
|
-
|
8449
|
+
|
8449
8450
|
return this;
|
8450
8451
|
};
|
8451
8452
|
})(wysihtml5);/**
|
@@ -8467,7 +8468,7 @@ wysihtml5.views.View = Base.extend(
|
|
8467
8468
|
"73": "italic", // I
|
8468
8469
|
"85": "underline" // U
|
8469
8470
|
};
|
8470
|
-
|
8471
|
+
|
8471
8472
|
wysihtml5.views.Composer.prototype.observe = function() {
|
8472
8473
|
var that = this,
|
8473
8474
|
state = this.getValue(),
|
@@ -8506,7 +8507,7 @@ wysihtml5.views.View = Base.extend(
|
|
8506
8507
|
}
|
8507
8508
|
that.parent.fire("blur").fire("blur:composer");
|
8508
8509
|
});
|
8509
|
-
|
8510
|
+
|
8510
8511
|
if (browser.isIos()) {
|
8511
8512
|
// When on iPad/iPhone/IPod after clicking outside of editor, the editor loses focus
|
8512
8513
|
// but the UI still acts as if the editor has focus (blinking caret and onscreen keyboard visible)
|
@@ -8522,7 +8523,7 @@ wysihtml5.views.View = Base.extend(
|
|
8522
8523
|
}
|
8523
8524
|
input.focus();
|
8524
8525
|
input.parentNode.removeChild(input);
|
8525
|
-
|
8526
|
+
|
8526
8527
|
window.scrollTo(originalScrollLeft, originalScrollTop);
|
8527
8528
|
});
|
8528
8529
|
}
|
@@ -8560,17 +8561,17 @@ wysihtml5.views.View = Base.extend(
|
|
8560
8561
|
}
|
8561
8562
|
});
|
8562
8563
|
}
|
8563
|
-
|
8564
|
+
|
8564
8565
|
if (browser.hasHistoryIssue() && browser.supportsSelectionModify()) {
|
8565
8566
|
dom.observe(element, "keydown", function(event) {
|
8566
8567
|
if (!event.metaKey && !event.ctrlKey) {
|
8567
8568
|
return;
|
8568
8569
|
}
|
8569
|
-
|
8570
|
+
|
8570
8571
|
var keyCode = event.keyCode,
|
8571
8572
|
win = element.ownerDocument.defaultView,
|
8572
8573
|
selection = win.getSelection();
|
8573
|
-
|
8574
|
+
|
8574
8575
|
if (keyCode === 37 || keyCode === 39) {
|
8575
8576
|
if (keyCode === 37) {
|
8576
8577
|
selection.modify("extend", "left", "lineboundary");
|
@@ -8588,7 +8589,7 @@ wysihtml5.views.View = Base.extend(
|
|
8588
8589
|
}
|
8589
8590
|
});
|
8590
8591
|
}
|
8591
|
-
|
8592
|
+
|
8592
8593
|
// --------- Shortcut logic ---------
|
8593
8594
|
dom.observe(element, "keydown", function(event) {
|
8594
8595
|
var keyCode = event.keyCode,
|
@@ -8623,7 +8624,7 @@ wysihtml5.views.View = Base.extend(
|
|
8623
8624
|
IMG: "Image: ",
|
8624
8625
|
A: "Link: "
|
8625
8626
|
};
|
8626
|
-
|
8627
|
+
|
8627
8628
|
dom.observe(element, "mouseover", function(event) {
|
8628
8629
|
var target = event.target,
|
8629
8630
|
nodeName = target.nodeName,
|
@@ -8643,7 +8644,7 @@ wysihtml5.views.View = Base.extend(
|
|
8643
8644
|
*/
|
8644
8645
|
(function(wysihtml5) {
|
8645
8646
|
var INTERVAL = 400;
|
8646
|
-
|
8647
|
+
|
8647
8648
|
wysihtml5.views.Synchronizer = Base.extend(
|
8648
8649
|
/** @scope wysihtml5.views.Synchronizer.prototype */ {
|
8649
8650
|
|
@@ -8738,17 +8739,17 @@ wysihtml5.views.View = Base.extend(
|
|
8738
8739
|
wysihtml5.views.Textarea = wysihtml5.views.View.extend(
|
8739
8740
|
/** @scope wysihtml5.views.Textarea.prototype */ {
|
8740
8741
|
name: "textarea",
|
8741
|
-
|
8742
|
+
|
8742
8743
|
constructor: function(parent, textareaElement, config) {
|
8743
8744
|
this.base(parent, textareaElement, config);
|
8744
|
-
|
8745
|
+
|
8745
8746
|
this._observe();
|
8746
8747
|
},
|
8747
|
-
|
8748
|
+
|
8748
8749
|
clear: function() {
|
8749
8750
|
this.element.value = "";
|
8750
8751
|
},
|
8751
|
-
|
8752
|
+
|
8752
8753
|
getValue: function(parse) {
|
8753
8754
|
var value = this.isEmpty() ? "" : this.element.value;
|
8754
8755
|
if (parse) {
|
@@ -8756,14 +8757,14 @@ wysihtml5.views.Textarea = wysihtml5.views.View.extend(
|
|
8756
8757
|
}
|
8757
8758
|
return value;
|
8758
8759
|
},
|
8759
|
-
|
8760
|
+
|
8760
8761
|
setValue: function(html, parse) {
|
8761
8762
|
if (parse) {
|
8762
8763
|
html = this.parent.parse(html);
|
8763
8764
|
}
|
8764
8765
|
this.element.value = html;
|
8765
8766
|
},
|
8766
|
-
|
8767
|
+
|
8767
8768
|
hasPlaceholderSet: function() {
|
8768
8769
|
var supportsPlaceholder = wysihtml5.browser.supportsPlaceholderAttributeOn(this.element),
|
8769
8770
|
placeholderText = this.element.getAttribute("placeholder") || null,
|
@@ -8771,11 +8772,11 @@ wysihtml5.views.Textarea = wysihtml5.views.View.extend(
|
|
8771
8772
|
isEmpty = !value;
|
8772
8773
|
return (supportsPlaceholder && isEmpty) || (value === placeholderText);
|
8773
8774
|
},
|
8774
|
-
|
8775
|
+
|
8775
8776
|
isEmpty: function() {
|
8776
8777
|
return !wysihtml5.lang.string(this.element.value).trim() || this.hasPlaceholderSet();
|
8777
8778
|
},
|
8778
|
-
|
8779
|
+
|
8779
8780
|
_observe: function() {
|
8780
8781
|
var element = this.element,
|
8781
8782
|
parent = this.parent,
|
@@ -8788,13 +8789,13 @@ wysihtml5.views.Textarea = wysihtml5.views.View.extend(
|
|
8788
8789
|
* This is the case for focusin and focusout, so let's use them whenever possible, kkthxbai
|
8789
8790
|
*/
|
8790
8791
|
events = wysihtml5.browser.supportsEvent("focusin") ? ["focusin", "focusout", "change"] : ["focus", "blur", "change"];
|
8791
|
-
|
8792
|
+
|
8792
8793
|
parent.observe("beforeload", function() {
|
8793
8794
|
wysihtml5.dom.observe(element, events, function(event) {
|
8794
8795
|
var eventName = eventMapping[event.type] || event.type;
|
8795
8796
|
parent.fire(eventName).fire(eventName + ":textarea");
|
8796
8797
|
});
|
8797
|
-
|
8798
|
+
|
8798
8799
|
wysihtml5.dom.observe(element, ["paste", "drop"], function() {
|
8799
8800
|
setTimeout(function() { parent.fire("paste").fire("paste:textarea"); }, 0);
|
8800
8801
|
});
|
@@ -8836,8 +8837,8 @@ wysihtml5.views.Textarea = wysihtml5.views.View.extend(
|
|
8836
8837
|
SELECTOR_FORM_ELEMENTS = "input, select, textarea",
|
8837
8838
|
SELECTOR_FIELDS = "[data-wysihtml5-dialog-field]",
|
8838
8839
|
ATTRIBUTE_FIELDS = "data-wysihtml5-dialog-field";
|
8839
|
-
|
8840
|
-
|
8840
|
+
|
8841
|
+
|
8841
8842
|
wysihtml5.toolbar.Dialog = wysihtml5.lang.Dispatcher.extend(
|
8842
8843
|
/** @scope wysihtml5.toolbar.Dialog.prototype */ {
|
8843
8844
|
constructor: function(link, container) {
|
@@ -8849,7 +8850,7 @@ wysihtml5.views.Textarea = wysihtml5.views.View.extend(
|
|
8849
8850
|
if (this._observed) {
|
8850
8851
|
return;
|
8851
8852
|
}
|
8852
|
-
|
8853
|
+
|
8853
8854
|
var that = this,
|
8854
8855
|
callbackWrapper = function(event) {
|
8855
8856
|
var attributes = that._serialize();
|
@@ -8917,14 +8918,14 @@ wysihtml5.views.Textarea = wysihtml5.views.View.extend(
|
|
8917
8918
|
/**
|
8918
8919
|
* Takes the attributes of the "elementToChange"
|
8919
8920
|
* and inserts them in their corresponding dialog input fields
|
8920
|
-
*
|
8921
|
+
*
|
8921
8922
|
* Assume the "elementToChange" looks like this:
|
8922
8923
|
* <a href="http://www.google.com" target="_blank">foo</a>
|
8923
8924
|
*
|
8924
8925
|
* and we have the following dialog:
|
8925
8926
|
* <input type="text" data-wysihtml5-dialog-field="href" value="">
|
8926
8927
|
* <input type="text" data-wysihtml5-dialog-field="target" value="">
|
8927
|
-
*
|
8928
|
+
*
|
8928
8929
|
* after calling _interpolate() the dialog will look like this
|
8929
8930
|
* <input type="text" data-wysihtml5-dialog-field="href" value="http://www.google.com">
|
8930
8931
|
* <input type="text" data-wysihtml5-dialog-field="target" value="_blank">
|
@@ -8942,18 +8943,18 @@ wysihtml5.views.Textarea = wysihtml5.views.View.extend(
|
|
8942
8943
|
i = 0;
|
8943
8944
|
for (; i<length; i++) {
|
8944
8945
|
field = fields[i];
|
8945
|
-
|
8946
|
+
|
8946
8947
|
// Never change elements where the user is currently typing in
|
8947
8948
|
if (field === focusedElement) {
|
8948
8949
|
continue;
|
8949
8950
|
}
|
8950
|
-
|
8951
|
+
|
8951
8952
|
// Don't update hidden fields
|
8952
8953
|
// See https://github.com/xing/wysihtml5/pull/14
|
8953
8954
|
if (avoidHiddenFields && field.type === "hidden") {
|
8954
8955
|
continue;
|
8955
8956
|
}
|
8956
|
-
|
8957
|
+
|
8957
8958
|
fieldName = field.getAttribute(ATTRIBUTE_FIELDS);
|
8958
8959
|
newValue = this.elementToChange ? (this.elementToChange[fieldName] || "") : field.defaultValue;
|
8959
8960
|
field.value = newValue;
|
@@ -8967,7 +8968,7 @@ wysihtml5.views.Textarea = wysihtml5.views.View.extend(
|
|
8967
8968
|
if (dom.hasClass(this.link, CLASS_NAME_OPENED)) {
|
8968
8969
|
return;
|
8969
8970
|
}
|
8970
|
-
|
8971
|
+
|
8971
8972
|
var that = this,
|
8972
8973
|
firstField = this.container.querySelector(SELECTOR_FORM_ELEMENTS);
|
8973
8974
|
this.elementToChange = elementToChange;
|
@@ -9007,17 +9008,17 @@ wysihtml5.views.Textarea = wysihtml5.views.View.extend(
|
|
9007
9008
|
*
|
9008
9009
|
* Current HTML5 draft can be found here
|
9009
9010
|
* http://lists.w3.org/Archives/Public/public-xg-htmlspeech/2011Feb/att-0020/api-draft.html
|
9010
|
-
*
|
9011
|
+
*
|
9011
9012
|
* "Accessing Google Speech API Chrome 11"
|
9012
9013
|
* http://mikepultz.com/2011/03/accessing-google-speech-api-chrome-11/
|
9013
9014
|
*/
|
9014
9015
|
(function(wysihtml5) {
|
9015
9016
|
var dom = wysihtml5.dom;
|
9016
|
-
|
9017
|
+
|
9017
9018
|
var linkStyles = {
|
9018
9019
|
position: "relative"
|
9019
9020
|
};
|
9020
|
-
|
9021
|
+
|
9021
9022
|
var wrapperStyles = {
|
9022
9023
|
left: 0,
|
9023
9024
|
margin: 0,
|
@@ -9028,7 +9029,7 @@ wysihtml5.views.Textarea = wysihtml5.views.View.extend(
|
|
9028
9029
|
top: 0,
|
9029
9030
|
zIndex: 1
|
9030
9031
|
};
|
9031
|
-
|
9032
|
+
|
9032
9033
|
var inputStyles = {
|
9033
9034
|
cursor: "inherit",
|
9034
9035
|
fontSize: "50px",
|
@@ -9040,12 +9041,12 @@ wysihtml5.views.Textarea = wysihtml5.views.View.extend(
|
|
9040
9041
|
right: "-4px",
|
9041
9042
|
top: "50%"
|
9042
9043
|
};
|
9043
|
-
|
9044
|
+
|
9044
9045
|
var inputAttributes = {
|
9045
9046
|
"x-webkit-speech": "",
|
9046
9047
|
"speech": ""
|
9047
9048
|
};
|
9048
|
-
|
9049
|
+
|
9049
9050
|
wysihtml5.toolbar.Speech = function(parent, link) {
|
9050
9051
|
var input = document.createElement("input");
|
9051
9052
|
if (!wysihtml5.browser.supportsSpeechApiOn(input)) {
|
@@ -9058,32 +9059,32 @@ wysihtml5.views.Textarea = wysihtml5.views.View.extend(
|
|
9058
9059
|
}
|
9059
9060
|
|
9060
9061
|
var wrapper = document.createElement("div");
|
9061
|
-
|
9062
|
+
|
9062
9063
|
wysihtml5.lang.object(wrapperStyles).merge({
|
9063
9064
|
width: link.offsetWidth + "px",
|
9064
9065
|
height: link.offsetHeight + "px"
|
9065
9066
|
});
|
9066
|
-
|
9067
|
+
|
9067
9068
|
dom.insert(input).into(wrapper);
|
9068
9069
|
dom.insert(wrapper).into(link);
|
9069
|
-
|
9070
|
+
|
9070
9071
|
dom.setStyles(inputStyles).on(input);
|
9071
9072
|
dom.setAttributes(inputAttributes).on(input);
|
9072
|
-
|
9073
|
+
|
9073
9074
|
dom.setStyles(wrapperStyles).on(wrapper);
|
9074
9075
|
dom.setStyles(linkStyles).on(link);
|
9075
|
-
|
9076
|
+
|
9076
9077
|
var eventName = "onwebkitspeechchange" in input ? "webkitspeechchange" : "speechchange";
|
9077
9078
|
dom.observe(input, eventName, function() {
|
9078
9079
|
parent.execCommand("insertText", input.value);
|
9079
9080
|
input.value = "";
|
9080
9081
|
});
|
9081
|
-
|
9082
|
+
|
9082
9083
|
dom.observe(input, "click", function(event) {
|
9083
9084
|
if (dom.hasClass(link, "wysihtml5-command-disabled")) {
|
9084
9085
|
event.preventDefault();
|
9085
9086
|
}
|
9086
|
-
|
9087
|
+
|
9087
9088
|
event.stopPropagation();
|
9088
9089
|
});
|
9089
9090
|
};
|
@@ -9109,7 +9110,7 @@ wysihtml5.views.Textarea = wysihtml5.views.View.extend(
|
|
9109
9110
|
CLASS_NAME_COMMAND_ACTIVE = "wysihtml5-command-active",
|
9110
9111
|
CLASS_NAME_ACTION_ACTIVE = "wysihtml5-action-active",
|
9111
9112
|
dom = wysihtml5.dom;
|
9112
|
-
|
9113
|
+
|
9113
9114
|
wysihtml5.toolbar.Toolbar = Base.extend(
|
9114
9115
|
/** @scope wysihtml5.toolbar.Toolbar.prototype */ {
|
9115
9116
|
constructor: function(editor, container) {
|
@@ -9122,7 +9123,7 @@ wysihtml5.views.Textarea = wysihtml5.views.View.extend(
|
|
9122
9123
|
|
9123
9124
|
this._observe();
|
9124
9125
|
this.show();
|
9125
|
-
|
9126
|
+
|
9126
9127
|
var speechInputLinks = this.container.querySelectorAll("[data-wysihtml5-command=insertSpeech]"),
|
9127
9128
|
length = speechInputLinks.length,
|
9128
9129
|
i = 0;
|
@@ -9147,7 +9148,7 @@ wysihtml5.views.Textarea = wysihtml5.views.View.extend(
|
|
9147
9148
|
value = link.getAttribute("data-wysihtml5-" + type + "-value");
|
9148
9149
|
group = this.container.querySelector("[data-wysihtml5-" + type + "-group='" + name + "']");
|
9149
9150
|
dialog = this._getDialog(link, name);
|
9150
|
-
|
9151
|
+
|
9151
9152
|
mapping[name + ":" + value] = {
|
9152
9153
|
link: link,
|
9153
9154
|
group: group,
|
@@ -9164,7 +9165,7 @@ wysihtml5.views.Textarea = wysihtml5.views.View.extend(
|
|
9164
9165
|
dialogElement = this.container.querySelector("[data-wysihtml5-dialog='" + command + "']"),
|
9165
9166
|
dialog,
|
9166
9167
|
caretBookmark;
|
9167
|
-
|
9168
|
+
|
9168
9169
|
if (dialogElement) {
|
9169
9170
|
dialog = new wysihtml5.toolbar.Dialog(link, dialogElement);
|
9170
9171
|
|
@@ -9179,7 +9180,7 @@ wysihtml5.views.Textarea = wysihtml5.views.View.extend(
|
|
9179
9180
|
that.composer.selection.setBookmark(caretBookmark);
|
9180
9181
|
}
|
9181
9182
|
that._execCommand(command, attributes);
|
9182
|
-
|
9183
|
+
|
9183
9184
|
that.editor.fire("save:dialog", { command: command, dialogContainer: dialogElement, commandLink: link });
|
9184
9185
|
});
|
9185
9186
|
|
@@ -9240,7 +9241,7 @@ wysihtml5.views.Textarea = wysihtml5.views.View.extend(
|
|
9240
9241
|
links = this.commandLinks.concat(this.actionLinks),
|
9241
9242
|
length = links.length,
|
9242
9243
|
i = 0;
|
9243
|
-
|
9244
|
+
|
9244
9245
|
for (; i<length; i++) {
|
9245
9246
|
// 'javascript:;' and unselectable=on Needed for IE, but done in all browsers to make sure that all get the same css applied
|
9246
9247
|
// (you know, a:link { ... } doesn't match anchors with missing href attribute)
|
@@ -9252,7 +9253,7 @@ wysihtml5.views.Textarea = wysihtml5.views.View.extend(
|
|
9252
9253
|
|
9253
9254
|
// Needed for opera and chrome
|
9254
9255
|
dom.delegate(container, "[data-wysihtml5-command], [data-wysihtml5-action]", "mousedown", function(event) { event.preventDefault(); });
|
9255
|
-
|
9256
|
+
|
9256
9257
|
dom.delegate(container, "[data-wysihtml5-command]", "click", function(event) {
|
9257
9258
|
var link = this,
|
9258
9259
|
command = link.getAttribute("data-wysihtml5-command"),
|
@@ -9357,10 +9358,10 @@ wysihtml5.views.Textarea = wysihtml5.views.View.extend(
|
|
9357
9358
|
}
|
9358
9359
|
}
|
9359
9360
|
}
|
9360
|
-
|
9361
|
+
|
9361
9362
|
for (i in actionMapping) {
|
9362
9363
|
action = actionMapping[i];
|
9363
|
-
|
9364
|
+
|
9364
9365
|
if (action.name === "change_view") {
|
9365
9366
|
action.state = this.editor.currentView === this.editor.textarea;
|
9366
9367
|
if (action.state) {
|
@@ -9380,7 +9381,7 @@ wysihtml5.views.Textarea = wysihtml5.views.View.extend(
|
|
9380
9381
|
this.container.style.display = "none";
|
9381
9382
|
}
|
9382
9383
|
});
|
9383
|
-
|
9384
|
+
|
9384
9385
|
})(wysihtml5);
|
9385
9386
|
/**
|
9386
9387
|
* WYSIHTML5 Editor
|
@@ -9413,9 +9414,9 @@ wysihtml5.views.Textarea = wysihtml5.views.View.extend(
|
|
9413
9414
|
*/
|
9414
9415
|
(function(wysihtml5) {
|
9415
9416
|
var undef;
|
9416
|
-
|
9417
|
+
|
9417
9418
|
var defaultConfig = {
|
9418
|
-
// Give the editor a name, the name will also be set as class name on the iframe and on the iframe's body
|
9419
|
+
// Give the editor a name, the name will also be set as class name on the iframe and on the iframe's body
|
9419
9420
|
name: undef,
|
9420
9421
|
// Whether the editor should look like the textarea (by adopting styles)
|
9421
9422
|
style: true,
|
@@ -9439,7 +9440,7 @@ wysihtml5.views.Textarea = wysihtml5.views.View.extend(
|
|
9439
9440
|
// Whether the rich text editor should be rendered on touch devices (wysihtml5 >= 0.3.0 comes with basic support for iOS 5)
|
9440
9441
|
supportTouchDevices: true
|
9441
9442
|
};
|
9442
|
-
|
9443
|
+
|
9443
9444
|
wysihtml5.Editor = wysihtml5.lang.Dispatcher.extend(
|
9444
9445
|
/** @scope wysihtml5.Editor.prototype */ {
|
9445
9446
|
constructor: function(textareaElement, config) {
|
@@ -9448,36 +9449,36 @@ wysihtml5.views.Textarea = wysihtml5.views.View.extend(
|
|
9448
9449
|
this.textarea = new wysihtml5.views.Textarea(this, this.textareaElement, this.config);
|
9449
9450
|
this.currentView = this.textarea;
|
9450
9451
|
this._isCompatible = wysihtml5.browser.supported();
|
9451
|
-
|
9452
|
+
|
9452
9453
|
// Sort out unsupported/unwanted browsers here
|
9453
9454
|
if (!this._isCompatible || (!this.config.supportTouchDevices && wysihtml5.browser.isTouchDevice())) {
|
9454
9455
|
var that = this;
|
9455
9456
|
setTimeout(function() { that.fire("beforeload").fire("load"); }, 0);
|
9456
9457
|
return;
|
9457
9458
|
}
|
9458
|
-
|
9459
|
+
|
9459
9460
|
// Add class name to body, to indicate that the editor is supported
|
9460
9461
|
wysihtml5.dom.addClass(document.body, this.config.bodyClassName);
|
9461
|
-
|
9462
|
+
|
9462
9463
|
this.composer = new wysihtml5.views.Composer(this, this.textareaElement, this.config);
|
9463
9464
|
this.currentView = this.composer;
|
9464
|
-
|
9465
|
+
|
9465
9466
|
if (typeof(this.config.parser) === "function") {
|
9466
9467
|
this._initParser();
|
9467
9468
|
}
|
9468
|
-
|
9469
|
+
|
9469
9470
|
this.observe("beforeload", function() {
|
9470
9471
|
this.synchronizer = new wysihtml5.views.Synchronizer(this, this.textarea, this.composer);
|
9471
9472
|
if (this.config.toolbar) {
|
9472
9473
|
this.toolbar = new wysihtml5.toolbar.Toolbar(this, this.config.toolbar);
|
9473
9474
|
}
|
9474
9475
|
});
|
9475
|
-
|
9476
|
+
|
9476
9477
|
try {
|
9477
9478
|
console.log("Heya! This page is using wysihtml5 for rich text editing. Check out https://github.com/xing/wysihtml5");
|
9478
9479
|
} catch(e) {}
|
9479
9480
|
},
|
9480
|
-
|
9481
|
+
|
9481
9482
|
isCompatible: function() {
|
9482
9483
|
return this._isCompatible;
|
9483
9484
|
},
|
@@ -9493,11 +9494,11 @@ wysihtml5.views.Textarea = wysihtml5.views.View.extend(
|
|
9493
9494
|
|
9494
9495
|
setValue: function(html, parse) {
|
9495
9496
|
this.fire("unset_placeholder");
|
9496
|
-
|
9497
|
+
|
9497
9498
|
if (!html) {
|
9498
9499
|
return this.clear();
|
9499
9500
|
}
|
9500
|
-
|
9501
|
+
|
9501
9502
|
this.currentView.setValue(html, parse);
|
9502
9503
|
return this;
|
9503
9504
|
},
|
@@ -9514,7 +9515,7 @@ wysihtml5.views.Textarea = wysihtml5.views.View.extend(
|
|
9514
9515
|
this.currentView.disable();
|
9515
9516
|
return this;
|
9516
9517
|
},
|
9517
|
-
|
9518
|
+
|
9518
9519
|
/**
|
9519
9520
|
* Activate editor
|
9520
9521
|
*/
|
@@ -9522,15 +9523,15 @@ wysihtml5.views.Textarea = wysihtml5.views.View.extend(
|
|
9522
9523
|
this.currentView.enable();
|
9523
9524
|
return this;
|
9524
9525
|
},
|
9525
|
-
|
9526
|
+
|
9526
9527
|
isEmpty: function() {
|
9527
9528
|
return this.currentView.isEmpty();
|
9528
9529
|
},
|
9529
|
-
|
9530
|
+
|
9530
9531
|
hasPlaceholderSet: function() {
|
9531
9532
|
return this.currentView.hasPlaceholderSet();
|
9532
9533
|
},
|
9533
|
-
|
9534
|
+
|
9534
9535
|
parse: function(htmlOrElement) {
|
9535
9536
|
var returnValue = this.config.parser(htmlOrElement, this.config.parserRules, this.composer.sandbox.getDocument(), true);
|
9536
9537
|
if (typeof(htmlOrElement) === "object") {
|
@@ -9538,7 +9539,7 @@ wysihtml5.views.Textarea = wysihtml5.views.View.extend(
|
|
9538
9539
|
}
|
9539
9540
|
return returnValue;
|
9540
9541
|
},
|
9541
|
-
|
9542
|
+
|
9542
9543
|
/**
|
9543
9544
|
* Prepare html parser logic
|
9544
9545
|
* - Observes for paste and drop
|
@@ -9552,7 +9553,7 @@ wysihtml5.views.Textarea = wysihtml5.views.View.extend(
|
|
9552
9553
|
that.parse(that.composer.element);
|
9553
9554
|
}, keepScrollPosition);
|
9554
9555
|
});
|
9555
|
-
|
9556
|
+
|
9556
9557
|
this.observe("paste:textarea", function() {
|
9557
9558
|
var value = this.textarea.getValue(),
|
9558
9559
|
newValue;
|
@@ -9561,4 +9562,4 @@ wysihtml5.views.Textarea = wysihtml5.views.View.extend(
|
|
9561
9562
|
});
|
9562
9563
|
}
|
9563
9564
|
});
|
9564
|
-
})(wysihtml5);
|
9565
|
+
})(wysihtml5);
|