subtitle.js 6.3 KB

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