diff --git a/.babelrc b/.babelrc new file mode 100644 index 000000000..f5f4126c9 --- /dev/null +++ b/.babelrc @@ -0,0 +1,15 @@ +{ + "presets": [ + ["env", { + "modules": false, + "targets": { + "browsers": ["> 1%", "last 2 versions", "not ie <= 8"] + } + }], + "stage-2" + ], + "ignore": [ + "dist/utf8-php/ueditor.all.js" + ], + "plugins": ["transform-vue-jsx", "transform-runtime"] +} diff --git a/.gitignore b/.gitignore index 6b12680ec..aaa327088 100644 --- a/.gitignore +++ b/.gitignore @@ -190,3 +190,4 @@ pip-log.txt # Mac crap .DS_Store /node_modules +/package-lock.json diff --git a/_parse/parse.js b/_parse/parse.js index fe1275507..e8ad7e440 100644 --- a/_parse/parse.js +++ b/_parse/parse.js @@ -63,7 +63,7 @@ head.removeChild(node) } }, - domReady : function (onready) { + domReady : function ADXL(onready) { var doc = window.document; if (doc.readyState === "complete") { onready(); @@ -74,7 +74,7 @@ try { doc.documentElement.doScroll("left"); } catch (error) { - setTimeout(arguments.callee, 0); + setTimeout(ADXL, 0); return; } onready(); @@ -84,7 +84,7 @@ }); } else { doc.addEventListener("DOMContentLoaded", function () { - doc.removeEventListener("DOMContentLoaded", arguments.callee, false); + doc.removeEventListener("DOMContentLoaded", ADXL, false); onready(); }, false); window.addEventListener('load', function(){onready()}, false); diff --git a/_src/adapter/editor.js b/_src/adapter/editor.js index f0dfb77ef..94ee2d387 100644 --- a/_src/adapter/editor.js +++ b/_src/adapter/editor.js @@ -24,7 +24,7 @@ var editor = this.editor, me = this; - editor.addListener('ready', function () { + editor.addListener('ready', function ADXL() { //提供getDialog方法 editor.getDialog = function (name) { return editor.ui._dialogs[name + "Dialog"]; @@ -44,7 +44,7 @@ if (editor.options.wordCount) { function countFn() { setCount(editor,me); - domUtils.un(editor.document, "click", arguments.callee); + domUtils.un(editor.document, "click", ADXL); } domUtils.on(editor.document, "click", countFn); editor.ui.getDom('wordcount').innerHTML = editor.getLang("wordCountTip"); diff --git a/_src/core/domUtils.js b/_src/core/domUtils.js index 2d29930e2..2d753ca86 100644 --- a/_src/core/domUtils.js +++ b/_src/core/domUtils.js @@ -2408,6 +2408,38 @@ var domUtils = dom.domUtils = { } return true; }, - fillHtml : browser.ie11below ? ' ' : '
' + fillHtml : browser.ie11below ? ' ' : '
', + + /** + * add by ading 2020年4月1日10:20:17 + * 删除节点前部的Tab键产生的空格,即tab键的shift+tab反向效果 + * @method deleteTabspace + * @param { Node } delNode 需要删除tab空格的节点 + * @param { Number } spaceCount 需要查询位置关系的节点B + * @return { Boolean } 是否有删除 + * @example + */ + deleteTabspace: function(delNode, spaceCount){ + var bearkFlag = false; + var reg1 = new RegExp('^[ , ]','g'); //创建正则RegExp对象  + var reg2 = new RegExp('^​','g'); //创建正则RegExp对象  + // 循环所有子元素寻找第一个不为空的子元素进行删除tab空格 + this.getChildCount( delNode, function ( node ) { + if(!bearkFlag) { + if(!(node.id && node.id.indexOf('baidu_bookmark')>0)){ + if((node.textContent && node.textContent.length>0) || (node.data && node.data.length>0)){ + if(node.data && node.data.length>0){ + var newData = node.data; + for( i = 0; i < spaceCount; i++ ) newData = newData.replace(reg1, ''); + newData = newData.replace(reg2,''); + node.replaceWith(newData); + } + bearkFlag = true; + } + } + } + }); + return bearkFlag; + } }; var fillCharReg = new RegExp(domUtils.fillChar, 'g'); \ No newline at end of file diff --git a/_src/core/utils.js b/_src/core/utils.js index 036a93d91..803672dff 100644 --- a/_src/core/utils.js +++ b/_src/core/utils.js @@ -842,7 +842,7 @@ var utils = UE.utils = { } } - return function (onready, win) { + return function ADXL(onready, win) { win = win || window; var doc = win.document; onready && fnArr.push(onready); @@ -856,7 +856,7 @@ var utils = UE.utils = { try { doc.documentElement.doScroll("left"); } catch (error) { - setTimeout(arguments.callee, 0); + setTimeout(ADXL, 0); return; } doReady(doc); @@ -866,7 +866,7 @@ var utils = UE.utils = { }); } else { doc.addEventListener("DOMContentLoaded", function () { - doc.removeEventListener("DOMContentLoaded", arguments.callee, false); + doc.removeEventListener("DOMContentLoaded", ADXL, false); doReady(doc); }, false); win.addEventListener('load', function () { @@ -1146,44 +1146,44 @@ var utils = UE.utils = { }; /** * 判断给定的对象是否是字符串 - * @method isString - * @param { * } object 需要判断的对象 - * @return { Boolean } 给定的对象是否是字符串 + * method isString + * param { * } object 需要判断的对象 + * return { Boolean } 给定的对象是否是字符串 */ /** * 判断给定的对象是否是数组 - * @method isArray - * @param { * } object 需要判断的对象 - * @return { Boolean } 给定的对象是否是数组 + * method isArray + * param { * } object 需要判断的对象 + * return { Boolean } 给定的对象是否是数组 */ /** * 判断给定的对象是否是一个Function - * @method isFunction - * @param { * } object 需要判断的对象 - * @return { Boolean } 给定的对象是否是Function + * method isFunction + * param { * } object 需要判断的对象 + * return { Boolean } 给定的对象是否是Function */ /** * 判断给定的对象是否是Number - * @method isNumber - * @param { * } object 需要判断的对象 - * @return { Boolean } 给定的对象是否是Number + * method isNumber + * param { * } object 需要判断的对象 + * return { Boolean } 给定的对象是否是Number */ /** * 判断给定的对象是否是一个正则表达式 - * @method isRegExp - * @param { * } object 需要判断的对象 - * @return { Boolean } 给定的对象是否是正则表达式 + * method isRegExp + * param { * } object 需要判断的对象 + * return { Boolean } 给定的对象是否是正则表达式 */ /** * 判断给定的对象是否是一个普通对象 - * @method isObject - * @param { * } object 需要判断的对象 - * @return { Boolean } 给定的对象是否是普通对象 + * method isObject + * param { * } object 需要判断的对象 + * return { Boolean } 给定的对象是否是普通对象 */ utils.each(['String', 'Function', 'Array', 'Number', 'RegExp', 'Object', 'Date'], function (v) { UE.utils['is' + v] = function (obj) { diff --git a/_src/plugins/autosubmit.js b/_src/plugins/autosubmit.js index 34b6ea566..7476909db 100644 --- a/_src/plugins/autosubmit.js +++ b/_src/plugins/autosubmit.js @@ -6,10 +6,10 @@ /** * 提交表单 - * @command autosubmit - * @method execCommand - * @param { String } cmd 命令字符串 - * @example + * command autosubmit + * method execCommand + * param { String } cmd 命令字符串 + * example * ```javascript * editor.execCommand( 'autosubmit' ); * ``` diff --git a/_src/plugins/keystrokes.js b/_src/plugins/keystrokes.js index 1ccb45e80..d68f7e176 100644 --- a/_src/plugins/keystrokes.js +++ b/_src/plugins/keystrokes.js @@ -112,7 +112,17 @@ UE.plugins['keystrokes'] = function() { var span = me.document.createElement('span'); span.innerHTML = txt + domUtils.fillChar; if (range.collapsed) { - range.insertNode(span.cloneNode(true).firstChild).setCursor(true); + // change by ading 2020年4月1日11:16:25 单行`Tab`快捷键增加支持 `shift+Tab`反向操作 + if(evt.shiftKey){ + var bookmark = range.createBookmark(); + range.enlarge(true); + var bookmark2 = range.createBookmark(), + current = domUtils.getNextDomNode(bookmark2.start, false, filterFn); + domUtils.deleteTabspace(current, tabSize); + range.moveToBookmark(bookmark2).moveToBookmark(bookmark).select(); + } else { + range.insertNode(span.cloneNode(true).firstChild).setCursor(true); + } } else { var filterFn = function(node) { return domUtils.isBlockElm(node) && !excludeTagNameForTabKey[node.tagName.toLowerCase()] @@ -130,8 +140,15 @@ UE.plugins['keystrokes'] = function() { var bookmark2 = range.createBookmark(), current = domUtils.getNextDomNode(bookmark2.start, false, filterFn); while (current && !(domUtils.getPosition(current, bookmark2.end) & domUtils.POSITION_FOLLOWING)) { - current.insertBefore(span.cloneNode(true).firstChild, current.firstChild); - current = domUtils.getNextDomNode(current, false, filterFn); + // change by ading 2020年4月1日11:18:52 多行`Tab`快捷键增加支持 `shift+Tab`反向操作 + if(evt.shiftKey){ + var nextN = domUtils.getNextDomNode(current, false, filterFn); + domUtils.deleteTabspace(current, tabSize); + current = nextN; + }else{ + current.insertBefore(span.cloneNode(true).firstChild, current.firstChild); + current = domUtils.getNextDomNode(current, false, filterFn); + } } range.moveToBookmark(bookmark2).moveToBookmark(bookmark).select(); } diff --git a/_src/plugins/webapp.js b/_src/plugins/webapp.js index a18ff57cd..d3a794745 100644 --- a/_src/plugins/webapp.js +++ b/_src/plugins/webapp.js @@ -7,13 +7,13 @@ /** * 插入百度应用 - * @command webapp - * @method execCommand - * @remind 需要百度APPKey - * @remind 百度应用主页: http://app.baidu.com/ - * @param { Object } appOptions 应用所需的参数项, 支持的key有: title=>应用标题, width=>应用容器宽度, + * command webapp + * method execCommand + * remind 需要百度APPKey + * remind 百度应用主页: http://app.baidu.com/ + * param { Object } appOptions 应用所需的参数项, 支持的key有: title=>应用标题, width=>应用容器宽度, * height=>应用容器高度,logo=>应用logo,url=>应用地址 - * @example + * example * ```javascript * //editor是编辑器实例 * //在编辑器里插入一个“植物大战僵尸”的APP