bootsy 0.0.3 → 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
data/README.md
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
Bootsy
|
2
|
-
|
2
|
+
======
|
3
3
|
[![Build Status](https://secure.travis-ci.org/volmer/bootsy.png?branch=master)](http://travis-ci.org/volmer/bootsy)
|
4
4
|
|
5
5
|
*Bootsy* is a WYSIWYG solution for Rails based on [Bootstrap-wysihtml5](https://github.com/jhollingworth/bootstrap-wysihtml5) which includes image uploads via [CarrierWave](https://github.com/jnicklas/carrierwave).
|
@@ -8,8 +8,9 @@ Bootsy
|
|
8
8
|
## Requirements
|
9
9
|
|
10
10
|
* Ruby MRI >= 1.9.3;
|
11
|
+
* ImageMagick or GraphicsMagick (for MiniMagick);
|
11
12
|
* Rails >= 3.2.6;
|
12
|
-
* Twitter Bootstrap
|
13
|
+
* [Twitter Bootstrap](http://twitter.github.com/bootstrap/) assets added on your application.
|
13
14
|
|
14
15
|
|
15
16
|
## Installation
|
@@ -31,7 +32,7 @@ Bootsy
|
|
31
32
|
rails g bootsy:install
|
32
33
|
```
|
33
34
|
|
34
|
-
4. Add and run migrations:
|
35
|
+
4. Add and run migrations (if you are using ActiveRecord):
|
35
36
|
```console
|
36
37
|
rake bootsy:install:migrations
|
37
38
|
rake db:migrate
|
@@ -67,7 +68,7 @@ Bootsy will group the uploaded image files as galleries and associate them to on
|
|
67
68
|
|
68
69
|
## I18n
|
69
70
|
|
70
|
-
Bootsy defines some i18n keys. The english translation is automatically added to your `config/locales` directory as `bootsy.en.yml`. You can follow that template in order to translate Bootsy for your language.
|
71
|
+
Bootsy defines some i18n keys. The english translation is automatically added to your `config/locales` directory as `bootsy.en.yml`. You can follow that template in order to translate Bootsy for your language. You can find some examples [here](https://github.com/volmer/bootsy/tree/master/config/locales).
|
71
72
|
|
72
73
|
|
73
74
|
## Mongoid support
|
@@ -100,7 +100,7 @@
|
|
100
100
|
"check_attributes": {
|
101
101
|
"width": "numbers",
|
102
102
|
"alt": "alt",
|
103
|
-
"src": "
|
103
|
+
"src": "src",
|
104
104
|
"height": "numbers"
|
105
105
|
}
|
106
106
|
},
|
@@ -161,8 +161,6 @@
|
|
161
161
|
'style': "display:none"
|
162
162
|
});
|
163
163
|
|
164
|
-
console.log(options.locale);
|
165
|
-
|
166
164
|
for(var key in defaultOptions) {
|
167
165
|
var value = false;
|
168
166
|
|
@@ -11,8 +11,6 @@ function bootsyOpenImageGallery(editor){
|
|
11
11
|
}
|
12
12
|
|
13
13
|
function bootsyInsertImage(image, editor){
|
14
|
-
console.log(image);
|
15
|
-
|
16
14
|
$('#bootsy_image_gallery').modal('hide');
|
17
15
|
editor.composer.commands.exec("insertImage", image);
|
18
16
|
}
|
@@ -52,7 +50,6 @@ $(document).ready(function(){
|
|
52
50
|
imagePrefix = '/';
|
53
51
|
}
|
54
52
|
var img = $(this).parents('li.dropdown').find('img');
|
55
|
-
console.log($(this).parents('li.dropdown'));
|
56
53
|
var src = img.attr('src').replace("/thumb_", imagePrefix);
|
57
54
|
var alt = img.attr('alt');
|
58
55
|
|
@@ -3474,6 +3474,13 @@ wysihtml5.browser = (function() {
|
|
3474
3474
|
hasCurrentStyleProperty: function() {
|
3475
3475
|
return "currentStyle" in testElement;
|
3476
3476
|
},
|
3477
|
+
|
3478
|
+
/**
|
3479
|
+
* Firefox on OSX navigates through history when hitting CMD + Arrow right/left
|
3480
|
+
*/
|
3481
|
+
hasHistoryIssue: function() {
|
3482
|
+
return isGecko;
|
3483
|
+
},
|
3477
3484
|
|
3478
3485
|
/**
|
3479
3486
|
* Whether the browser inserts a <br> when pressing enter in a contentEditable element
|
@@ -3499,29 +3506,7 @@ wysihtml5.browser = (function() {
|
|
3499
3506
|
supportsEventsInIframeCorrectly: function() {
|
3500
3507
|
return !isOpera;
|
3501
3508
|
},
|
3502
|
-
|
3503
|
-
/**
|
3504
|
-
* Chrome & Safari only fire the ondrop/ondragend/... events when the ondragover event is cancelled
|
3505
|
-
* with event.preventDefault
|
3506
|
-
* Firefox 3.6 fires those events anyway, but the mozilla doc says that the dragover/dragenter event needs
|
3507
|
-
* to be cancelled
|
3508
|
-
*/
|
3509
|
-
firesOnDropOnlyWhenOnDragOverIsCancelled: function() {
|
3510
|
-
return isWebKit || isGecko;
|
3511
|
-
},
|
3512
3509
|
|
3513
|
-
/**
|
3514
|
-
* Whether the browser supports the event.dataTransfer property in a proper way
|
3515
|
-
*/
|
3516
|
-
supportsDataTransfer: function() {
|
3517
|
-
try {
|
3518
|
-
// Firefox doesn't support dataTransfer in a safe way, it doesn't strip script code in the html payload (like Chrome does)
|
3519
|
-
return isWebKit && (window.Clipboard || window.DataTransfer).prototype.getData;
|
3520
|
-
} catch(e) {
|
3521
|
-
return false;
|
3522
|
-
}
|
3523
|
-
},
|
3524
|
-
|
3525
3510
|
/**
|
3526
3511
|
* Everything below IE9 doesn't know how to treat HTML5 tags
|
3527
3512
|
*
|
@@ -3678,14 +3663,6 @@ wysihtml5.browser = (function() {
|
|
3678
3663
|
return "getSelection" in window && "modify" in window.getSelection();
|
3679
3664
|
},
|
3680
3665
|
|
3681
|
-
/**
|
3682
|
-
* Whether the browser supports the classList object for fast className manipulation
|
3683
|
-
* See https://developer.mozilla.org/en/DOM/element.classList
|
3684
|
-
*/
|
3685
|
-
supportsClassList: function() {
|
3686
|
-
return "classList" in testElement;
|
3687
|
-
},
|
3688
|
-
|
3689
3666
|
/**
|
3690
3667
|
* Opera needs a white space after a <br> in order to position the caret correctly
|
3691
3668
|
*/
|
@@ -4058,12 +4035,12 @@ wysihtml5.browser = (function() {
|
|
4058
4035
|
// Reveal url reg exp to the outside
|
4059
4036
|
wysihtml5.dom.autoLink.URL_REG_EXP = URL_REG_EXP;
|
4060
4037
|
})(wysihtml5);(function(wysihtml5) {
|
4061
|
-
var
|
4062
|
-
api = wysihtml5.dom;
|
4038
|
+
var api = wysihtml5.dom;
|
4063
4039
|
|
4064
4040
|
api.addClass = function(element, className) {
|
4065
|
-
|
4066
|
-
|
4041
|
+
var classList = element.classList;
|
4042
|
+
if (classList) {
|
4043
|
+
return classList.add(className);
|
4067
4044
|
}
|
4068
4045
|
if (api.hasClass(element, className)) {
|
4069
4046
|
return;
|
@@ -4072,16 +4049,18 @@ wysihtml5.browser = (function() {
|
|
4072
4049
|
};
|
4073
4050
|
|
4074
4051
|
api.removeClass = function(element, className) {
|
4075
|
-
|
4076
|
-
|
4052
|
+
var classList = element.classList;
|
4053
|
+
if (classList) {
|
4054
|
+
return classList.remove(className);
|
4077
4055
|
}
|
4078
4056
|
|
4079
4057
|
element.className = element.className.replace(new RegExp("(^|\\s+)" + className + "(\\s+|$)"), " ");
|
4080
4058
|
};
|
4081
4059
|
|
4082
4060
|
api.hasClass = function(element, className) {
|
4083
|
-
|
4084
|
-
|
4061
|
+
var classList = element.classList;
|
4062
|
+
if (classList) {
|
4063
|
+
return classList.contains(className);
|
4085
4064
|
}
|
4086
4065
|
|
4087
4066
|
var elementClassName = element.className;
|
@@ -5061,6 +5040,30 @@ wysihtml5.dom.parse = (function() {
|
|
5061
5040
|
});
|
5062
5041
|
};
|
5063
5042
|
})(),
|
5043
|
+
|
5044
|
+
src: (function() {
|
5045
|
+
var REG_EXP = /^(\/|https?:\/\/)/i;
|
5046
|
+
return function(attributeValue) {
|
5047
|
+
if (!attributeValue || !attributeValue.match(REG_EXP)) {
|
5048
|
+
return null;
|
5049
|
+
}
|
5050
|
+
return attributeValue.replace(REG_EXP, function(match) {
|
5051
|
+
return match.toLowerCase();
|
5052
|
+
});
|
5053
|
+
};
|
5054
|
+
})(),
|
5055
|
+
|
5056
|
+
href: (function() {
|
5057
|
+
var REG_EXP = /^(\/|https?:\/\/|mailto:)/i;
|
5058
|
+
return function(attributeValue) {
|
5059
|
+
if (!attributeValue || !attributeValue.match(REG_EXP)) {
|
5060
|
+
return null;
|
5061
|
+
}
|
5062
|
+
return attributeValue.replace(REG_EXP, function(match) {
|
5063
|
+
return match.toLowerCase();
|
5064
|
+
});
|
5065
|
+
};
|
5066
|
+
})(),
|
5064
5067
|
|
5065
5068
|
alt: (function() {
|
5066
5069
|
var REG_EXP = /[^ a-z0-9_\-]/gi;
|
@@ -5136,7 +5139,8 @@ wysihtml5.dom.parse = (function() {
|
|
5136
5139
|
};
|
5137
5140
|
|
5138
5141
|
return parse;
|
5139
|
-
})()
|
5142
|
+
})();
|
5143
|
+
/**
|
5140
5144
|
* Checks for empty text node childs and removes them
|
5141
5145
|
*
|
5142
5146
|
* @param {Element} node The element in which to cleanup
|
@@ -5595,10 +5599,12 @@ wysihtml5.dom.replaceWithChildNodes = function(node) {
|
|
5595
5599
|
if (view.hasPlaceholderSet()) {
|
5596
5600
|
view.clear();
|
5597
5601
|
}
|
5602
|
+
view.placeholderSet = false;
|
5598
5603
|
dom.removeClass(view.element, CLASS_NAME);
|
5599
5604
|
},
|
5600
5605
|
set = function() {
|
5601
5606
|
if (view.isEmpty()) {
|
5607
|
+
view.placeholderSet = true;
|
5602
5608
|
view.setValue(placeholderText);
|
5603
5609
|
dom.addClass(view.element, CLASS_NAME);
|
5604
5610
|
}
|
@@ -6132,7 +6138,13 @@ wysihtml5.quirks.cleanPastedHTML = (function() {
|
|
6132
6138
|
try { newRange.setEnd(rangeBackup.endContainer, rangeBackup.endOffset); } catch(e2) {}
|
6133
6139
|
try { this.setSelection(newRange); } catch(e3) {}
|
6134
6140
|
},
|
6135
|
-
|
6141
|
+
|
6142
|
+
set: function(node, offset) {
|
6143
|
+
var newRange = rangy.createRange(this.doc);
|
6144
|
+
newRange.setStart(node, offset || 0);
|
6145
|
+
this.setSelection(newRange);
|
6146
|
+
},
|
6147
|
+
|
6136
6148
|
/**
|
6137
6149
|
* Insert html at the caret position and move the cursor after the inserted html
|
6138
6150
|
*
|
@@ -6195,6 +6207,7 @@ wysihtml5.quirks.cleanPastedHTML = (function() {
|
|
6195
6207
|
*/
|
6196
6208
|
scrollIntoView: function() {
|
6197
6209
|
var doc = this.doc,
|
6210
|
+
tolerance = 5, // px
|
6198
6211
|
hasScrollBars = doc.documentElement.scrollHeight > doc.documentElement.offsetHeight,
|
6199
6212
|
tempElement = doc._wysihtml5ScrollIntoViewElement = doc._wysihtml5ScrollIntoViewElement || (function() {
|
6200
6213
|
var element = doc.createElement("span");
|
@@ -6208,7 +6221,7 @@ wysihtml5.quirks.cleanPastedHTML = (function() {
|
|
6208
6221
|
this.insertNode(tempElement);
|
6209
6222
|
offsetTop = _getCumulativeOffsetTop(tempElement);
|
6210
6223
|
tempElement.parentNode.removeChild(tempElement);
|
6211
|
-
if (offsetTop
|
6224
|
+
if (offsetTop >= (doc.body.scrollTop + doc.documentElement.offsetHeight - tolerance)) {
|
6212
6225
|
doc.body.scrollTop = offsetTop;
|
6213
6226
|
}
|
6214
6227
|
}
|
@@ -6826,53 +6839,22 @@ wysihtml5.Commands = Base.extend(
|
|
6826
6839
|
return false;
|
6827
6840
|
}
|
6828
6841
|
}
|
6829
|
-
},
|
6830
|
-
|
6831
|
-
/**
|
6832
|
-
* Get the current command's value
|
6833
|
-
*
|
6834
|
-
* @param {String} command The command string which to check (eg. "formatBlock")
|
6835
|
-
* @return {String} The command value
|
6836
|
-
* @example
|
6837
|
-
* var currentBlockElement = commands.value("formatBlock");
|
6838
|
-
*/
|
6839
|
-
value: function(command) {
|
6840
|
-
var obj = wysihtml5.commands[command],
|
6841
|
-
method = obj && obj.value;
|
6842
|
-
if (method) {
|
6843
|
-
return method.call(obj, this.composer, command);
|
6844
|
-
} else {
|
6845
|
-
try {
|
6846
|
-
// try/catch for buggy firefox
|
6847
|
-
return this.doc.queryCommandValue(command);
|
6848
|
-
} catch(e) {
|
6849
|
-
return null;
|
6850
|
-
}
|
6851
|
-
}
|
6852
6842
|
}
|
6853
6843
|
});
|
6854
|
-
|
6855
|
-
|
6856
|
-
|
6857
|
-
|
6858
|
-
exec: function(composer, command) {
|
6859
|
-
return wysihtml5.commands.formatInline.exec(composer, command, "b");
|
6860
|
-
},
|
6861
|
-
|
6862
|
-
state: function(composer, command, color) {
|
6863
|
-
// element.ownerDocument.queryCommandState("bold") results:
|
6864
|
-
// firefox: only <b>
|
6865
|
-
// chrome: <b>, <strong>, <h1>, <h2>, ...
|
6866
|
-
// ie: <b>, <strong>
|
6867
|
-
// opera: <b>, <strong>
|
6868
|
-
return wysihtml5.commands.formatInline.state(composer, command, "b");
|
6869
|
-
},
|
6844
|
+
wysihtml5.commands.bold = {
|
6845
|
+
exec: function(composer, command) {
|
6846
|
+
return wysihtml5.commands.formatInline.exec(composer, command, "b");
|
6847
|
+
},
|
6870
6848
|
|
6871
|
-
|
6872
|
-
|
6873
|
-
|
6874
|
-
|
6875
|
-
|
6849
|
+
state: function(composer, command) {
|
6850
|
+
// element.ownerDocument.queryCommandState("bold") results:
|
6851
|
+
// firefox: only <b>
|
6852
|
+
// chrome: <b>, <strong>, <h1>, <h2>, ...
|
6853
|
+
// ie: <b>, <strong>
|
6854
|
+
// opera: <b>, <strong>
|
6855
|
+
return wysihtml5.commands.formatInline.state(composer, command, "b");
|
6856
|
+
}
|
6857
|
+
};
|
6876
6858
|
|
6877
6859
|
(function(wysihtml5) {
|
6878
6860
|
var undef,
|
@@ -6972,10 +6954,6 @@ wysihtml5.Commands = Base.extend(
|
|
6972
6954
|
|
6973
6955
|
state: function(composer, command) {
|
6974
6956
|
return wysihtml5.commands.formatInline.state(composer, command, "A");
|
6975
|
-
},
|
6976
|
-
|
6977
|
-
value: function() {
|
6978
|
-
return undef;
|
6979
6957
|
}
|
6980
6958
|
};
|
6981
6959
|
})(wysihtml5);/**
|
@@ -6985,7 +6963,7 @@ wysihtml5.Commands = Base.extend(
|
|
6985
6963
|
*/
|
6986
6964
|
(function(wysihtml5) {
|
6987
6965
|
var undef,
|
6988
|
-
REG_EXP = /wysiwyg-font-size-[
|
6966
|
+
REG_EXP = /wysiwyg-font-size-[0-9a-z\-]+/g;
|
6989
6967
|
|
6990
6968
|
wysihtml5.commands.fontSize = {
|
6991
6969
|
exec: function(composer, command, size) {
|
@@ -7007,8 +6985,7 @@ wysihtml5.Commands = Base.extend(
|
|
7007
6985
|
* Instead we set a css class
|
7008
6986
|
*/
|
7009
6987
|
(function(wysihtml5) {
|
7010
|
-
var
|
7011
|
-
REG_EXP = /wysiwyg-color-[a-z]+/g;
|
6988
|
+
var REG_EXP = /wysiwyg-color-[0-9a-z]+/g;
|
7012
6989
|
|
7013
6990
|
wysihtml5.commands.foreColor = {
|
7014
6991
|
exec: function(composer, command, color) {
|
@@ -7017,15 +6994,10 @@ wysihtml5.Commands = Base.extend(
|
|
7017
6994
|
|
7018
6995
|
state: function(composer, command, color) {
|
7019
6996
|
return wysihtml5.commands.formatInline.state(composer, command, "span", "wysiwyg-color-" + color, REG_EXP);
|
7020
|
-
},
|
7021
|
-
|
7022
|
-
value: function() {
|
7023
|
-
return undef;
|
7024
6997
|
}
|
7025
6998
|
};
|
7026
6999
|
})(wysihtml5);(function(wysihtml5) {
|
7027
|
-
var
|
7028
|
-
dom = wysihtml5.dom,
|
7000
|
+
var dom = wysihtml5.dom,
|
7029
7001
|
DEFAULT_NODE_NAME = "DIV",
|
7030
7002
|
// Following elements are grouped
|
7031
7003
|
// when the caret is within a H1 and the H4 is invoked, the H1 should turn into H4
|
@@ -7242,10 +7214,6 @@ wysihtml5.Commands = Base.extend(
|
|
7242
7214
|
className: className,
|
7243
7215
|
classRegExp: classRegExp
|
7244
7216
|
});
|
7245
|
-
},
|
7246
|
-
|
7247
|
-
value: function() {
|
7248
|
-
return undef;
|
7249
7217
|
}
|
7250
7218
|
};
|
7251
7219
|
})(wysihtml5);/**
|
@@ -7282,8 +7250,7 @@ wysihtml5.Commands = Base.extend(
|
|
7282
7250
|
* <span>ab|c</span> de|<b>fgh</b>
|
7283
7251
|
*/
|
7284
7252
|
(function(wysihtml5) {
|
7285
|
-
var
|
7286
|
-
// Treat <b> as <strong> and vice versa
|
7253
|
+
var // Treat <b> as <strong> and vice versa
|
7287
7254
|
ALIAS_MAPPING = {
|
7288
7255
|
"strong": "b",
|
7289
7256
|
"em": "i",
|
@@ -7337,33 +7304,22 @@ wysihtml5.Commands = Base.extend(
|
|
7337
7304
|
}
|
7338
7305
|
|
7339
7306
|
return _getApplier(tagName, className, classRegExp).isAppliedToRange(range);
|
7340
|
-
},
|
7341
|
-
|
7342
|
-
value: function() {
|
7343
|
-
return undef;
|
7344
7307
|
}
|
7345
7308
|
};
|
7346
|
-
})(wysihtml5);
|
7347
|
-
|
7348
|
-
|
7349
|
-
|
7350
|
-
|
7351
|
-
|
7352
|
-
composer.doc.execCommand(command, false, html);
|
7353
|
-
} else {
|
7354
|
-
composer.selection.insertHTML(html);
|
7355
|
-
}
|
7356
|
-
},
|
7357
|
-
|
7358
|
-
state: function() {
|
7359
|
-
return false;
|
7360
|
-
},
|
7361
|
-
|
7362
|
-
value: function() {
|
7363
|
-
return undef;
|
7309
|
+
})(wysihtml5);wysihtml5.commands.insertHTML = {
|
7310
|
+
exec: function(composer, command, html) {
|
7311
|
+
if (composer.commands.support(command)) {
|
7312
|
+
composer.doc.execCommand(command, false, html);
|
7313
|
+
} else {
|
7314
|
+
composer.selection.insertHTML(html);
|
7364
7315
|
}
|
7365
|
-
}
|
7366
|
-
|
7316
|
+
},
|
7317
|
+
|
7318
|
+
state: function() {
|
7319
|
+
return false;
|
7320
|
+
}
|
7321
|
+
};
|
7322
|
+
(function(wysihtml5) {
|
7367
7323
|
var NODE_NAME = "IMG";
|
7368
7324
|
|
7369
7325
|
wysihtml5.commands.insertImage = {
|
@@ -7405,9 +7361,12 @@ wysihtml5.Commands = Base.extend(
|
|
7405
7361
|
}
|
7406
7362
|
|
7407
7363
|
image = doc.createElement(NODE_NAME);
|
7408
|
-
|
7364
|
+
|
7409
7365
|
for (i in value) {
|
7410
|
-
|
7366
|
+
if (i === "className") {
|
7367
|
+
i = "class";
|
7368
|
+
}
|
7369
|
+
image.setAttribute(i, value[i]);
|
7411
7370
|
}
|
7412
7371
|
|
7413
7372
|
composer.selection.insertNode(image);
|
@@ -7459,16 +7418,10 @@ wysihtml5.Commands = Base.extend(
|
|
7459
7418
|
}
|
7460
7419
|
|
7461
7420
|
return imagesInSelection[0];
|
7462
|
-
},
|
7463
|
-
|
7464
|
-
value: function(composer) {
|
7465
|
-
var image = this.state(composer);
|
7466
|
-
return image && image.src;
|
7467
7421
|
}
|
7468
7422
|
};
|
7469
7423
|
})(wysihtml5);(function(wysihtml5) {
|
7470
|
-
var
|
7471
|
-
LINE_BREAK = "<br>" + (wysihtml5.browser.needsSpaceAfterLineBreak() ? " " : "");
|
7424
|
+
var LINE_BREAK = "<br>" + (wysihtml5.browser.needsSpaceAfterLineBreak() ? " " : "");
|
7472
7425
|
|
7473
7426
|
wysihtml5.commands.insertLineBreak = {
|
7474
7427
|
exec: function(composer, command) {
|
@@ -7484,151 +7437,122 @@ wysihtml5.Commands = Base.extend(
|
|
7484
7437
|
|
7485
7438
|
state: function() {
|
7486
7439
|
return false;
|
7487
|
-
},
|
7488
|
-
|
7489
|
-
value: function() {
|
7490
|
-
return undef;
|
7491
7440
|
}
|
7492
7441
|
};
|
7493
|
-
})(wysihtml5);
|
7494
|
-
|
7495
|
-
|
7496
|
-
|
7497
|
-
|
7498
|
-
|
7499
|
-
|
7500
|
-
|
7501
|
-
|
7502
|
-
tempClassName = "_wysihtml5-temp-" + new Date().getTime(),
|
7503
|
-
isEmpty,
|
7504
|
-
tempElement;
|
7505
|
-
|
7506
|
-
if (composer.commands.support(command)) {
|
7507
|
-
doc.execCommand(command, false, null);
|
7508
|
-
return;
|
7509
|
-
}
|
7510
|
-
|
7511
|
-
if (list) {
|
7512
|
-
// Unwrap list
|
7513
|
-
// <ol><li>foo</li><li>bar</li></ol>
|
7514
|
-
// becomes:
|
7515
|
-
// foo<br>bar<br>
|
7516
|
-
composer.selection.executeAndRestoreSimple(function() {
|
7517
|
-
wysihtml5.dom.resolveList(list);
|
7518
|
-
});
|
7519
|
-
} else if (otherList) {
|
7520
|
-
// Turn an unordered list into an ordered list
|
7521
|
-
// <ul><li>foo</li><li>bar</li></ul>
|
7522
|
-
// becomes:
|
7523
|
-
// <ol><li>foo</li><li>bar</li></ol>
|
7524
|
-
composer.selection.executeAndRestoreSimple(function() {
|
7525
|
-
wysihtml5.dom.renameElement(otherList, "ol");
|
7526
|
-
});
|
7527
|
-
} else {
|
7528
|
-
// Create list
|
7529
|
-
composer.commands.exec("formatBlock", "div", tempClassName);
|
7530
|
-
tempElement = doc.querySelector("." + tempClassName);
|
7531
|
-
isEmpty = tempElement.innerHTML === "" || tempElement.innerHTML === wysihtml5.INVISIBLE_SPACE;
|
7532
|
-
composer.selection.executeAndRestoreSimple(function() {
|
7533
|
-
list = wysihtml5.dom.convertToList(tempElement, "ol");
|
7534
|
-
});
|
7535
|
-
if (isEmpty) {
|
7536
|
-
composer.selection.selectNode(list.querySelector("li"));
|
7537
|
-
}
|
7538
|
-
}
|
7539
|
-
},
|
7442
|
+
})(wysihtml5);wysihtml5.commands.insertOrderedList = {
|
7443
|
+
exec: function(composer, command) {
|
7444
|
+
var doc = composer.doc,
|
7445
|
+
selectedNode = composer.selection.getSelectedNode(),
|
7446
|
+
list = wysihtml5.dom.getParentElement(selectedNode, { nodeName: "OL" }),
|
7447
|
+
otherList = wysihtml5.dom.getParentElement(selectedNode, { nodeName: "UL" }),
|
7448
|
+
tempClassName = "_wysihtml5-temp-" + new Date().getTime(),
|
7449
|
+
isEmpty,
|
7450
|
+
tempElement;
|
7540
7451
|
|
7541
|
-
|
7542
|
-
|
7543
|
-
return
|
7544
|
-
},
|
7545
|
-
|
7546
|
-
value: function() {
|
7547
|
-
return undef;
|
7452
|
+
if (composer.commands.support(command)) {
|
7453
|
+
doc.execCommand(command, false, null);
|
7454
|
+
return;
|
7548
7455
|
}
|
7549
|
-
|
7550
|
-
|
7551
|
-
|
7552
|
-
|
7553
|
-
|
7554
|
-
|
7555
|
-
|
7556
|
-
|
7557
|
-
|
7558
|
-
|
7559
|
-
|
7560
|
-
|
7561
|
-
|
7562
|
-
|
7563
|
-
|
7564
|
-
|
7565
|
-
|
7566
|
-
|
7567
|
-
|
7568
|
-
|
7569
|
-
|
7570
|
-
|
7571
|
-
|
7572
|
-
|
7573
|
-
|
7574
|
-
|
7575
|
-
|
7576
|
-
} else if (otherList) {
|
7577
|
-
// Turn an ordered list into an unordered list
|
7578
|
-
// <ol><li>foo</li><li>bar</li></ol>
|
7579
|
-
// becomes:
|
7580
|
-
// <ul><li>foo</li><li>bar</li></ul>
|
7581
|
-
composer.selection.executeAndRestoreSimple(function() {
|
7582
|
-
wysihtml5.dom.renameElement(otherList, "ul");
|
7583
|
-
});
|
7584
|
-
} else {
|
7585
|
-
// Create list
|
7586
|
-
composer.commands.exec("formatBlock", "div", tempClassName);
|
7587
|
-
tempElement = doc.querySelector("." + tempClassName);
|
7588
|
-
isEmpty = tempElement.innerHTML === "" || tempElement.innerHTML === wysihtml5.INVISIBLE_SPACE;
|
7589
|
-
composer.selection.executeAndRestoreSimple(function() {
|
7590
|
-
list = wysihtml5.dom.convertToList(tempElement, "ul");
|
7591
|
-
});
|
7592
|
-
if (isEmpty) {
|
7593
|
-
composer.selection.selectNode(list.querySelector("li"));
|
7594
|
-
}
|
7456
|
+
|
7457
|
+
if (list) {
|
7458
|
+
// Unwrap list
|
7459
|
+
// <ol><li>foo</li><li>bar</li></ol>
|
7460
|
+
// becomes:
|
7461
|
+
// foo<br>bar<br>
|
7462
|
+
composer.selection.executeAndRestoreSimple(function() {
|
7463
|
+
wysihtml5.dom.resolveList(list);
|
7464
|
+
});
|
7465
|
+
} else if (otherList) {
|
7466
|
+
// Turn an unordered list into an ordered list
|
7467
|
+
// <ul><li>foo</li><li>bar</li></ul>
|
7468
|
+
// becomes:
|
7469
|
+
// <ol><li>foo</li><li>bar</li></ol>
|
7470
|
+
composer.selection.executeAndRestoreSimple(function() {
|
7471
|
+
wysihtml5.dom.renameElement(otherList, "ol");
|
7472
|
+
});
|
7473
|
+
} else {
|
7474
|
+
// Create list
|
7475
|
+
composer.commands.exec("formatBlock", "div", tempClassName);
|
7476
|
+
tempElement = doc.querySelector("." + tempClassName);
|
7477
|
+
isEmpty = tempElement.innerHTML === "" || tempElement.innerHTML === wysihtml5.INVISIBLE_SPACE;
|
7478
|
+
composer.selection.executeAndRestoreSimple(function() {
|
7479
|
+
list = wysihtml5.dom.convertToList(tempElement, "ol");
|
7480
|
+
});
|
7481
|
+
if (isEmpty) {
|
7482
|
+
composer.selection.selectNode(list.querySelector("li"));
|
7595
7483
|
}
|
7596
|
-
}
|
7484
|
+
}
|
7485
|
+
},
|
7486
|
+
|
7487
|
+
state: function(composer) {
|
7488
|
+
var selectedNode = composer.selection.getSelectedNode();
|
7489
|
+
return wysihtml5.dom.getParentElement(selectedNode, { nodeName: "OL" });
|
7490
|
+
}
|
7491
|
+
};wysihtml5.commands.insertUnorderedList = {
|
7492
|
+
exec: function(composer, command) {
|
7493
|
+
var doc = composer.doc,
|
7494
|
+
selectedNode = composer.selection.getSelectedNode(),
|
7495
|
+
list = wysihtml5.dom.getParentElement(selectedNode, { nodeName: "UL" }),
|
7496
|
+
otherList = wysihtml5.dom.getParentElement(selectedNode, { nodeName: "OL" }),
|
7497
|
+
tempClassName = "_wysihtml5-temp-" + new Date().getTime(),
|
7498
|
+
isEmpty,
|
7499
|
+
tempElement;
|
7597
7500
|
|
7598
|
-
|
7599
|
-
|
7600
|
-
return
|
7601
|
-
},
|
7602
|
-
|
7603
|
-
value: function() {
|
7604
|
-
return undef;
|
7501
|
+
if (composer.commands.support(command)) {
|
7502
|
+
doc.execCommand(command, false, null);
|
7503
|
+
return;
|
7605
7504
|
}
|
7606
|
-
|
7607
|
-
|
7608
|
-
|
7505
|
+
|
7506
|
+
if (list) {
|
7507
|
+
// Unwrap list
|
7508
|
+
// <ul><li>foo</li><li>bar</li></ul>
|
7509
|
+
// becomes:
|
7510
|
+
// foo<br>bar<br>
|
7511
|
+
composer.selection.executeAndRestoreSimple(function() {
|
7512
|
+
wysihtml5.dom.resolveList(list);
|
7513
|
+
});
|
7514
|
+
} else if (otherList) {
|
7515
|
+
// Turn an ordered list into an unordered list
|
7516
|
+
// <ol><li>foo</li><li>bar</li></ol>
|
7517
|
+
// becomes:
|
7518
|
+
// <ul><li>foo</li><li>bar</li></ul>
|
7519
|
+
composer.selection.executeAndRestoreSimple(function() {
|
7520
|
+
wysihtml5.dom.renameElement(otherList, "ul");
|
7521
|
+
});
|
7522
|
+
} else {
|
7523
|
+
// Create list
|
7524
|
+
composer.commands.exec("formatBlock", "div", tempClassName);
|
7525
|
+
tempElement = doc.querySelector("." + tempClassName);
|
7526
|
+
isEmpty = tempElement.innerHTML === "" || tempElement.innerHTML === wysihtml5.INVISIBLE_SPACE;
|
7527
|
+
composer.selection.executeAndRestoreSimple(function() {
|
7528
|
+
list = wysihtml5.dom.convertToList(tempElement, "ul");
|
7529
|
+
});
|
7530
|
+
if (isEmpty) {
|
7531
|
+
composer.selection.selectNode(list.querySelector("li"));
|
7532
|
+
}
|
7533
|
+
}
|
7534
|
+
},
|
7609
7535
|
|
7610
|
-
|
7611
|
-
|
7612
|
-
|
7613
|
-
|
7614
|
-
|
7615
|
-
|
7616
|
-
|
7617
|
-
|
7618
|
-
// chrome: <i>, <em>, <blockquote>, ...
|
7619
|
-
// ie: <i>, <em>
|
7620
|
-
// opera: only <i>
|
7621
|
-
return wysihtml5.commands.formatInline.state(composer, command, "i");
|
7622
|
-
},
|
7536
|
+
state: function(composer) {
|
7537
|
+
var selectedNode = composer.selection.getSelectedNode();
|
7538
|
+
return wysihtml5.dom.getParentElement(selectedNode, { nodeName: "UL" });
|
7539
|
+
}
|
7540
|
+
};wysihtml5.commands.italic = {
|
7541
|
+
exec: function(composer, command) {
|
7542
|
+
return wysihtml5.commands.formatInline.exec(composer, command, "i");
|
7543
|
+
},
|
7623
7544
|
|
7624
|
-
|
7625
|
-
|
7626
|
-
|
7627
|
-
|
7628
|
-
|
7629
|
-
|
7630
|
-
|
7631
|
-
|
7545
|
+
state: function(composer, command) {
|
7546
|
+
// element.ownerDocument.queryCommandState("italic") results:
|
7547
|
+
// firefox: only <i>
|
7548
|
+
// chrome: <i>, <em>, <blockquote>, ...
|
7549
|
+
// ie: <i>, <em>
|
7550
|
+
// opera: only <i>
|
7551
|
+
return wysihtml5.commands.formatInline.state(composer, command, "i");
|
7552
|
+
}
|
7553
|
+
};(function(wysihtml5) {
|
7554
|
+
var CLASS_NAME = "wysiwyg-text-align-center",
|
7555
|
+
REG_EXP = /wysiwyg-text-align-[0-9a-z]+/g;
|
7632
7556
|
|
7633
7557
|
wysihtml5.commands.justifyCenter = {
|
7634
7558
|
exec: function(composer, command) {
|
@@ -7637,16 +7561,11 @@ wysihtml5.Commands = Base.extend(
|
|
7637
7561
|
|
7638
7562
|
state: function(composer, command) {
|
7639
7563
|
return wysihtml5.commands.formatBlock.state(composer, "formatBlock", null, CLASS_NAME, REG_EXP);
|
7640
|
-
},
|
7641
|
-
|
7642
|
-
value: function() {
|
7643
|
-
return undef;
|
7644
7564
|
}
|
7645
7565
|
};
|
7646
7566
|
})(wysihtml5);(function(wysihtml5) {
|
7647
|
-
var
|
7648
|
-
|
7649
|
-
REG_EXP = /wysiwyg-text-align-[a-z]+/g;
|
7567
|
+
var CLASS_NAME = "wysiwyg-text-align-left",
|
7568
|
+
REG_EXP = /wysiwyg-text-align-[0-9a-z]+/g;
|
7650
7569
|
|
7651
7570
|
wysihtml5.commands.justifyLeft = {
|
7652
7571
|
exec: function(composer, command) {
|
@@ -7655,16 +7574,11 @@ wysihtml5.Commands = Base.extend(
|
|
7655
7574
|
|
7656
7575
|
state: function(composer, command) {
|
7657
7576
|
return wysihtml5.commands.formatBlock.state(composer, "formatBlock", null, CLASS_NAME, REG_EXP);
|
7658
|
-
},
|
7659
|
-
|
7660
|
-
value: function() {
|
7661
|
-
return undef;
|
7662
7577
|
}
|
7663
7578
|
};
|
7664
7579
|
})(wysihtml5);(function(wysihtml5) {
|
7665
|
-
var
|
7666
|
-
|
7667
|
-
REG_EXP = /wysiwyg-text-align-[a-z]+/g;
|
7580
|
+
var CLASS_NAME = "wysiwyg-text-align-right",
|
7581
|
+
REG_EXP = /wysiwyg-text-align-[0-9a-z]+/g;
|
7668
7582
|
|
7669
7583
|
wysihtml5.commands.justifyRight = {
|
7670
7584
|
exec: function(composer, command) {
|
@@ -7673,28 +7587,47 @@ wysihtml5.Commands = Base.extend(
|
|
7673
7587
|
|
7674
7588
|
state: function(composer, command) {
|
7675
7589
|
return wysihtml5.commands.formatBlock.state(composer, "formatBlock", null, CLASS_NAME, REG_EXP);
|
7676
|
-
},
|
7677
|
-
|
7678
|
-
value: function() {
|
7679
|
-
return undef;
|
7680
7590
|
}
|
7681
7591
|
};
|
7682
7592
|
})(wysihtml5);(function(wysihtml5) {
|
7683
|
-
var
|
7684
|
-
|
7593
|
+
var CLASS_NAME = "wysiwyg-text-align-justify",
|
7594
|
+
REG_EXP = /wysiwyg-text-align-[0-9a-z]+/g;
|
7595
|
+
|
7596
|
+
wysihtml5.commands.justifyFull = {
|
7685
7597
|
exec: function(composer, command) {
|
7686
|
-
return wysihtml5.commands.
|
7598
|
+
return wysihtml5.commands.formatBlock.exec(composer, "formatBlock", null, CLASS_NAME, REG_EXP);
|
7687
7599
|
},
|
7688
7600
|
|
7689
7601
|
state: function(composer, command) {
|
7690
|
-
return wysihtml5.commands.
|
7691
|
-
},
|
7692
|
-
|
7693
|
-
value: function() {
|
7694
|
-
return undef;
|
7602
|
+
return wysihtml5.commands.formatBlock.state(composer, "formatBlock", null, CLASS_NAME, REG_EXP);
|
7695
7603
|
}
|
7696
7604
|
};
|
7697
|
-
})(wysihtml5)
|
7605
|
+
})(wysihtml5);
|
7606
|
+
wysihtml5.commands.redo = {
|
7607
|
+
exec: function(composer) {
|
7608
|
+
return composer.undoManager.redo();
|
7609
|
+
},
|
7610
|
+
|
7611
|
+
state: function(composer) {
|
7612
|
+
return false;
|
7613
|
+
}
|
7614
|
+
};wysihtml5.commands.underline = {
|
7615
|
+
exec: function(composer, command) {
|
7616
|
+
return wysihtml5.commands.formatInline.exec(composer, command, "u");
|
7617
|
+
},
|
7618
|
+
|
7619
|
+
state: function(composer, command) {
|
7620
|
+
return wysihtml5.commands.formatInline.state(composer, command, "u");
|
7621
|
+
}
|
7622
|
+
};wysihtml5.commands.undo = {
|
7623
|
+
exec: function(composer) {
|
7624
|
+
return composer.undoManager.undo();
|
7625
|
+
},
|
7626
|
+
|
7627
|
+
state: function(composer) {
|
7628
|
+
return false;
|
7629
|
+
}
|
7630
|
+
};/**
|
7698
7631
|
* Undo Manager for wysihtml5
|
7699
7632
|
* slightly inspired by http://rniwa.com/editing/undomanager.html#the-undomanager-interface
|
7700
7633
|
*/
|
@@ -7703,7 +7636,9 @@ wysihtml5.Commands = Base.extend(
|
|
7703
7636
|
Y_KEY = 89,
|
7704
7637
|
BACKSPACE_KEY = 8,
|
7705
7638
|
DELETE_KEY = 46,
|
7706
|
-
MAX_HISTORY_ENTRIES =
|
7639
|
+
MAX_HISTORY_ENTRIES = 25,
|
7640
|
+
DATA_ATTR_NODE = "data-wysihtml5-selection-node",
|
7641
|
+
DATA_ATTR_OFFSET = "data-wysihtml5-selection-offset",
|
7707
7642
|
UNDO_HTML = '<span id="_wysihtml5-undo" class="_wysihtml5-temp">' + wysihtml5.INVISIBLE_SPACE + '</span>',
|
7708
7643
|
REDO_HTML = '<span id="_wysihtml5-redo" class="_wysihtml5-temp">' + wysihtml5.INVISIBLE_SPACE + '</span>',
|
7709
7644
|
dom = wysihtml5.dom;
|
@@ -7721,13 +7656,14 @@ wysihtml5.Commands = Base.extend(
|
|
7721
7656
|
this.editor = editor;
|
7722
7657
|
this.composer = editor.composer;
|
7723
7658
|
this.element = this.composer.element;
|
7724
|
-
this.history = [this.composer.getValue()];
|
7725
|
-
this.position = 1;
|
7726
7659
|
|
7727
|
-
|
7728
|
-
|
7729
|
-
|
7730
|
-
|
7660
|
+
this.position = 0;
|
7661
|
+
this.historyStr = [];
|
7662
|
+
this.historyDom = [];
|
7663
|
+
|
7664
|
+
this.transact();
|
7665
|
+
|
7666
|
+
this._observe();
|
7731
7667
|
},
|
7732
7668
|
|
7733
7669
|
_observe: function() {
|
@@ -7824,46 +7760,124 @@ wysihtml5.Commands = Base.extend(
|
|
7824
7760
|
},
|
7825
7761
|
|
7826
7762
|
transact: function() {
|
7827
|
-
var previousHtml
|
7828
|
-
currentHtml
|
7763
|
+
var previousHtml = this.historyStr[this.position - 1],
|
7764
|
+
currentHtml = this.composer.getValue();
|
7829
7765
|
|
7830
|
-
if (currentHtml
|
7766
|
+
if (currentHtml === previousHtml) {
|
7831
7767
|
return;
|
7832
7768
|
}
|
7833
7769
|
|
7834
|
-
var length = this.
|
7770
|
+
var length = this.historyStr.length = this.historyDom.length = this.position;
|
7835
7771
|
if (length > MAX_HISTORY_ENTRIES) {
|
7836
|
-
this.
|
7772
|
+
this.historyStr.shift();
|
7773
|
+
this.historyDom.shift();
|
7837
7774
|
this.position--;
|
7838
7775
|
}
|
7839
7776
|
|
7840
7777
|
this.position++;
|
7841
|
-
|
7778
|
+
|
7779
|
+
var range = this.composer.selection.getRange(),
|
7780
|
+
node = range.startContainer || this.element,
|
7781
|
+
offset = range.startOffset || 0,
|
7782
|
+
element,
|
7783
|
+
position;
|
7784
|
+
|
7785
|
+
if (node.nodeType === wysihtml5.ELEMENT_NODE) {
|
7786
|
+
element = node;
|
7787
|
+
} else {
|
7788
|
+
element = node.parentNode;
|
7789
|
+
position = this.getChildNodeIndex(element, node);
|
7790
|
+
}
|
7791
|
+
|
7792
|
+
element.setAttribute(DATA_ATTR_OFFSET, offset);
|
7793
|
+
if (typeof(position) !== "undefined") {
|
7794
|
+
element.setAttribute(DATA_ATTR_NODE, position);
|
7795
|
+
}
|
7796
|
+
|
7797
|
+
var clone = this.element.cloneNode(!!currentHtml);
|
7798
|
+
this.historyDom.push(clone);
|
7799
|
+
this.historyStr.push(currentHtml);
|
7800
|
+
|
7801
|
+
element.removeAttribute(DATA_ATTR_OFFSET);
|
7802
|
+
element.removeAttribute(DATA_ATTR_NODE);
|
7842
7803
|
},
|
7843
7804
|
|
7844
7805
|
undo: function() {
|
7845
7806
|
this.transact();
|
7846
7807
|
|
7847
|
-
if (this.
|
7808
|
+
if (!this.undoPossible()) {
|
7848
7809
|
return;
|
7849
7810
|
}
|
7850
7811
|
|
7851
|
-
this.set(this.
|
7812
|
+
this.set(this.historyDom[--this.position - 1]);
|
7852
7813
|
this.editor.fire("undo:composer");
|
7853
7814
|
},
|
7854
7815
|
|
7855
7816
|
redo: function() {
|
7856
|
-
if (this.
|
7817
|
+
if (!this.redoPossible()) {
|
7857
7818
|
return;
|
7858
7819
|
}
|
7859
7820
|
|
7860
|
-
this.set(this.
|
7821
|
+
this.set(this.historyDom[++this.position - 1]);
|
7861
7822
|
this.editor.fire("redo:composer");
|
7862
7823
|
},
|
7863
7824
|
|
7864
|
-
|
7865
|
-
this.
|
7866
|
-
|
7825
|
+
undoPossible: function() {
|
7826
|
+
return this.position > 1;
|
7827
|
+
},
|
7828
|
+
|
7829
|
+
redoPossible: function() {
|
7830
|
+
return this.position < this.historyStr.length;
|
7831
|
+
},
|
7832
|
+
|
7833
|
+
set: function(historyEntry) {
|
7834
|
+
this.element.innerHTML = "";
|
7835
|
+
|
7836
|
+
var i = 0,
|
7837
|
+
childNodes = historyEntry.childNodes,
|
7838
|
+
length = historyEntry.childNodes.length;
|
7839
|
+
|
7840
|
+
for (; i<length; i++) {
|
7841
|
+
this.element.appendChild(childNodes[i].cloneNode(true));
|
7842
|
+
}
|
7843
|
+
|
7844
|
+
// Restore selection
|
7845
|
+
var offset,
|
7846
|
+
node,
|
7847
|
+
position;
|
7848
|
+
|
7849
|
+
if (historyEntry.hasAttribute(DATA_ATTR_OFFSET)) {
|
7850
|
+
offset = historyEntry.getAttribute(DATA_ATTR_OFFSET);
|
7851
|
+
position = historyEntry.getAttribute(DATA_ATTR_NODE);
|
7852
|
+
node = this.element;
|
7853
|
+
} else {
|
7854
|
+
node = this.element.querySelector("[" + DATA_ATTR_OFFSET + "]") || this.element;
|
7855
|
+
offset = node.getAttribute(DATA_ATTR_OFFSET);
|
7856
|
+
position = node.getAttribute(DATA_ATTR_NODE);
|
7857
|
+
node.removeAttribute(DATA_ATTR_OFFSET);
|
7858
|
+
node.removeAttribute(DATA_ATTR_NODE);
|
7859
|
+
}
|
7860
|
+
|
7861
|
+
if (position !== null) {
|
7862
|
+
node = this.getChildNodeByIndex(node, +position);
|
7863
|
+
}
|
7864
|
+
|
7865
|
+
this.composer.selection.set(node, offset);
|
7866
|
+
},
|
7867
|
+
|
7868
|
+
getChildNodeIndex: function(parent, child) {
|
7869
|
+
var i = 0,
|
7870
|
+
childNodes = parent.childNodes,
|
7871
|
+
length = childNodes.length;
|
7872
|
+
for (; i<length; i++) {
|
7873
|
+
if (childNodes[i] === child) {
|
7874
|
+
return i;
|
7875
|
+
}
|
7876
|
+
}
|
7877
|
+
},
|
7878
|
+
|
7879
|
+
getChildNodeByIndex: function(parent, index) {
|
7880
|
+
return parent.childNodes[index];
|
7867
7881
|
}
|
7868
7882
|
});
|
7869
7883
|
})(wysihtml5);
|
@@ -7959,7 +7973,12 @@ wysihtml5.views.View = Base.extend(
|
|
7959
7973
|
if (parse) {
|
7960
7974
|
html = this.parent.parse(html);
|
7961
7975
|
}
|
7962
|
-
|
7976
|
+
|
7977
|
+
try {
|
7978
|
+
this.element.innerHTML = html;
|
7979
|
+
} catch (e) {
|
7980
|
+
this.element.innerText = html;
|
7981
|
+
}
|
7963
7982
|
},
|
7964
7983
|
|
7965
7984
|
show: function() {
|
@@ -8013,7 +8032,7 @@ wysihtml5.views.View = Base.extend(
|
|
8013
8032
|
},
|
8014
8033
|
|
8015
8034
|
hasPlaceholderSet: function() {
|
8016
|
-
return this.getTextContent() == this.textarea.element.getAttribute("placeholder");
|
8035
|
+
return this.getTextContent() == this.textarea.element.getAttribute("placeholder") && this.placeholderSet;
|
8017
8036
|
},
|
8018
8037
|
|
8019
8038
|
isEmpty: function() {
|
@@ -8034,17 +8053,18 @@ wysihtml5.views.View = Base.extend(
|
|
8034
8053
|
stylesheets: this.config.stylesheets
|
8035
8054
|
});
|
8036
8055
|
this.iframe = this.sandbox.getIframe();
|
8037
|
-
|
8038
|
-
// Create hidden field which tells the server after submit, that the user used an wysiwyg editor
|
8039
|
-
var hiddenField = document.createElement("input");
|
8040
|
-
hiddenField.type = "hidden";
|
8041
|
-
hiddenField.name = "_wysihtml5_mode";
|
8042
|
-
hiddenField.value = 1;
|
8043
|
-
|
8044
|
-
// Store reference to current wysihtml5 instance on the textarea element
|
8056
|
+
|
8045
8057
|
var textareaElement = this.textarea.element;
|
8046
8058
|
dom.insert(this.iframe).after(textareaElement);
|
8047
|
-
|
8059
|
+
|
8060
|
+
// Create hidden field which tells the server after submit, that the user used an wysiwyg editor
|
8061
|
+
if (textareaElement.form) {
|
8062
|
+
var hiddenField = document.createElement("input");
|
8063
|
+
hiddenField.type = "hidden";
|
8064
|
+
hiddenField.name = "_wysihtml5_mode";
|
8065
|
+
hiddenField.value = 1;
|
8066
|
+
dom.insert(hiddenField).after(textareaElement);
|
8067
|
+
}
|
8048
8068
|
},
|
8049
8069
|
|
8050
8070
|
_create: function() {
|
@@ -8098,7 +8118,7 @@ wysihtml5.views.View = Base.extend(
|
|
8098
8118
|
|
8099
8119
|
// Simulate html5 autofocus on contentEditable element
|
8100
8120
|
if (this.textarea.element.hasAttribute("autofocus") || document.querySelector(":focus") == this.textarea.element) {
|
8101
|
-
setTimeout(function() { that.focus(); }, 100);
|
8121
|
+
setTimeout(function() { that.focus(true); }, 100);
|
8102
8122
|
}
|
8103
8123
|
|
8104
8124
|
wysihtml5.quirks.insertLineBreakOnReturn(this);
|
@@ -8144,6 +8164,10 @@ wysihtml5.views.View = Base.extend(
|
|
8144
8164
|
dom.autoLink(endContainer.parentNode);
|
8145
8165
|
});
|
8146
8166
|
});
|
8167
|
+
|
8168
|
+
dom.observe(this.element, "blur", function() {
|
8169
|
+
dom.autoLink(that.element);
|
8170
|
+
});
|
8147
8171
|
}
|
8148
8172
|
|
8149
8173
|
// Assuming we have the following:
|
@@ -8195,40 +8219,43 @@ wysihtml5.views.View = Base.extend(
|
|
8195
8219
|
_initObjectResizing: function() {
|
8196
8220
|
var properties = ["width", "height"],
|
8197
8221
|
propertiesLength = properties.length,
|
8198
|
-
element = this.element
|
8199
|
-
|
8200
|
-
this.commands.exec("enableObjectResizing", this.config.allowObjectResizing);
|
8201
|
-
|
8202
|
-
if (this.config.allowObjectResizing) {
|
8203
|
-
// IE sets inline styles after resizing objects
|
8204
|
-
// The following lines make sure that the width/height css properties
|
8205
|
-
// are copied over to the width/height attributes
|
8206
|
-
if (browser.supportsEvent("resizeend")) {
|
8207
|
-
dom.observe(element, "resizeend", function(event) {
|
8222
|
+
element = this.element,
|
8223
|
+
adoptStyles = function(event) {
|
8208
8224
|
var target = event.target || event.srcElement,
|
8209
8225
|
style = target.style,
|
8210
8226
|
i = 0,
|
8211
8227
|
property;
|
8212
|
-
|
8228
|
+
|
8229
|
+
if (target.nodeName !== "IMG") {
|
8230
|
+
return;
|
8231
|
+
}
|
8232
|
+
|
8233
|
+
for (; i<propertiesLength; i++) {
|
8213
8234
|
property = properties[i];
|
8214
8235
|
if (style[property]) {
|
8215
8236
|
target.setAttribute(property, parseInt(style[property], 10));
|
8216
8237
|
style[property] = "";
|
8217
8238
|
}
|
8218
8239
|
}
|
8240
|
+
|
8219
8241
|
// After resizing IE sometimes forgets to remove the old resize handles
|
8220
8242
|
wysihtml5.quirks.redraw(element);
|
8221
|
-
}
|
8222
|
-
|
8243
|
+
};
|
8244
|
+
|
8245
|
+
this.commands.exec("enableObjectResizing", true);
|
8246
|
+
|
8247
|
+
// IE sets inline styles after resizing objects
|
8248
|
+
// The following lines make sure that the width/height css properties
|
8249
|
+
// are copied over to the width/height attributes
|
8250
|
+
if (browser.supportsEvent("resizeend")) {
|
8251
|
+
dom.observe(element, "resizeend", adoptStyles);
|
8223
8252
|
} else {
|
8224
|
-
|
8225
|
-
dom.observe(element, "resizestart", function(event) { event.preventDefault(); });
|
8226
|
-
}
|
8253
|
+
dom.observe(element, "DOMAttrModified", adoptStyles);
|
8227
8254
|
}
|
8228
8255
|
},
|
8229
8256
|
|
8230
8257
|
_initUndoManager: function() {
|
8231
|
-
new wysihtml5.UndoManager(this.parent);
|
8258
|
+
this.undoManager = new wysihtml5.UndoManager(this.parent);
|
8232
8259
|
}
|
8233
8260
|
});
|
8234
8261
|
})(wysihtml5);(function(wysihtml5) {
|
@@ -8447,8 +8474,7 @@ wysihtml5.views.View = Base.extend(
|
|
8447
8474
|
iframe = this.sandbox.getIframe(),
|
8448
8475
|
element = this.element,
|
8449
8476
|
focusBlurElement = browser.supportsEventsInIframeCorrectly() ? element : this.sandbox.getWindow(),
|
8450
|
-
|
8451
|
-
pasteEvents = browser.supportsEvent("drop") ? ["drop", "paste"] : ["dragdrop", "paste"];
|
8477
|
+
pasteEvents = ["drop", "paste"];
|
8452
8478
|
|
8453
8479
|
// --------- destroy:composer event ---------
|
8454
8480
|
dom.observe(iframe, "DOMNodeRemoved", function() {
|
@@ -8481,7 +8507,7 @@ wysihtml5.views.View = Base.extend(
|
|
8481
8507
|
that.parent.fire("blur").fire("blur:composer");
|
8482
8508
|
});
|
8483
8509
|
|
8484
|
-
if (
|
8510
|
+
if (browser.isIos()) {
|
8485
8511
|
// When on iPad/iPhone/IPod after clicking outside of editor, the editor loses focus
|
8486
8512
|
// but the UI still acts as if the editor has focus (blinking caret and onscreen keyboard visible)
|
8487
8513
|
// We prevent that by focusing a temporary input element which immediately loses focus
|
@@ -8506,30 +8532,10 @@ wysihtml5.views.View = Base.extend(
|
|
8506
8532
|
that.parent.fire("unset_placeholder");
|
8507
8533
|
});
|
8508
8534
|
|
8509
|
-
if (browser.firesOnDropOnlyWhenOnDragOverIsCancelled()) {
|
8510
|
-
dom.observe(element, ["dragover", "dragenter"], function(event) {
|
8511
|
-
event.preventDefault();
|
8512
|
-
});
|
8513
|
-
}
|
8514
|
-
|
8515
8535
|
dom.observe(element, pasteEvents, function(event) {
|
8516
|
-
|
8517
|
-
data;
|
8518
|
-
|
8519
|
-
if (dataTransfer && browser.supportsDataTransfer()) {
|
8520
|
-
data = dataTransfer.getData("text/html") || dataTransfer.getData("text/plain");
|
8521
|
-
}
|
8522
|
-
if (data) {
|
8523
|
-
element.focus();
|
8524
|
-
that.commands.exec("insertHTML", data);
|
8536
|
+
setTimeout(function() {
|
8525
8537
|
that.parent.fire("paste").fire("paste:composer");
|
8526
|
-
|
8527
|
-
event.preventDefault();
|
8528
|
-
} else {
|
8529
|
-
setTimeout(function() {
|
8530
|
-
that.parent.fire("paste").fire("paste:composer");
|
8531
|
-
}, 0);
|
8532
|
-
}
|
8538
|
+
}, 0);
|
8533
8539
|
});
|
8534
8540
|
|
8535
8541
|
// --------- neword event ---------
|
@@ -8555,6 +8561,34 @@ wysihtml5.views.View = Base.extend(
|
|
8555
8561
|
});
|
8556
8562
|
}
|
8557
8563
|
|
8564
|
+
if (browser.hasHistoryIssue() && browser.supportsSelectionModify()) {
|
8565
|
+
dom.observe(element, "keydown", function(event) {
|
8566
|
+
if (!event.metaKey && !event.ctrlKey) {
|
8567
|
+
return;
|
8568
|
+
}
|
8569
|
+
|
8570
|
+
var keyCode = event.keyCode,
|
8571
|
+
win = element.ownerDocument.defaultView,
|
8572
|
+
selection = win.getSelection();
|
8573
|
+
|
8574
|
+
if (keyCode === 37 || keyCode === 39) {
|
8575
|
+
if (keyCode === 37) {
|
8576
|
+
selection.modify("extend", "left", "lineboundary");
|
8577
|
+
if (!event.shiftKey) {
|
8578
|
+
selection.collapseToStart();
|
8579
|
+
}
|
8580
|
+
}
|
8581
|
+
if (keyCode === 39) {
|
8582
|
+
selection.modify("extend", "right", "lineboundary");
|
8583
|
+
if (!event.shiftKey) {
|
8584
|
+
selection.collapseToEnd();
|
8585
|
+
}
|
8586
|
+
}
|
8587
|
+
event.preventDefault();
|
8588
|
+
}
|
8589
|
+
});
|
8590
|
+
}
|
8591
|
+
|
8558
8592
|
// --------- Shortcut logic ---------
|
8559
8593
|
dom.observe(element, "keydown", function(event) {
|
8560
8594
|
var keyCode = event.keyCode,
|
@@ -8930,6 +8964,10 @@ wysihtml5.views.Textarea = wysihtml5.views.View.extend(
|
|
8930
8964
|
* Show the dialog element
|
8931
8965
|
*/
|
8932
8966
|
show: function(elementToChange) {
|
8967
|
+
if (dom.hasClass(this.link, CLASS_NAME_OPENED)) {
|
8968
|
+
return;
|
8969
|
+
}
|
8970
|
+
|
8933
8971
|
var that = this,
|
8934
8972
|
firstField = this.container.querySelector(SELECTOR_FORM_ELEMENTS);
|
8935
8973
|
this.elementToChange = elementToChange;
|
@@ -9014,7 +9052,11 @@ wysihtml5.views.Textarea = wysihtml5.views.View.extend(
|
|
9014
9052
|
link.style.display = "none";
|
9015
9053
|
return;
|
9016
9054
|
}
|
9017
|
-
|
9055
|
+
var lang = parent.editor.textarea.element.getAttribute("lang");
|
9056
|
+
if (lang) {
|
9057
|
+
inputAttributes.lang = lang;
|
9058
|
+
}
|
9059
|
+
|
9018
9060
|
var wrapper = document.createElement("div");
|
9019
9061
|
|
9020
9062
|
wysihtml5.lang.object(wrapperStyles).merge({
|
@@ -9026,7 +9068,7 @@ wysihtml5.views.Textarea = wysihtml5.views.View.extend(
|
|
9026
9068
|
dom.insert(wrapper).into(link);
|
9027
9069
|
|
9028
9070
|
dom.setStyles(inputStyles).on(input);
|
9029
|
-
dom.setAttributes(inputAttributes).on(input)
|
9071
|
+
dom.setAttributes(inputAttributes).on(input);
|
9030
9072
|
|
9031
9073
|
dom.setStyles(wrapperStyles).on(wrapper);
|
9032
9074
|
dom.setStyles(linkStyles).on(link);
|
@@ -9208,8 +9250,8 @@ wysihtml5.views.Textarea = wysihtml5.views.View.extend(
|
|
9208
9250
|
}).on(links[i]);
|
9209
9251
|
}
|
9210
9252
|
|
9211
|
-
// Needed for opera
|
9212
|
-
dom.delegate(container, "[data-wysihtml5-command]", "mousedown", function(event) { event.preventDefault(); });
|
9253
|
+
// Needed for opera and chrome
|
9254
|
+
dom.delegate(container, "[data-wysihtml5-command], [data-wysihtml5-action]", "mousedown", function(event) { event.preventDefault(); });
|
9213
9255
|
|
9214
9256
|
dom.delegate(container, "[data-wysihtml5-command]", "click", function(event) {
|
9215
9257
|
var link = this,
|
@@ -9394,8 +9436,6 @@ wysihtml5.views.Textarea = wysihtml5.views.View.extend(
|
|
9394
9436
|
stylesheets: [],
|
9395
9437
|
// Placeholder text to use, defaults to the placeholder attribute on the textarea element
|
9396
9438
|
placeholderText: undef,
|
9397
|
-
// Whether the composer should allow the user to manually resize images, tables etc.
|
9398
|
-
allowObjectResizing: true,
|
9399
9439
|
// Whether the rich text editor should be rendered on touch devices (wysihtml5 >= 0.3.0 comes with basic support for iOS 5)
|
9400
9440
|
supportTouchDevices: true
|
9401
9441
|
};
|
@@ -9452,9 +9492,12 @@ wysihtml5.views.Textarea = wysihtml5.views.View.extend(
|
|
9452
9492
|
},
|
9453
9493
|
|
9454
9494
|
setValue: function(html, parse) {
|
9495
|
+
this.fire("unset_placeholder");
|
9496
|
+
|
9455
9497
|
if (!html) {
|
9456
9498
|
return this.clear();
|
9457
9499
|
}
|
9500
|
+
|
9458
9501
|
this.currentView.setValue(html, parse);
|
9459
9502
|
return this;
|
9460
9503
|
},
|
@@ -9518,4 +9561,4 @@ wysihtml5.views.Textarea = wysihtml5.views.View.extend(
|
|
9518
9561
|
});
|
9519
9562
|
}
|
9520
9563
|
});
|
9521
|
-
})(wysihtml5);
|
9564
|
+
})(wysihtml5);
|
data/lib/bootsy/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bootsy
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-08-13 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: mini_magick
|
@@ -218,7 +218,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
218
218
|
version: '0'
|
219
219
|
segments:
|
220
220
|
- 0
|
221
|
-
hash:
|
221
|
+
hash: 2854455113211705351
|
222
222
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
223
223
|
none: false
|
224
224
|
requirements:
|
@@ -227,7 +227,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
227
227
|
version: '0'
|
228
228
|
segments:
|
229
229
|
- 0
|
230
|
-
hash:
|
230
|
+
hash: 2854455113211705351
|
231
231
|
requirements: []
|
232
232
|
rubyforge_project:
|
233
233
|
rubygems_version: 1.8.24
|