if (ar[i].name == 'id') { // always keep ids?
continue;
}
- if (ar[i].name == 'style') {
- throw "style removed?";
- }
+ //if (ar[i].name == 'style') {
+ // throw "style removed?";
+ //}
Roo.log("removeAttribute" + ar[i].name);
from.removeAttribute(ar[i].name);
}
ar = to.attributes;
for(var i = 0; i< ar.length;i++) {
if (from.getAttribute(ar[i].name) == to.getAttribute(ar[i].name)) {
+ Roo.log("skipAttribute " + ar[i].name + '=' + to.getAttribute(ar[i].name));
continue;
}
- Roo.log("updateAttribute " + from.getAttribute(ar[i].name) + '=>' + to.getAttribute(ar[i].name));
+ Roo.log("updateAttribute " + ar[i].name + '=>' + to.getAttribute(ar[i].name));
from.setAttribute(ar[i].name, to.getAttribute(ar[i].name));
}
// children
*/
syncValue : function()
{
- Roo.log("HtmlEditorCore:syncValue (EDITOR->TEXT)");
+ //Roo.log("HtmlEditorCore:syncValue (EDITOR->TEXT)");
if(this.initialized){
this.undoManager.addEvent();
*/
pushValue : function()
{
- Roo.log("HtmlEditorCore:pushValue (TEXT->EDITOR)");
+ //Roo.log("HtmlEditorCore:pushValue (TEXT->EDITOR)");
if(this.initialized){
var v = this.el.dom.value.trim();
if (e && (e.ctrlKey || e.metaKey) && e.keyCode === 90) {
return; // we do not handle this.. (undo manager does..)
}
+ // in theory this detects if the last element is not a br, then we try and do that.
+ // its so clicking in space at bottom triggers adding a br and moving the cursor.
+ if (e &&
+ e.target.nodeName == 'BODY' &&
+ e.type == "mouseup" &&
+ this.doc.body.lastChild
+ ) {
+ var lc = this.doc.body.lastChild;
+ while (lc.nodeType == 3 && lc.nodeValue == '') {
+ lc = lc.previousSibling;
+ }
+ if (lc.nodeType == 1 && lc.nodeName != 'BR') {
+ // if last element is <BR> - then dont do anything.
+
+ var ns = this.doc.createElement('br');
+ this.doc.body.appendChild(ns);
+ range = this.doc.createRange();
+ range.setStartAfter(ns);
+ range.collapse(true);
+ var sel = this.win.getSelection();
+ sel.removeAllRanges();
+ sel.addRange(range);
+ }
+ }
+
+
+
this.owner.fireEvent('editorevent', this, e);
// this.updateToolbar();
this.syncValue(); //we can not sync so often.. sync cleans, so this breaks stuff
this.tb.items.each(function(item){
item.enable();
});
+ // initialize 'blocks'
+ Roo.each(Roo.get(this.editorcore.doc.body).query('*[data-block]'), function(e) {
+ Roo.htmleditor.Block.factory(e).updateElement(e);
+ },this);
+
}
}
Roo.htmleditor.Block.factory = function(node)
{
-
+ var cc = Roo.htmleditor.Block.cache;
var id = Roo.get(node).id;
- if (typeof(Roo.htmleditor.Block.cache[id]) != 'undefined') {
+ if (typeof(cc[id]) != 'undefined' && (!cc[id].node || cc[id].node.closest('body'))) {
Roo.htmleditor.Block.cache[id].readElement();
return Roo.htmleditor.Block.cache[id];
}
click : function (_self, e)
{
block().resetWidths();
+ syncValue();
}
},
xns : rooui.Toolbar
remove : function()
{
Roo.log(this.cfg.node);
+ },
+
+
+
+ resetWidths : function()
+ {
+ Array.from(this.node.getElementsByTagName('td')).forEach(function(n) {
+ var nn = Roo.htmleditor.Block.factory(n);
+ nn.width = '';
+ nn.updateElement(n);
+ });
}
Roo.get(this.core.doc.body).on('keypress', this.keypress, this);
}
+//Roo.htmleditor.KeyEnter.i = 0;
+
Roo.htmleditor.KeyEnter.prototype = {
var docFragment = doc.createDocumentFragment();
//add a new line
- var newEle = doc.createTextNode('\n');
- docFragment.appendChild(newEle);
+
var range = this.core.win.getSelection().getRangeAt(0);
}
+ var newEle = doc.createTextNode('\n');
+ docFragment.appendChild(newEle);
+
//add the br, or p, or something else
newEle = doc.createElement('br');
+ //newEle.setAttribute('data-id', Roo.htmleditor.KeyEnter.i++);
+ docFragment.appendChild(newEle);
+ doc.createTextNode('\n');
docFragment.appendChild(newEle);
- range.deleteContents();
- range.insertNode(docFragment);
+ range.deleteContents();
+ range.insertNode(docFragment); //<< inseting here...
+
var ns = newEle.nextSibling
while (ns && ns.nodeType == 3) {
ns = ns.nextSibling;
}
if (!ns) {
+ //Roo.log('add extra');
ns = doc.createElement('br');
+ //ns.setAttribute('data-id', 'x' + Roo.htmleditor.KeyEnter.i++);
newEle.parentNode.appendChild(ns);
}
+
range = doc.createRange();
- range.setStart(ns, 0);
- range.setEnd(ns, 0);
+ range.setStartAfter(newEle);
range.collapse(true);
var sel = this.core.win.getSelection();
sel.removeAllRanges();
sel.addRange(range);
- this.core.undoManager.addEvent();
+ //this.core.undoManager.addEvent();
return false;
}
);
}
- Roo.log("transaction: pos:" + this.position + " len: " + this.length + " slen:" + this.stack.length);
+ //Roo.log("transaction: pos:" + this.position + " len: " + this.length + " slen:" + this.stack.length);
},
undo : function ()
{
- Roo.log("undo: pos:" + this.position + " len: " + this.length + " slen:" + this.stack.length);
+ //Roo.log("undo: pos:" + this.position + " len: " + this.length + " slen:" + this.stack.length);
if (this.position < this.length) {
for (var i = this.stack[this.position].length - 1; i >= 0; i--) {
addEvent : function(merge)
{
- Roo.log("undomanager +" + (merge ? 'Y':'n'));
+ //Roo.log("undomanager +" + (merge ? 'Y':'n'));
// not sure if this should clear the timer
merge = typeof(merge) == 'undefined' ? false : merge;
</span><span class="jsdoc-var">onEditorEvent </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">e</span><span class="jsdoc-syntax">)
{
+
+ </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">e </span><span class="jsdoc-syntax">&& (</span><span class="jsdoc-var">e.ctrlKey </span><span class="jsdoc-syntax">|| </span><span class="jsdoc-var">e.metaKey</span><span class="jsdoc-syntax">) && </span><span class="jsdoc-var">e.keyCode </span><span class="jsdoc-syntax">=== 90) {
+ </span><span class="jsdoc-keyword">return</span><span class="jsdoc-syntax">; </span><span class="jsdoc-comment">// we do not handle this.. (undo manager does..)
+ </span><span class="jsdoc-syntax">}
</span><span class="jsdoc-var">this.owner.fireEvent</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'editorevent'</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">e</span><span class="jsdoc-syntax">);
</span><span class="jsdoc-comment">// this.updateToolbar();
</span><span class="jsdoc-var">this.syncValue</span><span class="jsdoc-syntax">(); </span><span class="jsdoc-comment">//we can not sync so often.. sync cleans, so this breaks stuff
</span><span class="jsdoc-var">Roo.get</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.core.doc.body</span><span class="jsdoc-syntax">)</span><span class="jsdoc-var">.on</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'keypress'</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">this.keypress</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">);
}
-
+</span><span class="jsdoc-var">Roo.htmleditor.KeyEnter.i </span><span class="jsdoc-syntax">= 0;
</span><span class="jsdoc-var">Roo.htmleditor.KeyEnter.prototype </span><span class="jsdoc-syntax">= {
</span><span class="jsdoc-var">core </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">,
</span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">docFragment </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">doc.createDocumentFragment</span><span class="jsdoc-syntax">();
</span><span class="jsdoc-comment">//add a new line
- </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">newEle </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">doc.createTextNode</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'\n'</span><span class="jsdoc-syntax">);
- </span><span class="jsdoc-var">docFragment.appendChild</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">newEle</span><span class="jsdoc-syntax">);
+
</span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">range </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.core.win.getSelection</span><span class="jsdoc-syntax">()</span><span class="jsdoc-var">.getRangeAt</span><span class="jsdoc-syntax">(0);
}
+ </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">newEle </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">doc.createTextNode</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'\n'</span><span class="jsdoc-syntax">);
+ </span><span class="jsdoc-var">docFragment.appendChild</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">newEle</span><span class="jsdoc-syntax">);
+
</span><span class="jsdoc-comment">//add the br, or p, or something else
</span><span class="jsdoc-var">newEle </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">doc.createElement</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'br'</span><span class="jsdoc-syntax">);
+ </span><span class="jsdoc-var">newEle.setAttribute</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'data-id'</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">Roo.htmleditor.KeyEnter.i</span><span class="jsdoc-syntax">++);
+ </span><span class="jsdoc-var">docFragment.appendChild</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">newEle</span><span class="jsdoc-syntax">);
+ </span><span class="jsdoc-var">doc.createTextNode</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'\n'</span><span class="jsdoc-syntax">);
</span><span class="jsdoc-var">docFragment.appendChild</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">newEle</span><span class="jsdoc-syntax">);
+
</span><span class="jsdoc-var">range.deleteContents</span><span class="jsdoc-syntax">();
- </span><span class="jsdoc-var">range.insertNode</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">docFragment</span><span class="jsdoc-syntax">);
+ </span><span class="jsdoc-var">range.insertNode</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">docFragment</span><span class="jsdoc-syntax">); </span><span class="jsdoc-comment">//<< inseting here...
</span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">ns </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">newEle.nextSibling
</span><span class="jsdoc-keyword">while </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">ns </span><span class="jsdoc-syntax">&& </span><span class="jsdoc-var">ns.nodeType </span><span class="jsdoc-syntax">== 3) {
}
</span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(!</span><span class="jsdoc-var">ns</span><span class="jsdoc-syntax">) {
+ </span><span class="jsdoc-var">Roo.log</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'add extra'</span><span class="jsdoc-syntax">);
</span><span class="jsdoc-var">ns </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">doc.createElement</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'br'</span><span class="jsdoc-syntax">);
+ </span><span class="jsdoc-var">ns.setAttribute</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'data-id'</span><span class="jsdoc-syntax">, </span><span class="jsdoc-string">'x' </span><span class="jsdoc-syntax">+ </span><span class="jsdoc-var">Roo.htmleditor.KeyEnter.i</span><span class="jsdoc-syntax">++);
</span><span class="jsdoc-var">newEle.parentNode.appendChild</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">ns</span><span class="jsdoc-syntax">);
}
+
</span><span class="jsdoc-var">range </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">doc.createRange</span><span class="jsdoc-syntax">();
- </span><span class="jsdoc-var">range.setStart</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">ns</span><span class="jsdoc-syntax">, 0);
- </span><span class="jsdoc-var">range.setEnd</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">ns</span><span class="jsdoc-syntax">, 0);
- </span><span class="jsdoc-var">range.collapse</span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">);
+ </span><span class="jsdoc-var">range.setStartAfter</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">newEle</span><span class="jsdoc-syntax">);
+ </span><span class="jsdoc-var">range.collapse</span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">true</span><span class="jsdoc-syntax">);
</span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">sel </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.core.win.getSelection</span><span class="jsdoc-syntax">();
</span><span class="jsdoc-var">sel.removeAllRanges</span><span class="jsdoc-syntax">();
</span><span class="jsdoc-var">sel.addRange</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">range</span><span class="jsdoc-syntax">);
- </span><span class="jsdoc-var">this.core.undoManager.addEvent</span><span class="jsdoc-syntax">();
+ </span><span class="jsdoc-comment">//this.core.undoManager.addEvent();
</span><span class="jsdoc-keyword">return false</span><span class="jsdoc-syntax">;
}