pagebreak.js 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. /**
  2. * 分页功能插件
  3. * @file
  4. * @since 1.2.6.1
  5. */
  6. UE.plugins["pagebreak"] = function() {
  7. var me = this,
  8. notBreakTags = ["td"];
  9. me.setOpt("pageBreakTag", "_ueditor_page_break_tag_");
  10. function fillNode(node) {
  11. if (domUtils.isEmptyBlock(node)) {
  12. var firstChild = node.firstChild,
  13. tmpNode;
  14. while (
  15. firstChild &&
  16. firstChild.nodeType == 1 &&
  17. domUtils.isEmptyBlock(firstChild)
  18. ) {
  19. tmpNode = firstChild;
  20. firstChild = firstChild.firstChild;
  21. }
  22. !tmpNode && (tmpNode = node);
  23. domUtils.fillNode(me.document, tmpNode);
  24. }
  25. }
  26. //分页符样式添加
  27. me.ready(function() {
  28. utils.cssRule(
  29. "pagebreak",
  30. ".pagebreak{display:block;clear:both !important;cursor:default !important;width: 100% !important;margin:0;}",
  31. me.document
  32. );
  33. });
  34. function isHr(node) {
  35. return (
  36. node &&
  37. node.nodeType == 1 &&
  38. node.tagName == "HR" &&
  39. node.className == "pagebreak"
  40. );
  41. }
  42. me.addInputRule(function(root) {
  43. root.traversal(function(node) {
  44. if (node.type == "text" && node.data == me.options.pageBreakTag) {
  45. var hr = UE.uNode.createElement(
  46. '<hr class="pagebreak" noshade="noshade" size="5" style="-webkit-user-select: none;">'
  47. );
  48. node.parentNode.insertBefore(hr, node);
  49. node.parentNode.removeChild(node);
  50. }
  51. });
  52. });
  53. me.addOutputRule(function(node) {
  54. utils.each(node.getNodesByTagName("hr"), function(n) {
  55. if (n.getAttr("class") == "pagebreak") {
  56. var txt = UE.uNode.createText(me.options.pageBreakTag);
  57. n.parentNode.insertBefore(txt, n);
  58. n.parentNode.removeChild(n);
  59. }
  60. });
  61. });
  62. /**
  63. * 插入分页符
  64. * @command pagebreak
  65. * @method execCommand
  66. * @param { String } cmd 命令字符串
  67. * @remind 在表格中插入分页符会把表格切分成两部分
  68. * @remind 获取编辑器内的数据时, 编辑器会把分页符转换成“_ueditor_page_break_tag_”字符串,
  69. * 以便于提交数据到服务器端后处理分页。
  70. * @example
  71. * ```javascript
  72. * editor.execCommand( 'pagebreak'); //插入一个hr标签,带有样式类名pagebreak
  73. * ```
  74. */
  75. me.commands["pagebreak"] = {
  76. execCommand: function() {
  77. var range = me.selection.getRange(),
  78. hr = me.document.createElement("hr");
  79. domUtils.setAttributes(hr, {
  80. class: "pagebreak",
  81. noshade: "noshade",
  82. size: "5"
  83. });
  84. domUtils.unSelectable(hr);
  85. //table单独处理
  86. var node = domUtils.findParentByTagName(
  87. range.startContainer,
  88. notBreakTags,
  89. true
  90. ),
  91. parents = [],
  92. pN;
  93. if (node) {
  94. switch (node.tagName) {
  95. case "TD":
  96. pN = node.parentNode;
  97. if (!pN.previousSibling) {
  98. var table = domUtils.findParentByTagName(pN, "table");
  99. // var tableWrapDiv = table.parentNode;
  100. // if(tableWrapDiv && tableWrapDiv.nodeType == 1
  101. // && tableWrapDiv.tagName == 'DIV'
  102. // && tableWrapDiv.getAttribute('dropdrag')
  103. // ){
  104. // domUtils.remove(tableWrapDiv,true);
  105. // }
  106. table.parentNode.insertBefore(hr, table);
  107. parents = domUtils.findParents(hr, true);
  108. } else {
  109. pN.parentNode.insertBefore(hr, pN);
  110. parents = domUtils.findParents(hr);
  111. }
  112. pN = parents[1];
  113. if (hr !== pN) {
  114. domUtils.breakParent(hr, pN);
  115. }
  116. //table要重写绑定一下拖拽
  117. me.fireEvent("afteradjusttable", me.document);
  118. }
  119. } else {
  120. if (!range.collapsed) {
  121. range.deleteContents();
  122. var start = range.startContainer;
  123. while (
  124. !domUtils.isBody(start) &&
  125. domUtils.isBlockElm(start) &&
  126. domUtils.isEmptyNode(start)
  127. ) {
  128. range.setStartBefore(start).collapse(true);
  129. domUtils.remove(start);
  130. start = range.startContainer;
  131. }
  132. }
  133. range.insertNode(hr);
  134. var pN = hr.parentNode,
  135. nextNode;
  136. while (!domUtils.isBody(pN)) {
  137. domUtils.breakParent(hr, pN);
  138. nextNode = hr.nextSibling;
  139. if (nextNode && domUtils.isEmptyBlock(nextNode)) {
  140. domUtils.remove(nextNode);
  141. }
  142. pN = hr.parentNode;
  143. }
  144. nextNode = hr.nextSibling;
  145. var pre = hr.previousSibling;
  146. if (isHr(pre)) {
  147. domUtils.remove(pre);
  148. } else {
  149. pre && fillNode(pre);
  150. }
  151. if (!nextNode) {
  152. var p = me.document.createElement("p");
  153. hr.parentNode.appendChild(p);
  154. domUtils.fillNode(me.document, p);
  155. range.setStart(p, 0).collapse(true);
  156. } else {
  157. if (isHr(nextNode)) {
  158. domUtils.remove(nextNode);
  159. } else {
  160. fillNode(nextNode);
  161. }
  162. range.setEndAfter(hr).collapse(false);
  163. }
  164. range.select(true);
  165. }
  166. }
  167. };
  168. };