/**
* 有序列表,无序列表插件
* @file
* @since 1.2.6.1
*/
UE.plugins["list"] = function() {
var me = this,
notExchange = {
TD: 1,
PRE: 1,
BLOCKQUOTE: 1
};
var customStyle = {
cn: "cn-1-",
cn1: "cn-2-",
cn2: "cn-3-",
num: "num-1-",
num1: "num-2-",
num2: "num-3-",
dash: "dash",
dot: "dot"
};
me.setOpt({
autoTransWordToList: false,
insertorderedlist: {
num: "",
num1: "",
num2: "",
cn: "",
cn1: "",
cn2: "",
decimal: "",
"lower-alpha": "",
"lower-roman": "",
"upper-alpha": "",
"upper-roman": ""
},
insertunorderedlist: {
circle: "",
disc: "",
square: "",
dash: "",
dot: ""
},
listDefaultPaddingLeft: "30",
listiconpath: "http://bs.baidu.com/listicon/",
maxListLevel: -1, //-1不限制
disablePInList: false
});
function listToArray(list) {
var arr = [];
for (var p in list) {
arr.push(p);
}
return arr;
}
var listStyle = {
OL: listToArray(me.options.insertorderedlist),
UL: listToArray(me.options.insertunorderedlist)
};
var liiconpath = me.options.listiconpath;
//根据用户配置,调整customStyle
for (var s in customStyle) {
if (
!me.options.insertorderedlist.hasOwnProperty(s) &&
!me.options.insertunorderedlist.hasOwnProperty(s)
) {
delete customStyle[s];
}
}
me.ready(function() {
var customCss = [];
for (var p in customStyle) {
if (p == "dash" || p == "dot") {
customCss.push(
"li.list-" +
customStyle[p] +
"{background-image:url(" +
liiconpath +
customStyle[p] +
".gif)}"
);
customCss.push(
"ul.custom_" +
p +
"{list-style:none;}ul.custom_" +
p +
" li{background-position:0 3px;background-repeat:no-repeat}"
);
} else {
for (var i = 0; i < 99; i++) {
customCss.push(
"li.list-" +
customStyle[p] +
i +
"{background-image:url(" +
liiconpath +
"list-" +
customStyle[p] +
i +
".gif)}"
);
}
customCss.push(
"ol.custom_" +
p +
"{list-style:none;}ol.custom_" +
p +
" li{background-position:0 3px;background-repeat:no-repeat}"
);
}
switch (p) {
case "cn":
customCss.push("li.list-" + p + "-paddingleft-1{padding-left:25px}");
customCss.push("li.list-" + p + "-paddingleft-2{padding-left:40px}");
customCss.push("li.list-" + p + "-paddingleft-3{padding-left:55px}");
break;
case "cn1":
customCss.push("li.list-" + p + "-paddingleft-1{padding-left:30px}");
customCss.push("li.list-" + p + "-paddingleft-2{padding-left:40px}");
customCss.push("li.list-" + p + "-paddingleft-3{padding-left:55px}");
break;
case "cn2":
customCss.push("li.list-" + p + "-paddingleft-1{padding-left:40px}");
customCss.push("li.list-" + p + "-paddingleft-2{padding-left:55px}");
customCss.push("li.list-" + p + "-paddingleft-3{padding-left:68px}");
break;
case "num":
case "num1":
customCss.push("li.list-" + p + "-paddingleft-1{padding-left:25px}");
break;
case "num2":
customCss.push("li.list-" + p + "-paddingleft-1{padding-left:35px}");
customCss.push("li.list-" + p + "-paddingleft-2{padding-left:40px}");
break;
case "dash":
customCss.push("li.list-" + p + "-paddingleft{padding-left:35px}");
break;
case "dot":
customCss.push("li.list-" + p + "-paddingleft{padding-left:20px}");
}
}
customCss.push(".list-paddingleft-1{padding-left:0}");
customCss.push(
".list-paddingleft-2{padding-left:" +
me.options.listDefaultPaddingLeft +
"px}"
);
customCss.push(
".list-paddingleft-3{padding-left:" +
me.options.listDefaultPaddingLeft * 2 +
"px}"
);
//如果不给宽度会在自定应样式里出现滚动条
utils.cssRule(
"list",
"ol,ul{margin:0;pading:0;" +
(browser.ie ? "" : "width:95%") +
"}li{clear:both;}" +
customCss.join("\n"),
me.document
);
});
//单独处理剪切的问题
me.ready(function() {
domUtils.on(me.body, "cut", function() {
setTimeout(function() {
var rng = me.selection.getRange(),
li;
//trace:3416
if (!rng.collapsed) {
if (
(li = domUtils.findParentByTagName(rng.startContainer, "li", true))
) {
if (!li.nextSibling && domUtils.isEmptyBlock(li)) {
var pn = li.parentNode,
node;
if ((node = pn.previousSibling)) {
domUtils.remove(pn);
rng.setStartAtLast(node).collapse(true);
rng.select(true);
} else if ((node = pn.nextSibling)) {
domUtils.remove(pn);
rng.setStartAtFirst(node).collapse(true);
rng.select(true);
} else {
var tmpNode = me.document.createElement("p");
domUtils.fillNode(me.document, tmpNode);
pn.parentNode.insertBefore(tmpNode, pn);
domUtils.remove(pn);
rng.setStart(tmpNode, 0).collapse(true);
rng.select(true);
}
}
}
}
});
});
});
function getStyle(node) {
var cls = node.className;
if (domUtils.hasClass(node, /custom_/)) {
return cls.match(/custom_(\w+)/)[1];
}
return domUtils.getStyle(node, "list-style-type");
}
me.addListener("beforepaste", function(type, html) {
var me = this,
rng = me.selection.getRange(),
li;
var root = UE.htmlparser(html.html, true);
if ((li = domUtils.findParentByTagName(rng.startContainer, "li", true))) {
var list = li.parentNode,
tagName = list.tagName == "OL" ? "ul" : "ol";
utils.each(root.getNodesByTagName(tagName), function(n) {
n.tagName = list.tagName;
n.setAttr();
if (n.parentNode === root) {
type = getStyle(list) || (list.tagName == "OL" ? "decimal" : "disc");
} else {
var className = n.parentNode.getAttr("class");
if (className && /custom_/.test(className)) {
type = className.match(/custom_(\w+)/)[1];
} else {
type = n.parentNode.getStyle("list-style-type");
}
if (!type) {
type = list.tagName == "OL" ? "decimal" : "disc";
}
}
var index = utils.indexOf(listStyle[list.tagName], type);
if (n.parentNode !== root)
index = index + 1 == listStyle[list.tagName].length ? 0 : index + 1;
var currentStyle = listStyle[list.tagName][index];
if (customStyle[currentStyle]) {
n.setAttr("class", "custom_" + currentStyle);
} else {
n.setStyle("list-style-type", currentStyle);
}
});
}
html.html = root.toHtml();
});
//导出时,去掉p标签
me.getOpt("disablePInList") === true &&
me.addOutputRule(function(root) {
utils.each(root.getNodesByTagName("li"), function(li) {
var newChildrens = [],
index = 0;
utils.each(li.children, function(n) {
if (n.tagName == "p") {
var tmpNode;
while ((tmpNode = n.children.pop())) {
newChildrens.splice(index, 0, tmpNode);
tmpNode.parentNode = li;
lastNode = tmpNode;
}
tmpNode = newChildrens[newChildrens.length - 1];
if (
!tmpNode ||
tmpNode.type != "element" ||
tmpNode.tagName != "br"
) {
var br = UE.uNode.createElement("br");
br.parentNode = li;
newChildrens.push(br);
}
index = newChildrens.length;
}
});
if (newChildrens.length) {
li.children = newChildrens;
}
});
});
//进入编辑器的li要套p标签
me.addInputRule(function(root) {
utils.each(root.getNodesByTagName("li"), function(li) {
var tmpP = UE.uNode.createElement("p");
for (var i = 0, ci; (ci = li.children[i]); ) {
if (ci.type == "text" || dtd.p[ci.tagName]) {
tmpP.appendChild(ci);
} else {
if (tmpP.firstChild()) {
li.insertBefore(tmpP, ci);
tmpP = UE.uNode.createElement("p");
i = i + 2;
} else {
i++;
}
}
}
if ((tmpP.firstChild() && !tmpP.parentNode) || !li.firstChild()) {
li.appendChild(tmpP);
}
//trace:3357
//p不能为空
if (!tmpP.firstChild()) {
tmpP.innerHTML(browser.ie ? " " : "
");
}
//去掉末尾的空白
var p = li.firstChild();
var lastChild = p.lastChild();
if (
lastChild &&
lastChild.type == "text" &&
/^\s*$/.test(lastChild.data)
) {
p.removeChild(lastChild);
}
});
if (me.options.autoTransWordToList) {
var orderlisttype = {
num1: /^\d+\)/,
decimal: /^\d+\./,
"lower-alpha": /^[a-z]+\)/,
"upper-alpha": /^[A-Z]+\./,
cn: /^[\u4E00\u4E8C\u4E09\u56DB\u516d\u4e94\u4e03\u516b\u4e5d]+[\u3001]/,
cn2: /^\([\u4E00\u4E8C\u4E09\u56DB\u516d\u4e94\u4e03\u516b\u4e5d]+\)/
},
unorderlisttype = {
square: "n"
};
function checkListType(content, container) {
var span = container.firstChild();
if (
span &&
span.type == "element" &&
span.tagName == "span" &&
/Wingdings|Symbol/.test(span.getStyle("font-family"))
) {
for (var p in unorderlisttype) {
if (unorderlisttype[p] == span.data) {
return p;
}
}
return "disc";
}
for (var p in orderlisttype) {
if (orderlisttype[p].test(content)) {
return p;
}
}
}
utils.each(root.getNodesByTagName("p"), function(node) {
if (node.getAttr("class") != "MsoListParagraph") {
return;
}
//word粘贴过来的会带有margin要去掉,但这样也可能会误命中一些央视
node.setStyle("margin", "");
node.setStyle("margin-left", "");
node.setAttr("class", "");
function appendLi(list, p, type) {
if (list.tagName == "ol") {
if (browser.ie) {
var first = p.firstChild();
if (
first.type == "element" &&
first.tagName == "span" &&
orderlisttype[type].test(first.innerText())
) {
p.removeChild(first);
}
} else {
p.innerHTML(p.innerHTML().replace(orderlisttype[type], ""));
}
} else {
p.removeChild(p.firstChild());
}
var li = UE.uNode.createElement("li");
li.appendChild(p);
list.appendChild(li);
}
var tmp = node,
type,
cacheNode = node;
if (
node.parentNode.tagName != "li" &&
(type = checkListType(node.innerText(), node))
) {
var list = UE.uNode.createElement(
me.options.insertorderedlist.hasOwnProperty(type) ? "ol" : "ul"
);
if (customStyle[type]) {
list.setAttr("class", "custom_" + type);
} else {
list.setStyle("list-style-type", type);
}
while (
node &&
node.parentNode.tagName != "li" &&
checkListType(node.innerText(), node)
) {
tmp = node.nextSibling();
if (!tmp) {
node.parentNode.insertBefore(list, node);
}
appendLi(list, node, type);
node = tmp;
}
if (!list.parentNode && node && node.parentNode) {
node.parentNode.insertBefore(list, node);
}
}
var span = cacheNode.firstChild();
if (
span &&
span.type == "element" &&
span.tagName == "span" &&
/^\s*( )+\s*$/.test(span.innerText())
) {
span.parentNode.removeChild(span);
}
});
}
});
//调整索引标签
me.addListener("contentchange", function() {
adjustListStyle(me.document);
});
function adjustListStyle(doc, ignore) {
utils.each(domUtils.getElementsByTagName(doc, "ol ul"), function(node) {
if (!domUtils.inDoc(node, doc)) return;
var parent = node.parentNode;
if (parent.tagName == node.tagName) {
var nodeStyleType =
getStyle(node) || (node.tagName == "OL" ? "decimal" : "disc"),
parentStyleType =
getStyle(parent) || (parent.tagName == "OL" ? "decimal" : "disc");
if (nodeStyleType == parentStyleType) {
var styleIndex = utils.indexOf(
listStyle[node.tagName],
nodeStyleType
);
styleIndex = styleIndex + 1 == listStyle[node.tagName].length
? 0
: styleIndex + 1;
setListStyle(node, listStyle[node.tagName][styleIndex]);
}
}
var index = 0,
type = 2;
if (domUtils.hasClass(node, /custom_/)) {
if (
!(
/[ou]l/i.test(parent.tagName) &&
domUtils.hasClass(parent, /custom_/)
)
) {
type = 1;
}
} else {
if (
/[ou]l/i.test(parent.tagName) &&
domUtils.hasClass(parent, /custom_/)
) {
type = 3;
}
}
var style = domUtils.getStyle(node, "list-style-type");
style && (node.style.cssText = "list-style-type:" + style);
node.className =
utils.trim(node.className.replace(/list-paddingleft-\w+/, "")) +
" list-paddingleft-" +
type;
utils.each(domUtils.getElementsByTagName(node, "li"), function(li) {
li.style.cssText && (li.style.cssText = "");
if (!li.firstChild) {
domUtils.remove(li);
return;
}
if (li.parentNode !== node) {
return;
}
index++;
if (domUtils.hasClass(node, /custom_/)) {
var paddingLeft = 1,
currentStyle = getStyle(node);
if (node.tagName == "OL") {
if (currentStyle) {
switch (currentStyle) {
case "cn":
case "cn1":
case "cn2":
if (
index > 10 &&
(index % 10 == 0 || (index > 10 && index < 20))
) {
paddingLeft = 2;
} else if (index > 20) {
paddingLeft = 3;
}
break;
case "num2":
if (index > 9) {
paddingLeft = 2;
}
}
}
li.className =
"list-" +
customStyle[currentStyle] +
index +
" " +
"list-" +
currentStyle +
"-paddingleft-" +
paddingLeft;
} else {
li.className =
"list-" +
customStyle[currentStyle] +
" " +
"list-" +
currentStyle +
"-paddingleft";
}
} else {
li.className = li.className.replace(/list-[\w\-]+/gi, "");
}
var className = li.getAttribute("class");
if (className !== null && !className.replace(/\s/g, "")) {
domUtils.removeAttributes(li, "class");
}
});
!ignore &&
adjustList(
node,
node.tagName.toLowerCase(),
getStyle(node) || domUtils.getStyle(node, "list-style-type"),
true
);
});
}
function adjustList(list, tag, style, ignoreEmpty) {
var nextList = list.nextSibling;
if (
nextList &&
nextList.nodeType == 1 &&
nextList.tagName.toLowerCase() == tag &&
(getStyle(nextList) ||
domUtils.getStyle(nextList, "list-style-type") ||
(tag == "ol" ? "decimal" : "disc")) == style
) {
domUtils.moveChild(nextList, list);
if (nextList.childNodes.length == 0) {
domUtils.remove(nextList);
}
}
if (nextList && domUtils.isFillChar(nextList)) {
domUtils.remove(nextList);
}
var preList = list.previousSibling;
if (
preList &&
preList.nodeType == 1 &&
preList.tagName.toLowerCase() == tag &&
(getStyle(preList) ||
domUtils.getStyle(preList, "list-style-type") ||
(tag == "ol" ? "decimal" : "disc")) == style
) {
domUtils.moveChild(list, preList);
}
if (preList && domUtils.isFillChar(preList)) {
domUtils.remove(preList);
}
!ignoreEmpty && domUtils.isEmptyBlock(list) && domUtils.remove(list);
if (getStyle(list)) {
adjustListStyle(list.ownerDocument, true);
}
}
function setListStyle(list, style) {
if (customStyle[style]) {
list.className = "custom_" + style;
}
try {
domUtils.setStyle(list, "list-style-type", style);
} catch (e) {}
}
function clearEmptySibling(node) {
var tmpNode = node.previousSibling;
if (tmpNode && domUtils.isEmptyBlock(tmpNode)) {
domUtils.remove(tmpNode);
}
tmpNode = node.nextSibling;
if (tmpNode && domUtils.isEmptyBlock(tmpNode)) {
domUtils.remove(tmpNode);
}
}
me.addListener("keydown", function(type, evt) {
function preventAndSave() {
evt.preventDefault ? evt.preventDefault() : (evt.returnValue = false);
me.fireEvent("contentchange");
me.undoManger && me.undoManger.save();
}
function findList(node, filterFn) {
while (node && !domUtils.isBody(node)) {
if (filterFn(node)) {
return null;
}
if (node.nodeType == 1 && /[ou]l/i.test(node.tagName)) {
return node;
}
node = node.parentNode;
}
return null;
}
var keyCode = evt.keyCode || evt.which;
if (keyCode == 13 && !evt.shiftKey) {
//回车
var rng = me.selection.getRange(),
parent = domUtils.findParent(
rng.startContainer,
function(node) {
return domUtils.isBlockElm(node);
},
true
),
li = domUtils.findParentByTagName(rng.startContainer, "li", true);
if (parent && parent.tagName != "PRE" && !li) {
var html = parent.innerHTML.replace(
new RegExp(domUtils.fillChar, "g"),
""
);
if (/^\s*1\s*\.[^\d]/.test(html)) {
parent.innerHTML = html.replace(/^\s*1\s*\./, "");
rng.setStartAtLast(parent).collapse(true).select();
me.__hasEnterExecCommand = true;
me.execCommand("insertorderedlist");
me.__hasEnterExecCommand = false;
}
}
var range = me.selection.getRange(),
start = findList(range.startContainer, function(node) {
return node.tagName == "TABLE";
}),
end = range.collapsed
? start
: findList(range.endContainer, function(node) {
return node.tagName == "TABLE";
});
if (start && end && start === end) {
if (!range.collapsed) {
start = domUtils.findParentByTagName(
range.startContainer,
"li",
true
);
end = domUtils.findParentByTagName(range.endContainer, "li", true);
if (start && end && start === end) {
range.deleteContents();
li = domUtils.findParentByTagName(range.startContainer, "li", true);
if (li && domUtils.isEmptyBlock(li)) {
pre = li.previousSibling;
next = li.nextSibling;
p = me.document.createElement("p");
domUtils.fillNode(me.document, p);
parentList = li.parentNode;
if (pre && next) {
range.setStart(next, 0).collapse(true).select(true);
domUtils.remove(li);
} else {
if ((!pre && !next) || !pre) {
parentList.parentNode.insertBefore(p, parentList);
} else {
li.parentNode.parentNode.insertBefore(
p,
parentList.nextSibling
);
}
domUtils.remove(li);
if (!parentList.firstChild) {
domUtils.remove(parentList);
}
range.setStart(p, 0).setCursor();
}
preventAndSave();
return;
}
} else {
var tmpRange = range.cloneRange(),
bk = tmpRange.collapse(false).createBookmark();
range.deleteContents();
tmpRange.moveToBookmark(bk);
var li = domUtils.findParentByTagName(
tmpRange.startContainer,
"li",
true
);
clearEmptySibling(li);
tmpRange.select();
preventAndSave();
return;
}
}
li = domUtils.findParentByTagName(range.startContainer, "li", true);
if (li) {
if (domUtils.isEmptyBlock(li)) {
bk = range.createBookmark();
var parentList = li.parentNode;
if (li !== parentList.lastChild) {
domUtils.breakParent(li, parentList);
clearEmptySibling(li);
} else {
parentList.parentNode.insertBefore(li, parentList.nextSibling);
if (domUtils.isEmptyNode(parentList)) {
domUtils.remove(parentList);
}
}
//嵌套不处理
if (!dtd.$list[li.parentNode.tagName]) {
if (!domUtils.isBlockElm(li.firstChild)) {
p = me.document.createElement("p");
li.parentNode.insertBefore(p, li);
while (li.firstChild) {
p.appendChild(li.firstChild);
}
domUtils.remove(li);
} else {
domUtils.remove(li, true);
}
}
range.moveToBookmark(bk).select();
} else {
var first = li.firstChild;
if (!first || !domUtils.isBlockElm(first)) {
var p = me.document.createElement("p");
!li.firstChild && domUtils.fillNode(me.document, p);
while (li.firstChild) {
p.appendChild(li.firstChild);
}
li.appendChild(p);
first = p;
}
var span = me.document.createElement("span");
range.insertNode(span);
domUtils.breakParent(span, li);
var nextLi = span.nextSibling;
first = nextLi.firstChild;
if (!first) {
p = me.document.createElement("p");
domUtils.fillNode(me.document, p);
nextLi.appendChild(p);
first = p;
}
if (domUtils.isEmptyNode(first)) {
first.innerHTML = "";
domUtils.fillNode(me.document, first);
}
range.setStart(first, 0).collapse(true).shrinkBoundary().select();
domUtils.remove(span);
var pre = nextLi.previousSibling;
if (pre && domUtils.isEmptyBlock(pre)) {
pre.innerHTML = "