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