Skip to content

Commit 1cd9495

Browse files
author
Oliver Pulges
committed
Update to v0.5.5
1 parent 16153a6 commit 1cd9495

File tree

3 files changed

+241
-73
lines changed

3 files changed

+241
-73
lines changed

lib/wysihtml/rails/version.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
module Wysihtml
22
module Rails
3-
VERSION = "0.5.4"
3+
VERSION = "0.5.5"
44
end
55
end

vendor/assets/javascripts/wysihtml-toolbar.js

Lines changed: 120 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/**
2-
* @license wysihtml v0.5.4
2+
* @license wysihtml v0.5.5
33
* https://github.com/Voog/wysihtml
44
*
55
* Author: Christopher Blum (https://github.com/tiff)
@@ -10,7 +10,7 @@
1010
*
1111
*/
1212
var wysihtml5 = {
13-
version: "0.5.4",
13+
version: "0.5.5",
1414

1515
// namespaces
1616
commands: {},
@@ -7119,6 +7119,10 @@ wysihtml5.browser = (function() {
71197119
return ("styleFloat" in document.createElement("div").style) ? "styleFloat" : "cssFloat";
71207120
}
71217121
return key;
7122+
},
7123+
7124+
usesControlRanges: function() {
7125+
return document.body && "createControlRange" in document.body;
71227126
}
71237127
};
71247128
})();
@@ -8136,8 +8140,8 @@ wysihtml5.dom.copyAttributes = function(attributesToCopy) {
81368140

81378141
transferContentTo: function(targetNode, removeOldWrapper) {
81388142
if (node.nodeType === 1) {
8139-
if (wysihtml5.dom.domNode(targetNode).is.voidElement()) {
8140-
while (node.firstChild) {
8143+
if (wysihtml5.dom.domNode(targetNode).is.voidElement() || targetNode.nodeType === 3) {
8144+
while (node.lastChild) {
81418145
targetNode.parentNode.insertBefore(node.lastChild, targetNode.nextSibling);
81428146
}
81438147
} else {
@@ -11736,6 +11740,14 @@ wysihtml5.quirks.ensureProperClearing = (function() {
1173611740
return ret;
1173711741
}
1173811742

11743+
function getRangeNode(node, offset) {
11744+
if (node.nodeType === 3) {
11745+
return node;
11746+
} else {
11747+
return node.childNodes[offset] || node;
11748+
}
11749+
}
11750+
1173911751
function getWebkitSelectionFixNode(container) {
1174011752
var blankNode = document.createElement('span');
1174111753

@@ -11806,7 +11818,7 @@ wysihtml5.quirks.ensureProperClearing = (function() {
1180611818
/** @scope wysihtml5.Selection.prototype */ {
1180711819
constructor: function(editor, contain, unselectableClass) {
1180811820
// Make sure that our external range library is initialized
11809-
window.rangy.init();
11821+
rangy.init();
1181011822

1181111823
this.editor = editor;
1181211824
this.composer = editor.composer;
@@ -12133,11 +12145,16 @@ wysihtml5.quirks.ensureProperClearing = (function() {
1213312145
range.deleteContents();
1213412146
},
1213512147

12148+
getCaretNode: function () {
12149+
var selection = this.getSelection();
12150+
return (selection && selection.anchorNode) ? getRangeNode(selection.anchorNode, selection.anchorOffset) : null;
12151+
},
12152+
1213612153
getPreviousNode: function(node, ignoreEmpty) {
1213712154
var displayStyle;
1213812155
if (!node) {
1213912156
var selection = this.getSelection();
12140-
node = selection.anchorNode;
12157+
node = (selection && selection.anchorNode) ? getRangeNode(selection.anchorNode, selection.anchorOffset) : null;
1214112158
}
1214212159

1214312160
if (node === this.contain) {
@@ -12257,15 +12274,24 @@ wysihtml5.quirks.ensureProperClearing = (function() {
1225712274
return (/^\s*$/).test(endtxt);
1225812275
},
1225912276

12260-
caretIsFirstInSelection: function() {
12277+
caretIsFirstInSelection: function(includeLineBreaks) {
1226112278
var r = rangy.createRange(this.doc),
1226212279
s = this.getSelection(),
1226312280
range = this.getRange(),
12264-
startNode = range.startContainer;
12281+
startNode = getRangeNode(range.startContainer, range.startOffset);
1226512282

1226612283
if (startNode) {
1226712284
if (startNode.nodeType === wysihtml5.TEXT_NODE) {
12268-
return this.isCollapsed() && (startNode.nodeType === wysihtml5.TEXT_NODE && (/^\s*$/).test(startNode.data.substr(0,range.startOffset)));
12285+
if (!startNode.parentNode) {
12286+
return false;
12287+
}
12288+
if (!this.isCollapsed() || (startNode.parentNode.firstChild !== startNode && !wysihtml5.dom.domNode(startNode.previousSibling).is.block())) {
12289+
return false;
12290+
}
12291+
var ws = this.win.getComputedStyle(startNode.parentNode).whiteSpace;
12292+
return (ws === "pre" || ws === "pre-wrap") ? range.startOffset === 0 : (/^\s*$/).test(startNode.data.substr(0,range.startOffset));
12293+
} else if (includeLineBreaks && wysihtml5.dom.domNode(startNode).is.lineBreak()) {
12294+
return true;
1226912295
} else {
1227012296
r.selectNodeContents(this.getRange().commonAncestorContainer);
1227112297
r.collapse(true);
@@ -17526,31 +17552,36 @@ wysihtml5.views.View = Base.extend(
1752617552
var selection = composer.selection,
1752717553
prevNode = selection.getPreviousNode();
1752817554

17529-
if (selection.caretIsFirstInSelection() &&
17530-
prevNode &&
17531-
prevNode.nodeType === 1 &&
17532-
(/block/).test(composer.win.getComputedStyle(prevNode).display) &&
17533-
!domNode(prevNode).test({
17534-
query: "ol, ul, table, tr, dl"
17535-
})
17536-
) {
17537-
if ((/^\s*$/).test(prevNode.textContent || prevNode.innerText)) {
17538-
// If heading is empty remove the heading node
17539-
prevNode.parentNode.removeChild(prevNode);
17540-
return true;
17541-
} else {
17542-
if (prevNode.lastChild) {
17543-
var selNode = prevNode.lastChild,
17544-
selectedNode = selection.getSelectedNode(),
17545-
commonAncestorNode = domNode(prevNode).commonAncestor(selectedNode, composer.element),
17546-
curNode = wysihtml5.dom.getParentElement(selectedNode, {
17547-
query: "h1, h2, h3, h4, h5, h6, p, pre, div, blockquote"
17548-
}, false, commonAncestorNode || composer.element);
17549-
17550-
if (curNode) {
17551-
domNode(curNode).transferContentTo(prevNode, true);
17552-
selection.setAfter(selNode);
17553-
return true;
17555+
if (selection.caretIsFirstInSelection(wysihtml5.browser.usesControlRanges()) && prevNode) {
17556+
if (prevNode.nodeType === 1 &&
17557+
wysihtml5.dom.domNode(prevNode).is.block() &&
17558+
!domNode(prevNode).test({
17559+
query: "ol, ul, table, tr, dl"
17560+
})
17561+
) {
17562+
if ((/^\s*$/).test(prevNode.textContent || prevNode.innerText)) {
17563+
// If heading is empty remove the heading node
17564+
prevNode.parentNode.removeChild(prevNode);
17565+
return true;
17566+
} else {
17567+
if (prevNode.lastChild) {
17568+
var selNode = prevNode.lastChild,
17569+
selectedNode = selection.getSelectedNode(),
17570+
commonAncestorNode = domNode(prevNode).commonAncestor(selectedNode, composer.element),
17571+
curNode = wysihtml5.dom.getParentElement(selectedNode, {
17572+
query: "h1, h2, h3, h4, h5, h6, p, pre, div, blockquote"
17573+
}, false, commonAncestorNode || composer.element);
17574+
17575+
if (curNode) {
17576+
domNode(curNode).transferContentTo(prevNode, true);
17577+
selection.setAfter(selNode);
17578+
return true;
17579+
} else if (wysihtml5.browser.usesControlRanges()) {
17580+
selectedNode = selection.getCaretNode();
17581+
domNode(selectedNode).transferContentTo(prevNode, true);
17582+
selection.setAfter(selNode);
17583+
return true;
17584+
}
1755417585
}
1755517586
}
1755617587
}
@@ -17601,6 +17632,26 @@ wysihtml5.views.View = Base.extend(
1760117632
return false;
1760217633
},
1760317634

17635+
fixDeleteInTheBeginningOfControlSelection: function(composer) {
17636+
var selection = composer.selection,
17637+
prevNode = selection.getPreviousNode(),
17638+
selectedNode = selection.getSelectedNode(),
17639+
afterCaretNode;
17640+
17641+
if (selection.caretIsFirstInSelection()) {
17642+
if (selectedNode.nodeType === 3) {
17643+
selectedNode = selectedNode.parentNode;
17644+
}
17645+
afterCaretNode = selectedNode.firstChild;
17646+
domNode(selectedNode).transferContentTo(prevNode, true);
17647+
if (afterCaretNode) {
17648+
composer.selection.setBefore(afterCaretNode);
17649+
}
17650+
return true;
17651+
}
17652+
return false;
17653+
},
17654+
1760417655
// Table management
1760517656
// If present enableObjectResizing and enableInlineTableEditing command should be called with false to prevent native table handlers
1760617657
initTableHandling: function() {
@@ -17713,6 +17764,12 @@ wysihtml5.views.View = Base.extend(
1771317764
event.preventDefault();
1771417765
return;
1771517766
}
17767+
if (wysihtml5.browser.usesControlRanges()) {
17768+
if (actions.fixDeleteInTheBeginningOfControlSelection(composer)) {
17769+
event.preventDefault();
17770+
return;
17771+
}
17772+
}
1771617773
} else {
1771717774
if (selection.containsUneditable()) {
1771817775
event.preventDefault();
@@ -17829,6 +17886,30 @@ wysihtml5.views.View = Base.extend(
1782917886
this.selection.selectNode(target);
1783017887
}
1783117888
}
17889+
17890+
// Saves mousedown position for IE controlSelect fix
17891+
if (wysihtml5.browser.usesControlRanges()) {
17892+
this.selection.lastMouseDownPos = {x: event.clientX, y: event.clientY};
17893+
setTimeout(function() {
17894+
delete this.selection.lastMouseDownPos;
17895+
}.bind(this), 0);
17896+
}
17897+
};
17898+
17899+
// IE has this madness of control selects of overflowed and some other elements (weird box around element on selection and second click selects text)
17900+
// This fix handles the second click problem by adding cursor to the right position under cursor inside when controlSelection is made
17901+
var handleIEControlSelect = function(event) {
17902+
var target = event.target,
17903+
pos = this.selection.lastMouseDownPos;
17904+
if (pos) {
17905+
var caretPosition = document.body.createTextRange();
17906+
setTimeout(function() {
17907+
try {
17908+
caretPosition.moveToPoint(pos.x, pos.y);
17909+
caretPosition.select();
17910+
} catch (e) {}
17911+
}.bind(this), 0);
17912+
}
1783217913
};
1783317914

1783417915
var handleClick = function(event) {
@@ -17916,8 +17997,6 @@ wysihtml5.views.View = Base.extend(
1791617997
this.selection.getSelection().removeAllRanges();
1791717998
}).bind(this), 0);
1791817999
};
17919-
17920-
1792118000

1792218001
// Testing requires actions to be accessible from out of scope
1792318002
wysihtml5.views.Composer.prototype.observeActions = actions;
@@ -17961,6 +18040,11 @@ wysihtml5.views.View = Base.extend(
1796118040
this.element.addEventListener("keyup", handleKeyUp.bind(this), false);
1796218041
this.element.addEventListener("keydown", handleKeyDown.bind(this), false);
1796318042

18043+
// IE controlselect madness fix
18044+
if (wysihtml5.browser.usesControlRanges()) {
18045+
this.element.addEventListener('mscontrolselect', handleIEControlSelect.bind(this), false);
18046+
}
18047+
1796418048
this.element.addEventListener("dragenter", (function() {
1796518049
this.parent.fire("unset_placeholder");
1796618050
}).bind(this), false);

0 commit comments

Comments
 (0)