*/
/**
* @class Roo.data.MemoryProxy
+ * @extends Roo.data.DataProxy
* An implementation of Roo.data.DataProxy that simply passes the data specified in its constructor
* to the Reader when its load method is called.
* @constructor
- * @param {Object} data The data object which the Reader uses to construct a block of Roo.data.Records.
+ * @param {Object} config A config object containing the objects needed for the Store to access data,
*/
-Roo.data.MemoryProxy = function(data){
- if (data.data) {
- data = data.data;
+Roo.data.MemoryProxy = function(config){
+ var data = config;
+ if (typeof(config) != 'undefined' && typeof(config.data) != 'undefined') {
+ data = config.data;
}
Roo.data.MemoryProxy.superclass.constructor.call(this);
this.data = data;
Roo.extend(Roo.data.MemoryProxy, Roo.data.DataProxy, {
+ /**
+ * @cfg {Object} data The data object which the Reader uses to construct a block of Roo.data.Records.
+ */
/**
* Load data from the requested source (in this case an in-memory
* data object passed to the constructor), read the data object into
this.hexStore.push(cmd);
},
cmderror : function(cmd) {
- throw new Exception (cmd.value);
+ throw cmd.value;
},
/*
{
this.emitText();
if (this.controlWord === '') {
- this.emitError('empty control word');
+ // do we want to track this - it seems just to cause problems.
+ //this.emitError('empty control word');
} else {
this.push({
type: 'controlword',
return;
case this.tag === true: // everything
+ case e.tagName.indexOf(":") > -1 && typeof(this.tag) == 'object' && this.tag.indexOf(":") > -1:
+ case e.tagName.indexOf(":") > -1 && typeof(this.tag) == 'string' && this.tag == ":":
case typeof(this.tag) == 'object' && this.tag.indexOf(e.tagName) > -1: // array and it matches.
case typeof(this.tag) == 'string' && this.tag == e.tagName: // array and it matches.
if (this.replaceTag && false === this.replaceTag(e)) {
// no need to apply config.
this.replaceDocBullets(cfg.node);
- this.walk(cfg.node);
+ // this is disabled as the removal is done by other filters;
+ // this.walk(cfg.node);
}
styleToObject: function(node)
{
- var styles = node.getAttribute("style").split(";");
+ var styles = (node.getAttribute("style") || '').split(";");
var ret = {};
Roo.each(styles, function(s) {
if (!s.match(/:/)) {
var kv = s.split(":");
// what ever is left... we allow.
- ret[kv[0]] = kv[1];
+ ret[kv[0].trim()] = kv[1];
});
return ret;
},
replaceDocBullets : function(doc)
{
- var listpara = doc.getElementsByClassName('MsoListParagraph');
+ // this is a bit odd - but it appears some indents use ql-indent-1
+ //Roo.log(doc.innerHTML);
+
+ var listpara = doc.getElementsByClassName('MsoListParagraphCxSpFirst');
+ for( var i = 0; i < listpara.length; i ++) {
+ listpara.item(i).className = "MsoListParagraph";
+ }
+ // this is a bit hacky - we had one word document where h2 had a miso-list attribute.
+ var htwo = doc.getElementsByTagName('h2');
+ for( var i = 0; i < htwo.length; i ++) {
+ if (htwo.item(i).getAttribute('style').match(/mso-list:/)) {
+ htwo.item(i).className = "MsoListParagraph";
+ }
+ }
+
+ listpara = doc.getElementsByClassName('ql-indent-1');
+ while(listpara.length) {
+ this.replaceDocBullet(listpara.item(0));
+ }
+ listpara = doc.getElementsByClassName('MsoListParagraph');
while(listpara.length) {
this.replaceDocBullet(listpara.item(0));
- //code
}
+
},
replaceDocBullet : function(p)
var ns = p,
parent = p.parentNode,
doc = parent.ownerDocument,
- items = [];
+ items = [];
+
+
while (ns) {
if (ns.nodeType != 1) {
ns = ns.nextSibling;
continue;
}
- if (!ns.className.match(/MsoListParagraph/i)) {
+ if (!ns.className.match(/(MsoListParagraph|ql-indent-1)/i)) {
break;
}
items.push(ns);
ns = ns.nextSibling;
-
}
+
+
var ul = parent.ownerDocument.createElement('ul'); // what about number lists...
parent.insertBefore(ul, p);
var lvl = 0;
var stack = [ ul ];
var last_li = false;
- items.forEach(function(n) {
- parent.removeChild(n);
+
+ items.forEach(function(n, ipos) {
+ //Roo.log("got innertHMLT=" + n.innerHTML);
+
var spans = n.getElementsByTagName('span');
- if (!spans.length || !n.isEqualNode(spans.item(0).parentNode)) {
+ if (!spans.length) {
+ //Roo.log("No spans found");
+
+ parent.removeChild(n);
return; // skip it...
}
+
+
+
+ var style = {};
+ for(var i = 0; i < spans.length; i++) {
- var style = this.styleToObject(n);
+ style = this.styleToObject(spans[i]);
+ if (typeof(style['mso-list']) == 'undefined') {
+ continue;
+ }
+
+ spans[i].parentNode.removeChild(spans[i]); // remove the fake bullet.
+ break;
+ }
+ //Roo.log("NOW GOT innertHMLT=" + n.innerHTML);
+ style = this.styleToObject(n); // mo-list is from the parent node.
if (typeof(style['mso-list']) == 'undefined') {
- return; // skip it.
+ //Roo.log("parent is missing level");
+ parent.removeChild(n);
+ return;
}
- n.removeChild(spans.item(0)); // remove the fake bullet.
- var nlvl = (style['mso-list'].split(' ')[1].replace(/level/,'') *1) - 1;
+
+ var nlvl = (style['mso-list'].split(' ')[1].replace(/level/,'') *1) - 1 ;
+
+
+
if (nlvl > lvl) {
//new indent
var nul = doc.createElement('ul'); // what about number lists...
+ if (!last_li) {
+ last_li = doc.createElement('li');
+ stack[lvl].appendChild(last_li);
+ }
last_li.appendChild(nul);
stack[nlvl] = nul;
+
}
lvl = nlvl;
var nli = stack[nlvl].appendChild(doc.createElement('li'));
last_li = nli;
+ nli.innerHTML = n.innerHTML;
+ //Roo.log("innerHTML = " + n.innerHTML);
+ parent.removeChild(n);
+
// copy children of p into nli
- while(n.firstChild) {
+ /*while(n.firstChild) {
var fc = n.firstChild;
n.removeChild(fc);
nli.appendChild(fc);
- }
+ }*/
},this);
* @param {String} text String to write out.
* @param {Boolean} raw Optional raw state if true the contents wont get encoded.
*/
- text: function(text, node)
+ text: function(in_text, node)
{
// if not in whitespace critical
- if (text.length < 1) {
+ if (in_text.length < 1) {
return;
}
+ var text = new XMLSerializer().serializeToString(document.createTextNode(in_text)); // escape it properly?
+
if (this.in_pre) {
this.html[this.html.length] = text;
return;
var pc = range.closest([ 'ol', 'ul']);
var pli = range.closest('li');
if (!pc || e.ctrlKey) {
- sel.insertNode('br', 'after');
+ // on it list, or ctrl pressed.
+ if (!e.ctrlKey) {
+ sel.insertNode('br', 'after');
+ } else {
+ // only do this if we have ctrl key..
+ var br = doc.createElement('br');
+ br.className = 'clear';
+ br.setAttribute('style', 'clear: both');
+ sel.insertNode(br, 'after');
+ }
+
this.core.undoManager.addEvent();
this.core.fireEditorEvent(e);
store : {
xtype : 'SimpleStore',
data : [
- ['50%'],
+ ['100%'],
['80%'],
- ['100%']
+ ['50%'],
+ ['20%'],
+ ['10%']
],
fields : [ 'val'],
xns : Roo.data
contextMenu : function(toolbar)
{
+ console.log("htmleditor.BlockTd contextMenu");
+ console.log(toolbar);
var cell = function() {
return Roo.htmleditor.Block.factory(toolbar.tb.selectedNode);
*/
toObject : function()
{
-
+ console.log("htmleditor.BlockTd toObject");
var ret = {
tag : 'td',
contenteditable : 'true', // this stops cell selection from picking the table.
readElement : function(node)
{
+ console.log("htmleditor.BlockTd readElement");
+ console.log(node);
node = node ? node : this.node ;
this.width = node.style.width;
this.colspan = Math.max(1,1*node.getAttribute('colspan'));
toTableArray : function()
{
+ console.log("htmleditor.BlockTd toTableArray");
var ret = [];
var tab = this.node.closest('tr').closest('table');
Array.from(tab.rows).forEach(function(r, ri){
shrinkColumn : function()
{
+ console.log("htmleditor.BlockTd shrinkColumn");
var table = this.toTableArray();
+ console.log(table);
this.normalizeWidths(table);
var col = this.cellData.col;
var nw = this.colWidths[col] * 0.8;
});
new Roo.htmleditor.FilterBlack({ node : d, tag : this.black});
// should be fonts..
- new Roo.htmleditor.FilterKeepChildren({node : d, tag : [ 'FONT', 'O:P' ]} );
+ new Roo.htmleditor.FilterKeepChildren({node : d, tag : [ 'FONT', ':' ]} );
new Roo.htmleditor.FilterParagraph({ node : d });
new Roo.htmleditor.FilterSpan({ node : d });
new Roo.htmleditor.FilterLongBr({ node : d });
cleanWord : function(node)
{
new Roo.htmleditor.FilterWord({ node : node ? node : this.doc.body });
+ new Roo.htmleditor.FilterKeepChildren({node : node ? node : this.doc.body, tag : [ 'FONT', ':' ]} );
},
* a function which returns such a specification.
*/
/**
- * @cfg {String} labelAlign
+ * @cfg {String} labelAlign (left|top|right)
* Valid values are "left," "top" and "right" (defaults to "left")
*/
/**
}
});
+
/**
* @class Roo.form.Column
* @extends Roo.form.Layout
}
});
-
/**
* @class Roo.form.Row
* @extends Roo.form.Layout