From 3f5233c61ad493ef4b011d91a3807e697dcdc9b0 Mon Sep 17 00:00:00 2001 From: Neil Jenkins Date: Mon, 14 Nov 2011 15:18:05 +1100 Subject: [PATCH] Fix bug in applying styles in Opera/IE. Was removing the crucial empty text node that these browsers use to indicate and editable line. --- Demo.html | 1 + Readme.md | 2 +- build/document.html | 3 +-- build/squire.js | 2 +- source/Editor.js | 15 +++++---------- source/document.html | 3 +-- 6 files changed, 10 insertions(+), 16 deletions(-) diff --git a/Demo.html b/Demo.html index bff0fcd..721bff6 100644 --- a/Demo.html +++ b/Demo.html @@ -64,6 +64,7 @@ Unlist        Insert image + Set HTML        Undo Redo diff --git a/Readme.md b/Readme.md index f6e793c..7c49dd7 100644 --- a/Readme.md +++ b/Readme.md @@ -7,7 +7,7 @@ Unlike other HTML5 rich text editors, squire was written as a component for writ ### Lightweight ### -* Only 7KB of JS after minification and gzip (25KB before gzip). +* Only 8KB of JS after minification and gzip (26KB before gzip). * Does not include its own XHR wrapper, widget library or lightbox overlays. * No dependencies. * No UI for a toolbar is supplied, allowing you to integrate seamlessly with the diff --git a/build/document.html b/build/document.html index 52398d1..734a865 100644 --- a/build/document.html +++ b/build/document.html @@ -51,7 +51,6 @@ - - + \ No newline at end of file diff --git a/build/squire.js b/build/squire.js index 077d7a7..7421e37 100644 --- a/build/squire.js +++ b/build/squire.js @@ -1 +1 @@ -/* Copyright © 2011 by Neil Jenkins. Licensed under the MIT license. */(function(a){"use strict";var b=!a.createTreeWalker;window.ie===9&&(b=!0),b||function(){var c=a.createElement("div"),d=a.createTextNode("");c.appendChild(d);var e=c.cloneNode(!0),f=c.cloneNode(!0),g=c.cloneNode(!0),h=a.createTreeWalker(c,1,function(a){return 1},!1);c.appendChild(e),c.appendChild(f),c.appendChild(g),h.currentNode=g,h.previousNode()!==f&&(b=!0)}();if(!b)return;var c={1:1,2:2,3:4,8:128,9:256,11:1024},d=1,e=function(a,b,c){this.root=this.currentNode=a,this.nodeType=b,this.filter=c};e.prototype.nextNode=function(){var a=this.currentNode,b=this.root,e=this.nodeType,f=this.filter,g;for(;;){g=a.firstChild;while(!g&&a){if(a===b)break;g=a.nextSibling,g||(a=a.parentNode)}if(!g)return null;if(c[g.nodeType]&e&&f(g)===d)return this.currentNode=g,g;a=g}},e.prototype.previousNode=function(){var a=this.currentNode,b=this.root,e=this.nodeType,f=this.filter,g;for(;;){if(a===b)return null;g=a.previousSibling;if(g)while(a=g.lastChild)g=a;else g=a.parentNode;if(!g)return null;if(c[g.nodeType]&e&&f(g)===d)return this.currentNode=g,g;a=g}},a.createTreeWalker=function(a,b,c){return new e(a,b,c)}})(document),function(){"use strict";var a=function(a,b){var c=a.prototype,d;for(d in b)c[d]=b[d]},b=function(a,b){var c=a.length;while(c--)if(!b(a[c]))return!1;return!0},c=function(){return!1},d=function(){return!0},e=/^(?:A(?:BBR|CRONYM)?|B(?:R|D[IO])?|C(?:ITE|ODE)|D(?:FN|EL)|EM|HR|I(?:NPUT|MG|NS)?|KBD|Q|R(?:P|T|UBY)|S(?:U[BP]|PAN|TRONG|AMP)|U)$/,f={BR:1,IMG:1,INPUT:1},g=function(a,b){var c=b.parentNode;return c&&c.replaceChild(a,b),a},h=1,i=3,j=1,k=1,l=3,m=function(a){return a.isBlock()?k:l},n=!!window.opera||!!window.ie;a(Node,{isInline:c,isBlock:c,isContainer:c,getPath:function(){var a=this.parentNode;return a?a.getPath():""},detach:function(){var a=this.parentNode;return a&&a.removeChild(this),this},replaceWith:function(a){return g(a,this),this},replaces:function(a){return g(this,a),this},nearest:function(a,b){var c=this.parentNode;return c?c.nearest(a,b):null},getPreviousBlock:function(){var a=this.ownerDocument,b=a.createTreeWalker(a.body,j,m,!1);return b.currentNode=this,b.previousNode()},getNextBlock:function(){var a=this.ownerDocument,b=a.createTreeWalker(a.body,j,m,!1);return b.currentNode=this,b.nextNode()},split:function(a,b){return a},mergeContainers:function(){}}),a(Text,{isInline:d,isLeaf:d,getLength:function(){return this.length},isLike:function(a){return a.nodeType===i},split:function(a,b){var c=this;return c===b?a:c.parentNode.split(c.splitText(a),b)}}),a(Element,{isLeaf:function(){return!!f[this.nodeName]},isInline:function(){return e.test(this.nodeName)},isBlock:function(){return!this.isInline()&&b(this.childNodes,function(a){return a.isInline()})},isContainer:function(){return!this.isInline()&&!this.isBlock()},getLength:function(){return this.childNodes.length},getPath:function(){var a=this.nodeName;if(a==="BODY")return a;var b=this.parentNode.getPath(),c=this.id,d=this.className.trim();return b+=">"+a,c&&(b+="#"+c),d&&(d=d.split(/\s\s*/),d.sort(),b+=".",b+=d.join(".")),b},wraps:function(a){return g(this,a).appendChild(a),this},empty:function(){var a=this.ownerDocument.createDocumentFragment(),b=this.childNodes.length;while(b--)a.appendChild(this.firstChild);return a},is:function(a,b){if(this.nodeName!==a)return!1;var c;for(c in b)if(this.getAttribute(c)!==b[c])return!1;return!0},nearest:function(a,b){var c=this;do if(c.is(a,b))return c;while((c=c.parentNode)&&c.nodeType===h);return null},isLike:function(a){return a.nodeType===h&&a.nodeName===this.nodeName&&a.className===this.className&&a.style.cssText===this.style.cssText},mergeInlines:function(a){var b=this.childNodes,c=b.length,d=[],e,g,j;while(c--){e=b[c],g=c&&b[c-1];if(c&&e.isInline()&&e.isLike(g)&&!f[e.nodeName])a.startContainer===e&&(a.startContainer=g,a.startOffset+=g.getLength()),a.endContainer===e&&(a.endContainer=g,a.endOffset+=g.getLength()),a.startContainer===this&&(a.startOffset>c?a.startOffset-=1:a.startOffset===c&&(a.startContainer=g,a.startOffset=g.getLength())),a.endContainer===this&&(a.endOffset>c?a.endOffset-=1:a.endOffset===c&&(a.endContainer=g,a.endOffset=g.getLength())),e.detach(),e.nodeType===i?g.appendData(e.data):d.push(e.empty());else if(e.nodeType===h){j=d.length;while(j--)e.appendChild(d.pop());e.mergeInlines(a)}}},mergeWithBlock:function(a,b){var c=this,d=a,e,f,g;while(d.parentNode.childNodes.length===1)d=d.parentNode;d.detach(),f=c.childNodes.length,e=c.lastChild,e&&e.nodeName==="BR"&&(c.removeChild(e),f-=1),g={startContainer:c,startOffset:f,endContainer:c,endOffset:f},c.appendChild(a.empty()),c.mergeInlines(g),b.setStart(g.startContainer,g.startOffset),b.collapse(!0),window.opera&&(e=c.lastChild)&&e.nodeName==="BR"&&c.removeChild(e)},mergeContainers:function(){var a=this.previousSibling,b=this.firstChild;a&&a.isLike(this)&&a.isContainer()&&(a.appendChild(this.detach().empty()),b&&b.mergeContainers())},split:function(a,b){var c=this;typeof a=="number"&&(a=a-1,f=c.compareBoundaryPoints(h,d)<1;return!e&&!f}var k=c.compareBoundaryPoints(g,d)<1,l=c.compareBoundaryPoints(i,d)>-1;return k&&l},moveBoundariesDownTree:function(){var a=this.startContainer,b=this.startOffset,c=this.endContainer,e=this.endOffset,f;while(a.nodeType!==d){f=a.childNodes[b];if(!f||f.nodeName==="BR")break;a=f,b=0}if(e)while(c.nodeType!==d){f=c.childNodes[e-1];if(!f||f.nodeName==="BR")break;c=f,e=c.getLength()}else while(c.nodeType!==d){f=c.firstChild;if(!f||f.nodeName==="BR")break;c=f}return this.collapsed?(this.setStart(c,e),this.setEnd(a,b)):(this.setStart(a,b),this.setEnd(c,e)),this},moveBoundariesUpTree:function(a){var c=this.startContainer,d=this.startOffset,e=this.endContainer,f=this.endOffset,g;a||(a=this.commonAncestorContainer);while(c!==a&&!d)g=c.parentNode,d=b.call(g.childNodes,c),c=g;while(e!==a&&f===e.getLength())g=e.parentNode,f=b.call(g.childNodes,e)+1,e=g;return this.setStart(c,d),this.setEnd(e,f),this},getStartBlock:function(){var a=this.startContainer,b;return a.isInline()?b=a.getPreviousBlock():a.isBlock()?b=a:(b=k(a,this.startOffset),b=b.getNextBlock()),b&&this.containsNode(b,!0)?b:null},getEndBlock:function(){var a=this.endContainer,b,c;if(a.isInline())b=a.getPreviousBlock();else if(a.isBlock())b=a;else{b=l(a,this.endOffset);if(!b){b=a.ownerDocument.body;while(c=b.lastChild)b=c}b=b.getPreviousBlock()}return b&&this.containsNode(b,!0)?b:null},startsAtBlockBoundary:function(){var a=this.startContainer,c=this.startOffset,d,e;while(a.isInline()){if(c)return!1;d=a.parentNode,c=b.call(d.childNodes,a),a=d}while(c&&(e=a.childNodes[c-1])&&(e.data===""||e.nodeName==="BR"))c-=1;return!c},endsAtBlockBoundary:function(){var a=this.endContainer,c=this.endOffset,d=a.getLength(),e,f;while(a.isInline()){if(c!==d)return!1;e=a.parentNode,c=b.call(e.childNodes,a)+1,a=e,d=a.childNodes.length}while(c20)&&(b<33||b>45)&&R()});var S=function(a){Q||(N+=1,Ne.endOffset?p.splitText(e.endOffset):o=e.endOffset),p===e.startContainer&&(q&&e.startOffset?p=p.splitText(e.startOffset):m=e.startOffset),q&&(n(a,b).wraps(p),o=p.length),l=p,k||(k=l);while(p=j.nextNode());e=u(k,m,l,o)}return e},X=function(a,b,d,e){K(d),d.collapsed&&d._insertNode(h.createTextNode(""));var f=d.commonAncestorContainer;while(f.isInline())f=f.parentNode;var g=d.startContainer,i=d.startOffset,j=d.endContainer,k=d.endOffset,l=[],m=function p(a,b){if(d.containsNode(a,!1))return;var e=a.nodeType===c,f,h;if(!d.containsNode(a,!0)){e&&!a.length?a.detach():a.nodeName!=="INPUT"&&l.push([b,a]);return}if(e)a===j&&k!==a.length&&l.push([b,a.splitText(k)]),a===g&&i&&(a.splitText(i),l.push([b,a]));else for(f=a.firstChild;f;f=h)h=f.nextSibling,p(f,b)},n=Array.prototype.filter.call(f.getElementsByTagName(a),function(c){return d.containsNode(c,!0)&&c.is(a,b)});e||n.forEach(function(a){m(a,a)}),l.forEach(function(a){a[0].cloneNode(!1).wraps(a[1])}),n.forEach(function(a){a.replaceWith(a.empty())}),d=M();var o={startContainer:d.startContainer,startOffset:d.startOffset,endContainer:d.endContainer,endOffset:d.endOffset};return f.mergeInlines(o),d.setStart(o.startContainer,o.startOffset),d.setEnd(o.endContainer,o.endOffset),d},Y=function(a,b,c,d){if(!c&&!(c=x()))return;S(c),M(c),b&&(c=X(b.tag.toUpperCase(),b.attributes||{},c,d)),a&&(c=W(a.tag.toUpperCase(),a.attributes||{},c)),C(c),B(0,!0),R()},Z=function(a,b){if(!b&&!(b=x()))return;S(b),M(b);var c=b.getStartBlock(),d=b.getEndBlock();if(c&&d)for(;;){a(c);if(c===d)break;c=c.getNextBlock()}B(0,!0),R()},$=function(a,b){if(!b&&!(b=x()))return;k||j.setAttribute("contenteditable","false"),Q?K(b):S(b),b.expandToBlockBoundaries(),b.moveBoundariesUpTree(j);var c=b._extractContents(j);b._insertNode(a(c)),b.endOffset]*>([\s\S]*?)<\/style>/gi,bs=function(a){return function(){return a.apply(null,arguments),this}},bt=function(a,b,c){return function(){return a(b,c),D(),this}};i.editor={addEventListener:bs(s),removeEventListener:bs(t),focus:bs(D),blur:bs(E),getDocument:function(){return h},getHTML:function(){var a=[],b,c,d,e;if(m){b=j;while(b=b.getNextBlock())!b.textContent&&!b.querySelector("BR")&&(c=n("BR"),b.appendChild(c),a.push(c))}d=F();if(m){e=a.length;while(e--)a[e].detach()}return d},setHTML:function(a){var b=h.createDocumentFragment(),c=n("DIV"),d="",e;br.lastIndex=0,a=a.replace(br,function(a,b){return d+=b.replace(//g,""),""}),c.innerHTML=a,b.appendChild(c.empty()),bk(b,!0),bm(b),bl(b,"DIV");var f=b;while(f=f.getNextBlock())f.fixCursor();while(e=j.lastChild)j.removeChild(e);if(d){var g=h.documentElement.firstChild,i=n("STYLE",{type:"text/css"});i.styleSheet?(g.appendChild(i),i.styleSheet.cssText=d):(i.appendChild(h.createTextNode(d)),g.appendChild(i))}j.appendChild(b),j.fixCursor(),N=-1,O=[],P=0,Q=!1;var k=u(j.firstChild,0);return S(k),C(M(k)),B(0,!0),this},getSelectedText:function(){return x().getTextContent()},insertImage:function(a){var b=n("IMG",{src:a});return H(b),b},getPath:function(){return A},getSelection:x,setSelection:bs(C),undo:bs(T),redo:bs(U),hasFormat:V,changeFormat:bs(Y),bold:bt(Y,{tag:"B"}),italic:bt(Y,{tag:"I"}),underline:bt(Y,{tag:"U"}),removeBold:bt(Y,null,{tag:"B"}),removeItalic:bt(Y,null,{tag:"I"}),removeUnderline:bt(Y,null,{tag:"U"}),makeLink:function(a){a=encodeURI(a);var b=x();if(b.collapsed){var c=a.indexOf(":")+1;if(c)while(a[c]==="/")c+=1;b._insertNode(h.createTextNode(a.slice(c)))}return Y({tag:"A",attributes:{href:a}},{tag:"A"},b),D(),this},removeLink:function(){return Y(null,{tag:"A"},x(),!0),D(),this},setFontFace:function(a){return Y({tag:"SPAN",attributes:{"class":"font",style:"font-family: "+a+", sans-serif;"}},{tag:"SPAN",attributes:{"class":"font"}}),D(),this},setFontSize:function(a){return Y({tag:"SPAN",attributes:{"class":"size",style:"font-size: "+(typeof a=="number"?a+"px":a)}},{tag:"SPAN",attributes:{"class":"size"}}),D(),this},setTextColour:function(a){return Y({tag:"SPAN",attributes:{"class":"colour",style:"color: "+a}},{tag:"SPAN",attributes:{"class":"colour"}}),D(),this},setHighlightColour:function(a){return Y({tag:"SPAN",attributes:{"class":"highlight",style:"background-color: "+a}},{tag:"SPAN",attributes:{"class":"highlight"}}),D(),this},setTextAlignment:function(a){return Z(function(b){b.className="align-"+a,b.style.textAlign=a}),D(),this},modifyBlocks:bs($),incQuoteLevel:bt($,_),decQuoteLevel:bt($,ba),makeUnorderedList:bt($,bc),makeOrderedList:bt($,bd),removeList:bt($,be)},j.setAttribute("contenteditable","true"),i.editor.setHTML("")},!1); \ No newline at end of file +/* Copyright © 2011 by Neil Jenkins. Licensed under the MIT license. */(function(a){"use strict";var b=!a.createTreeWalker;window.ie===9&&(b=!0),b||function(){var c=a.createElement("div"),d=a.createTextNode("");c.appendChild(d);var e=c.cloneNode(!0),f=c.cloneNode(!0),g=c.cloneNode(!0),h=a.createTreeWalker(c,1,function(a){return 1},!1);c.appendChild(e),c.appendChild(f),c.appendChild(g),h.currentNode=g,h.previousNode()!==f&&(b=!0)}();if(!b)return;var c={1:1,2:2,3:4,8:128,9:256,11:1024},d=1,e=function(a,b,c){this.root=this.currentNode=a,this.nodeType=b,this.filter=c};e.prototype.nextNode=function(){var a=this.currentNode,b=this.root,e=this.nodeType,f=this.filter,g;for(;;){g=a.firstChild;while(!g&&a){if(a===b)break;g=a.nextSibling,g||(a=a.parentNode)}if(!g)return null;if(c[g.nodeType]&e&&f(g)===d)return this.currentNode=g,g;a=g}},e.prototype.previousNode=function(){var a=this.currentNode,b=this.root,e=this.nodeType,f=this.filter,g;for(;;){if(a===b)return null;g=a.previousSibling;if(g)while(a=g.lastChild)g=a;else g=a.parentNode;if(!g)return null;if(c[g.nodeType]&e&&f(g)===d)return this.currentNode=g,g;a=g}},a.createTreeWalker=function(a,b,c){return new e(a,b,c)}})(document),function(){"use strict";var a=function(a,b){var c=a.prototype,d;for(d in b)c[d]=b[d]},b=function(a,b){var c=a.length;while(c--)if(!b(a[c]))return!1;return!0},c=function(){return!1},d=function(){return!0},e=/^(?:A(?:BBR|CRONYM)?|B(?:R|D[IO])?|C(?:ITE|ODE)|D(?:FN|EL)|EM|HR|I(?:NPUT|MG|NS)?|KBD|Q|R(?:P|T|UBY)|S(?:U[BP]|PAN|TRONG|AMP)|U)$/,f={BR:1,IMG:1,INPUT:1},g=function(a,b){var c=b.parentNode;return c&&c.replaceChild(a,b),a},h=1,i=3,j=1,k=1,l=3,m=function(a){return a.isBlock()?k:l},n=!!window.opera||!!window.ie;a(Node,{isInline:c,isBlock:c,isContainer:c,getPath:function(){var a=this.parentNode;return a?a.getPath():""},detach:function(){var a=this.parentNode;return a&&a.removeChild(this),this},replaceWith:function(a){return g(a,this),this},replaces:function(a){return g(this,a),this},nearest:function(a,b){var c=this.parentNode;return c?c.nearest(a,b):null},getPreviousBlock:function(){var a=this.ownerDocument,b=a.createTreeWalker(a.body,j,m,!1);return b.currentNode=this,b.previousNode()},getNextBlock:function(){var a=this.ownerDocument,b=a.createTreeWalker(a.body,j,m,!1);return b.currentNode=this,b.nextNode()},split:function(a,b){return a},mergeContainers:function(){}}),a(Text,{isInline:d,isLeaf:d,getLength:function(){return this.length},isLike:function(a){return a.nodeType===i},split:function(a,b){var c=this;return c===b?a:c.parentNode.split(c.splitText(a),b)}}),a(Element,{isLeaf:function(){return!!f[this.nodeName]},isInline:function(){return e.test(this.nodeName)},isBlock:function(){return!this.isInline()&&b(this.childNodes,function(a){return a.isInline()})},isContainer:function(){return!this.isInline()&&!this.isBlock()},getLength:function(){return this.childNodes.length},getPath:function(){var a=this.nodeName;if(a==="BODY")return a;var b=this.parentNode.getPath(),c=this.id,d=this.className.trim();return b+=">"+a,c&&(b+="#"+c),d&&(d=d.split(/\s\s*/),d.sort(),b+=".",b+=d.join(".")),b},wraps:function(a){return g(this,a).appendChild(a),this},empty:function(){var a=this.ownerDocument.createDocumentFragment(),b=this.childNodes.length;while(b--)a.appendChild(this.firstChild);return a},is:function(a,b){if(this.nodeName!==a)return!1;var c;for(c in b)if(this.getAttribute(c)!==b[c])return!1;return!0},nearest:function(a,b){var c=this;do if(c.is(a,b))return c;while((c=c.parentNode)&&c.nodeType===h);return null},isLike:function(a){return a.nodeType===h&&a.nodeName===this.nodeName&&a.className===this.className&&a.style.cssText===this.style.cssText},mergeInlines:function(a){var b=this.childNodes,c=b.length,d=[],e,g,j;while(c--){e=b[c],g=c&&b[c-1];if(c&&e.isInline()&&e.isLike(g)&&!f[e.nodeName])a.startContainer===e&&(a.startContainer=g,a.startOffset+=g.getLength()),a.endContainer===e&&(a.endContainer=g,a.endOffset+=g.getLength()),a.startContainer===this&&(a.startOffset>c?a.startOffset-=1:a.startOffset===c&&(a.startContainer=g,a.startOffset=g.getLength())),a.endContainer===this&&(a.endOffset>c?a.endOffset-=1:a.endOffset===c&&(a.endContainer=g,a.endOffset=g.getLength())),e.detach(),e.nodeType===i?g.appendData(e.data):d.push(e.empty());else if(e.nodeType===h){j=d.length;while(j--)e.appendChild(d.pop());e.mergeInlines(a)}}},mergeWithBlock:function(a,b){var c=this,d=a,e,f,g;while(d.parentNode.childNodes.length===1)d=d.parentNode;d.detach(),f=c.childNodes.length,e=c.lastChild,e&&e.nodeName==="BR"&&(c.removeChild(e),f-=1),g={startContainer:c,startOffset:f,endContainer:c,endOffset:f},c.appendChild(a.empty()),c.mergeInlines(g),b.setStart(g.startContainer,g.startOffset),b.collapse(!0),window.opera&&(e=c.lastChild)&&e.nodeName==="BR"&&c.removeChild(e)},mergeContainers:function(){var a=this.previousSibling,b=this.firstChild;a&&a.isLike(this)&&a.isContainer()&&(a.appendChild(this.detach().empty()),b&&b.mergeContainers())},split:function(a,b){var c=this;typeof a=="number"&&(a=a-1,f=c.compareBoundaryPoints(h,d)<1;return!e&&!f}var k=c.compareBoundaryPoints(g,d)<1,l=c.compareBoundaryPoints(i,d)>-1;return k&&l},moveBoundariesDownTree:function(){var a=this.startContainer,b=this.startOffset,c=this.endContainer,e=this.endOffset,f;while(a.nodeType!==d){f=a.childNodes[b];if(!f||f.nodeName==="BR")break;a=f,b=0}if(e)while(c.nodeType!==d){f=c.childNodes[e-1];if(!f||f.nodeName==="BR")break;c=f,e=c.getLength()}else while(c.nodeType!==d){f=c.firstChild;if(!f||f.nodeName==="BR")break;c=f}return this.collapsed?(this.setStart(c,e),this.setEnd(a,b)):(this.setStart(a,b),this.setEnd(c,e)),this},moveBoundariesUpTree:function(a){var c=this.startContainer,d=this.startOffset,e=this.endContainer,f=this.endOffset,g;a||(a=this.commonAncestorContainer);while(c!==a&&!d)g=c.parentNode,d=b.call(g.childNodes,c),c=g;while(e!==a&&f===e.getLength())g=e.parentNode,f=b.call(g.childNodes,e)+1,e=g;return this.setStart(c,d),this.setEnd(e,f),this},getStartBlock:function(){var a=this.startContainer,b;return a.isInline()?b=a.getPreviousBlock():a.isBlock()?b=a:(b=k(a,this.startOffset),b=b.getNextBlock()),b&&this.containsNode(b,!0)?b:null},getEndBlock:function(){var a=this.endContainer,b,c;if(a.isInline())b=a.getPreviousBlock();else if(a.isBlock())b=a;else{b=l(a,this.endOffset);if(!b){b=a.ownerDocument.body;while(c=b.lastChild)b=c}b=b.getPreviousBlock()}return b&&this.containsNode(b,!0)?b:null},startsAtBlockBoundary:function(){var a=this.startContainer,c=this.startOffset,d,e;while(a.isInline()){if(c)return!1;d=a.parentNode,c=b.call(d.childNodes,a),a=d}while(c&&(e=a.childNodes[c-1])&&(e.data===""||e.nodeName==="BR"))c-=1;return!c},endsAtBlockBoundary:function(){var a=this.endContainer,c=this.endOffset,d=a.getLength(),e,f;while(a.isInline()){if(c!==d)return!1;e=a.parentNode,c=b.call(e.childNodes,a)+1,a=e,d=a.childNodes.length}while(c20)&&(b<33||b>45)&&R()});var S=function(a){Q||(N+=1,Nf.endOffset?p.splitText(f.endOffset):o=f.endOffset),p===f.startContainer&&(q&&f.startOffset?p=p.splitText(f.startOffset):m=f.startOffset),q&&(n(b,c).wraps(p),o=p.length),l=p,k||(k=l);while(p=j.nextNode());f=u(k,m,l,o)}return f},X=function(b,c,e,f){K(e),e.collapsed&&e._insertNode(a.createTextNode(""));var g=e.commonAncestorContainer;while(g.isInline())g=g.parentNode;var h=e.startContainer,i=e.startOffset,j=e.endContainer,k=e.endOffset,l=[],m=function p(a,b){if(e.containsNode(a,!1))return;var c=a.nodeType===d,f,g;if(!e.containsNode(a,!0)){a.nodeName!=="INPUT"&&l.push([b,a]);return}if(c)a===j&&k!==a.length&&l.push([b,a.splitText(k)]),a===h&&i&&(a.splitText(i),l.push([b,a]));else for(f=a.firstChild;f;f=g)g=f.nextSibling,p(f,b)},n=Array.prototype.filter.call(g.getElementsByTagName(b),function(a){return e.containsNode(a,!0)&&a.is(b,c)});f||n.forEach(function(a){m(a,a)}),l.forEach(function(a){a[0].cloneNode(!1).wraps(a[1])}),n.forEach(function(a){a.replaceWith(a.empty())}),e=M();var o={startContainer:e.startContainer,startOffset:e.startOffset,endContainer:e.endContainer,endOffset:e.endOffset};return g.mergeInlines(o),e.setStart(o.startContainer,o.startOffset),e.setEnd(o.endContainer,o.endOffset),e},Y=function(a,b,c,d){if(!c&&!(c=x()))return;S(c),M(c),b&&(c=X(b.tag.toUpperCase(),b.attributes||{},c,d)),a&&(c=W(a.tag.toUpperCase(),a.attributes||{},c)),C(c),B(0,!0),R()},Z=function(a,b){if(!b&&!(b=x()))return;S(b),M(b);var c=b.getStartBlock(),d=b.getEndBlock();if(c&&d)for(;;){a(c);if(c===d)break;c=c.getNextBlock()}B(0,!0),R()},$=function(a,b){if(!b&&!(b=x()))return;k||j.setAttribute("contenteditable","false"),Q?K(b):S(b),b.expandToBlockBoundaries(),b.moveBoundariesUpTree(j);var c=b._extractContents(j);b._insertNode(a(c)),b.endOffset]*>([\s\S]*?)<\/style>/gi,bs=function(a){return function(){return a.apply(null,arguments),this}},bt=function(a,b,c){return function(){return a(b,c),D(),this}};i.editor={addEventListener:bs(s),removeEventListener:bs(t),focus:bs(D),blur:bs(E),getDocument:function(){return a},getHTML:function(){var a=[],b,c,d,e;if(m){b=j;while(b=b.getNextBlock())!b.textContent&&!b.querySelector("BR")&&(c=n("BR"),b.appendChild(c),a.push(c))}d=F();if(m){e=a.length;while(e--)a[e].detach()}return d},setHTML:function(b){var c=a.createDocumentFragment(),d=n("DIV"),e="",f;br.lastIndex=0,b=b.replace(br,function(a,b){return e+=b.replace(//g,""),""}),d.innerHTML=b,c.appendChild(d.empty()),bk(c,!0),bm(c),bl(c,"DIV");var g=c;while(g=g.getNextBlock())g.fixCursor();while(f=j.lastChild)j.removeChild(f);if(e){var h=a.documentElement.firstChild,i=n("STYLE",{type:"text/css"});i.styleSheet?(h.appendChild(i),i.styleSheet.cssText=e):(i.appendChild(a.createTextNode(e)),h.appendChild(i))}j.appendChild(c),j.fixCursor(),N=-1,O=[],P=0,Q=!1;var k=u(j.firstChild,0);return S(k),C(M(k)),B(0,!0),this},getSelectedText:function(){return x().getTextContent()},insertImage:function(a){var b=n("IMG",{src:a});return H(b),b},getPath:function(){return A},getSelection:x,setSelection:bs(C),undo:bs(T),redo:bs(U),hasFormat:V,changeFormat:bs(Y),bold:bt(Y,{tag:"B"}),italic:bt(Y,{tag:"I"}),underline:bt(Y,{tag:"U"}),removeBold:bt(Y,null,{tag:"B"}),removeItalic:bt(Y,null,{tag:"I"}),removeUnderline:bt(Y,null,{tag:"U"}),makeLink:function(b){b=encodeURI(b);var c=x();if(c.collapsed){var d=b.indexOf(":")+1;if(d)while(b[d]==="/")d+=1;c._insertNode(a.createTextNode(b.slice(d)))}return Y({tag:"A",attributes:{href:b}},{tag:"A"},c),D(),this},removeLink:function(){return Y(null,{tag:"A"},x(),!0),D(),this},setFontFace:function(a){return Y({tag:"SPAN",attributes:{"class":"font",style:"font-family: "+a+", sans-serif;"}},{tag:"SPAN",attributes:{"class":"font"}}),D(),this},setFontSize:function(a){return Y({tag:"SPAN",attributes:{"class":"size",style:"font-size: "+(typeof a=="number"?a+"px":a)}},{tag:"SPAN",attributes:{"class":"size"}}),D(),this},setTextColour:function(a){return Y({tag:"SPAN",attributes:{"class":"colour",style:"color: "+a}},{tag:"SPAN",attributes:{"class":"colour"}}),D(),this},setHighlightColour:function(a){return Y({tag:"SPAN",attributes:{"class":"highlight",style:"background-color: "+a}},{tag:"SPAN",attributes:{"class":"highlight"}}),D(),this},setTextAlignment:function(a){return Z(function(b){b.className="align-"+a,b.style.textAlign=a}),D(),this},modifyBlocks:bs($),incQuoteLevel:bt($,_),decQuoteLevel:bt($,ba),makeUnorderedList:bt($,bc),makeOrderedList:bt($,bd),removeList:bt($,be)},j.setAttribute("contenteditable","true"),i.editor.setHTML("")}(document); \ No newline at end of file diff --git a/source/Editor.js b/source/Editor.js index 189d5c9..54ef71a 100644 --- a/source/Editor.js +++ b/source/Editor.js @@ -2,7 +2,7 @@ /*global Range, window, document, setTimeout */ -document.addEventListener( 'DOMContentLoaded', function () { +( function ( doc ) { "use strict"; @@ -16,13 +16,12 @@ document.addEventListener( 'DOMContentLoaded', function () { FILTER_ACCEPT = 1, // NodeFilter.FILTER_ACCEPT, FILTER_SKIP = 3; // NodeFilter.FILTER_SKIP; - var doc = document, - win = doc.defaultView, + var win = doc.defaultView, body = doc.body; var isOpera = !!win.opera; var isIE = !!win.ie; - var useTextFixer = isOpera || isOpera; + var useTextFixer = isIE || isOpera; // --- DOM Sugar --- @@ -528,12 +527,8 @@ document.addEventListener( 'DOMContentLoaded', function () { // If not at least partially contained, wrap entire contents // in a clone of the tag we're removing and we're done. if ( !range.containsNode( node, true ) ) { - // Tidy up as we go... - if ( isText && !node.length ) { - node.detach(); - } // Ignore bookmarks - else if ( node.nodeName !== 'INPUT' ) { + if ( node.nodeName !== 'INPUT' ) { toWrap.push([ exemplar, node ]); } return; @@ -1585,4 +1580,4 @@ document.addEventListener( 'DOMContentLoaded', function () { body.setAttribute( 'contenteditable', 'true' ); win.editor.setHTML( '' ); -}, false ); \ No newline at end of file +}( document ) ); \ No newline at end of file diff --git a/source/document.html b/source/document.html index 52398d1..734a865 100644 --- a/source/document.html +++ b/source/document.html @@ -51,7 +51,6 @@ - - + \ No newline at end of file