wysihtml-rails 0.5.0.beta14 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/wysihtml/rails/version.rb +1 -1
- data/vendor/assets/javascripts/wysihtml-toolbar.js +73 -78
- data/vendor/assets/javascripts/wysihtml.js +73 -78
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1433246fbe1120226d24d24cb6106c9f1d8d971b
|
4
|
+
data.tar.gz: 8e29ce8a0c663d5bdcfd82087ecad8e84e19eb74
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3e10a13b4417d81fcf6618285902a64232de9a4755a4a6787062bb2904eac0641c775de088a1764aee4b8de4335528193c1f94f5766745cabd997fa6770ab966
|
7
|
+
data.tar.gz: 6f04bfec384aeba9cd3e210a9e4332e83053885c8a2e96650911d55e9aaa8c15231c3d1461512ca737a0d97d8604c87e6cbe36ecde797529eb7b2432197a64bf
|
@@ -1,5 +1,5 @@
|
|
1
1
|
/**
|
2
|
-
* @license wysihtml v0.5.0
|
2
|
+
* @license wysihtml v0.5.0
|
3
3
|
* https://github.com/Voog/wysihtml
|
4
4
|
*
|
5
5
|
* Author: Christopher Blum (https://github.com/tiff)
|
@@ -10,7 +10,7 @@
|
|
10
10
|
*
|
11
11
|
*/
|
12
12
|
var wysihtml5 = {
|
13
|
-
version: "0.5.0
|
13
|
+
version: "0.5.0",
|
14
14
|
|
15
15
|
// namespaces
|
16
16
|
commands: {},
|
@@ -7040,7 +7040,7 @@ wysihtml5.browser = (function() {
|
|
7040
7040
|
Should actually check for clipboardData on paste event, but cannot in firefox
|
7041
7041
|
*/
|
7042
7042
|
supportsModernPaste: function () {
|
7043
|
-
return !(
|
7043
|
+
return !isIE();
|
7044
7044
|
},
|
7045
7045
|
|
7046
7046
|
// Unifies the property names of element.style by returning the suitable property name for current browser
|
@@ -9140,27 +9140,31 @@ wysihtml5.dom.parse = function(elementOrHtml_current, config_current) {
|
|
9140
9140
|
}
|
9141
9141
|
|
9142
9142
|
|
9143
|
-
if (typeof(allowedClasses) === "string" && allowedClasses === "any"
|
9144
|
-
if (
|
9145
|
-
|
9146
|
-
|
9147
|
-
|
9148
|
-
|
9143
|
+
if (typeof(allowedClasses) === "string" && allowedClasses === "any") {
|
9144
|
+
if (oldNode.getAttribute("class")) {
|
9145
|
+
if (currentRules.classes_blacklist) {
|
9146
|
+
oldClasses = oldNode.getAttribute("class");
|
9147
|
+
if (oldClasses) {
|
9148
|
+
classes = classes.concat(oldClasses.split(WHITE_SPACE_REG_EXP));
|
9149
|
+
}
|
9149
9150
|
|
9150
|
-
|
9151
|
-
|
9152
|
-
|
9153
|
-
|
9154
|
-
|
9151
|
+
classesLength = classes.length;
|
9152
|
+
for (; i<classesLength; i++) {
|
9153
|
+
currentClass = classes[i];
|
9154
|
+
if (!currentRules.classes_blacklist[currentClass]) {
|
9155
|
+
newClasses.push(currentClass);
|
9156
|
+
}
|
9155
9157
|
}
|
9156
|
-
}
|
9157
9158
|
|
9158
|
-
|
9159
|
-
|
9160
|
-
|
9159
|
+
if (newClasses.length) {
|
9160
|
+
attributes["class"] = wysihtml5.lang.array(newClasses).unique().join(" ");
|
9161
|
+
}
|
9161
9162
|
|
9163
|
+
} else {
|
9164
|
+
attributes["class"] = oldNode.getAttribute("class");
|
9165
|
+
}
|
9162
9166
|
} else {
|
9163
|
-
attributes["class"] =
|
9167
|
+
attributes["class"] = wysihtml5.lang.array(classes).unique().join(" ");
|
9164
9168
|
}
|
9165
9169
|
} else {
|
9166
9170
|
// make sure that wysihtml5 temp class doesn't get stripped out
|
@@ -10015,7 +10019,7 @@ wysihtml5.dom.replaceWithChildNodes = function(node) {
|
|
10015
10019
|
set = function() {
|
10016
10020
|
if (view.isEmpty() && !view.placeholderSet) {
|
10017
10021
|
view.placeholderSet = true;
|
10018
|
-
view.setValue(placeholderText);
|
10022
|
+
view.setValue(placeholderText, false);
|
10019
10023
|
dom.addClass(view.element, CLASS_NAME);
|
10020
10024
|
}
|
10021
10025
|
};
|
@@ -11120,7 +11124,7 @@ wysihtml5.dom.unwrap = function(node) {
|
|
11120
11124
|
**/
|
11121
11125
|
wysihtml5.dom.getPastedHtml = function(event) {
|
11122
11126
|
var html;
|
11123
|
-
if (event.clipboardData) {
|
11127
|
+
if (wysihtml5.browser.supportsModernPaste() && event.clipboardData) {
|
11124
11128
|
if (wysihtml5.lang.array(event.clipboardData.types).contains('text/html')) {
|
11125
11129
|
html = event.clipboardData.getData('text/html');
|
11126
11130
|
} else if (wysihtml5.lang.array(event.clipboardData.types).contains('text/plain')) {
|
@@ -11990,9 +11994,15 @@ wysihtml5.quirks.ensureProperClearing = (function() {
|
|
11990
11994
|
// Deletes selection contents making sure uneditables/unselectables are not partially deleted
|
11991
11995
|
// Triggers wysihtml5:uneditable:delete custom event on all deleted uneditables if customevents suppoorted
|
11992
11996
|
deleteContents: function() {
|
11993
|
-
var range = this.getRange()
|
11994
|
-
|
11995
|
-
|
11997
|
+
var range = this.getRange();
|
11998
|
+
this.deleteRangeContents(range);
|
11999
|
+
this.setSelection(range);
|
12000
|
+
},
|
12001
|
+
|
12002
|
+
// Makes sure all uneditable sare notified before deleting contents
|
12003
|
+
deleteRangeContents: function (range) {
|
12004
|
+
var startParent, endParent, uneditables, ev;
|
12005
|
+
|
11996
12006
|
if (this.unselectableClass) {
|
11997
12007
|
if ((startParent = wysihtml5.dom.getParentElement(range.startContainer, { query: "." + this.unselectableClass }, false, this.contain))) {
|
11998
12008
|
range.setStartBefore(startParent);
|
@@ -12011,10 +12021,8 @@ wysihtml5.quirks.ensureProperClearing = (function() {
|
|
12011
12021
|
uneditables[i].dispatchEvent(ev);
|
12012
12022
|
} catch (err) {}
|
12013
12023
|
}
|
12014
|
-
|
12015
12024
|
}
|
12016
12025
|
range.deleteContents();
|
12017
|
-
this.setSelection(range);
|
12018
12026
|
},
|
12019
12027
|
|
12020
12028
|
getPreviousNode: function(node, ignoreEmpty) {
|
@@ -12301,28 +12309,41 @@ wysihtml5.quirks.ensureProperClearing = (function() {
|
|
12301
12309
|
},
|
12302
12310
|
|
12303
12311
|
/**
|
12304
|
-
* Insert html at the caret position and move the cursor after the inserted html
|
12312
|
+
* Insert html at the caret or selection position and move the cursor after the inserted html
|
12313
|
+
* Replaces selection content if present
|
12305
12314
|
*
|
12306
12315
|
* @param {String} html HTML string to insert
|
12307
12316
|
* @example
|
12308
12317
|
* selection.insertHTML("<p>foobar</p>");
|
12309
12318
|
*/
|
12310
12319
|
insertHTML: function(html) {
|
12311
|
-
var range =
|
12320
|
+
var range = this.getRange(),
|
12312
12321
|
node = this.doc.createElement('DIV'),
|
12313
12322
|
fragment = this.doc.createDocumentFragment(),
|
12314
|
-
lastChild;
|
12315
|
-
|
12316
|
-
|
12317
|
-
|
12323
|
+
lastChild, lastEditorElement;
|
12324
|
+
|
12325
|
+
if (range) {
|
12326
|
+
range.deleteContents();
|
12327
|
+
node.innerHTML = html;
|
12328
|
+
lastChild = node.lastChild;
|
12318
12329
|
|
12319
|
-
|
12320
|
-
|
12321
|
-
|
12322
|
-
|
12330
|
+
while (node.firstChild) {
|
12331
|
+
fragment.appendChild(node.firstChild);
|
12332
|
+
}
|
12333
|
+
range.insertNode(fragment);
|
12334
|
+
|
12335
|
+
lastEditorElement = this.contain.lastChild;
|
12336
|
+
while (lastEditorElement && lastEditorElement.nodeType === 3 && lastEditorElement.previousSibling && (/^\s*$/).test(lastEditorElement.data)) {
|
12337
|
+
lastEditorElement = lastEditorElement.previousSibling;
|
12338
|
+
}
|
12323
12339
|
|
12324
|
-
|
12325
|
-
|
12340
|
+
if (lastChild) {
|
12341
|
+
// fixes some pad cases mostly on webkit where last nr is needed
|
12342
|
+
if (lastEditorElement && lastChild === lastEditorElement && lastChild.nodeType === 1) {
|
12343
|
+
this.contain.appendChild(this.doc.createElement('br'));
|
12344
|
+
}
|
12345
|
+
this.setAfter(lastChild);
|
12346
|
+
}
|
12326
12347
|
}
|
12327
12348
|
},
|
12328
12349
|
|
@@ -15100,11 +15121,7 @@ wysihtml5.Commands = Base.extend(
|
|
15100
15121
|
;(function(wysihtml5){
|
15101
15122
|
wysihtml5.commands.insertHTML = {
|
15102
15123
|
exec: function(composer, command, html) {
|
15103
|
-
if (composer.commands.support(command)) {
|
15104
|
-
composer.doc.execCommand(command, false, html);
|
15105
|
-
} else {
|
15106
15124
|
composer.selection.insertHTML(html);
|
15107
|
-
}
|
15108
15125
|
},
|
15109
15126
|
|
15110
15127
|
state: function() {
|
@@ -15226,14 +15243,7 @@ wysihtml5.Commands = Base.extend(
|
|
15226
15243
|
|
15227
15244
|
wysihtml5.commands.insertLineBreak = {
|
15228
15245
|
exec: function(composer, command) {
|
15229
|
-
|
15230
|
-
composer.doc.execCommand(command, false, null);
|
15231
|
-
if (!wysihtml5.browser.autoScrollsToCaret()) {
|
15232
|
-
composer.selection.scrollIntoView();
|
15233
|
-
}
|
15234
|
-
} else {
|
15235
|
-
composer.commands.exec("insertHTML", LINE_BREAK);
|
15236
|
-
}
|
15246
|
+
composer.selection.insertHTML(LINE_BREAK);
|
15237
15247
|
},
|
15238
15248
|
|
15239
15249
|
state: function() {
|
@@ -16195,9 +16205,6 @@ wysihtml5.views.View = Base.extend(
|
|
16195
16205
|
/** @scope wysihtml5.views.Composer.prototype */ {
|
16196
16206
|
name: "composer",
|
16197
16207
|
|
16198
|
-
// Needed for firefox in order to display a proper caret in an empty contentEditable
|
16199
|
-
CARET_HACK: "<br>",
|
16200
|
-
|
16201
16208
|
constructor: function(parent, editableElement, config) {
|
16202
16209
|
this.base(parent, editableElement, config);
|
16203
16210
|
if (!this.config.noTextarea) {
|
@@ -16213,7 +16220,7 @@ wysihtml5.views.View = Base.extend(
|
|
16213
16220
|
},
|
16214
16221
|
|
16215
16222
|
clear: function() {
|
16216
|
-
this.element.innerHTML = browser.displaysCaretInEmptyContentEditableCorrectly() ? "" :
|
16223
|
+
this.element.innerHTML = browser.displaysCaretInEmptyContentEditableCorrectly() ? "" : "<br>";
|
16217
16224
|
},
|
16218
16225
|
|
16219
16226
|
getValue: function(parse, clearInternals) {
|
@@ -16221,12 +16228,11 @@ wysihtml5.views.View = Base.extend(
|
|
16221
16228
|
if (parse !== false) {
|
16222
16229
|
value = this.parent.parse(value, (clearInternals === false) ? false : true);
|
16223
16230
|
}
|
16224
|
-
|
16225
16231
|
return value;
|
16226
16232
|
},
|
16227
16233
|
|
16228
16234
|
setValue: function(html, parse) {
|
16229
|
-
if (parse) {
|
16235
|
+
if (parse !== false) {
|
16230
16236
|
html = this.parent.parse(html);
|
16231
16237
|
}
|
16232
16238
|
|
@@ -16237,12 +16243,12 @@ wysihtml5.views.View = Base.extend(
|
|
16237
16243
|
}
|
16238
16244
|
},
|
16239
16245
|
|
16240
|
-
cleanUp: function() {
|
16246
|
+
cleanUp: function(rules) {
|
16241
16247
|
var bookmark;
|
16242
16248
|
if (this.selection) {
|
16243
16249
|
bookmark = rangy.saveSelection(this.win);
|
16244
16250
|
}
|
16245
|
-
this.parent.parse(this.element);
|
16251
|
+
this.parent.parse(this.element, undefined, rules);
|
16246
16252
|
if (bookmark) {
|
16247
16253
|
rangy.restoreSelection(bookmark);
|
16248
16254
|
}
|
@@ -16630,17 +16636,6 @@ wysihtml5.views.View = Base.extend(
|
|
16630
16636
|
});
|
16631
16637
|
}
|
16632
16638
|
|
16633
|
-
// Under certain circumstances Chrome + Safari create nested <p> or <hX> tags after paste
|
16634
|
-
// Inserting an invisible white space in front of it fixes the issue
|
16635
|
-
// This is too hacky and causes selection not to replace content on paste in chrome
|
16636
|
-
/* if (browser.createsNestedInvalidMarkupAfterPaste()) {
|
16637
|
-
dom.observe(this.element, "paste", function(event) {
|
16638
|
-
var invisibleSpace = that.doc.createTextNode(wysihtml5.INVISIBLE_SPACE);
|
16639
|
-
that.selection.insertNode(invisibleSpace);
|
16640
|
-
});
|
16641
|
-
}*/
|
16642
|
-
|
16643
|
-
|
16644
16639
|
dom.observe(this.element, "keydown", function(event) {
|
16645
16640
|
var keyCode = event.keyCode;
|
16646
16641
|
|
@@ -17087,7 +17082,7 @@ wysihtml5.views.View = Base.extend(
|
|
17087
17082
|
if (this.config.copyedFromMarking) {
|
17088
17083
|
// If supported the copied source can be based directly on selection
|
17089
17084
|
// Very useful for webkit based browsers where copy will otherwise contain a lot of code and styles based on whatever and not actually in selection.
|
17090
|
-
if (
|
17085
|
+
if (wysihtml5.browser.supportsModernPaste()) {
|
17091
17086
|
event.clipboardData.setData("text/html", this.config.copyedFromMarking + this.selection.getHtml());
|
17092
17087
|
event.clipboardData.setData("text/plain", this.selection.getPlainText());
|
17093
17088
|
event.preventDefault();
|
@@ -17466,14 +17461,14 @@ wysihtml5.views.View = Base.extend(
|
|
17466
17461
|
},
|
17467
17462
|
|
17468
17463
|
setValue: function(html, parse) {
|
17469
|
-
if (parse) {
|
17464
|
+
if (parse !== false) {
|
17470
17465
|
html = this.parent.parse(html);
|
17471
17466
|
}
|
17472
17467
|
this.element.value = html;
|
17473
17468
|
},
|
17474
17469
|
|
17475
|
-
cleanUp: function() {
|
17476
|
-
var html = this.parent.parse(this.element.value);
|
17470
|
+
cleanUp: function(rules) {
|
17471
|
+
var html = this.parent.parse(this.element.value, undefined, rules);
|
17477
17472
|
this.element.value = html;
|
17478
17473
|
},
|
17479
17474
|
|
@@ -17568,7 +17563,7 @@ wysihtml5.views.View = Base.extend(
|
|
17568
17563
|
handleTabKey: true,
|
17569
17564
|
// Object which includes parser rules to apply when html gets cleaned
|
17570
17565
|
// See parser_rules/*.js for examples
|
17571
|
-
parserRules: { tags: { br: {}, span: {}, div: {}, p: {} }, classes: {} },
|
17566
|
+
parserRules: { tags: { br: {}, span: {}, div: {}, p: {}, b: {}, i: {}, u: {} }, classes: {} },
|
17572
17567
|
// Object which includes parser when the user inserts content via copy & paste. If null parserRules will be used instead
|
17573
17568
|
pasteParserRulesets: null,
|
17574
17569
|
// Parser method to use when the user inserts content
|
@@ -17680,8 +17675,8 @@ wysihtml5.views.View = Base.extend(
|
|
17680
17675
|
return this;
|
17681
17676
|
},
|
17682
17677
|
|
17683
|
-
cleanUp: function() {
|
17684
|
-
this.currentView.cleanUp();
|
17678
|
+
cleanUp: function(rules) {
|
17679
|
+
this.currentView.cleanUp(rules);
|
17685
17680
|
},
|
17686
17681
|
|
17687
17682
|
focus: function(setToEnd) {
|
@@ -17723,10 +17718,10 @@ wysihtml5.views.View = Base.extend(
|
|
17723
17718
|
this.off();
|
17724
17719
|
},
|
17725
17720
|
|
17726
|
-
parse: function(htmlOrElement, clearInternals) {
|
17721
|
+
parse: function(htmlOrElement, clearInternals, customRules) {
|
17727
17722
|
var parseContext = (this.config.contentEditableMode) ? document : ((this.composer) ? this.composer.sandbox.getDocument() : null);
|
17728
17723
|
var returnValue = this.config.parser(htmlOrElement, {
|
17729
|
-
"rules": this.config.parserRules,
|
17724
|
+
"rules": customRules || this.config.parserRules,
|
17730
17725
|
"cleanUp": this.config.cleanUp,
|
17731
17726
|
"context": parseContext,
|
17732
17727
|
"uneditableClass": this.config.classNames.uneditableContainer,
|
@@ -1,5 +1,5 @@
|
|
1
1
|
/**
|
2
|
-
* @license wysihtml v0.5.0
|
2
|
+
* @license wysihtml v0.5.0
|
3
3
|
* https://github.com/Voog/wysihtml
|
4
4
|
*
|
5
5
|
* Author: Christopher Blum (https://github.com/tiff)
|
@@ -10,7 +10,7 @@
|
|
10
10
|
*
|
11
11
|
*/
|
12
12
|
var wysihtml5 = {
|
13
|
-
version: "0.5.0
|
13
|
+
version: "0.5.0",
|
14
14
|
|
15
15
|
// namespaces
|
16
16
|
commands: {},
|
@@ -7040,7 +7040,7 @@ wysihtml5.browser = (function() {
|
|
7040
7040
|
Should actually check for clipboardData on paste event, but cannot in firefox
|
7041
7041
|
*/
|
7042
7042
|
supportsModernPaste: function () {
|
7043
|
-
return !(
|
7043
|
+
return !isIE();
|
7044
7044
|
},
|
7045
7045
|
|
7046
7046
|
// Unifies the property names of element.style by returning the suitable property name for current browser
|
@@ -9140,27 +9140,31 @@ wysihtml5.dom.parse = function(elementOrHtml_current, config_current) {
|
|
9140
9140
|
}
|
9141
9141
|
|
9142
9142
|
|
9143
|
-
if (typeof(allowedClasses) === "string" && allowedClasses === "any"
|
9144
|
-
if (
|
9145
|
-
|
9146
|
-
|
9147
|
-
|
9148
|
-
|
9143
|
+
if (typeof(allowedClasses) === "string" && allowedClasses === "any") {
|
9144
|
+
if (oldNode.getAttribute("class")) {
|
9145
|
+
if (currentRules.classes_blacklist) {
|
9146
|
+
oldClasses = oldNode.getAttribute("class");
|
9147
|
+
if (oldClasses) {
|
9148
|
+
classes = classes.concat(oldClasses.split(WHITE_SPACE_REG_EXP));
|
9149
|
+
}
|
9149
9150
|
|
9150
|
-
|
9151
|
-
|
9152
|
-
|
9153
|
-
|
9154
|
-
|
9151
|
+
classesLength = classes.length;
|
9152
|
+
for (; i<classesLength; i++) {
|
9153
|
+
currentClass = classes[i];
|
9154
|
+
if (!currentRules.classes_blacklist[currentClass]) {
|
9155
|
+
newClasses.push(currentClass);
|
9156
|
+
}
|
9155
9157
|
}
|
9156
|
-
}
|
9157
9158
|
|
9158
|
-
|
9159
|
-
|
9160
|
-
|
9159
|
+
if (newClasses.length) {
|
9160
|
+
attributes["class"] = wysihtml5.lang.array(newClasses).unique().join(" ");
|
9161
|
+
}
|
9161
9162
|
|
9163
|
+
} else {
|
9164
|
+
attributes["class"] = oldNode.getAttribute("class");
|
9165
|
+
}
|
9162
9166
|
} else {
|
9163
|
-
attributes["class"] =
|
9167
|
+
attributes["class"] = wysihtml5.lang.array(classes).unique().join(" ");
|
9164
9168
|
}
|
9165
9169
|
} else {
|
9166
9170
|
// make sure that wysihtml5 temp class doesn't get stripped out
|
@@ -10015,7 +10019,7 @@ wysihtml5.dom.replaceWithChildNodes = function(node) {
|
|
10015
10019
|
set = function() {
|
10016
10020
|
if (view.isEmpty() && !view.placeholderSet) {
|
10017
10021
|
view.placeholderSet = true;
|
10018
|
-
view.setValue(placeholderText);
|
10022
|
+
view.setValue(placeholderText, false);
|
10019
10023
|
dom.addClass(view.element, CLASS_NAME);
|
10020
10024
|
}
|
10021
10025
|
};
|
@@ -11120,7 +11124,7 @@ wysihtml5.dom.unwrap = function(node) {
|
|
11120
11124
|
**/
|
11121
11125
|
wysihtml5.dom.getPastedHtml = function(event) {
|
11122
11126
|
var html;
|
11123
|
-
if (event.clipboardData) {
|
11127
|
+
if (wysihtml5.browser.supportsModernPaste() && event.clipboardData) {
|
11124
11128
|
if (wysihtml5.lang.array(event.clipboardData.types).contains('text/html')) {
|
11125
11129
|
html = event.clipboardData.getData('text/html');
|
11126
11130
|
} else if (wysihtml5.lang.array(event.clipboardData.types).contains('text/plain')) {
|
@@ -11990,9 +11994,15 @@ wysihtml5.quirks.ensureProperClearing = (function() {
|
|
11990
11994
|
// Deletes selection contents making sure uneditables/unselectables are not partially deleted
|
11991
11995
|
// Triggers wysihtml5:uneditable:delete custom event on all deleted uneditables if customevents suppoorted
|
11992
11996
|
deleteContents: function() {
|
11993
|
-
var range = this.getRange()
|
11994
|
-
|
11995
|
-
|
11997
|
+
var range = this.getRange();
|
11998
|
+
this.deleteRangeContents(range);
|
11999
|
+
this.setSelection(range);
|
12000
|
+
},
|
12001
|
+
|
12002
|
+
// Makes sure all uneditable sare notified before deleting contents
|
12003
|
+
deleteRangeContents: function (range) {
|
12004
|
+
var startParent, endParent, uneditables, ev;
|
12005
|
+
|
11996
12006
|
if (this.unselectableClass) {
|
11997
12007
|
if ((startParent = wysihtml5.dom.getParentElement(range.startContainer, { query: "." + this.unselectableClass }, false, this.contain))) {
|
11998
12008
|
range.setStartBefore(startParent);
|
@@ -12011,10 +12021,8 @@ wysihtml5.quirks.ensureProperClearing = (function() {
|
|
12011
12021
|
uneditables[i].dispatchEvent(ev);
|
12012
12022
|
} catch (err) {}
|
12013
12023
|
}
|
12014
|
-
|
12015
12024
|
}
|
12016
12025
|
range.deleteContents();
|
12017
|
-
this.setSelection(range);
|
12018
12026
|
},
|
12019
12027
|
|
12020
12028
|
getPreviousNode: function(node, ignoreEmpty) {
|
@@ -12301,28 +12309,41 @@ wysihtml5.quirks.ensureProperClearing = (function() {
|
|
12301
12309
|
},
|
12302
12310
|
|
12303
12311
|
/**
|
12304
|
-
* Insert html at the caret position and move the cursor after the inserted html
|
12312
|
+
* Insert html at the caret or selection position and move the cursor after the inserted html
|
12313
|
+
* Replaces selection content if present
|
12305
12314
|
*
|
12306
12315
|
* @param {String} html HTML string to insert
|
12307
12316
|
* @example
|
12308
12317
|
* selection.insertHTML("<p>foobar</p>");
|
12309
12318
|
*/
|
12310
12319
|
insertHTML: function(html) {
|
12311
|
-
var range =
|
12320
|
+
var range = this.getRange(),
|
12312
12321
|
node = this.doc.createElement('DIV'),
|
12313
12322
|
fragment = this.doc.createDocumentFragment(),
|
12314
|
-
lastChild;
|
12315
|
-
|
12316
|
-
|
12317
|
-
|
12323
|
+
lastChild, lastEditorElement;
|
12324
|
+
|
12325
|
+
if (range) {
|
12326
|
+
range.deleteContents();
|
12327
|
+
node.innerHTML = html;
|
12328
|
+
lastChild = node.lastChild;
|
12318
12329
|
|
12319
|
-
|
12320
|
-
|
12321
|
-
|
12322
|
-
|
12330
|
+
while (node.firstChild) {
|
12331
|
+
fragment.appendChild(node.firstChild);
|
12332
|
+
}
|
12333
|
+
range.insertNode(fragment);
|
12334
|
+
|
12335
|
+
lastEditorElement = this.contain.lastChild;
|
12336
|
+
while (lastEditorElement && lastEditorElement.nodeType === 3 && lastEditorElement.previousSibling && (/^\s*$/).test(lastEditorElement.data)) {
|
12337
|
+
lastEditorElement = lastEditorElement.previousSibling;
|
12338
|
+
}
|
12323
12339
|
|
12324
|
-
|
12325
|
-
|
12340
|
+
if (lastChild) {
|
12341
|
+
// fixes some pad cases mostly on webkit where last nr is needed
|
12342
|
+
if (lastEditorElement && lastChild === lastEditorElement && lastChild.nodeType === 1) {
|
12343
|
+
this.contain.appendChild(this.doc.createElement('br'));
|
12344
|
+
}
|
12345
|
+
this.setAfter(lastChild);
|
12346
|
+
}
|
12326
12347
|
}
|
12327
12348
|
},
|
12328
12349
|
|
@@ -15100,11 +15121,7 @@ wysihtml5.Commands = Base.extend(
|
|
15100
15121
|
;(function(wysihtml5){
|
15101
15122
|
wysihtml5.commands.insertHTML = {
|
15102
15123
|
exec: function(composer, command, html) {
|
15103
|
-
if (composer.commands.support(command)) {
|
15104
|
-
composer.doc.execCommand(command, false, html);
|
15105
|
-
} else {
|
15106
15124
|
composer.selection.insertHTML(html);
|
15107
|
-
}
|
15108
15125
|
},
|
15109
15126
|
|
15110
15127
|
state: function() {
|
@@ -15226,14 +15243,7 @@ wysihtml5.Commands = Base.extend(
|
|
15226
15243
|
|
15227
15244
|
wysihtml5.commands.insertLineBreak = {
|
15228
15245
|
exec: function(composer, command) {
|
15229
|
-
|
15230
|
-
composer.doc.execCommand(command, false, null);
|
15231
|
-
if (!wysihtml5.browser.autoScrollsToCaret()) {
|
15232
|
-
composer.selection.scrollIntoView();
|
15233
|
-
}
|
15234
|
-
} else {
|
15235
|
-
composer.commands.exec("insertHTML", LINE_BREAK);
|
15236
|
-
}
|
15246
|
+
composer.selection.insertHTML(LINE_BREAK);
|
15237
15247
|
},
|
15238
15248
|
|
15239
15249
|
state: function() {
|
@@ -16195,9 +16205,6 @@ wysihtml5.views.View = Base.extend(
|
|
16195
16205
|
/** @scope wysihtml5.views.Composer.prototype */ {
|
16196
16206
|
name: "composer",
|
16197
16207
|
|
16198
|
-
// Needed for firefox in order to display a proper caret in an empty contentEditable
|
16199
|
-
CARET_HACK: "<br>",
|
16200
|
-
|
16201
16208
|
constructor: function(parent, editableElement, config) {
|
16202
16209
|
this.base(parent, editableElement, config);
|
16203
16210
|
if (!this.config.noTextarea) {
|
@@ -16213,7 +16220,7 @@ wysihtml5.views.View = Base.extend(
|
|
16213
16220
|
},
|
16214
16221
|
|
16215
16222
|
clear: function() {
|
16216
|
-
this.element.innerHTML = browser.displaysCaretInEmptyContentEditableCorrectly() ? "" :
|
16223
|
+
this.element.innerHTML = browser.displaysCaretInEmptyContentEditableCorrectly() ? "" : "<br>";
|
16217
16224
|
},
|
16218
16225
|
|
16219
16226
|
getValue: function(parse, clearInternals) {
|
@@ -16221,12 +16228,11 @@ wysihtml5.views.View = Base.extend(
|
|
16221
16228
|
if (parse !== false) {
|
16222
16229
|
value = this.parent.parse(value, (clearInternals === false) ? false : true);
|
16223
16230
|
}
|
16224
|
-
|
16225
16231
|
return value;
|
16226
16232
|
},
|
16227
16233
|
|
16228
16234
|
setValue: function(html, parse) {
|
16229
|
-
if (parse) {
|
16235
|
+
if (parse !== false) {
|
16230
16236
|
html = this.parent.parse(html);
|
16231
16237
|
}
|
16232
16238
|
|
@@ -16237,12 +16243,12 @@ wysihtml5.views.View = Base.extend(
|
|
16237
16243
|
}
|
16238
16244
|
},
|
16239
16245
|
|
16240
|
-
cleanUp: function() {
|
16246
|
+
cleanUp: function(rules) {
|
16241
16247
|
var bookmark;
|
16242
16248
|
if (this.selection) {
|
16243
16249
|
bookmark = rangy.saveSelection(this.win);
|
16244
16250
|
}
|
16245
|
-
this.parent.parse(this.element);
|
16251
|
+
this.parent.parse(this.element, undefined, rules);
|
16246
16252
|
if (bookmark) {
|
16247
16253
|
rangy.restoreSelection(bookmark);
|
16248
16254
|
}
|
@@ -16630,17 +16636,6 @@ wysihtml5.views.View = Base.extend(
|
|
16630
16636
|
});
|
16631
16637
|
}
|
16632
16638
|
|
16633
|
-
// Under certain circumstances Chrome + Safari create nested <p> or <hX> tags after paste
|
16634
|
-
// Inserting an invisible white space in front of it fixes the issue
|
16635
|
-
// This is too hacky and causes selection not to replace content on paste in chrome
|
16636
|
-
/* if (browser.createsNestedInvalidMarkupAfterPaste()) {
|
16637
|
-
dom.observe(this.element, "paste", function(event) {
|
16638
|
-
var invisibleSpace = that.doc.createTextNode(wysihtml5.INVISIBLE_SPACE);
|
16639
|
-
that.selection.insertNode(invisibleSpace);
|
16640
|
-
});
|
16641
|
-
}*/
|
16642
|
-
|
16643
|
-
|
16644
16639
|
dom.observe(this.element, "keydown", function(event) {
|
16645
16640
|
var keyCode = event.keyCode;
|
16646
16641
|
|
@@ -17087,7 +17082,7 @@ wysihtml5.views.View = Base.extend(
|
|
17087
17082
|
if (this.config.copyedFromMarking) {
|
17088
17083
|
// If supported the copied source can be based directly on selection
|
17089
17084
|
// Very useful for webkit based browsers where copy will otherwise contain a lot of code and styles based on whatever and not actually in selection.
|
17090
|
-
if (
|
17085
|
+
if (wysihtml5.browser.supportsModernPaste()) {
|
17091
17086
|
event.clipboardData.setData("text/html", this.config.copyedFromMarking + this.selection.getHtml());
|
17092
17087
|
event.clipboardData.setData("text/plain", this.selection.getPlainText());
|
17093
17088
|
event.preventDefault();
|
@@ -17466,14 +17461,14 @@ wysihtml5.views.View = Base.extend(
|
|
17466
17461
|
},
|
17467
17462
|
|
17468
17463
|
setValue: function(html, parse) {
|
17469
|
-
if (parse) {
|
17464
|
+
if (parse !== false) {
|
17470
17465
|
html = this.parent.parse(html);
|
17471
17466
|
}
|
17472
17467
|
this.element.value = html;
|
17473
17468
|
},
|
17474
17469
|
|
17475
|
-
cleanUp: function() {
|
17476
|
-
var html = this.parent.parse(this.element.value);
|
17470
|
+
cleanUp: function(rules) {
|
17471
|
+
var html = this.parent.parse(this.element.value, undefined, rules);
|
17477
17472
|
this.element.value = html;
|
17478
17473
|
},
|
17479
17474
|
|
@@ -17568,7 +17563,7 @@ wysihtml5.views.View = Base.extend(
|
|
17568
17563
|
handleTabKey: true,
|
17569
17564
|
// Object which includes parser rules to apply when html gets cleaned
|
17570
17565
|
// See parser_rules/*.js for examples
|
17571
|
-
parserRules: { tags: { br: {}, span: {}, div: {}, p: {} }, classes: {} },
|
17566
|
+
parserRules: { tags: { br: {}, span: {}, div: {}, p: {}, b: {}, i: {}, u: {} }, classes: {} },
|
17572
17567
|
// Object which includes parser when the user inserts content via copy & paste. If null parserRules will be used instead
|
17573
17568
|
pasteParserRulesets: null,
|
17574
17569
|
// Parser method to use when the user inserts content
|
@@ -17680,8 +17675,8 @@ wysihtml5.views.View = Base.extend(
|
|
17680
17675
|
return this;
|
17681
17676
|
},
|
17682
17677
|
|
17683
|
-
cleanUp: function() {
|
17684
|
-
this.currentView.cleanUp();
|
17678
|
+
cleanUp: function(rules) {
|
17679
|
+
this.currentView.cleanUp(rules);
|
17685
17680
|
},
|
17686
17681
|
|
17687
17682
|
focus: function(setToEnd) {
|
@@ -17723,10 +17718,10 @@ wysihtml5.views.View = Base.extend(
|
|
17723
17718
|
this.off();
|
17724
17719
|
},
|
17725
17720
|
|
17726
|
-
parse: function(htmlOrElement, clearInternals) {
|
17721
|
+
parse: function(htmlOrElement, clearInternals, customRules) {
|
17727
17722
|
var parseContext = (this.config.contentEditableMode) ? document : ((this.composer) ? this.composer.sandbox.getDocument() : null);
|
17728
17723
|
var returnValue = this.config.parser(htmlOrElement, {
|
17729
|
-
"rules": this.config.parserRules,
|
17724
|
+
"rules": customRules || this.config.parserRules,
|
17730
17725
|
"cleanUp": this.config.cleanUp,
|
17731
17726
|
"context": parseContext,
|
17732
17727
|
"uneditableClass": this.config.classNames.uneditableContainer,
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: wysihtml-rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.0
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tanel Jakobsoo
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-10-
|
11
|
+
date: 2015-10-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: railties
|
@@ -89,9 +89,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
89
89
|
version: '0'
|
90
90
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
91
91
|
requirements:
|
92
|
-
- - "
|
92
|
+
- - ">="
|
93
93
|
- !ruby/object:Gem::Version
|
94
|
-
version:
|
94
|
+
version: '0'
|
95
95
|
requirements: []
|
96
96
|
rubyforge_project:
|
97
97
|
rubygems_version: 2.2.2
|