pagebreak.js 5.9 KB

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