123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354 |
- /**
- * 自动排版
- * @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);
- }
- };
- };
|