diff --git a/_examples/completeDemo.html b/_examples/completeDemo.html index 21ff703066921f9d48fd22e7a22957e579d42689..00a9e09019addeb287f57643e9d262bdd1dad77d 100755 --- a/_examples/completeDemo.html +++ b/_examples/completeDemo.html @@ -64,7 +64,7 @@ } function createEditor(){ enableBtn(); - UE.getEditor('editor') + UE.getEditor('editor'); } function getAllHtml() { alert( UE.getEditor('editor').getAllHtml() ) diff --git a/_src/plugins/contextmenu.js b/_src/plugins/contextmenu.js index 1b7364acb23d134bb18958d80935a35c0883cf47..ea0c7ebb576837422783ee4ae0cdfdcc9a6454e6 100644 --- a/_src/plugins/contextmenu.js +++ b/_src/plugins/contextmenu.js @@ -70,6 +70,41 @@ UE.plugins['contextmenu'] = function () { label:lang.inserttable, cmdName:'inserttable' }, + { + label:"清除表格背景", + cmdName:"cleartablebackground", + exec:function(){ + this.execCommand("cleartablebackground"); + } + }, + { + label:"整个表格隔行变色", + cmdName:"settablebackground", + exec:function(){ + this.execCommand("settablebackground",{repeat:true,colorList:["#bbb","#ccc"]},true); + } + }, + { + label:"三色渐变", + cmdName:"settablebackground", + exec:function(){ + this.execCommand("settablebackground",{repeat:true,colorList:["#aaa","#bbb","#ccc"]}); + } + }, + { + label:"隔行变色", + cmdName:"settablebackground", + exec:function(){ + this.execCommand("settablebackground",{repeat:true,colorList:["#bbb","#ccc"]}); + } + }, + { + label:"红蓝相间", + cmdName:"settablebackground", + exec:function(){ + this.execCommand("settablebackground",{repeat:true,colorList:["red","blue"]}); + } + }, { label:lang.deletetable, cmdName:'deletetable' @@ -174,6 +209,54 @@ UE.plugins['contextmenu'] = function () { } ] }, + { + group:"表格排序", + icon:'tablesort', + subMenu:[ + { + label:"逆序当前", + cmdName:'sorttable', + value:1 + }, + { + label:"按ASCII字符升序", + cmdName:'sorttable' + }, + { + label:"按ASCII字符降序", + cmdName:'sorttable', + exec:function(){ + this.execCommand("sorttable",function(td1,td2){ + var value1 = td1.innerHTML, + value2 = td2.innerHTML; + return value2.localeCompare(value1); + }); + } + }, + { + label:"按数值大小升序", + cmdName:'sorttable', + exec:function(){ + this.execCommand("sorttable",function(td1,td2){ + var value1 = parseInt(td1.innerHTML,10), + value2 = parseInt(td2.innerHTML,10); + return (value1||0) - (value2||0); + }); + } + }, + { + label:"按数值大小降序", + cmdName:'sorttable', + exec:function(){ + this.execCommand("sorttable",function(td1,td2){ + var value1 = parseInt(td1.innerHTML,10), + value2 = parseInt(td2.innerHTML,10); + return (value2||0) - (value1||0); + }); + } + } + ] + }, { group:lang.aligntd, icon:'aligntd', @@ -330,6 +413,8 @@ UE.plugins['contextmenu'] = function () { return me.getLang("contextMenu.aligntd"); case "aligntable": return me.getLang("contextMenu.aligntable"); + case "tablesort": + return "表格排序"; default : return ''; } diff --git a/_src/plugins/table.action.js b/_src/plugins/table.action.js index 2b4b9667b2dbfa975ea2ebbf7872b9dffb6acad7..32c0f0ff4c85c455605669b5274b02db938781b5 100644 --- a/_src/plugins/table.action.js +++ b/_src/plugins/table.action.js @@ -47,7 +47,8 @@ UE.plugins['table'] = function () { 'defaultRows':5, 'tdvalign':'top', 'cursorpath':me.options.UEDITOR_HOME_URL + "themes/default/images/cursor_", - 'tableDragable':false + 'tableDragable':false, + 'classList':[".back1",".back2"] }); me.getUETable = getUETable; var commands = { @@ -84,7 +85,7 @@ UE.plugins['table'] = function () { 'table.noBorderTable td,table.noBorderTable th,table.noBorderTable caption{border:1px dashed #ddd !important}' + //插入的表格的默认样式 'table{margin-bottom:10px;border-collapse:collapse;display:table;}' + - 'td,th{ background:white; padding: 5px 10px;border: 1px solid #DDD;}' + + 'td,th{padding: 5px 10px;border: 1px solid #DDD;}' + 'caption{border:1px dashed #DDD;border-bottom:0;padding:3px;text-align:center;}' + 'th{border-top:2px solid #BBB;background:#F7F7F7;}' + 'td p{margin:0;padding:0;}', me.document); @@ -513,6 +514,11 @@ UE.plugins['table'] = function () { toggleDraggableState(me, false, "", null); } }); + me.addListener("interlacetable",function(type,table){ + var rows = table.rows, + len; + + }); me.addListener("mousedown", mouseDownEvent); diff --git a/_src/plugins/table.cmds.js b/_src/plugins/table.cmds.js index 8960e18bf5ab0a0caf8e92aae4f356f81370c7d9..ff5629a3c31c0520e6593b9513c03c28e7bd85f7 100644 --- a/_src/plugins/table.cmds.js +++ b/_src/plugins/table.cmds.js @@ -5,18 +5,19 @@ * Time: 下午6:25 * To change this template use File | Settings | File Templates. */ -;(function(){ +; +(function () { var UT = UE.UETable, - getTableItemsByRange = function(editor){ + getTableItemsByRange = function (editor) { return UT.getTableItemsByRange(editor); }, - getUETableBySelected = function(editor){ + getUETableBySelected = function (editor) { return UT.getUETableBySelected(editor) }, - getDefaultValue = function(editor,table){ - return UT.getDefaultValue(editor,table); + getDefaultValue = function (editor, table) { + return UT.getDefaultValue(editor, table); }, - getUETable = function(tdOrTable){ + getUETable = function (tdOrTable) { return UT.getUETable(tdOrTable); }; @@ -526,10 +527,10 @@ table = tableItems.table; if (table) { if (cmd == 'adaptbywindow') { - resetTdWidth(table,this); + resetTdWidth(table, this); } else { - var cells = domUtils.getElementsByTagName(table,"td th"); - utils.each(cells,function(cell){ + var cells = domUtils.getElementsByTagName(table, "td th"); + utils.each(cells, function (cell) { cell.removeAttribute("width"); }); table.removeAttribute("width"); @@ -696,7 +697,6 @@ if (table) { var obj = {}; obj[data[0]] = data[1]; - table.style[utils.cssStyleToDomStyle("float")] = ""; table.style.margin = ""; domUtils.setStyles(table, obj); @@ -745,25 +745,99 @@ } } }; + UE.commands['sorttable'] = { + queryCommandState:function () { + var me = this, + tableItems = getTableItemsByRange(me); + if (!tableItems.cell) return -1; + var table = tableItems.table, + cells = table.getElementsByTagName("td"); + for (var i = 0, cell; cell = cells[i++];) { + if (cell.rowSpan != 1 || cell.colSpan != 1) return -1; + } + return 0; + }, + execCommand:function (cmd, fn) { + var me = this, + range = me.selection.getRange(), + bk = range.createBookmark(true), + tableItems = getTableItemsByRange(me), + cell = tableItems.cell, + ut = getUETable(tableItems.table), + cellIndex = ut.getCellInfo(cell).cellIndex, + cells = ut.getSameEndPosCells(cell, "x"); + if (cells.length < ut.rowsNum) { + this.fireEvent("tableForbidSort"); + return; + } + ut.sortTable(cellIndex, fn); + range.moveToBookmark(bk).select(); + } + }; - function resetTdWidth(table,editor){ + UE.commands["enablesort"] = UE.commands["disablesort"] = { + queryCommandState:function () { + return getTableItemsByRange(this).table ? 0 : -1; + }, + execCommand:function (cmd) { + var table = getTableItemsByRange(this).table; + table.setAttribute("data-sort", cmd == "enablesort" ? "sortEnabled" : "sortDisabled"); + } + }; + UE.commands["settablebackground"] = { + queryCommandState:function () { + return getTableItemsByRange(this).table ? 0 : -1; + }, + execCommand:function (cmd, value, allCells) { + var table, cells, ut; + if (allCells) { + table = getTableItemsByRange(this).table; + cells = table.getElementsByTagName("td"); + } else { + cells = getSelectedArr(this); + } + ut = getUETable(cells[0]); + ut.setBackground(cells, value); + } + }; + + UE.commands["cleartablebackground"] = { + execCommand:function () { + var cells = getSelectedArr(this), + ut = getUETable(cells[0]); + ut.removeBackground(cells); + } + }; + + UE.commands["interlacedtable"] = UE.commands["uninterlacedtable"] = { + execCommand:function (cmd) { + var table = getTableItemsByRange(this).table; + table.setAttribute("interlaced", cmd == "interlacedtable" ? "enabled" : "disabled"); + this.fireEvent("interlacetable",table); + } + }; + + function resetTdWidth(table, editor) { var tds = table.getElementsByTagName("td"); utils.each(tds, function (td) { td.removeAttribute("width"); }); - table.setAttribute('width', getTableWidth(editor,true,getDefaultValue(editor,table))); - setTimeout(function(){ - utils.each(tds,function(td){ - (td.colSpan ==1) && td.setAttribute("width",td.offsetWidth + ""); + table.setAttribute('width', getTableWidth(editor, true, getDefaultValue(editor, table))); + setTimeout(function () { + utils.each(tds, function (td) { + (td.colSpan == 1) && td.setAttribute("width", td.offsetWidth + ""); }) - },0); + }, 0); } + function getTableWidth(editor, needIEHack, defaultValue) { var body = editor.body; return body.offsetWidth - (needIEHack ? parseInt(domUtils.getComputedStyle(body, 'margin-left'), 10) * 2 : 0) - defaultValue.tableBorder * 2 - (editor.options.offsetWidth || 0); } + function getSelectedArr(editor) { - var ut = getTableItemsByRange(editor).cell || getUETableBySelected(editor); - return ut ? (ut.nodeType ? [ut] : ut.selectedTds) : []; + var cell = getTableItemsByRange(editor).cell, + ut = getUETable(cell); + return ut.selectedTds.length ? ut.selectedTds : [cell]; } })(); \ No newline at end of file diff --git a/_src/plugins/table.core.js b/_src/plugins/table.core.js index 9fb95f0ccef29c5077bd99e5840f28548052f5de..360fa3cf8bd5c4123dfe75aaeb80c63732c3b637 100644 --- a/_src/plugins/table.core.js +++ b/_src/plugins/table.core.js @@ -11,7 +11,7 @@ * @constructor */ (function () { - var UETable = UE.UETable = function(table) { + var UETable = UE.UETable = function (table) { this.table = table; this.indexTable = []; this.selectedTds = []; @@ -20,29 +20,29 @@ }; //===以下为静态工具方法=== - UETable.removeSelectedClass = function(cells) { + UETable.removeSelectedClass = function (cells) { utils.each(cells, function (cell) { domUtils.removeClasses(cell, "selectTdClass"); }) }; - UETable.addSelectedClass = function(cells){ + UETable.addSelectedClass = function (cells) { utils.each(cells, function (cell) { domUtils.addClass(cell, "selectTdClass"); }) }; - UETable.isEmptyBlock = function(node) { + UETable.isEmptyBlock = function (node) { var reg = new RegExp(domUtils.fillChar, 'g'); if (node[browser.ie ? 'innerText' : 'textContent'].replace(/^\s*$/, '').replace(reg, '').length > 0) { return 0; } - for (var i in dtd.$isNotEmpty) if(dtd.$isNotEmpty.hasOwnProperty(i)) { + for (var i in dtd.$isNotEmpty) if (dtd.$isNotEmpty.hasOwnProperty(i)) { if (node.getElementsByTagName(i).length) { return 0; } } return 1; }; - UETable.getWidth = function(cell) { + UETable.getWidth = function (cell) { if (!cell)return 0; return parseInt(domUtils.getComputedStyle(cell, "width"), 10); }; @@ -51,7 +51,7 @@ * 根据当前选区获取相关的table信息 * @return {Object} */ - UETable.getTableItemsByRange = function(editor) { + UETable.getTableItemsByRange = function (editor) { var start = editor.selection.getStart(), //在table或者td边缘有可能存在选中tr的情况 cell = start && domUtils.findParentByTagName(start, ["td", "th"], true), @@ -66,7 +66,7 @@ caption:caption } }; - UETable.getUETableBySelected = function(editor){ + UETable.getUETableBySelected = function (editor) { var table = UETable.getTableItemsByRange(editor).table; if (table && table.ueTable && table.ueTable.selectedTds.length) { return table.ueTable; @@ -74,7 +74,7 @@ return null; }; - UETable.getDefaultValue = function(editor,table){ + UETable.getDefaultValue = function (editor, table) { var borderMap = { thin:'0px', medium:'1px', @@ -117,7 +117,7 @@ * 根据当前点击的td或者table获取索引对象 * @param tdOrTable */ - UETable.getUETable = function(tdOrTable) { + UETable.getUETable = function (tdOrTable) { var tag = tdOrTable.tagName.toLowerCase(); tdOrTable = (tag == "td" || tag == "th" || tag == 'caption') ? domUtils.findParentByTagName(tdOrTable, "table", true) : tdOrTable; if (!tdOrTable.ueTable) { @@ -261,14 +261,14 @@ setCellContent:function (cell, content) { cell.innerHTML = content || (browser.ie ? domUtils.fillChar : "
"); }, - cloneCell:function(cell,ignoreMerge){ - if(!cell || utils.isString(cell)){ + cloneCell:function (cell, ignoreMerge) { + if (!cell || utils.isString(cell)) { return this.table.ownerDocument.createElement(cell || 'td'); } var flag = domUtils.hasClass(cell, "selectTdClass"); flag && domUtils.removeClasses(cell, "selectTdClass"); var tmpCell = cell.cloneNode(true); - if(ignoreMerge){ + if (ignoreMerge) { tmpCell.rowSpan = tmpCell.colSpan = 1; } tmpCell.style.borderLeftStyle = ""; @@ -312,10 +312,12 @@ this.cellsRange = {}; this.indexTable = []; var rows = this.table.rows, - //暂时采用rows Length,对残缺表格可能存在问题, - //todo 可以考虑取最大值 - rowsNum = rows.length, + rowsNum = this.getMaxRows(), + dNum = rowsNum - rows.length, colsNum = this.getMaxCols(); + while (dNum--) { + this.table.insertRow(rows.length); + } this.rowsNum = rowsNum; this.colsNum = colsNum; for (var i = 0, len = rows.length; i < len; i++) { @@ -1009,7 +1011,58 @@ var tds = this.table.getElementsByTagName("td"), range = this.getCellsRange(tds[0], tds[tds.length - 1]); this.setSelected(range); + }, + sortTable:function(sortByCellIndex,compareFn){ + var table = this.table, + rows = table.rows, + trArray = [], + flag = rows[0].cells[0].tagName === "TH"; + for (var i = 0, len = rows.length; i < len; i++) { + trArray[i] = rows[i]; + } + //th不参与排序 + flag && trArray.splice(0,1); + trArray.sort(function (tr1, tr2) { + return compareFn ? (typeof compareFn === "number" ? compareFn : compareFn.call(this,tr1.cells[sortByCellIndex], tr2.cells[sortByCellIndex])) : function () { + var value1 = tr1.cells[sortByCellIndex].innerHTML, + value2 = tr2.cells[sortByCellIndex].innerHTML; + return value1.localeCompare(value2); + }(); + }); + var fragment = table.ownerDocument.createDocumentFragment(); + for (var j = 0, len = trArray.length; j < len; j++) { + fragment.appendChild(trArray[j]); + } + table.getElementsByTagName("tbody")[0].appendChild(fragment); + }, + setBackground:function(cells,value){ + if(typeof value ==="string"){ + utils.each(cells,function(cell){ + cell.style.backgroundColor = value; + }) + }else if(typeof value === "object"){ + value = utils.extend({ + repeat:true, + colorList:["#ddd","#fff"] + },value); + var rowIndex = this.getCellInfo(cells[0]).rowIndex, + count = 0, + colors = value.colorList, + getColor = function(list,index,repeat){ + return list[index] ? list[index] : repeat ? list[index % list.length]: ""; + }; + for(var i = 0,cell;cell= cells[i++];){ + var cellInfo = this.getCellInfo(cell); + cell.style.backgroundColor = getColor(colors,((rowIndex + count) == cellInfo.rowIndex) ? count : ++count, value.repeat); + } + } + }, + removeBackground:function(cells){ + utils.each(cells,function(cell){ + cell.style.backgroundColor = ""; + }) } }; - function showError(e) {} + function showError(e) { + } })(); \ No newline at end of file diff --git a/_src/plugins/wordimage.js b/_src/plugins/wordimage.js index 9059bbf6a3be82fe8ff03fd2f28b21123821e1ff..56d0ddf749e4505189a78fa6aa8588cd912ad7de 100644 --- a/_src/plugins/wordimage.js +++ b/_src/plugins/wordimage.js @@ -14,7 +14,7 @@ UE.plugins["wordimage"] = function () { flag = parseInt(attrs.width) < 128 || parseInt(attrs.height) < 43, opt = me.options, src = opt.UEDITOR_HOME_URL + 'themes/default/images/spacer.gif'; - if (attrs['_src'].indexOf("file:///")!==-1) { + if (attrs['_src'] && attrs['_src'].indexOf("file:///")!==-1) { img.setAttr({ width:attrs.width, height:attrs.height, diff --git a/_src/ui/colorbutton.js b/_src/ui/colorbutton.js index 7866874ada66c126daa64a48f4a9035efc06c45f..6bb3d90ae185c57fec6f863978831ddb1b88a400 100644 --- a/_src/ui/colorbutton.js +++ b/_src/ui/colorbutton.js @@ -25,9 +25,18 @@ }, onpicknocolor: function (t, color){ me._onPickNoColor(color); + }, + onchangeheight:function(){ + var color = this.getPreview().style.backgroundColor, + popbody = me.popup.getDom("body"); + domUtils.setStyle(popbody,"height",me.popup.getDom("content").offsetHeight+"px"); + me.setColor(color); } }), - editor:me.editor + editor:me.editor, + onhide:function(){ + this.content.toggleAdv(1); + } }); this.initSplitButton(); }, diff --git a/_src/ui/colorpicker.js b/_src/ui/colorpicker.js index a4451bb5b81a5022658dbe6fff5b0e5b15d3ebfb..f78b3748942b15f9c0d02aa76a43e31c2af7e690 100644 --- a/_src/ui/colorpicker.js +++ b/_src/ui/colorpicker.js @@ -2,6 +2,7 @@ ///import uicore (function (){ var utils = baidu.editor.utils, + uiUtils = baidu.editor.ui.uiUtils, UIBase = baidu.editor.ui.UIBase, ColorPicker = baidu.editor.ui.ColorPicker = function (options){ this.initOptions(options); @@ -10,9 +11,28 @@ }; ColorPicker.prototype = { + hue:360, + ishide : true, + saturation:100, + brightness:100, getHtmlTpl: function (){ return genColorPicker(this.noColorText,this.editor); }, + getPad:function(){ + return this.getDom("pad"); + }, + getSliderMain:function(){ + return this.getDom("sliderMain"); + }, + getThumb:function(){ + return this.getDom("thumb"); + }, + getPreview:function(){ + return this.getDom('preview'); + }, + getAdv:function(){ + return this.getDom("adv"); + }, _onTableClick: function (evt){ var tgt = evt.target || evt.srcElement; var color = tgt.getAttribute('data-color'); @@ -24,14 +44,208 @@ var tgt = evt.target || evt.srcElement; var color = tgt.getAttribute('data-color'); if (color) { - this.getDom('preview').style.backgroundColor = color; + this.getPreview().style.backgroundColor = color; } }, _onTableOut: function (){ - this.getDom('preview').style.backgroundColor = ''; + this.getPreview().style.backgroundColor = ''; }, _onPickNoColor: function (){ this.fireEvent('picknocolor'); + }, + _onShowAdv:function(){ + if(browser.ie && browser.version<=6){ + alert("您的浏览器版本太低,请使用高级版本的浏览器") + return; + } + this.toggleAdv(); + }, + toggleAdv:function(ishide){ + var obj = this.getDom("togglehandle"); + if(ishide&&this.ishide){ + return; + } + this.getAdv().style.display=this.ishide?"block":"none"; + domUtils.removeClasses(obj,["arrow_down","arrow_up"]); + this.ishide?domUtils.addClass(obj,"arrow_up"):domUtils.addClass(obj,"arrow_down"); + this.ishide = !this.ishide; + this.fireEvent("changeheight"); + }, + _onPadDotMouseDown:function(evt){ + var me = this; + uiUtils.startDrag(evt, { + ondragstart: function (){}, + ondragmove: function (x, y,evt){ + me._onClickPad(evt); + }, + ondragstop:function(){} + }); + }, + /** + * 校准value值,保证它在合理范围内 + * @private + * @param {Number} x 范围上限,被校准的数值不能超过这个数值. + * @param {Number} y 需要校准的数值. + * @return {Number} 校准过的数值. + */ + _adjustValue: function(x, y) { + return Math.max(0, Math.min(x, y)); + }, + _onClickPad:function(evt){ + var me = this, + paddot = me.getDom("paddot"), + pdrect = uiUtils.getClientRect(paddot), + rect = uiUtils.getClientRect(me.getPad()), + evtoffset = uiUtils.getViewportOffsetByEvent(evt); + //计算鼠标坐标相对调色板左上角距离 + me.padDotY = me._adjustValue(rect.height, evtoffset.top - rect.top); + me.padDotX = me._adjustValue(rect.width, evtoffset.left - rect.left); + + me.safeSetOffset(paddot,{ + top: me.padDotY-pdrect.height/2 , + left: me.padDotX-pdrect.width/2 + }); + + me.saturation = parseInt(100 * me.padDotX / rect.width, 10); //根据调色块top值计算饱和度 + me.brightness = parseInt(100 * (rect.height - me.padDotY) / rect.height, 10); //根据调色块left值计算亮度 + me._setNewColor(); + + }, + /** + * 将rgb格式转成hex格式 + * @private + * @param {Object} rgb rgb格式颜色值. + * @return {String} hex格式颜色值. + */ + _RGBToHex: function(rgb) { + var hex = [rgb.r.toString(16), rgb.g.toString(16), rgb.b.toString(16)]; + for(var i= 0;i vpRect.right) { + left = vpRect.right - rect.width; + } + var top = offset.top||0; + if (top + rect.height > vpRect.bottom) { + top = vpRect.bottom - rect.height; + } + domUtils.setStyle(el,"left",Math.max(left, 0) + 'px'); + domUtils.setStyle(el,"top",Math.max(top, 0) + 'px'); + }, + /** + * 设置pad背景色 + */ + setPadBackground:function(){ + var me = this, + pad = me.getPad(), + thumb = me.getThumb(), + sliderMainRect = uiUtils.getClientRect(me.getSliderMain()); + me.hue = parseInt(360 * (sliderMainRect.height - Math.min(me.value,sliderMainRect.height)) / sliderMainRect.height,10); + //设置面板背景色 + domUtils.setStyle(pad,'background-color','#' + me._HSBToHex({ + h: Math.max(me.hue,0), + s: 100, + b: 100 + })); + me._setNewColor(); } }; utils.inherits(ColorPicker, UIBase); @@ -68,7 +282,27 @@ '"' + '>':''; } - html += ''; + html += ''; + //高级按钮 + html += ''; + html += getAdvColorPicker(); + html += ''; + return html; + } + + + function getAdvColorPicker(){ + var html = '
' + + '
' + + '
' + + '
'+ + '
' + + '
' + + '
' + + '
' + + '
' + + '
' + + '
'; return html; } })(); diff --git a/_src/ui/uiutils.js b/_src/ui/uiutils.js index d0309ed5e6a968f6dc72be51a681b1086a8554fe..91db76d0e00d2b19963531db7dd923c4c585bb41 100644 --- a/_src/ui/uiutils.js +++ b/_src/ui/uiutils.js @@ -161,7 +161,7 @@ function handleMouseMove(evt){ var x = evt.clientX - startX; var y = evt.clientY - startY; - callbacks.ondragmove(x, y); + callbacks.ondragmove(x, y,evt); if (evt.stopPropagation) { evt.stopPropagation(); } else { @@ -171,7 +171,7 @@ if (doc.addEventListener) { function handleMouseUp(evt){ doc.removeEventListener('mousemove', handleMouseMove, true); - doc.removeEventListener('mouseup', handleMouseMove, true); + doc.removeEventListener('mouseup', handleMouseUp, true); window.removeEventListener('mouseup', handleMouseUp, true); callbacks.ondragstop(); } diff --git a/_test/build_run.xml b/_test/build_run.xml index ee3272c9ef897f217687fac8b9d5f28ddf9f2c3a..8b475e0adabf0fe75886b42925ddf44effe72dea 100644 --- a/_test/build_run.xml +++ b/_test/build_run.xml @@ -6,6 +6,8 @@ + + @@ -59,8 +61,8 @@ - + @@ -72,8 +74,8 @@ - + diff --git a/_test/build_run_core.xml b/_test/build_run_core.xml index 4f57b41298b9599ff4d63b32c2d0179be59e39d2..5a6bafad38b5dbdc1020107a0158afad384a967e 100644 --- a/_test/build_run_core.xml +++ b/_test/build_run_core.xml @@ -6,6 +6,7 @@ + @@ -59,8 +60,8 @@ - + diff --git a/_test/build_run_plugin.xml b/_test/build_run_plugin.xml index e9fa1d6c987f1e082718fb0ef6e94ae20e6bd4ea..c6af6d49b47693f0658a5a99ca00f149e71c6147 100644 --- a/_test/build_run_plugin.xml +++ b/_test/build_run_plugin.xml @@ -6,6 +6,8 @@ + + @@ -59,8 +61,8 @@ - + diff --git a/_test/build_run_ui.xml b/_test/build_run_ui.xml index 93e5c742e5b88593f9c32d00dcd00e5adc6cbfee..d53f1b497ef9b46c2ac8ff2bf9f962470aff8187 100644 --- a/_test/build_run_ui.xml +++ b/_test/build_run_ui.xml @@ -6,6 +6,7 @@ + @@ -59,8 +60,8 @@ - + diff --git a/_test/core/Editor.js b/_test/core/Editor.js index e405c0baac7dc2a90e10227b74734d600e1dc944..f1624878d6ae15998edd6f905a893ad1e2c56591 100644 --- a/_test/core/Editor.js +++ b/_test/core/Editor.js @@ -115,78 +115,6 @@ test( "render-- options", function() { // //todo //} ); - -//TODO 现在在过滤机制里面去除无用的标签 -test( "getContent--去除无用的空标签:autoClearEmptyNode==true", function() { - var editor = new UE.Editor({autoClearEmptyNode:true,'autoFloatEnabled':false}); - stop(); - setTimeout(function(){ - var div = document.body.appendChild(document.createElement('div')); - editor.render(div); - te.dom.push(div); - editor.focus(); - var innerHTML = 'xxem
xxxx
'; - editor.setContent( innerHTML ); - editor.execCommand('source'); - editor.execCommand('source'); - equal( editor.getContent(), '

xxem

xxxx
', "span style空,套空的em和不空的em" ); - //style="color:#c4bd97;" - innerHTML = 'xxem'; - editor.setContent( innerHTML ); - if(ua.browser.ie ==9){ - equal( editor.getContent().toLowerCase(), '

xxem

', "span style不空,套空的em和不空的em" ); - } - else{ - equal( editor.getContent().toLowerCase(), '

xxem

', "span style不空,套空的em和不空的em" ); - } - innerHTML = 'xxem'; - editor.setContent( innerHTML ); - /*inline标签上只要有属性就不清理*/ - if(ua.browser.ie ==9){ - equal( editor.getContent().toLowerCase(), '

xxem

', "span 有style但内容为空" ); - } - else{ - equal( editor.getContent().toLowerCase(), '

xxem

', "span 有style但内容为空" ); - } - innerHTML = 'asdfxxem'; - editor.setContent( innerHTML ); - if(ua.browser.ie ==9){ - equal( editor.getContent().toLowerCase(), '

asdfxxem

', "span 有style内容不空" ); - } - else{ - equal( editor.getContent().toLowerCase(), '

asdfxxem

', "span 有style内容不空" ); - } - innerHTML = 'axxem'; - editor.setContent( innerHTML ); - equal( editor.getContent(), '

axxem

', "a 有href但内容为空,不过滤a标签" ); - start() - },100); -} ); -//editor.options.autoClearEmptyNode -test("getContent--不去除无用的空标签:autoClearEmptyNode==false", function() { - var editor = new UE.Editor({autoClearEmptyNode:false,'autoFloatEnabled':false}); - stop(); - setTimeout(function(){ - var div = document.body.appendChild(document.createElement('div')); - editor.render(div); - te.dom.push(div); - editor.focus(); - var innerHTML = 'xxem'; - editor.setContent(innerHTML); - equal(editor.getContent().toLowerCase(), '

xxem

', "span style空,套空的em和不空的em"); - innerHTML = 'xxem'; - editor.setContent(innerHTML); - ua.manualDeleteFillData(editor.body); - if (ua.browser.ie == 9) { - equal(editor.getContent().toLowerCase(), '

xxem

', "span 有style但内容为空"); - } - else { - equal(editor.getContent().toLowerCase(), '

xxem

', "span 有style但内容为空"); - } - start(); - },100); -}); - test("getContent--转换空格,nbsp与空格相间显示", function() { var editor = te.obj[1]; var div = te.dom[0]; @@ -202,8 +130,9 @@ test('getContent--参数为函数', function() { var div = te.dom[0]; editor.render(div); editor.focus(); - editor.setContent("


dd

"); - equal(editor.getContent(), "


dd

", 'hasContents判断不为空'); + + editor.setContent("


dd

"); + equal(editor.getContent(), "


dd

", 'hasContents判断不为空'); equal(editor.getContent(function() { return false }), "", '为空'); @@ -214,8 +143,8 @@ test('getContent--2个参数,第一个参数为参数为函数', function() { var div = te.dom[0]; editor.render(div); editor.focus(); - editor.setContent("


dd

"); - equal(editor.getContent(), "


dd

", 'hasContents判断不为空'); + editor.setContent("


dd

"); + equal(editor.getContent(), "


dd

", 'hasContents判断不为空'); equal(editor.getContent("", function() { return false }), "", '为空'); @@ -405,7 +334,7 @@ test("execCommand", function() { var editor = te.obj[1]; var div = te.dom[0]; editor.focus(); - editor.setContent("xx

xxx

"); + editor.setContent("

xx

xxx

"); var doc = editor.document; var range = new baidu.editor.dom.Range(doc); var p = doc.getElementsByTagName('p')[1]; @@ -416,7 +345,8 @@ test("execCommand", function() { range.selectNode(p).select(); editor.execCommand("forecolor", "red"); /*span发生了变化,需要重新获取*/ - span = doc.getElementsByTagName('span')[0]; + + var span = doc.getElementsByTagName('span')[0]; equal(span.style['color'], 'red', 'check execCommand color'); var div_new = document.createElement('div'); div_new.innerHTML = '

xx

xxx

'; diff --git a/_test/core/filternode.js b/_test/core/filternode.js index 9ad54ade810489b957130653d573478f51cfe30e..06127c185ff18b1a4941ad520e250609d37de0b7 100644 --- a/_test/core/filternode.js +++ b/_test/core/filternode.js @@ -1,47 +1,54 @@ module( 'core.filternode' ); -test( '', function() { +test( '过滤掉整个标签', function() { var uNode = UE.uNode; var node = uNode.createElement('

sdfsdf

sdf
'); UE.filterNode(node,{ 'p':{}, 'b':'-' }); - equals(node.toHtml().replace(/[ ]+>/g,'>'),'

sdf

sdf
'); - node.innerHTML('

sdfasdf
'); + equals(node.toHtml().replace(/[ ]+>/g,'>'),'

sdf

sdf
','保留p,过滤b'); + + node.innerHTML('

sdfs





'); UE.filterNode(node,{ - 'p':{$:{ - style:['color'] - }}, - 'td':{} + 'p':{}, + 'br':'-' }); - equals(node.toHtml().replace(/[ ]+>/g,'>'),'

sdfasdf
'); - node.innerHTML('

sdfssdfs

sdfasdf
'); + equals(node.toHtml().replace(/[ ]+>/g,'>'),'

sdfs

','保留p,过滤br'); +}); + +test( '过滤标签全部属性', function() { + var uNode = UE.uNode; + var node = uNode.createElement('

sdfsdf

sdf
'); + node.innerHTML('

sdfssdfs

sdfasdf
'); UE.filterNode(node,{ - 'p':{$:{ - style:['color'] - }}, - 'tr':function(node){ - node.tagName = 'p'; - node.setAttr(); - }, - 'td':function(node){ - node.parentNode.removeChild(node,true) - } + 'p':{$:{}} }); - equals(node.toHtml().replace(/[ ]+>/g,'>'),'

sdfssdfs

sdfasdf
'); + equals(node.toHtml().replace(/[ ]+>/g,'>'),'

sdfssdfs

sdfasdf
','过滤p全部属性'); + node.innerHTML('
asdlkfj
'); UE.filterNode(node,{ - 'p':{$:{}} + 'h6':function(node){ + node.tagName = 'p'; + node.setAttr(); + }, + '-':'b i', + 'p':{} }); - equals(node.toHtml().replace(/[ ]+>/g,'>'),'

sdfssdfs

sdfasdf
'); + equals(node.toHtml().replace(/[ ]+>/g,'>'),'

asd

','同时过滤多个标签属性'); +}); - node.innerHTML('

sdfs





'); +test( '过滤标签部分属性', function() { + var uNode = UE.uNode; + var node = uNode.createElement('

sdfsdf

sdf
'); + node.innerHTML('

sdfasdf
'); UE.filterNode(node,{ - 'p':{}, - 'br':'-' + 'p':{$:{ + style:['color'] + }}, + 'td':{} }); - equals(node.toHtml().replace(/[ ]+>/g,'>'),'

sdfs

'); + equals(node.toHtml().replace(/[ ]+>/g,'>'),'

sdfasdf
','保留p的color属性'); node.innerHTML('

sdfssdfs

'); UE.filterNode(node,{ @@ -51,7 +58,7 @@ test( '', function() { 'span':{$:{}}, 'strong':'-' }); - equals(node.toHtml().replace(/[ ]+>/g,'>'),'

sdfs

'); + equals(node.toHtml().replace(/[ ]+>/g,'>'),'

sdfs

','过滤span全部属性,保留p部分属性,过滤strong标签'); node.innerHTML('

sdfssdfssdfssdfs

'); UE.filterNode(node,{ @@ -62,14 +69,37 @@ test( '', function() { 'sub':{$:{}}, 'i':'-' }); - equals(node.toHtml().replace(/[ ]+>/g,'>'),'

sdfssdfs

'); + equals(node.toHtml().replace(/[ ]+>/g,'>'),'

sdfssdfs

','过滤sub全部属性,保留u部分属性,过滤i标签'); +}); - node.innerHTML(''); +test( '标签替换过滤', function() { + var uNode = UE.uNode; + var node = uNode.createElement('

sdfsdf

sdf
'); + node.innerHTML('

sdfssdfs

sdfasdf
'); + UE.filterNode(node,{ + 'p':{$:{ + style:['color'] + }}, + 'tr':function(node){ + node.tagName = 'p'; + node.setAttr(); + }, + 'td':function(node){ + node.parentNode.removeChild(node,true) + } + }); + equals(node.toHtml().replace(/[ ]+>/g,'>'),'

sdfssdfs

sdfasdf
','tr替换为p,过滤掉td'); + + node.innerHTML('
aldkfj
adf
lkj
'); UE.filterNode(node,{ 'img':{$:{ src:[''] }}, - 'script':function(node){ + 'table':{}, + 'tbody':{}, + 'tr':{$:{}}, + 'td':{$:{}}, + 'th':function(node){ var txt = !!node.innerText(); if(txt){ node.parentNode.insertAfter(UE.uNode.createText('    '),node); @@ -77,15 +107,41 @@ test( '', function() { node.parentNode.removeChild(node,node.innerText()) } }); - equals(node.toHtml().replace(/[ ]+>/g,'>'),'
'); + equals(node.toHtml().replace(/[ ]+>/g,'>'),'
aldkfjadf    
lkj
','th按文本内容替换,保留img部分属性'); +}); +test( '保留标签全部属性', function() { + var uNode = UE.uNode; + var node = uNode.createElement('

sdfsdf

sdf
'); node.innerHTML('
  1. sdf
    • a
    • b
    • c
  2. jkl
'); - UE.filterNode(node,{ 'ol':{}, 'ul':{$:{}}, 'li':{} }); - equals(node.toHtml().replace(/[ ]+>/g,'>'),'
  1. sdf
    • a
    • b
    • c
  2. jkl
'); + equals(node.toHtml().replace(/[ ]+>/g,'>'),'
  1. sdf
    • a
    • b
    • c
  2. jkl
','保留ol、li全部属性,过滤ul全部属性'); +}); + +test( '过滤规则为空', function() { + var uNode = UE.uNode; + var node = uNode.createElement('

sdfsdf

sdf
'); + node.innerHTML('

asd

sdfasdf
'); + UE.filterNode(node,{}); + equals(node.toHtml().replace(/[ ]+>/g,'>'),'

asd

sdfasdf
','过滤规则为空'); +}); + +test( '特殊规则过滤', function() { + var uNode = UE.uNode; + var node = uNode.createElement('

sdf

sdf
'); + node.innerHTML(''); + UE.filterNode(node,{ + 'b':'-' + }); + equals(node.toHtml().replace(/[ ]+>/g,'>'),'
','过滤规则中包含html中不存在的标签'); + node.innerHTML('

'); + UE.filterNode(node,{ + 'p':{} + }); + equals(node.toHtml().replace(/[ ]+>/g,'>'),'

','innerHTML中包含注释'); }); \ No newline at end of file diff --git a/_test/core/htmlparser.js b/_test/core/htmlparser.js index ede4928bad969cd449c6d292a6914b1062120b6b..feb32ba6a6a706b4c187745c9d2799b2bdc8fb2a 100644 --- a/_test/core/htmlparser.js +++ b/_test/core/htmlparser.js @@ -1,33 +1,39 @@ module( 'core.htmlparser' ); -test( '', function() { - var div = te.dom[0]; +test( '普通标签处理', function() { var root = UE.htmlparser('sdfsdfsdfsf'); - equals(root.toHtml(),'sdfsdfsdfsf'); + equals(root.toHtml(),'sdfsdfsdfsf','单个普通标签'); root = UE.htmlparser('sdfsdfsdsdfsdfsf'); - equals(root.toHtml(),'sdfsdfsdsdfsdfsf'); + equals(root.toHtml(),'sdfsdfsdsdfsdfsf','多个普通标签'); root = UE.htmlparser('sdf'); - equals(root.toHtml(),'sdf'); - root = UE.htmlparser('sdf'); - equals(root.toHtml(),'sdf'); - root = UE.htmlparser('

'); - equals(root.toHtml(),'

'); - root = UE.htmlparser('

sdfsdfsdf

'); - equals(root.toHtml(),'

sdfsdfsdf

'); + equals(root.toHtml(),'sdf','添加属性的标签'); root = UE.htmlparser(''); - equals(root.toHtml(),''); - root = UE.htmlparser('' + '\n\r' + ''); - equals(root.toHtml(),'' + '\n\r' + '
'); - root = UE.htmlparser('
  • sdfsdfsdf
  • sdfsdfsdfsdf'); - equals(root.toHtml(),'
    • sdfsdfsdf
    • sdfsdfsdfsdf
    '); + equals(root.toHtml(),'','img标签'); +}); + +test( '特殊标签处理', function() { + var root = UE.htmlparser('sdf'); + equals(root.toHtml(),'sdf','包含注释'); root = UE.htmlparser(''); - equals(root.toHtml().replace(/[ ]+>/g,'>'),''); + equals(root.toHtml().replace(/[ ]+>/g,'>'),'','script标签'); root = UE.htmlparser('


    '); - equals(root.toHtml().replace(/[ ]+>/g,'>'),'


    '); - root = UE.htmlparser('
    1. sdf
    2. sdfsdf
    '); - equals(root.toHtml().replace(/[ ]+>/g,'>'),'
    1. sdf
    2. sdfsdf
    '); + equals(root.toHtml().replace(/[ ]+>/g,'>'),'


    ','br标签'); + root = UE.htmlparser('
  • sdfsdfsdf
  • sdfsdfsdfsdf'); + equals(root.toHtml(),'
    • sdfsdfsdf
    • sdfsdfsdfsdf
    ','以文本结束的html'); +}); + +test( '补全不完整table', function() { + var root = UE.htmlparser('

    '); + equals(root.toHtml(),'

    ','td完整,补全table'); + root = UE.htmlparser('

    sdfsdfsdf

    '); + equals(root.toHtml(),'

    sdfsdfsdf

    ','td不完整,补全table'); + root = UE.htmlparser('' + '\n\r' + ''); + equals(root.toHtml(),'
    ','包含\n,补全table'); +}); + +test( '补全不完整li', function() { + var root = UE.htmlparser('
    1. sdf
    2. sdfsdf
    '); + equals(root.toHtml().replace(/[ ]+>/g,'>'),'
    1. sdf
    2. sdfsdf
    ','补全u,em'); root = UE.htmlparser('
    1. sdf
      • a
      • b
      • c
    2. jkl
    '); - equals(root.toHtml().replace(/[ ]+>/g,'>'),'
    1. sdf
      • a
      • b
      • c
    2. jkl
    '); - root = UE.htmlparser('
    1. asdfas
    2. dfasdfa
    '); - equals(root.toHtml().replace(/[ ]+>/g,'>'),'
    1. asdfas
    2. dfasdfa
    '); + equals(root.toHtml().replace(/[ ]+>/g,'>'),'
    1. sdf
      • a
      • b
      • c
    2. jkl
    ','补全li'); }); \ No newline at end of file diff --git a/_test/core/node.js b/_test/core/node.js index f4bfa79aa3fd3914e7b5f1759401907d159bf66d..57c9381db21a3dcd1f5e700d8505c7f17a2f06f7 100644 --- a/_test/core/node.js +++ b/_test/core/node.js @@ -1,78 +1,162 @@ module( 'core.node' ); -test( '', function() { +test( 'createElement', function() { var uNode = UE.uNode; var node = uNode.createElement('div'); - equals(node.tagName,'div'); - equals(node.type,'element'); + equals(node.tagName,'div','空div ——tagname'); + equals(node.type,'element','空div ——节点类型'); node = uNode.createElement('
    sdfadf
    '); - equals(node.tagName,'div'); - equals(node.children[0].data,'sdfadf'); - node = uNode.createElement('
    sdfadf
    '); + equals(node.tagName,'div','非空div——tagname'); + equals(node.children[0].data,'sdfadf','非空div——数据内容'); +}); + +test( 'getNodeById', function() { + var uNode = UE.uNode; + var node = uNode.createElement('
    sdfadf
    '); node = node.getNodeById('bb'); - equals(node.getAttr('id'),'bb'); + equals(node.getAttr('id'),'bb','获取标签id'); node = uNode.createElement('
    sdfadf
    '); node = node.getNodeById('cc'); - equals(node.getAttr('id'),'cc'); - node = uNode.createElement('
    sdfadf
    '); + equals(node.getAttr('id'),'cc','获取标签id'); +}); + +test( 'getNodesByTagName', function() { + var uNode = UE.uNode; + var node = uNode.createElement('
    sdfadf
    '); var nodelist = node.getNodesByTagName('div'); - equals(nodelist.length,2); - equals(node.innerHTML().replace(/[ ]+>/g,'>'),'
    sdfadf'); + equals(nodelist.length,2,'div节点列表长度'); + equals(node.innerHTML().replace(/[ ]+>/g,'>'),'
    sdfadf','innerHTML内容'); +}); + +test( 'innerHTML', function() { + var uNode = UE.uNode; + var node = uNode.createElement('
    sdfadf
    '); + node.innerHTML('
    '); + var nodelist =node.getNodesByTagName('div'); + equals(nodelist.length,3,'div节点列表长度'); + for(var i= 0,ci;ci=nodelist[i++];){ + ci.tagName = 'p'; + } + equals(node.innerHTML(),'

    ','innerHTML内容'); +}); + +test( 'innerText', function() { + var tmp = new UE.uNode.createElement('area'); + tmp.innerHTML('

    '); + equals(tmp.innerText(),tmp,'标签类型特殊'); + var tmp = new UE.uNode.createText(''); + tmp.innerHTML('

    '); + equals(tmp.innerText(),tmp,'对象类型不为element'); + var uNode = UE.uNode; + var node = uNode.createElement('
    sdfadf
    '); + node.innerHTML('

    dfsdfsdfeeesdf

    '); + equals(node.innerText(),'dfsdfsdfeeesdf','获取标签中纯文本'); +}); + +test( 'getData', function() { + var tmp = new UE.uNode.createElement('div'); + equals(tmp.getData(),'','element元素'); + var tmp = new UE.uNode.createText('askdj'); + equals(tmp.getData(),"askdj",'其他类型'); +}); + +test( 'appendChild && insertBefore', function() { + var uNode = UE.uNode; + var node = uNode.createElement('
    sdfadf
    '); node.innerHTML('

    '); - equals(node.innerHTML().replace(/[ ]+>/g,'>'),'

    '); + equals(node.innerHTML().replace(/[ ]+>/g,'>'),'

    ','补全html标签'); var tmp = uNode.createElement('div'); node.appendChild(tmp); - equals(node.innerHTML().replace(/[ ]+>/g,'>'),'

    '); + equals(node.innerHTML().replace(/[ ]+>/g,'>'),'

    ','appendChild'); node.insertBefore(tmp,node.firstChild()); - equals(node.innerHTML().replace(/[ ]+>/g,'>'),'

    '); + equals(node.innerHTML().replace(/[ ]+>/g,'>'),'

    ','insertBefore'); node.appendChild(tmp); - equals(node.innerHTML().replace(/[ ]+>/g,'>'),'

    '); - tmp = uNode.createElement('p'); + equals(node.innerHTML().replace(/[ ]+>/g,'>'),'

    ','appendChild'); +}); + +test( 'replaceChild && setAttr', function() { + var uNode = UE.uNode; + var node = uNode.createElement('
    sdfadf
    '); + node.innerHTML('

    '); + var tmp = uNode.createElement('p'); tmp.setAttr({'class':'test','id':'aa'}); node.insertBefore(tmp,node.lastChild()); - equals(node.innerHTML().replace(/[ ]+>/g,'>'),'

    '); + equals(node.innerHTML().replace(/[ ]+>/g,'>'),'

    ','setAttr不为空'); node.replaceChild(uNode.createElement('div'),tmp); - equals(node.innerHTML().replace(/[ ]+>/g,'>'),'

    '); - node.innerHTML('

    dfsdfsdfeeesdf

    '); - equals(node.innerText(),'dfsdfsdfeeesdf'); - node.innerHTML('
    '); - nodelist =node.getNodesByTagName('div'); - equals(nodelist.length,3); - for(var i= 0,ci;ci=nodelist[i++];){ - ci.tagName = 'p'; - } - equals(node.innerHTML(),'

    '); + equals(node.innerHTML().replace(/[ ]+>/g,'>'),'

    ','replaceChild'); + + node.removeChild(node.lastChild(),true); + tmp = uNode.createElement('p'); + tmp.setAttr(); + node.insertAfter(tmp,node.lastChild()); + equals(node.innerHTML().replace(/[ ]+>/g,'>'),'

    ','setAttr为空'); + node.innerHTML('

    '); + var tmp = uNode.createElement('div'); + node.appendChild(tmp); + node.replaceChild(node.firstChild(),tmp); + equals(node.innerHTML().replace(/[ ]+>/g,'>'),'

    ','replaceChild'); +}); + +test( 'insertAfter', function() { + var uNode = UE.uNode; + var node = uNode.createElement('
    sdfadf
    '); + node.innerHTML('

    '); + var tmp = uNode.createElement('div'); + node.appendChild(tmp); + node.insertAfter(tmp,node.firstChild()); + equals(node.innerHTML().replace(/[ ]+>/g,'>'),'

    ','在第一个子节点后插入'); +}); + +test( 'getStyle', function() { + var uNode = UE.uNode; + var node = uNode.createElement('div'); + node.innerHTML('
    '); + node = node.firstChild(); + equals(node.getStyle(''),'','空cssStyle'); node.innerHTML('
    '); node = node.firstChild(); - equals(node.getStyle('border'),'1px solid #ccc'); + equals(node.getStyle('border'),'1px solid #ccc','有border,取border样式'); + node.innerHTML('
    '); + node = node.firstChild(); + equals(node.getStyle('color'),'','无color样式,取color样式'); + node.innerHTML('
    '); + node = node.firstChild(); + equals(node.getStyle('border'),'1px solid #ccc','有2个样式,取其一'); +}); + +test( 'setStyle', function() { + var uNode = UE.uNode; + var node = uNode.createElement('div'); node.innerHTML('
    '); node = node.firstChild(); - equals(node.getStyle('border'),'1px solid #ccc'); node.setStyle('border','2px solid #ccc'); - equals(node.getAttr('style'),'border:2px solid #ccc;color:#ccc'); + equals(node.getAttr('style'),'border:2px solid #ccc;color:#ccc','修改样式中的一个'); node.setStyle({ 'font':'12px', 'background':'#ccc' }); - equals(node.getAttr('style'),'background:#ccc;font:12px;border:2px solid #ccc;color:#ccc'); + equals(node.getAttr('style'),'background:#ccc;font:12px;border:2px solid #ccc;color:#ccc','添加新样式'); node.setStyle({ 'font':'', 'background':'', 'border':'', 'color':'' }); - equals(node.getAttr('style'),undefined); + equals(node.getAttr('style'),undefined,'清空样式'); node.setStyle('border',''); + equals(node.getAttr('style'),"border:<script>alert("")</script>;",'脚本'); + equals(node.toHtml(),'
    ','脚本转html'); + node.innerHTML('
    asdfasdfsdf
    '); + node.removeChild(node.firstChild(),true); + equals(node.toHtml(),'
    asdfasdfsdf
    ','移除子节点'); +}); - equals(node.getAttr('style'),"border:<script>alert("")</script>;"); - - equals(node.toHtml(),'
    ') +test( 'getIndex', function() { + var uNode = UE.uNode; + var node = uNode.createElement('div'); node.innerHTML('
    asdfasdfsdf
    ') node.removeChild(node.firstChild(),true); - equals(node.toHtml(),'
    asdfasdfsdf
    ') var tmp = new UE.uNode.createElement('div'); node.appendChild(tmp); - equals(tmp.getIndex(),2) - - + equals(tmp.getIndex(),2,'节点索引'); }); \ No newline at end of file diff --git a/_test/plugins/anchor.js b/_test/plugins/anchor.js index 47e6622b2fab61cf503564373b77fab9aa6b3700..a01a7c5b622333fb6dc7259d4cf1f194146a5f7f 100644 --- a/_test/plugins/anchor.js +++ b/_test/plugins/anchor.js @@ -5,17 +5,14 @@ test( '插入锚点后切换源码', function() { var range = te.obj[1]; var body = editor.body; stop(); - //1.2版本,ie中‘’-〉' ' - var br = baidu.editor.browser.ie ? ' ' : '
    '; + var br = baidu.editor.browser.ie ? ' ' : '
    '; //1.2版本,ie中‘’-〉' ' setTimeout( function() { editor.setContent( '

    ' + br + '

    ' ); range.setStart( body.firstChild, 0 ).collapse( 1 ).select(); editor.execCommand( 'anchor', 'hello' ); -//1.2版本后,在img前有的不可见字符没有删去,这里改成之比较img内的内容 -// ua.checkHTMLSameStyle( '' + br, editor.document, body.firstChild, '检查锚点html' ); + ua.checkHTMLSameStyle( '' + br, editor.document, body.firstChild, '检查锚点html' ); //1.2版本后,在img前有的不可见字符没有删去,这里改成之比较img内的内容 ok(body.getElementsByTagName('img')[0].attributes['anchorname'].nodeValue=="hello"&&body.getElementsByTagName('img')[0].attributes['class'].nodeValue=="anchorclass",'检查锚点'); - editor.execCommand( 'source' ); - /*切到源码模式下会有一个超时*/ + editor.execCommand( 'source' ); /*切到源码模式下会有一个超时*/ setTimeout( function() { var tas = editor.iframe.parentNode.getElementsByTagName( 'textarea' ); ok( tas[0].value.indexOf( '', editor.document, body.firstChild, '检查锚点html' ); -// /*这种情况不应当转换为锚点*/ -// editor.execCommand( 'source' ); -// setTimeout( function() { -//// ta = editor.iframe.parentNode.getElementsByTagName( 'textarea' )[0]; -// editor.iframe.parentNode.getElementsByTagName( 'textarea' )[0].value = '

    你好

    '; -// setTimeout( function() { -// editor.execCommand( 'source' ); -// equal( body.firstChild.firstChild.tagName.toLowerCase(), 'a', 'a标签不会转化' ); -// /*用例结束前等一下,因为还有个超时操作会获取窗口*/ -// setTimeout( function() { -// start(); -// }, 50 ); -// }, 50 ); -// }, 50 ); -// }, 20 ); -// }, 10 ); -// }, 20 ); -//} ); + test( '在源码模式设置超链接的name属性,切换到编辑器模式检查超链接是否变为锚点', function() { var editor = te.obj[0]; var body = editor.body; stop(); setTimeout(function(){ editor.setContent( '' ); - /*切到源码模式下会有一个超时*/ setTimeout( function() { editor.execCommand( 'source' ); setTimeout( function() { var ta = editor.iframe.parentNode.getElementsByTagName( 'textarea' )[0]; - /*这种情况认为是锚点*/ - ta.value = '

    '; + ta.value = '

    '; /*这种情况认为是锚点*/ setTimeout( function() { editor.execCommand( 'source' ); ua.checkHTMLSameStyle( '', editor.document, body.firstChild, '检查锚点html' ); @@ -88,22 +48,20 @@ test( '在源码模式设置超链接的name属性,切换到编辑器模式检 },100); } ); + test( '在源码模式设置超链接没有name属性,切换到编辑器模式检查超链接不变为锚点', function() { var editor = te.obj[0]; editor.setContent( '' ); var body = editor.body; stop(); - /*切到源码模式下会有一个超时*/ setTimeout( function() { editor.execCommand( 'source' ); setTimeout( function() { var ta = editor.iframe.parentNode.getElementsByTagName( 'textarea' )[0]; - ta.value = '

    你好

    '; + ta.value = '

    你好

    '; setTimeout( function() { - editor.execCommand( 'source' ); ua.manualDeleteFillData(editor.body); - equal( body.firstChild.firstChild.tagName.toLowerCase(), 'a', 'a标签不会转化' ); start(); }, 50 ); @@ -120,7 +78,6 @@ test( '已存在锚点', function() { range.selectNode(body.firstChild).select(); editor.execCommand( 'anchor', 'hello' ); var name=body.firstChild.firstChild.getAttribute('anchorname'); -// equal(ua.getChildHTML(editor.body),'

    ','更改name'); equal(name, 'hello', '更改name'); editor.setContent( '

    ' ); range.selectNode(body.firstChild).select(); diff --git a/_test/plugins/defaultfilter.js b/_test/plugins/defaultfilter.js new file mode 100644 index 0000000000000000000000000000000000000000..8737238c13d3d2e4b6545d39a8a79fe32c18629c --- /dev/null +++ b/_test/plugins/defaultfilter.js @@ -0,0 +1,89 @@ +/** + * Created by JetBrains PhpStorm. + * User: dongyancen + * Date: 13-2-28 + * Time: 下午3:20 + * To change this template use File | Settings | File Templates. + */ +module( 'plugins.defaultfilter' ); + +//TODO 现在在过滤机制里面去除无用的标签 +test( "getContent--去除无用的空标签:autoClearEmptyNode==true", function() { + var editor = new UE.Editor({autoClearEmptyNode:true,'autoFloatEnabled':false}); + stop(); + setTimeout(function(){ + var div = document.body.appendChild(document.createElement('div')); + editor.render(div); + te.dom.push(div); + editor.focus(); + var innerHTML = 'xxem
    xxxx
    '; + editor.setContent( innerHTML ); + editor.execCommand('source'); + editor.execCommand('source'); + equal( editor.getContent(), '

    xxem

    xxxx
    ', "span style空,套空的em和不空的em" ); + //style="color:#c4bd97;" + innerHTML = 'xxem'; + editor.setContent( innerHTML ); + if(ua.browser.ie ==9){ + equal( editor.getContent().toLowerCase(), '

    xxem

    ', "span style不空,套空的em和不空的em" ); + } + else{ + equal( editor.getContent().toLowerCase(), '

    xxem

    ', "span style不空,套空的em和不空的em" ); + } + innerHTML = 'xxem'; + editor.setContent( innerHTML ); + /*inline标签上只要有属性就不清理*/ + if(ua.browser.ie ==9){ + equal( editor.getContent().toLowerCase(), '

    xxem

    ', "span 有style但内容为空" ); + } + else{ + equal( editor.getContent().toLowerCase(), '

    xxem

    ', "span 有style但内容为空" ); + } + innerHTML = 'asdfxxem'; + editor.setContent( innerHTML ); + if(ua.browser.ie ==9){ + equal( editor.getContent().toLowerCase(), '

    asdfxxem

    ', "span 有style内容不空" ); + } + else{ + equal( editor.getContent().toLowerCase(), '

    asdfxxem

    ', "span 有style内容不空" ); + } + innerHTML = 'axxem'; + editor.setContent( innerHTML ); + equal( editor.getContent(), '

    axxem

    ', "a 有href但内容为空,不过滤a标签" ); + start() + },100); +} ); +//editor.options.autoClearEmptyNode +test("getContent--不去除无用的空标签:autoClearEmptyNode==false", function() { + var editor = new UE.Editor({autoClearEmptyNode:false,'autoFloatEnabled':false}); + stop(); + setTimeout(function(){ + var div = document.body.appendChild(document.createElement('div')); + editor.render(div); + te.dom.push(div); + editor.focus(); + var innerHTML = 'xxem'; + editor.setContent(innerHTML); + equal(editor.getContent().toLowerCase(), '

    xxem

    ', "span style空,套空的em和不空的em"); + innerHTML = 'xxem'; + editor.setContent(innerHTML); + ua.manualDeleteFillData(editor.body); + if (ua.browser.ie == 9) { + equal(editor.getContent().toLowerCase(), '

    xxem

    ', "span 有style但内容为空"); + } + else { + equal(editor.getContent().toLowerCase(), '

    xxem

    ', "span 有style但内容为空"); + } + start(); + },100); +}); + +test("getContent--转换空格,nbsp与空格相间显示", function() { + var editor = te.obj[1]; + var div = te.dom[0]; + editor.render(div); + editor.focus(); + var innerHTML = '
    x x x    x    
    '; + editor.setContent(innerHTML); + equal(editor.getContent(), '
    x  x   x    x    
    ', "转换空格,nbsp与空格相间显示"); +}); diff --git a/_test/plugins/table.cmds.js b/_test/plugins/table.cmds.js new file mode 100644 index 0000000000000000000000000000000000000000..4e31f6930f3305d50b488bd8d5b46a8b13ffcdb0 --- /dev/null +++ b/_test/plugins/table.cmds.js @@ -0,0 +1,543 @@ +module( 'plugins.table' ); + +/*trace992,合并单元格后多了一个td*/ +test( '向右合并--拆分成列', function() { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent( '

    ' ); + range.setStart( editor.body.firstChild, 0 ).collapse( true ).select(); + editor.execCommand( 'inserttable', {numCols:2,numRows:2} ); + ua.manualDeleteFillData( editor.body ); + + var tds = editor.body.getElementsByTagName( 'td' ); + range.setStart( tds[0], 0 ).collapse( true ).select(); + editor.execCommand( 'mergeright' ); + range.setStart( tds[1], 0 ).collapse( true ).select(); + editor.execCommand( 'mergeright' ); + tds = editor.body.getElementsByTagName( 'td' ); + equal( tds.length, 2, '2个单元格' ); + equal( tds[0].getAttribute( 'colspan' ), 2, '第一行的单元格colspan为2' ); + equal( tds[1].getAttribute( 'colspan' ), 2, '第二行的单元格colspan为2' ); + ua.manualDeleteFillData( editor.body ); + setTimeout( function(){ + editor.execCommand('source'); + start(); + }); + stop(); + tds = editor.body.getElementsByTagName( 'td' ); + equal( tds.length, 2, '2个单元格' ); + equal( tds[0].getAttribute( 'colspan' ), 2, '切换到源码后第一个的单元格colspan' ); + equal( tds[1].getAttribute( 'colspan' ), 2, '切换到源码后第二行第一个的单元格colspan' ); + + range.setStart( tds[0], 0 ).collapse( true ).select(); + editor.execCommand('splittocols'); + equal( tds[0].getAttribute( 'colspan' ), 1, '拆分--[0][0]单元格colspan' ); + equal( tds[0].rowSpan, 1, '拆分--[0][0]单元格rowspan' ); +} ); + +test('向下合并-拆分成行',function(){ + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent( '

    ' ); + range.setStart( editor.body.firstChild, 0 ).collapse( true ).select(); + editor.execCommand( 'inserttable', {numCols:2,numRows:2} ); + ua.manualDeleteFillData( editor.body ); + var tds = editor.body.getElementsByTagName( 'td' ); + + range.setStart( tds[0], 0 ).collapse( true ).select(); + editor.execCommand( 'mergedown' ); + range.setStart( tds[1], 0 ).collapse( true ).select(); + editor.execCommand( 'mergedown' ); + tds = editor.body.getElementsByTagName( 'td' ); + equal( tds.length, 2, '2个单元格' ); + equal( tds[0].getAttribute( 'rowspan' ), 2, '合并--[0][0]单元格rowspan' ); + equal( tds[1].getAttribute( 'rowspan' ), 2, '合并--[0][1]单元格rowspan' ); + + range.setStart( tds[0], 0 ).collapse( true ).select(); + editor.execCommand('splittorows'); + range.setStart( tds[1], 0 ).collapse( true ).select(); + editor.execCommand('splittorows'); + equal( tds[0].colSpan, 1, '拆分--[0][0]单元格colspan' ); + equal( tds[0].getAttribute( 'rowspan' ), 1, '拆分--[0][0]单元格rowspan' ); +}); + +test('完全拆分单元格',function(){ + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent( '

    ' ); + range.setStart( editor.body.firstChild, 0 ).collapse( true ).select(); + editor.execCommand( 'inserttable', {numCols:3,numRows:3} ); + ua.manualDeleteFillData( editor.body ); + + setTimeout(function(){ + var trs = editor.body.firstChild.getElementsByTagName( 'tr' ); + var ut = editor.getUETable(editor.body.firstChild); + var cellsRange = ut.getCellsRange(trs[0].cells[0],trs[1].cells[1]); + ut.setSelected(cellsRange); + range.setStart( trs[0].cells[0], 0 ).collapse( true ).select(); + + editor.execCommand( 'mergecells' ); + ut.clearSelected(); + var tds = editor.body.getElementsByTagName( 'td' ); + equal( tds.length, 6, '单元格数' ); + equal( tds[0].getAttribute( 'colspan' ), 2, '合并--[0][0]单元格colspan' ); + equal( tds[0].getAttribute( 'rowspan' ), 2, '合并--[0][0]单元格rowspan' ); + + editor.execCommand('splittoCells'); + equal( tds.length, 9, '单元格数' ); + equal( tds[0].getAttribute( 'colspan' ), 1, '拆分--[0][0]单元格colspan' ); + equal( tds[0].getAttribute( 'rowspan' ), 1, '拆分--[0][0]单元格rowspan' ); + equal( tds[1].colSpan, 1, '拆分--[0][1]单元格colspan' ); + equal( tds[1].getAttribute( 'rowspan' ), 1, '拆分--[0][1]单元格rowspan' ); + + editor.undoManger.undo(); + equal( tds[0].getAttribute( 'colspan' ), 2, '撤销--[0][0]单元格colspan' ); + equal( tds[0].getAttribute( 'rowspan' ), 2, '撤销--[0][0]单元格rowspan' ); + start(); + },50); + stop(); +}); + +test('删除table',function(){ + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent( '

    ' ); + range.setStart( editor.body.firstChild, 0 ).collapse( true ).select(); + editor.execCommand( 'inserttable'); + ua.manualDeleteFillData(editor.body); + equal(editor.queryCommandState('deletetable'),-1,'删除按钮灰色'); + + var tds = editor.body.getElementsByTagName( 'td' ); + range.setStart( tds[0], 0 ).collapse( true ).select(); +// setTimeout(function(){ editor.execCommand( 'deletetable' ); +// },1000); +// +// ua.manualDeleteFillData(editor.body); +// var table=editor.body.getElementsByTagName('table')[0]; +// equal(table,undefined,'删除成功'); +}); +// +//test('修改table屬性',function(){ +// var editor = te.obj[0]; +// var range = te.obj[1]; +// editor.setContent( '

    ' ); +// range.setStart( editor.body.firstChild, 0 ).collapse( true ).select(); +// editor.execCommand( 'inserttable', {numCols:2,numRows:3,align:'center'} ); +// var table = editor.body.getElementsByTagName('table')[0]; +// var align = table.getAttribute('align'); +//// var cla = table.getAttribute('class'); +// equal(align,'center','对齐方式居中'); +//// equal(cla,' noBorderTable','无边框'); +// var tds = editor.body.getElementsByTagName( 'td' ); +// range.setStart( tds[0], 0 ).collapse( true ).select(); +// editor.execCommand('edittable',{align:'right'}); +// ua.manualDeleteFillData(editor.body); +// table = editor.body.getElementsByTagName('table')[0]; +// align = table.getAttribute('align'); +// equal(align,'right','对齐方式:向右'); +// equal(editor.queryCommandState('edittable'),0,'state'); +//}); +// +//test('修改单元格',function(){ +// var editor=te.obj[0]; +// var range=te.obj[1]; +// editor.setContent('

    '); +// range.setStart(editor.body.firstChild,0).collapse(true).select(); +// editor.execCommand('inserttable'); +// var tds = editor.body.firstChild.getElementsByTagName('td'); +// editor.currentSelectedArr.push(tds[1]); +// +// editor.execCommand('edittd',{bgColor:'#9bbb59',align:'center'}); +// var td = editor.body.firstChild.getElementsByTagName('td')[1]; +// var bg = td.getAttribute('bgColor'); +// var align = td.getAttribute('align'); +// equal(bg,'#9bbb59','背景颜色'); +// equal(align,'center','水平居中'); +// equal(editor.queryCommandState('edittd'),0,'state'); +//}); + +test('表格前插行',function(){ + var editor=te.obj[0]; + var range=te.obj[1]; + editor.setContent('

    '); + range.setStart(editor.body.firstChild,0).collapse(true).select(); + editor.execCommand('inserttable'); + var tds = editor.body.firstChild.getElementsByTagName('td'); + range.setStart(tds[1],0).collapse(true).select(); + + editor.execCommand('insertparagraphbeforetable'); + ua.manualDeleteFillData(editor.body); + var br=ua.browser.ie?'':'
    '; + equal(editor.body.firstChild.innerHTML,br,'表格前插行'); +}); + +test('插入行',function(){ + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent( '

    ' ); + range.setStart( editor.body.firstChild, 0 ).collapse( true ).select(); + editor.execCommand( 'inserttable', {numCols:3,numRows:3} ); + ua.manualDeleteFillData( editor.body ); + var tds = editor.body.getElementsByTagName( 'td' ); + range.setStart( tds[0], 0 ).collapse( true ).select(); + editor.execCommand( 'mergedown' ); + range.setStart( tds[4], 0 ).collapse( true ).select(); + editor.execCommand('insertrow'); + tds = editor.body.getElementsByTagName( 'td' ); + equal( tds[0].getAttribute('rowspan'), 3, '[0][0]单元格rowspan'); + editor.undoManger.undo(); + equal( tds[0].getAttribute('rowspan'), 2, '[0][0]单元格rowspan'); +}); + +test('插入列',function(){ + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent( '

    ' ); + range.setStart( editor.body.firstChild, 0 ).collapse( true ).select(); + editor.execCommand( 'inserttable', {numCols:3,numRows:3} ); + ua.manualDeleteFillData( editor.body ); + var tds = editor.body.getElementsByTagName( 'td' ); + range.setStart( tds[0], 0 ).collapse( true ).select(); + editor.execCommand( 'mergeright' ); + range.setStart( tds[3], 0 ).collapse( true ).select(); + editor.execCommand('insertcol'); + tds = editor.body.getElementsByTagName( 'td' ); + equal( tds[0].getAttribute('colspan'), 3, '[0][0]单元格colspan'); + editor.undoManger.undo(); + equal( tds[0].getAttribute('colspan'), 2, '[0][0]单元格colspan'); +}); + +test('删除行',function(){ + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent( '

    ' ); + range.setStart( editor.body.firstChild, 0 ).collapse( true ).select(); + editor.execCommand( 'inserttable', {numCols:2,numRows:3} ); + var tds = editor.body.getElementsByTagName('td'); + + range.setStart(tds[0],0).collapse(1).select(); + editor.execCommand('deleterow'); + equal(editor.body.getElementsByTagName('tr').length,2,'删除行'); + editor.undoManger.undo(); + equal(editor.body.getElementsByTagName('tr').length,3,'撤销后的行数'); + + range.setStart(tds[5],0).collapse(1).select(); + editor.execCommand('deleterow'); + equal(editor.body.getElementsByTagName('tr').length,2,'删除行'); +}); + +//test('mouse event',function(){ +// var editor=te.obj[0]; +// var range=te.obj[1]; +// editor.setContent('

    '); +// range.setStart(editor.body.firstChild,0).collapse(true).select(); +// editor.execCommand('inserttable'); +// +//// setTimeout(function(){ +// var trs = editor.body.firstChild.getElementsByTagName( 'tr' ); +// var ut = editor.getUETable(editor.body.firstChild); +// var cellsRange = ut.getCellsRange(trs[0].cells[0],trs[2].cells[4]); +// ut.setSelected(cellsRange); +// range.setStart( trs[0].cells[0], 0 ).collapse( true ).select(); +// +// var td=trs[3].getElementsByTagName('td'); +// ua.mousedown(td[0]);//清空选择的单元格 +// equal(ut.selectedTds.length,'0','mouse down--length'); +//// ua.mouseover(td[0]);//选择单元格 +//// ua.mouseover(td[1]); +//// ua.mouseup(td[2]); +//// equal(editor.currentSelectedArr.length,'2','mouse over--length'); +// // editor.currentSelectedArr=[]; +// // range.setStart(td[2],0).setEnd(td[4],0).select(); +// // ua.mouseup(td[3]); +// // range = editor.selection.getRange(); +// // ua.checkResult(range,td[2],td[2],0,0,true,'mouse up --range'); +//// start(); +//// },50); +//// stop(); +//}); + + +/*trace 750,1308*/ +//test( 'trace1308:前插入行的样式和原先不同', function() { +// var editor = te.obj[0]; +// var range = te.obj[1]; +// +///*不能设置content为空,这样插入表格会有问题 +// * 可以尝试手动地在主demo中清空body所有内容后插入表格,ie下面插入表格的菜单是灰的,光标也没有办法定位到表格外面*/ +// +// editor.setContent( '

    ' ); +// range.setStart( editor.body.firstChild, 0 ).collapse( true ).select(); +// editor.execCommand( 'inserttable', {numCols:2,numRows:2} ); +// ua.manualDeleteFillData( editor.body ); +// range.setStartAfter( editor.body.firstChild ).collapse( true ).select(); +// //cellborder:2,不支持了 +// editor.execCommand( 'inserttable', {border:2,numCols:2,numRows:2} ); +// var table2 = editor.body.getElementsByTagName( 'table' )[1]; +// range.setStart( table2.getElementsByTagName( 'td' )[0], 0 ).collapse( true ).select(); +// editor.execCommand( 'insertrow' ); +// var tds = table2.getElementsByTagName( 'td' ); +// +///*firefox下用jquery的方式去不到border-width*/ +// +// for(var index = 0;index

    ' ); + range.setStart( editor.body.firstChild, 0 ).collapse( true ).select(); + editor.execCommand( 'inserttable', {numCols:2,numRows:2} ); + ua.manualDeleteFillData( editor.body ); + var tds = editor.body.getElementsByTagName( 'td' ); + tds[1].innerHTML = 'hello'; + range.setStart( tds[0], 0 ).collapse( true ).select(); + editor.execCommand( 'mergeright' ); + var tr = editor.body.getElementsByTagName( 'tr' )[0]; + equal( $( tr.firstChild ).attr( 'colspan' ), '2', '跨度2列' ); + editor.execCommand( 'splittocols' ); + ua.manualDeleteFillData( editor.body ); + tds = editor.body.getElementsByTagName( 'td' ); + //1.2版本,合并拆分之后hello前多了空的占位符 + ok( tds[0].innerHTML == '

    hello' || tds[0].innerHTML == "​hello", '第一个单元格中有内容' ); + ok( tds[1].innerHTML == '' || tds[1].innerHTML == '
    ', '第二个单元格中有内容' ); +} ); + +/*trace 743*/ +test( '合并单元格后删除列再撤销', function() { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent( '

    ' ); + range.setStart( editor.body.firstChild, 0 ).collapse( true ).select(); + editor.execCommand( 'inserttable', {numCols:4,numRows:4} ); + ua.manualDeleteFillData( editor.body ); + + setTimeout(function(){ + var trs = editor.body.firstChild.getElementsByTagName( 'tr' ); + var ut = editor.getUETable(editor.body.firstChild); + var cellsRange = ut.getCellsRange(trs[0].cells[0],trs[0].cells[3]); + ut.setSelected(cellsRange); + range.setStart( trs[0].cells[0], 0 ).collapse( true ).select(); + + editor.execCommand( 'mergecells' ); + range.setStart( trs[0].cells[0], 0 ).collapse( true ).select(); + editor.execCommand( 'deleterow' ); + trs = editor.body.getElementsByTagName( 'tr' ); + equal( trs.length, 3, '删除后只剩3个tr' ); + editor.undoManger.undo(); + trs = editor.body.getElementsByTagName( 'tr' ); + equal( trs.length, 4, '撤销后有4个tr' ); + equal( $( trs[0].cells[0] ).attr( 'colspan' ), 4, '第一行的第一个单元格colspan为4' ); + start(); + },50); + stop(); +} ); + +/*trace 726*/ +test( '选中合并过的单元格和普通单元格,查看完全拆分单元格菜单是否高亮', function() { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent( '

    ' ); + range.setStart( editor.body.firstChild, 0 ).collapse( true ).select(); + editor.execCommand( 'inserttable', {numCols:4,numRows:4} ); + ua.manualDeleteFillData( editor.body ); + + setTimeout(function(){ + var trs = editor.body.firstChild.getElementsByTagName( 'tr' ); + var ut = editor.getUETable(editor.body.firstChild); + var cellsRange = ut.getCellsRange(trs[0].cells[0],trs[1].cells[1]); + ut.setSelected(cellsRange); + range.setStart( trs[0].cells[0], 0 ).collapse( true ).select(); + + editor.execCommand( 'mergecells' ); + equal( editor.queryCommandState( 'splittocells' ), 0, '应当可以拆分单元格' ); + setTimeout(function(){ + var trs = editor.body.firstChild.getElementsByTagName( 'tr' ); + var ut = editor.getUETable(editor.body.firstChild); + var cellsRange = ut.getCellsRange(trs[0].cells[0],trs[3].cells[3]); + ut.setSelected(cellsRange); + range.setStart( trs[0].cells[0], 0 ).collapse( true ).select(); + editor.queryCommandState( 'splittocells' ); + equal( editor.queryCommandState( 'splittocells' ), -1, '应当不可以拆分单元格' ); + start(); + },50); + },50); + stop(); +} ); + +/*trace 718*/ +test( '2次撤销删除列', function() { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent( '

    ' ); + range.setStart( editor.body.firstChild, 0 ).collapse( true ).select(); + editor.execCommand( 'inserttable', {numCols:4,numRows:4} ); + ua.manualDeleteFillData( editor.body ); + + setTimeout(function(){ + var trs = editor.body.firstChild.getElementsByTagName( 'tr' ); + var ut = editor.getUETable(editor.body.firstChild); + var cellsRange = ut.getCellsRange(trs[1].cells[1],trs[2].cells[2]); + ut.setSelected(cellsRange); + range.setStart( trs[1].cells[1], 0 ).collapse( true ).select(); + + editor.execCommand( 'mergecells' ); + equal( trs[1].cells[1].rowSpan, 2, 'rowspan 为2' ); + equal( trs[1].cells[1].colSpan, 2, 'colspan 为2' ); + editor.execCommand( 'deletecol' ); + equal( trs[1].cells.length, 3, '3个td' ); + editor.undoManger.undo(); + + trs = editor.body.firstChild.getElementsByTagName( 'tr' ); + equal( trs[1].cells.length, 3, '3个td' ); + equal( trs[1].cells[1].rowSpan, 2, 'rowspan 为2' ); + equal( trs[1].cells[1].colSpan, 2, 'colspan 为2' ); + + range.setStart( trs[1].cells[1], 0 ).collapse(1).select(); + editor.execCommand( 'deletecol' ); + equal( trs[1].cells.length, 3, '3个td' ); + equal( trs[1].cells[1].rowSpan, 2, 'rowspan 为2' ); + ok( trs[1].cells[1].colSpan == undefined || trs[1].cells[1].colSpan == 1, 'colspan为1或者undefined' ); + start(); + },50); + stop(); +} ); + +/*trace 713*/ +test( '合并最后一列单元格后再前插入列', function() { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent( '

    ' ); + range.setStart( editor.body.firstChild, 0 ).collapse( true ).select(); + editor.execCommand( 'inserttable', {numCols:3,numRows:3} ); + + setTimeout(function(){ + var trs = editor.body.firstChild.getElementsByTagName( 'tr' ); + var ut = editor.getUETable(editor.body.firstChild); + var cellsRange = ut.getCellsRange(trs[0].cells[2],trs[2].cells[2]); /*合并最后一列的单元格*/ + ut.setSelected(cellsRange); + range.setStart( trs[0].cells[2], 0 ).collapse( true ).select(); + + editor.execCommand( 'mergecells' ); + equal( $( trs[0].cells[2] ).attr( 'rowspan' ), 3, '跨3行' ); + editor.execCommand( 'insertcol' ); /*前插入列*/ + trs = editor.body.getElementsByTagName( 'tr' ); + equal( trs[0].cells.length, 4, '4列' ); + equal( $( trs[0].cells[3] ).attr( 'rowspan' ), 3, '跨3行' ); + start(); + },50); + stop(); +} ); + +/*trace 1098 */ +test( 'trace 1098:多次合并单元格偶切换到源码再切回来', function() { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent( '

    ' ); + range.setStart( editor.body.firstChild, 0 ).collapse( true ).select(); + editor.execCommand( 'inserttable', {numCols:3,numRows:3} ); + + setTimeout(function(){ + var trs = editor.body.firstChild.getElementsByTagName( 'tr' ); + var ut = editor.getUETable(editor.body.firstChild); + var cellsRange = ut.getCellsRange(trs[0].cells[0],trs[2].cells[0]); + ut.setSelected(cellsRange); + range.setStart( trs[0].cells[0], 0 ).collapse( true ).select(); + editor.execCommand( 'mergecells' ); + + setTimeout(function(){ + trs = editor.body.firstChild.getElementsByTagName( 'tr' ); + ut = editor.getUETable(editor.body.firstChild); + cellsRange = ut.getCellsRange(trs[0].cells[1],trs[2].cells[0]); + ut.setSelected(cellsRange); + range.setStart( trs[0].cells[1], 0 ).collapse( true ).select(); + editor.execCommand( 'mergecells' ); + + setTimeout( function() { + trs = editor.body.firstChild.getElementsByTagName( 'tr' ); + ut = editor.getUETable(editor.body.firstChild); + cellsRange = ut.getCellsRange(trs[0].cells[2],trs[1].cells[0]); + ut.setSelected(cellsRange); + range.setStart( trs[0].cells[2], 0 ).collapse( true ).select(); + editor.execCommand( 'mergecells' ); + editor.execCommand( 'source' ); + editor.execCommand( 'source' ); + + equal( trs.length, 3, '3个tr' ); + equal( trs[0].cells[0].rowSpan, 3, '第一个单元格rowspan 3' ); + equal( trs[0].cells[1].rowSpan, 3, '第二个单元格rowspan 3' ); + equal( trs[0].cells.length, 3, '3个td' ); + equal( trs[1].cells.length, 0, '0个td' ); + equal( trs[2].cells.length, 1, '1个td' ); + start(); + }, 50 ); + },50); + },50); + stop(); +} ); + +/*trace 1307*/ +test( 'trace 1307:adjustTable--多次合并单元格切换到源码再切回来--选中单元格浏览器会假死', function() { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent( '

    ' ); + range.setStart( editor.body.firstChild, 0 ).collapse( true ).select(); + editor.execCommand( 'inserttable', {numCols:4,numRows:4} ); + + setTimeout(function(){ + var trs = editor.body.firstChild.getElementsByTagName( 'tr' ); + var ut = editor.getUETable(editor.body.firstChild); + var cellsRange = ut.getCellsRange(trs[1].cells[0],trs[3].cells[1]); + ut.setSelected(cellsRange); + range.setStart( trs[1].cells[0], 0 ).collapse( true ).select(); + + editor.execCommand( 'mergecells' ); + setTimeout(function(){ + var trs = editor.body.firstChild.getElementsByTagName( 'tr' ); + var ut = editor.getUETable(editor.body.firstChild); + var cellsRange = ut.getCellsRange(trs[0].cells[2],trs[2].cells[0]); + ut.setSelected(cellsRange); + range.setStart( trs[0].cells[2], 0 ).collapse( true ).select(); + editor.execCommand( 'mergecells' ); + editor.execCommand( 'source' ); + editor.execCommand( 'source' ); + + trs = editor.body.getElementsByTagName( 'tr' ); + equal( trs[1].rowIndex, 1, '(1,1)行索引' ); + equal( trs[1].cells[0].cellIndex, 0, '(1,0)列索引' ); + equal( trs[1].cells[1].cellIndex, 1, '(1,1)列索引' ); + + equal( trs[2].rowIndex, 2, '(2,2)行索引' ); + equal( trs[2].cells[0].cellIndex, 0, '(2,0)列索引' ); + + equal( trs[1].cells[0].rowSpan, 3, '第二行第一个单元格rowspan 3' ); + equal( trs[1].cells[0].colSpan, 2, '第二行第一个单元格colspan 2' ); + equal( trs[0].cells[2].rowSpan, 3, '第一行第三个单元格rowspan 3' ); + equal( trs.length, 4, '4个tr' ); + equal( trs[0].cells.length, 4, '4个td' ); + equal( trs[1].cells.length, 2, '2个td' ); + equal( trs[2].cells.length, 1, '1个td' ); + equal( trs[3].cells.length, 2, '2个td' ); + start(); + },50); + },50); + stop(); +} ); +///*trace 2378*/ +//test('不覆盖原来的class',function(){ +// var editor = te.obj[0]; +// editor.setContent('
    '); +// editor.execCommand('source'); +// editor.execCommand('source'); +// var table = editor.body.getElementsByTagName('table'); +// equal($(table).attr('class'),'asdf noBorderTable','table的class'); +//}); diff --git a/_test/plugins/table.core.js b/_test/plugins/table.core.js index 0cb7e7f600aa7283f6212a6a14a8c2acd8a9944f..c139827089732db15831c3e776240771ba067922 100644 --- a/_test/plugins/table.core.js +++ b/_test/plugins/table.core.js @@ -12,26 +12,39 @@ function getTable(str) { div.id = "testTable"; document.body.appendChild(div); } - div.innerHTML = "" + str + "
    "; + div.innerHTML = "" + str + "
    "; return div.firstChild; } +UT = UE.UETable; test("create UETable",function(){ var table = getTable("ddd"), - ut = new UE.UETable(table); + ut = new UT(table); ok(ut.table === table,"UT对象创建成功"); - equal(ut.colsNum,1,"单元格列数为1"); - equal(ut.rowsNum,1,"单元格行数为1"); + ok(ut.colsNum == 1 && ut.rowsNum == 1,"单元格行、列数为1"); }); test("getMaxRows",function(){ var table = getTable("123" + "123"), - ut = new UE.UETable(table); + ut = new UT(table); var maxRows = ut.getMaxRows(); equal(maxRows,2,"最大行数为2"); - - table = getTable("123" + + table = getTable("123" + "2"); + ut = new UT(table); + maxRows = ut.getMaxRows(); + equal(maxRows,3,"最大行数为3"); +}); +test("getMaxCols",function(){ + var table = getTable("123" + + "123"), + ut = new UT(table); + var maxCols = ut.getMaxCols(); + equal(maxCols,3,"最大列数为3"); - + table = getTable("123" + + "2"); + ut = new UT(table); + maxCols = ut.getMaxCols(); + equal(maxCols,6,"最大列数为6"); }); \ No newline at end of file diff --git a/_test/plugins/table.js b/_test/plugins/table.js deleted file mode 100644 index ec359196ea3b8f2df5185847f0db667a035ef3b0..0000000000000000000000000000000000000000 --- a/_test/plugins/table.js +++ /dev/null @@ -1,501 +0,0 @@ -module( 'plugins.table' ); -// -///*trace992,合并单元格后多了一个td*/ -test( '向右合并--拆分成列', function() { -// var editor = te.obj[0]; -// var range = te.obj[1]; -// editor.setContent( '

    ' ); -// range.setStart( editor.body.firstChild, 0 ).collapse( true ).select(); -// editor.execCommand( 'inserttable', {numCols:2,numRows:2} ); -// ua.manualDeleteFillData( editor.body ); -// -// var tds = editor.body.getElementsByTagName( 'td' ); -// range.setStart( tds[0], 0 ).collapse( true ).select(); -// editor.execCommand( 'mergeright' ); -// range.setStart( tds[2], 0 ).collapse( true ).select(); -// editor.execCommand( 'mergeright' ); -// tds = editor.body.getElementsByTagName( 'td' ); -// equal( tds.length, 4, '4个单元格' ); -// equal( tds[0].getAttribute( 'colspan' ), 2, '第一行的单元格colspan为2' ); -// equal( $( tds[1] ).css( 'display' ), 'none', '第一行第二个单元格隐藏了' ); -// equal( tds[2].getAttribute( 'colspan' ), 2, '第二行的单元格colspan为2' ); -// ua.manualDeleteFillData( editor.body ); -// setTimeout( function(){ -// editor.execCommand('source'); -// start(); -// }); -// stop(); -// tds = editor.body.getElementsByTagName( 'td' ); -// equal( tds.length, 4, '4个单元格' ); -// equal( tds[0].getAttribute( 'colspan' ), 2, '切换到源码后第一个的单元格colspan' ); -// equal( tds[2].getAttribute( 'colspan' ), 2, '切换到源码后第二行第一个的单元格colspan' ); -// -// range.setStart( tds[0], 0 ).collapse( true ).select(); -// editor.execCommand('splittocols'); -// equal( tds[0].getAttribute( 'colspan' ), 1, '拆分--[0][0]单元格colspan' ); -// equal( tds[0].getAttribute( 'rowspan' ), 1, '拆分--[0][0]单元格rowspan' ); -} ); -// -//test('向下合并-拆分成行',function(){ -// var editor = te.obj[0]; -// var range = te.obj[1]; -// editor.setContent( '

    ' ); -// range.setStart( editor.body.firstChild, 0 ).collapse( true ).select(); -// editor.execCommand( 'inserttable', {numCols:2,numRows:2} ); -// ua.manualDeleteFillData( editor.body ); -// var tds = editor.body.getElementsByTagName( 'td' ); -// -// range.setStart( tds[0], 0 ).collapse( true ).select(); -// editor.execCommand( 'mergedown' ); -// range.setStart( tds[1], 0 ).collapse( true ).select(); -// editor.execCommand( 'mergedown' ); -// tds = editor.body.getElementsByTagName( 'td' ); -// equal( tds.length, 4, '4个单元格' ); -// equal( tds[0].getAttribute( 'rowspan' ), 2, '合并--[0][0]单元格rowspan' ); -// equal( $( tds[2] ).css( 'display' ), 'none', '合并--[1][0]单元格隐藏了' ); -// equal( tds[1].getAttribute( 'rowspan' ), 2, '合并--[0][1]单元格rowspan' ); -// -// range.setStart( tds[0], 0 ).collapse( true ).select(); -// editor.execCommand('splittorows'); -// range.setStart( tds[1], 0 ).collapse( true ).select(); -// editor.execCommand('splittorows'); -// equal( tds[0].getAttribute( 'colspan' ), 1, '拆分--[0][0]单元格colspan' ); -// equal( tds[0].getAttribute( 'rowspan' ), 1, '拆分--[0][0]单元格rowspan' ); -//}) -// -//test('完全拆分单元格',function(){ -// var editor = te.obj[0]; -// var range = te.obj[1]; -// editor.setContent( '

    ' ); -// range.setStart( editor.body.firstChild, 0 ).collapse( true ).select(); -// editor.execCommand( 'inserttable', {numCols:3,numRows:3} ); -// ua.manualDeleteFillData( editor.body ); -// var tds = editor.body.getElementsByTagName( 'td' ); -// editor.currentSelectedArr=[tds[0],tds[1],tds[3],tds[4]]; -// -// editor.execCommand( 'mergeCells' ); -// equal( tds.length, 9, '单元格数' ); -// equal( tds[0].getAttribute( 'colspan' ), 2, '合并--[0][0]单元格colspan' ); -// equal( tds[0].getAttribute( 'rowspan' ), 2, '合并--[0][0]单元格rowspan' ); -// -// editor.execCommand('splittoCells'); -// equal( tds.length, 9, '单元格数' ); -// equal( tds[0].getAttribute( 'colspan' ), 1, '拆分--[0][0]单元格colspan' ); -// equal( tds[0].getAttribute( 'rowspan' ), 1, '拆分--[0][0]单元格rowspan' ); -// equal( tds[1].getAttribute( 'colspan' ), 1, '拆分--[0][1]单元格colspan' ); -// equal( tds[1].getAttribute( 'rowspan' ), 1, '拆分--[0][1]单元格rowspan' ); -// -// editor.undoManger.undo(); -// equal( tds[0].getAttribute( 'colspan' ), 2, '撤销--[0][0]单元格colspan' ); -// equal( tds[0].getAttribute( 'rowspan' ), 2, '撤销--[0][0]单元格rowspan' ); -//}) -// -//test('删除table',function(){ -// var editor = te.obj[0]; -// var range = te.obj[1]; -// editor.setContent( '

    ' ); -// range.setStart( editor.body.firstChild, 0 ).collapse( true ).select(); -// editor.execCommand( 'inserttable'); -// ua.manualDeleteFillData(editor.body); -// equal(editor.queryCommandState('deletetable'),-1,'删除按钮灰色'); -// var trs=editor.body.getElementsByTagName('tr'); -// editor.currentSelectedArr.push(trs[1]); -// -// editor.execCommand('deletetable'); -// ua.manualDeleteFillData(editor.body); -// var table=editor.body.getElementsByTagName('table')[0]; -// equal(table,undefined,'删除成功'); -//}) -// -//test('修改table屬性',function(){ -// var editor = te.obj[0]; -// var range = te.obj[1]; -// editor.setContent( '

    ' ); -// range.setStart( editor.body.firstChild, 0 ).collapse( true ).select(); -// editor.execCommand( 'inserttable', {numCols:2,numRows:3,align:'center'} ); -// var table = editor.body.getElementsByTagName('table')[0]; -// var align = table.getAttribute('align'); -//// var cla = table.getAttribute('class'); -// equal(align,'center','对齐方式居中'); -//// equal(cla,' noBorderTable','无边框'); -// var tds = editor.body.getElementsByTagName( 'td' ); -// range.setStart( tds[0], 0 ).collapse( true ).select(); -// editor.execCommand('edittable',{align:'right'}); -// ua.manualDeleteFillData(editor.body); -// table = editor.body.getElementsByTagName('table')[0]; -// align = table.getAttribute('align'); -// equal(align,'right','对齐方式:向右'); -// equal(editor.queryCommandState('edittable'),0,'state'); -//}); -// -//test('修改单元格',function(){ -// var editor=te.obj[0]; -// var range=te.obj[1]; -// editor.setContent('

    '); -// range.setStart(editor.body.firstChild,0).collapse(true).select(); -// editor.execCommand('inserttable'); -// var tds = editor.body.firstChild.getElementsByTagName('td'); -// editor.currentSelectedArr.push(tds[1]); -// -// editor.execCommand('edittd',{bgColor:'#9bbb59',align:'center'}); -// var td = editor.body.firstChild.getElementsByTagName('td')[1]; -// var bg = td.getAttribute('bgColor'); -// var align = td.getAttribute('align'); -// equal(bg,'#9bbb59','背景颜色'); -// equal(align,'center','水平居中'); -// equal(editor.queryCommandState('edittd'),0,'state'); -//}); -// -//test('表格前插行',function(){ -// var editor=te.obj[0]; -// var range=te.obj[1]; -// editor.setContent('

    '); -// range.setStart(editor.body.firstChild,0).collapse(true).select(); -// editor.execCommand('inserttable'); -// var tds = editor.body.firstChild.getElementsByTagName('td'); -//// editor.currentSelectedArr.push(tds[1]); -// range.setStart(tds[1],0).collapse(true).select(); -// -// editor.execCommand('insertparagraphbeforetable'); -// ua.manualDeleteFillData(editor.body); -// var br=ua.browser.ie?'':'
    '; -// equal(editor.body.firstChild.innerHTML,br,'表格前插行'); -//}); -// -//test('插入行',function(){ -// var editor = te.obj[0]; -// var range = te.obj[1]; -// editor.setContent( '

    ' ); -// range.setStart( editor.body.firstChild, 0 ).collapse( true ).select(); -// editor.execCommand( 'inserttable', {numCols:3,numRows:3} ); -// ua.manualDeleteFillData( editor.body ); -// var tds = editor.body.getElementsByTagName( 'td' ); -// range.setStart( tds[0], 0 ).collapse( true ).select(); -// editor.execCommand( 'mergedown' ); -// range.setStart( tds[4], 0 ).collapse( true ).select(); -// editor.execCommand('insertrow'); -// tds = editor.body.getElementsByTagName( 'td' ); -// equal( tds[0].getAttribute('rowspan'), 3, '[0][0]单元格rowspan'); -// editor.undoManger.undo(); -// equal( tds[0].getAttribute('rowspan'), 2, '[0][0]单元格rowspan'); -//}); -// -//test('插入列',function(){ -// var editor = te.obj[0]; -// var range = te.obj[1]; -// editor.setContent( '

    ' ); -// range.setStart( editor.body.firstChild, 0 ).collapse( true ).select(); -// editor.execCommand( 'inserttable', {numCols:3,numRows:3} ); -// ua.manualDeleteFillData( editor.body ); -// var tds = editor.body.getElementsByTagName( 'td' ); -// range.setStart( tds[0], 0 ).collapse( true ).select(); -// editor.execCommand( 'mergeright' ); -// range.setStart( tds[4], 0 ).collapse( true ).select(); -// editor.execCommand('insertcol'); -// tds = editor.body.getElementsByTagName( 'td' ); -// equal( tds[0].getAttribute('colspan'), 3, '[0][0]单元格colspan'); -// editor.undoManger.undo(); -// equal( tds[0].getAttribute('colspan'), 2, '[0][0]单元格colspan'); -//}); -// -//test('删除行',function(){ -// var editor = te.obj[0]; -// var range = te.obj[1]; -// editor.setContent( '

    ' ); -// range.setStart( editor.body.firstChild, 0 ).collapse( true ).select(); -// editor.execCommand( 'inserttable', {numCols:2,numRows:3} ); -//// var table = editor.body.getElementsByTagName('table')[0]; -// var tds = editor.body.getElementsByTagName('td'); -// -// range.setStart(tds[0],0).collapse(1).select(); -// editor.execCommand('deleterow'); -// equal(editor.body.getElementsByTagName('tr').length,2,'删除行'); -// editor.undoManger.undo(); -// equal(editor.body.getElementsByTagName('tr').length,3,'撤销后的行数'); -// -// range.setStart(tds[5],0).collapse(1).select(); -// editor.execCommand('deleterow'); -// equal(editor.body.getElementsByTagName('tr').length,2,'删除行'); -//}); -// -//test('mouse event',function(){ -// var editor=te.obj[0]; -// var range=te.obj[1]; -// editor.setContent('

    '); -// range.setStart(editor.body.firstChild,0).collapse(true).select(); -// -// editor.execCommand('inserttable'); -// var trs=editor.body.firstChild.getElementsByTagName('tr'); -// editor.currentSelectedArr=[trs[0],trs[1],trs[2]]; -// var td=trs[3].getElementsByTagName('td'); -// ua.mousedown(td[0]);//清空选择的单元格 -// equal(editor.currentSelectedArr.length,'0','mouse down--length'); -// ua.mouseover(td[0]);//选择单元格 -// ua.mouseover(td[1]); -// ua.mouseup(td[2]); -// equal(editor.currentSelectedArr.length,'2','mouse over--length'); -//// editor.currentSelectedArr=[]; -//// range.setStart(td[2],0).setEnd(td[4],0).select(); -//// ua.mouseup(td[3]); -//// range = editor.selection.getRange(); -//// ua.checkResult(range,td[2],td[2],0,0,true,'mouse up --range'); -//}); -// -// -///*trace 750,1308*/ -// -//test( 'trace1308:前插入行的样式和原先不同', function() { -// var editor = te.obj[0]; -// var range = te.obj[1]; -// -///*不能设置content为空,这样插入表格会有问题 -// * 可以尝试手动地在主demo中清空body所有内容后插入表格,ie下面插入表格的菜单是灰的,光标也没有办法定位到表格外面*/ -// -// editor.setContent( '

    ' ); -// range.setStart( editor.body.firstChild, 0 ).collapse( true ).select(); -// editor.execCommand( 'inserttable', {numCols:2,numRows:2} ); -// ua.manualDeleteFillData( editor.body ); -// range.setStartAfter( editor.body.firstChild ).collapse( true ).select(); -// //cellborder:2,不支持了 -// editor.execCommand( 'inserttable', {border:2,numCols:2,numRows:2} ); -// var table2 = editor.body.getElementsByTagName( 'table' )[1]; -// range.setStart( table2.getElementsByTagName( 'td' )[0], 0 ).collapse( true ).select(); -// editor.execCommand( 'insertrow' ); -// var tds = table2.getElementsByTagName( 'td' ); -// -///*firefox下用jquery的方式去不到border-width*/ -// -// for(var index = 0;index

    ' ); -// range.setStart( editor.body.firstChild, 0 ).collapse( true ).select(); -// editor.execCommand( 'inserttable', {numCols:2,numRows:2} ); -// ua.manualDeleteFillData( editor.body ); -// var tds = editor.body.getElementsByTagName( 'td' ); -// tds[1].innerHTML = 'hello'; -// range.setStart( tds[0], 0 ).collapse( true ).select(); -// editor.execCommand( 'mergeright' ); -// var tr = editor.body.getElementsByTagName( 'tr' )[0]; -// equal( $( tr.firstChild ).attr( 'colspan' ), '2', '跨度2列' ); -// editor.execCommand( 'splittocols' ); -// ua.manualDeleteFillData( editor.body ); -// tds = editor.body.getElementsByTagName( 'td' ); -// //1.2版本,合并拆分之后hello前多了空的占位符 -// ok( tds[0].innerHTML == 'hello' || tds[0].innerHTML == "​hello", '第一个单元格中有内容' ); -// ok( tds[1].innerHTML == '' || tds[1].innerHTML == '
    ', '第二个单元格中有内容' ); -//} ); -// -// -///*trace 743*/ -// -//test( '合并单元格后删除列再撤销', function() { -// var editor = te.obj[0]; -// var range = te.obj[1]; -// editor.setContent( '

    ' ); -// range.setStart( editor.body.firstChild, 0 ).collapse( true ).select(); -// editor.execCommand( 'inserttable', {numCols:4,numRows:4} ); -// ua.manualDeleteFillData( editor.body ); -// var trs = editor.body.getElementsByTagName( 'tr' ); -// range.selectNode( trs[0] ).select(); -// -///*range是假选,必须得显式地在数组currentSelectedArr里设置*/ -// -////ie中不允许用Array.prototype.slice.call将NodeList转化为数组 editor.currentSelectedArr = Array.prototype.slice.call( trs[0].children, 0 ); -// for ( var index = 0; index < trs[0].childNodes.length; index++ ) -// editor.currentSelectedArr.push( trs[0].childNodes[index] ); -// editor.execCommand( 'mergecells' ); -// -// range.setStart( trs[0].firstChild, 0 ).collapse( true ).select(); -// editor.currentSelectedArr = [trs[0].firstChild]; -// editor.execCommand( 'deleterow' ); -// trs = editor.body.getElementsByTagName( 'tr' ); -// equal( trs.length, 3, '删除后只剩3个tr' ); -// editor.undoManger.undo(); -// trs = editor.body.getElementsByTagName( 'tr' ); -// equal( trs.length, 4, '撤销后有4个tr' ); -// equal( $( trs[0].firstChild ).attr( 'colspan' ), 4, '第一行的第一个单元格colspan为4' ); -//} ); -// -// -///*trace 726*/ -// -//test( '选中合并过的单元格和普通单元格,查看完全拆分单元格菜单是否高亮', function() { -// var editor = te.obj[0]; -// var range = te.obj[1]; -// editor.setContent( '

    ' ); -// range.setStart( editor.body.firstChild, 0 ).collapse( true ).select(); -// editor.execCommand( 'inserttable', {numCols:4,numRows:4} ); -// ua.manualDeleteFillData( editor.body ); -// var trs = editor.body.getElementsByTagName( 'tr' ); -// range.selectNode( trs[0] ).select(); -// -///*range是假选,必须得显式地在数组currentSelectedArr里设置*/ -// -// for ( var index = 0; index < trs[0].childNodes.length; index++ ) -// editor.currentSelectedArr.push( trs[0].childNodes[index] ); -// editor.execCommand( 'mergecells' ); -// equal( editor.queryCommandState( 'splittocells' ), 0, '应当可以拆分单元格' ); -// range.selectNode( trs[0].parentNode ).select(); -// -///*选中所有的tr*/ -// -// for ( index = 0; index < trs[0].childNodes.length; index++ ) -// editor.currentSelectedArr.push( trs[index] ); -// editor.queryCommandState( 'splittocells' ) -// equal( editor.queryCommandState( 'splittocells' ), -1, '应当不可以拆分单元格' ); -//} ); -// -// -///*trace 718*/ -// -//test( '2次撤销删除列', function() { -// var editor = te.obj[0]; -// var range = te.obj[1]; -// editor.setContent( '

    ' ); -// range.setStart( editor.body.firstChild, 0 ).collapse( true ).select(); -// editor.execCommand( 'inserttable', {numCols:4,numRows:4} ); -// ua.manualDeleteFillData( editor.body ); -// var trs = editor.body.getElementsByTagName( 'tr' ); -// range.setStart( trs[0].firstChild.nextSibling, 0 ).setEnd( trs[1].lastChild.previousSibling, 0 ).select(); -// editor.currentSelectedArr = [trs[0].childNodes[1],trs[0].childNodes[2],trs[1].childNodes[1],trs[1].childNodes[2]]; -// editor.execCommand( 'mergecells' ); -// equal( $( trs[0].childNodes[1] ).attr( 'rowspan' ), 2, 'rowspan 为2' ); -// equal( $( trs[0].childNodes[1] ).attr( 'colspan' ), 2, 'colspan 为2' ); -// editor.execCommand( 'deletecol' ); -// equal( trs[0].childNodes.length, 2, '2个td' ); -// editor.undoManger.undo(); -// trs = editor.body.getElementsByTagName( 'tr' ); -// equal( trs[0].childNodes.length, 4, '4个td' ); -// equal( $( trs[0].childNodes[1] ).attr( 'rowspan' ), 2, 'rowspan 为2' ); -// equal( $( trs[0].childNodes[1] ).attr( 'colspan' ), 2, 'colspan 为2' ); -// range.setStart( trs[0].firstChild.nextSibling, 0 ).collapse(1).select(); -// editor.execCommand( 'deletecol' ); -// equal( trs[0].childNodes.length, 2, '2个td' ); -// equal( $( trs[0].childNodes[1] ).attr( 'rowspan' ), 1, 'rowspan 为1' ); -// ok( $( trs[0].childNodes[1] ).attr( 'colspan' ) == undefined || $( trs[0].childNodes[1] ).attr( 'colspan' ) == 1, 'colspan为1或者undefined' ) -//} ); -// -// -///*trace 713*/ -// -//test( '合并最后一列单元格后再前插入列', function() { -// var editor = te.obj[0]; -// var range = te.obj[1]; -// editor.setContent( '

    ' ); -// range.setStart( editor.body.firstChild, 0 ).collapse( true ).select(); -// editor.execCommand( 'inserttable', {numCols:3,numRows:3} ); -// -// var trs = editor.body.getElementsByTagName( 'tr' ); -// range.setStart( trs[0].children[2], 0 ).setEnd( trs[2].children[2], 0 ).select(); -// editor.currentSelectedArr = [trs[0].children[2],trs[1].children[2],trs[2].children[2]]; -// -///*合并最后一列的单元格*/ -// -// editor.execCommand( 'mergecells' ); -// equal( $( trs[0].childNodes[2] ).attr( 'rowspan' ), 3, '跨3行' ); -// -///*前插入列*/ -// -// editor.execCommand( 'insertcol' ); -// trs = editor.body.getElementsByTagName( 'tr' ); -// equal( trs[0].childNodes.length, 4, '4列' ); -// equal( $( trs[0].childNodes[3] ).attr( 'rowspan' ), 3, '跨3行' ); -//} ); -// -///*trace 1098 */ -// -//test( 'trace 1098:多次合并单元格偶切换到源码再切回来', function() { -// var editor = te.obj[0]; -// var range = te.obj[1]; -// editor.setContent( '

    ' ); -// range.setStart( editor.body.firstChild, 0 ).collapse( true ).select(); -// editor.execCommand( 'inserttable', {numCols:2,numRows:3} ); -// var trs = editor.body.getElementsByTagName( 'tr' ); -////TODO bug一直未修复 -// editor.currentSelectedArr = [trs[0].children[0],trs[1].children[0],trs[2].children[0]]; -//// editor.execCommand( 'mergecells' ); -//// -//// editor.currentSelectedArr = [trs[0].children[1],trs[1].children[1]]; -//// editor.execCommand( 'mergecells' ); -//// editor.execCommand( 'source' ); -//// editor.execCommand( 'source' ); -//// stop(); -//// setTimeout( function() { -// trs = editor.body.getElementsByTagName( 'tr' ); -// -///*bug中切换源码后只剩2个tr了*/ -// -//// equal( trs.length, 3, '3个tr' ); -//// equal( trs[0].childNodes[0].rowspan, 3, '第一个单元格rowspan 3' ); -//// equal( trs[0].childNodes[1].rowspan, 2, '第二个单元格rowspan 3' ); -//// for ( var index = 0; index < trs.length; index++ ) { -//// equal( trs[index].childNodes.length, 3, '3个td' ); -//// } -//// start(); -//// }, 50 ); -//} ); -///*trace 1307*/ -// -//test( 'trace 1307:adjustTable--多次合并单元格切换到源码再切回来--选中单元格浏览器会假死', function() { -// var editor = te.obj[0]; -// var range = te.obj[1]; -// editor.setContent( '

    ' ); -// range.setStart( editor.body.firstChild, 0 ).collapse( true ).select(); -// editor.execCommand( 'inserttable', {numCols:4,numRows:4} ); -// var trs = editor.body.getElementsByTagName( 'tr' ); -// -// editor.currentSelectedArr = [trs[1].children[0],trs[1].children[1],trs[2].children[0],trs[2].children[1],trs[3].children[0],trs[3].children[1]]; -// editor.execCommand( 'mergecells' ); -////TODO 注释不过的用例 -//// editor.currentSelectedArr = [trs[0].children[2],trs[1].children[2],trs[2].children[2]]; -//// editor.execCommand( 'mergecells' ); -//// -//// editor.execCommand( 'source' ); -//// editor.execCommand( 'source' ); -//// trs = editor.body.getElementsByTagName( 'tr' ); -//// */ -///*adjustTable的问题,切换到源码再切换回来后td插入到tr中的位置错了 -//// * 1197行,直接在tr后面append不显示(display=none)的td,而实际上应当将这个td放在倒数第二个位置*/ -// -//// equal( $( trs[1].childNodes[1] ).attr( 'rootRowIndex' ), 1, '(1,1)行索引' ); -//// equal( $( trs[1].childNodes[1] ).attr( 'rootCellIndex' ), 0, '(1,1)列索引' ); -//// -//// equal( $( trs[1].childNodes[2] ).attr( 'rootRowIndex' ), 0, '(1,2)行索引' ); -//// equal( $( trs[1].childNodes[2] ).attr( 'rootCellIndex' ), 2, '(1,2)列索引' ); -//// -//// equal( $( trs[2].childNodes[2] ).attr( 'rootRowIndex' ), 0, '(2,2)行索引' ); -//// equal( $( trs[2].childNodes[2] ).attr( 'rootCellIndex' ), 2, '(2,2)列索引' ); -//// -//// equal( $( trs[2].childNodes[0] ).attr( 'rootRowIndex' ), 1, '(2,0)行索引' ); -//// equal( $( trs[2].childNodes[0] ).attr( 'rootCellIndex' ), 0, '(2,0)列索引' ); -//// -//// equal( trs[1].childNodes[0].rowspan, 3, '第二行第一个单元格rowspan 3' ); -//// equal( trs[1].childNodes[0].colspan, 2, '第二行第一个单元格colspan 2' ); -//// equal( trs[0].childNodes[2].rowspan, 3, '第一行第三个单元格rowspan 3' ); -//// equal( trs.length, 4, '4个tr' ); -//// for ( var index = 0; index < trs.length; index++ ) { -//// equal( trs[index].childNodes.length, 4, '4个td' ); -//// } -// -//} ); -///*trace 2378*/ -//test('不覆盖原来的class',function(){ -// var editor = te.obj[0]; -// editor.setContent('
    '); -// editor.execCommand('source'); -// editor.execCommand('source'); -// var table = editor.body.getElementsByTagName('table'); -// equal($(table).attr('class'),'asdf noBorderTable','table的class'); -//}); diff --git a/_test/tools/br/js/run.js b/_test/tools/br/js/run.js index 1af3b448520fcca4eb49bb1f8a166824689826d4..42cafa8da7bd6fafc03cd5f7f05f6dd84a3b0a80 100644 --- a/_test/tools/br/js/run.js +++ b/_test/tools/br/js/run.js @@ -2,7 +2,7 @@ function run( kiss, runnext ) { window.document.title = kiss; var wb = window.brtest = window.brtest || {}; - wb.timeout = wb.timeout || 30000; + wb.timeout = wb.timeout || 50000; wb.breakOnError = /breakonerror=true/gi.test( location.search ) || $( 'input#id_control_breakonerror' ).attr( 'checked' ); wb.runnext = /batchrun=true/gi.test( location.search ) || runnext diff --git a/dialogs/internal.js b/dialogs/internal.js index d9a59b2a335bd368297fe34e733af44cbfde2426..94f5d9c32e6b8b9902abe7eaf434373dfdb28ca0 100755 --- a/dialogs/internal.js +++ b/dialogs/internal.js @@ -42,11 +42,11 @@ var langImgPath = editor.options.langPath + editor.options.lang + "/images/"; //针对静态资源 - for ( var i in lang.static ) { + for ( var i in lang["static"] ) { var dom = $G( i ); if(!dom) continue; var tagName = dom.tagName, - content = lang.static[i]; + content = lang["static"][i]; if(content.src){ //clone content = utils.extend({},content,false); diff --git a/themes/default/_css/colorpicker.css b/themes/default/_css/colorpicker.css index 2b04a8e46edfe0920c561a587249d05b09a4b1d3..fb6a0922bdbec01f7bf718321038cdbba06eed4e 100755 --- a/themes/default/_css/colorpicker.css +++ b/themes/default/_css/colorpicker.css @@ -40,4 +40,80 @@ width: 14px; height: 14px; margin: 0; +} +.edui-default .edui-colorpicker-advbtn{ + display: block; + text-align: center; + cursor: pointer; + height:20px; +} +.arrow_down{ + background: white url('../images/arrow_down.png') no-repeat center; +} +.arrow_up{ + background: white url('../images/arrow_up.png') no-repeat center; +} +/*高级的样式*/ +.edui-colorpicker-adv{ + position: relative; + overflow: hidden; + height: 180px; + display: none; +} +.edui-colorpicker-plant, .edui-colorpicker-hue { + border: solid 1px #666; +} +.edui-colorpicker-pad { + width: 150px; + height: 150px; + left: 14px; + top: 13px; + position: absolute; + background: red; + overflow: hidden; + cursor: crosshair; +} +.edui-colorpicker-cover{ + position: absolute; + top: 0; + left: 0; + width: 150px; + height: 150px; + background: url("../images/tangram-colorpicker.png") -160px -200px; +} +.edui-colorpicker-padDot{ + position: absolute; + top: 0; + left: 0; + width: 11px; + height: 11px; + overflow: hidden; + background: url(../images/tangram-colorpicker.png) 0px -200px repeat-x; + z-index: 1000; + +} +.edui-colorpicker-sliderMain { + position: absolute; + left: 171px; + top: 13px; + width: 19px; + height: 152px; + background: url(../images/tangram-colorpicker.png) -179px -12px no-repeat; + +} +.edui-colorpicker-slider { + width: 100%; + height: 100%; + cursor: pointer; +} +.edui-colorpicker-thumb{ + position: absolute; + top: 0; + cursor: pointer; + height: 3px; + left: -1px; + right: -1px; + border: 1px solid black; + background: white; + opacity: .8; } \ No newline at end of file diff --git a/themes/default/images/arrow_down.png b/themes/default/images/arrow_down.png new file mode 100644 index 0000000000000000000000000000000000000000..e9257e83b00375259f2f724c7cbac03d0df5ceb2 Binary files /dev/null and b/themes/default/images/arrow_down.png differ diff --git a/themes/default/images/arrow_up.png b/themes/default/images/arrow_up.png new file mode 100644 index 0000000000000000000000000000000000000000..74277af1e6a8ef91f8fe664efde11377a5292dbc Binary files /dev/null and b/themes/default/images/arrow_up.png differ diff --git a/themes/default/images/tangram-colorpicker.png b/themes/default/images/tangram-colorpicker.png new file mode 100644 index 0000000000000000000000000000000000000000..738e500cfcf2c746f977189b05a7fe43544e80f0 Binary files /dev/null and b/themes/default/images/tangram-colorpicker.png differ