File: /www/wwwroot/bs.kntsleep.com/system/extend/ueditor/_src/plugins/autotypeset.js
/**
* 自动排版
* @file
* @since 1.2.6.1
*/
/**
* 对当前编辑器的内容执行自动排版, 排版的行为根据config配置文件里的“autotypeset”选项进行控制。
* @command autotypeset
* @method execCommand
* @param { String } cmd 命令字符串
* @example
* ```javascript
* editor.execCommand( 'autotypeset' );
* ```
*/
UE.plugins["autotypeset"] = function() {
this.setOpt({
autotypeset: {
mergeEmptyline: true, //合并空行
removeClass: true, //去掉冗余的class
removeEmptyline: false, //去掉空行
textAlign: "left", //段落的排版方式,可以是 left,right,center,justify 去掉这个属性表示不执行排版
imageBlockLine: "center", //图片的浮动方式,独占一行剧中,左右浮动,默认: center,left,right,none 去掉这个属性表示不执行排版
pasteFilter: false, //根据规则过滤没事粘贴进来的内容
clearFontSize: false, //去掉所有的内嵌字号,使用编辑器默认的字号
clearFontFamily: false, //去掉所有的内嵌字体,使用编辑器默认的字体
removeEmptyNode: false, // 去掉空节点
//可以去掉的标签
removeTagNames: utils.extend({ div: 1 }, dtd.$removeEmpty),
indent: false, // 行首缩进
indentValue: "2em", //行首缩进的大小
bdc2sb: false,
tobdc: false
}
});
var me = this,
opt = me.options.autotypeset,
remainClass = {
selectTdClass: 1,
pagebreak: 1,
anchorclass: 1
},
remainTag = {
li: 1
},
tags = {
div: 1,
p: 1,
//trace:2183 这些也认为是行
blockquote: 1,
center: 1,
h1: 1,
h2: 1,
h3: 1,
h4: 1,
h5: 1,
h6: 1,
span: 1
},
highlightCont;
//升级了版本,但配置项目里没有autotypeset
if (!opt) {
return;
}
readLocalOpts();
function isLine(node, notEmpty) {
if (!node || node.nodeType == 3) return 0;
if (domUtils.isBr(node)) return 1;
if (node && node.parentNode && tags[node.tagName.toLowerCase()]) {
if (
(highlightCont && highlightCont.contains(node)) ||
node.getAttribute("pagebreak")
) {
return 0;
}
return notEmpty
? !domUtils.isEmptyBlock(node)
: domUtils.isEmptyBlock(
node,
new RegExp("[\\s" + domUtils.fillChar + "]", "g")
);
}
}
function removeNotAttributeSpan(node) {
if (!node.style.cssText) {
domUtils.removeAttributes(node, ["style"]);
if (
node.tagName.toLowerCase() == "span" &&
domUtils.hasNoAttributes(node)
) {
domUtils.remove(node, true);
}
}
}
function autotype(type, html) {
var me = this,
cont;
if (html) {
if (!opt.pasteFilter) {
return;
}
cont = me.document.createElement("div");
cont.innerHTML = html.html;
} else {
cont = me.document.body;
}
var nodes = domUtils.getElementsByTagName(cont, "*");
// 行首缩进,段落方向,段间距,段内间距
for (var i = 0, ci; (ci = nodes[i++]); ) {
if (me.fireEvent("excludeNodeinautotype", ci) === true) {
continue;
}
//font-size
if (opt.clearFontSize && ci.style.fontSize) {
domUtils.removeStyle(ci, "font-size");
removeNotAttributeSpan(ci);
}
//font-family
if (opt.clearFontFamily && ci.style.fontFamily) {
domUtils.removeStyle(ci, "font-family");
removeNotAttributeSpan(ci);
}
if (isLine(ci)) {
//合并空行
if (opt.mergeEmptyline) {
var next = ci.nextSibling,
tmpNode,
isBr = domUtils.isBr(ci);
while (isLine(next)) {
tmpNode = next;
next = tmpNode.nextSibling;
if (isBr && (!next || (next && !domUtils.isBr(next)))) {
break;
}
domUtils.remove(tmpNode);
}
}
//去掉空行,保留占位的空行
if (
opt.removeEmptyline &&
domUtils.inDoc(ci, cont) &&
!remainTag[ci.parentNode.tagName.toLowerCase()]
) {
if (domUtils.isBr(ci)) {
next = ci.nextSibling;
if (next && !domUtils.isBr(next)) {
continue;
}
}
domUtils.remove(ci);
continue;
}
}
if (isLine(ci, true) && ci.tagName != "SPAN") {
if (opt.indent) {
ci.style.textIndent = opt.indentValue;
}
if (opt.textAlign) {
ci.style.textAlign = opt.textAlign;
}
// if(opt.lineHeight)
// ci.style.lineHeight = opt.lineHeight + 'cm';
}
//去掉class,保留的class不去掉
if (
opt.removeClass &&
ci.className &&
!remainClass[ci.className.toLowerCase()]
) {
if (highlightCont && highlightCont.contains(ci)) {
continue;
}
domUtils.removeAttributes(ci, ["class"]);
}
//表情不处理
if (
opt.imageBlockLine &&
ci.tagName.toLowerCase() == "img" &&
!ci.getAttribute("emotion")
) {
if (html) {
var img = ci;
switch (opt.imageBlockLine) {
case "left":
case "right":
case "none":
var pN = img.parentNode,
tmpNode,
pre,
next;
while (dtd.$inline[pN.tagName] || pN.tagName == "A") {
pN = pN.parentNode;
}
tmpNode = pN;
if (
tmpNode.tagName == "P" &&
domUtils.getStyle(tmpNode, "text-align") == "center"
) {
if (
!domUtils.isBody(tmpNode) &&
domUtils.getChildCount(tmpNode, function(node) {
return !domUtils.isBr(node) && !domUtils.isWhitespace(node);
}) == 1
) {
pre = tmpNode.previousSibling;
next = tmpNode.nextSibling;
if (
pre &&
next &&
pre.nodeType == 1 &&
next.nodeType == 1 &&
pre.tagName == next.tagName &&
domUtils.isBlockElm(pre)
) {
pre.appendChild(tmpNode.firstChild);
while (next.firstChild) {
pre.appendChild(next.firstChild);
}
domUtils.remove(tmpNode);
domUtils.remove(next);
} else {
domUtils.setStyle(tmpNode, "text-align", "");
}
}
}
domUtils.setStyle(img, "float", opt.imageBlockLine);
break;
case "center":
if (me.queryCommandValue("imagefloat") != "center") {
pN = img.parentNode;
domUtils.setStyle(img, "float", "none");
tmpNode = img;
while (
pN &&
domUtils.getChildCount(pN, function(node) {
return !domUtils.isBr(node) && !domUtils.isWhitespace(node);
}) == 1 &&
(dtd.$inline[pN.tagName] || pN.tagName == "A")
) {
tmpNode = pN;
pN = pN.parentNode;
}
var pNode = me.document.createElement("p");
domUtils.setAttributes(pNode, {
style: "text-align:center"
});
tmpNode.parentNode.insertBefore(pNode, tmpNode);
pNode.appendChild(tmpNode);
domUtils.setStyle(tmpNode, "float", "");
}
}
} else {
var range = me.selection.getRange();
range.selectNode(ci).select();
me.execCommand("imagefloat", opt.imageBlockLine);
}
}
//去掉冗余的标签
if (opt.removeEmptyNode) {
if (
opt.removeTagNames[ci.tagName.toLowerCase()] &&
domUtils.hasNoAttributes(ci) &&
domUtils.isEmptyBlock(ci)
) {
domUtils.remove(ci);
}
}
}
if (opt.tobdc) {
var root = UE.htmlparser(cont.innerHTML);
root.traversal(function(node) {
if (node.type == "text") {
node.data = ToDBC(node.data);
}
});
cont.innerHTML = root.toHtml();
}
if (opt.bdc2sb) {
var root = UE.htmlparser(cont.innerHTML);
root.traversal(function(node) {
if (node.type == "text") {
node.data = DBC2SB(node.data);
}
});
cont.innerHTML = root.toHtml();
}
if (html) {
html.html = cont.innerHTML;
}
}
if (opt.pasteFilter) {
me.addListener("beforepaste", autotype);
}
function DBC2SB(str) {
var result = "";
for (var i = 0; i < str.length; i++) {
var code = str.charCodeAt(i); //获取当前字符的unicode编码
if (code >= 65281 && code <= 65373) {
//在这个unicode编码范围中的是所有的英文字母已经各种字符
result += String.fromCharCode(str.charCodeAt(i) - 65248); //把全角字符的unicode编码转换为对应半角字符的unicode码
} else if (code == 12288) {
//空格
result += String.fromCharCode(str.charCodeAt(i) - 12288 + 32);
} else {
result += str.charAt(i);
}
}
return result;
}
function ToDBC(txtstring) {
txtstring = utils.html(txtstring);
var tmp = "";
var mark = ""; /*用于判断,如果是html尖括里的标记,则不进行全角的转换*/
for (var i = 0; i < txtstring.length; i++) {
if (txtstring.charCodeAt(i) == 32) {
tmp = tmp + String.fromCharCode(12288);
} else if (txtstring.charCodeAt(i) < 127) {
tmp = tmp + String.fromCharCode(txtstring.charCodeAt(i) + 65248);
} else {
tmp += txtstring.charAt(i);
}
}
return tmp;
}
function readLocalOpts() {
var cookieOpt = me.getPreferences("autotypeset");
utils.extend(me.options.autotypeset, cookieOpt);
}
me.commands["autotypeset"] = {
execCommand: function() {
me.removeListener("beforepaste", autotype);
if (opt.pasteFilter) {
me.addListener("beforepaste", autotype);
}
autotype.call(me);
}
};
};