defaultfilter.js 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276
  1. ///import core
  2. ///plugin 编辑器默认的过滤转换机制
  3. UE.plugins["defaultfilter"] = function() {
  4. var me = this;
  5. me.setOpt({
  6. allowDivTransToP: true,
  7. disabledTableInTable: true,
  8. rgb2Hex: true
  9. });
  10. //默认的过滤处理
  11. //进入编辑器的内容处理
  12. me.addInputRule(function(root) {
  13. var allowDivTransToP = this.options.allowDivTransToP;
  14. var val;
  15. function tdParent(node) {
  16. while (node && node.type == "element") {
  17. if (node.tagName == "td") {
  18. return true;
  19. }
  20. node = node.parentNode;
  21. }
  22. return false;
  23. }
  24. //进行默认的处理
  25. root.traversal(function(node) {
  26. if (node.type == "element") {
  27. if (
  28. !dtd.$cdata[node.tagName] &&
  29. me.options.autoClearEmptyNode &&
  30. dtd.$inline[node.tagName] &&
  31. !dtd.$empty[node.tagName] &&
  32. (!node.attrs || utils.isEmptyObject(node.attrs))
  33. ) {
  34. if (!node.firstChild()) node.parentNode.removeChild(node);
  35. else if (
  36. node.tagName == "span" &&
  37. (!node.attrs || utils.isEmptyObject(node.attrs))
  38. ) {
  39. node.parentNode.removeChild(node, true);
  40. }
  41. return;
  42. }
  43. switch (node.tagName) {
  44. case "style":
  45. case "script":
  46. node.setAttr({
  47. cdata_tag: node.tagName,
  48. cdata_data: node.innerHTML() || "",
  49. _ue_custom_node_: "true"
  50. });
  51. node.tagName = "div";
  52. node.innerHTML("");
  53. break;
  54. case "a":
  55. if ((val = node.getAttr("href"))) {
  56. node.setAttr("_href", val);
  57. }
  58. break;
  59. case "img":
  60. //todo base64暂时去掉,后边做远程图片上传后,干掉这个
  61. if ((val = node.getAttr("src"))) {
  62. if (/^data:/.test(val)) {
  63. node.parentNode.removeChild(node);
  64. break;
  65. }
  66. }
  67. node.setAttr("_src", node.getAttr("src"));
  68. break;
  69. case "span":
  70. if (browser.webkit && (val = node.getStyle("white-space"))) {
  71. if (/nowrap|normal/.test(val)) {
  72. node.setStyle("white-space", "");
  73. if (
  74. me.options.autoClearEmptyNode &&
  75. utils.isEmptyObject(node.attrs)
  76. ) {
  77. node.parentNode.removeChild(node, true);
  78. }
  79. }
  80. }
  81. val = node.getAttr("id");
  82. if (val && /^_baidu_bookmark_/i.test(val)) {
  83. node.parentNode.removeChild(node);
  84. }
  85. break;
  86. case "p":
  87. if ((val = node.getAttr("align"))) {
  88. node.setAttr("align");
  89. node.setStyle("text-align", val);
  90. }
  91. //trace:3431
  92. // var cssStyle = node.getAttr('style');
  93. // if (cssStyle) {
  94. // cssStyle = cssStyle.replace(/(margin|padding)[^;]+/g, '');
  95. // node.setAttr('style', cssStyle)
  96. //
  97. // }
  98. //p标签不允许嵌套
  99. utils.each(node.children, function(n) {
  100. if (n.type == "element" && n.tagName == "p") {
  101. var next = n.nextSibling();
  102. node.parentNode.insertAfter(n, node);
  103. var last = n;
  104. while (next) {
  105. var tmp = next.nextSibling();
  106. node.parentNode.insertAfter(next, last);
  107. last = next;
  108. next = tmp;
  109. }
  110. return false;
  111. }
  112. });
  113. if (!node.firstChild()) {
  114. node.innerHTML(browser.ie ? "&nbsp;" : "<br/>");
  115. }
  116. break;
  117. case "div":
  118. if (node.getAttr("cdata_tag")) {
  119. break;
  120. }
  121. //针对代码这里不处理插入代码的div
  122. val = node.getAttr("class");
  123. if (val && /^line number\d+/.test(val)) {
  124. break;
  125. }
  126. if (!allowDivTransToP) {
  127. break;
  128. }
  129. var tmpNode,
  130. p = UE.uNode.createElement("p");
  131. while ((tmpNode = node.firstChild())) {
  132. if (
  133. tmpNode.type == "text" ||
  134. !UE.dom.dtd.$block[tmpNode.tagName]
  135. ) {
  136. p.appendChild(tmpNode);
  137. } else {
  138. if (p.firstChild()) {
  139. node.parentNode.insertBefore(p, node);
  140. p = UE.uNode.createElement("p");
  141. } else {
  142. node.parentNode.insertBefore(tmpNode, node);
  143. }
  144. }
  145. }
  146. if (p.firstChild()) {
  147. node.parentNode.insertBefore(p, node);
  148. }
  149. node.parentNode.removeChild(node);
  150. break;
  151. case "dl":
  152. node.tagName = "ul";
  153. break;
  154. case "dt":
  155. case "dd":
  156. node.tagName = "li";
  157. break;
  158. case "li":
  159. var className = node.getAttr("class");
  160. if (!className || !/list\-/.test(className)) {
  161. node.setAttr();
  162. }
  163. var tmpNodes = node.getNodesByTagName("ol ul");
  164. UE.utils.each(tmpNodes, function(n) {
  165. node.parentNode.insertAfter(n, node);
  166. });
  167. break;
  168. case "td":
  169. case "th":
  170. case "caption":
  171. if (!node.children || !node.children.length) {
  172. node.appendChild(
  173. browser.ie11below
  174. ? UE.uNode.createText(" ")
  175. : UE.uNode.createElement("br")
  176. );
  177. }
  178. break;
  179. case "table":
  180. if (me.options.disabledTableInTable && tdParent(node)) {
  181. node.parentNode.insertBefore(
  182. UE.uNode.createText(node.innerText()),
  183. node
  184. );
  185. node.parentNode.removeChild(node);
  186. }
  187. }
  188. }
  189. // if(node.type == 'comment'){
  190. // node.parentNode.removeChild(node);
  191. // }
  192. });
  193. });
  194. //从编辑器出去的内容处理
  195. me.addOutputRule(function(root) {
  196. var val;
  197. root.traversal(function(node) {
  198. if (node.type == "element") {
  199. if (
  200. me.options.autoClearEmptyNode &&
  201. dtd.$inline[node.tagName] &&
  202. !dtd.$empty[node.tagName] &&
  203. (!node.attrs || utils.isEmptyObject(node.attrs))
  204. ) {
  205. if (!node.firstChild()) node.parentNode.removeChild(node);
  206. else if (
  207. node.tagName == "span" &&
  208. (!node.attrs || utils.isEmptyObject(node.attrs))
  209. ) {
  210. node.parentNode.removeChild(node, true);
  211. }
  212. return;
  213. }
  214. switch (node.tagName) {
  215. case "div":
  216. if ((val = node.getAttr("cdata_tag"))) {
  217. node.tagName = val;
  218. node.appendChild(UE.uNode.createText(node.getAttr("cdata_data")));
  219. node.setAttr({
  220. cdata_tag: "",
  221. cdata_data: "",
  222. _ue_custom_node_: ""
  223. });
  224. }
  225. break;
  226. case "a":
  227. if ((val = node.getAttr("_href"))) {
  228. node.setAttr({
  229. href: utils.html(val),
  230. _href: ""
  231. });
  232. }
  233. break;
  234. break;
  235. case "span":
  236. val = node.getAttr("id");
  237. if (val && /^_baidu_bookmark_/i.test(val)) {
  238. node.parentNode.removeChild(node);
  239. }
  240. //将color的rgb格式转换为#16进制格式
  241. if (me.getOpt("rgb2Hex")) {
  242. var cssStyle = node.getAttr("style");
  243. if (cssStyle) {
  244. node.setAttr(
  245. "style",
  246. cssStyle.replace(/rgba?\(([\d,\s]+)\)/g, function(a, value) {
  247. var array = value.split(",");
  248. if (array.length > 3) return "";
  249. value = "#";
  250. for (var i = 0, color; (color = array[i++]); ) {
  251. color = parseInt(
  252. color.replace(/[^\d]/gi, ""),
  253. 10
  254. ).toString(16);
  255. value += color.length == 1 ? "0" + color : color;
  256. }
  257. return value.toUpperCase();
  258. })
  259. );
  260. }
  261. }
  262. break;
  263. case "img":
  264. if ((val = node.getAttr("_src"))) {
  265. node.setAttr({
  266. src: node.getAttr("_src"),
  267. _src: ""
  268. });
  269. }
  270. }
  271. }
  272. });
  273. });
  274. };