paragraph.js 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. ///import core
  2. ///commands 格式
  3. ///commandsName Paragraph
  4. ///commandsTitle 段落格式
  5. /**
  6. * 段落样式
  7. * @function
  8. * @name baidu.editor.execCommand
  9. * @param {String} cmdName paragraph插入段落执行命令
  10. * @param {String} style 标签值为:'p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6'
  11. * @param {String} attrs 标签的属性
  12. * @author zhanyi
  13. */
  14. UE.plugins['paragraph'] = function() {
  15. var me = this,
  16. block = domUtils.isBlockElm,
  17. notExchange = ['TD','LI','PRE'],
  18. doParagraph = function(range,style,attrs,sourceCmdName){
  19. var bookmark = range.createBookmark(),
  20. filterFn = function( node ) {
  21. return node.nodeType == 1 ? node.tagName.toLowerCase() != 'br' && !domUtils.isBookmarkNode(node) : !domUtils.isWhitespace( node )
  22. },
  23. para;
  24. range.enlarge( true );
  25. var bookmark2 = range.createBookmark(),
  26. current = domUtils.getNextDomNode( bookmark2.start, false, filterFn ),
  27. tmpRange = range.cloneRange(),
  28. tmpNode;
  29. while ( current && !(domUtils.getPosition( current, bookmark2.end ) & domUtils.POSITION_FOLLOWING) ) {
  30. if ( current.nodeType == 3 || !block( current ) ) {
  31. tmpRange.setStartBefore( current );
  32. while ( current && current !== bookmark2.end && !block( current ) ) {
  33. tmpNode = current;
  34. current = domUtils.getNextDomNode( current, false, null, function( node ) {
  35. return !block( node )
  36. } );
  37. }
  38. tmpRange.setEndAfter( tmpNode );
  39. para = range.document.createElement( style );
  40. if(attrs){
  41. domUtils.setAttributes(para,attrs);
  42. if(sourceCmdName && sourceCmdName == 'customstyle' && attrs.style)
  43. para.style.cssText = attrs.style;
  44. }
  45. para.appendChild( tmpRange.extractContents() );
  46. //需要内容占位
  47. if(domUtils.isEmptyNode(para)){
  48. domUtils.fillChar(range.document,para);
  49. }
  50. tmpRange.insertNode( para );
  51. var parent = para.parentNode;
  52. //如果para上一级是一个block元素且不是body,td就删除它
  53. if ( block( parent ) && !domUtils.isBody( para.parentNode ) && utils.indexOf(notExchange,parent.tagName)==-1) {
  54. //存储dir,style
  55. if(!(sourceCmdName && sourceCmdName == 'customstyle')){
  56. parent.getAttribute('dir') && para.setAttribute('dir',parent.getAttribute('dir'));
  57. //trace:1070
  58. parent.style.cssText && (para.style.cssText = parent.style.cssText + ';' + para.style.cssText);
  59. //trace:1030
  60. parent.style.textAlign && !para.style.textAlign && (para.style.textAlign = parent.style.textAlign);
  61. parent.style.textIndent && !para.style.textIndent && (para.style.textIndent = parent.style.textIndent);
  62. parent.style.padding && !para.style.padding && (para.style.padding = parent.style.padding);
  63. }
  64. //trace:1706 选择的就是h1-6要删除
  65. if(attrs && /h\d/i.test(parent.tagName) && !/h\d/i.test(para.tagName) ){
  66. domUtils.setAttributes(parent,attrs);
  67. if(sourceCmdName && sourceCmdName == 'customstyle' && attrs.style)
  68. parent.style.cssText = attrs.style;
  69. domUtils.remove(para,true);
  70. para = parent;
  71. }else
  72. domUtils.remove( para.parentNode, true );
  73. }
  74. if( utils.indexOf(notExchange,parent.tagName)!=-1){
  75. current = parent;
  76. }else{
  77. current = para;
  78. }
  79. current = domUtils.getNextDomNode( current, false, filterFn );
  80. } else {
  81. current = domUtils.getNextDomNode( current, true, filterFn );
  82. }
  83. }
  84. return range.moveToBookmark( bookmark2 ).moveToBookmark( bookmark );
  85. };
  86. me.setOpt('paragraph',['p:段落', 'h1:标题 1', 'h2:标题 2', 'h3:标题 3', 'h4:标题 4', 'h5:标题 5', 'h6:标题 6']);
  87. me.commands['paragraph'] = {
  88. execCommand : function( cmdName, style,attrs,sourceCmdName ) {
  89. var range = new dom.Range(this.document);
  90. if(this.currentSelectedArr && this.currentSelectedArr.length > 0){
  91. for(var i=0,ti;ti=this.currentSelectedArr[i++];){
  92. //trace:1079 不显示的不处理,插入文本,空的td也能加上相应的标签
  93. if(ti.style.display == 'none') continue;
  94. if(domUtils.isEmptyNode(ti)){
  95. var tmpTxt = this.document.createTextNode('paragraph');
  96. ti.innerHTML = '';
  97. ti.appendChild(tmpTxt);
  98. }
  99. doParagraph(range.selectNodeContents(ti),style,attrs,sourceCmdName);
  100. if(tmpTxt){
  101. var pN = tmpTxt.parentNode;
  102. domUtils.remove(tmpTxt);
  103. if(domUtils.isEmptyNode(pN)){
  104. domUtils.fillNode(this.document,pN)
  105. }
  106. }
  107. }
  108. var td = this.currentSelectedArr[0];
  109. if(domUtils.isEmptyBlock(td)){
  110. range.setStart(td,0).setCursor(false,true);
  111. }else{
  112. range.selectNode(td).select()
  113. }
  114. }else{
  115. range = this.selection.getRange();
  116. //闭合时单独处理
  117. if(range.collapsed){
  118. var txt = this.document.createTextNode('p');
  119. range.insertNode(txt);
  120. //去掉冗余的fillchar
  121. if(browser.ie){
  122. var node = txt.previousSibling;
  123. if(node && domUtils.isWhitespace(node)){
  124. domUtils.remove(node)
  125. }
  126. node = txt.nextSibling;
  127. if(node && domUtils.isWhitespace(node)){
  128. domUtils.remove(node)
  129. }
  130. }
  131. }
  132. range = doParagraph(range,style,attrs,sourceCmdName);
  133. if(txt){
  134. range.setStartBefore(txt).collapse(true);
  135. pN = txt.parentNode;
  136. domUtils.remove(txt);
  137. if(domUtils.isBlockElm(pN)&&domUtils.isEmptyNode(pN)){
  138. domUtils.fillNode(this.document,pN)
  139. }
  140. }
  141. if(browser.gecko && range.collapsed && range.startContainer.nodeType == 1){
  142. var child = range.startContainer.childNodes[range.startOffset];
  143. if(child && child.nodeType == 1 && child.tagName.toLowerCase() == style){
  144. range.setStart(child,0).collapse(true)
  145. }
  146. }
  147. //trace:1097 原来有true,原因忘了,但去了就不能清除多余的占位符了
  148. range.select()
  149. }
  150. return true;
  151. },
  152. queryCommandValue : function() {
  153. var node = utils.findNode(this.selection.getStartElementPath(),['p','h1','h2','h3','h4','h5','h6']);
  154. return node ? node.tagName.toLowerCase() : '';
  155. },
  156. queryCommandState : function(){
  157. return this.highlight ? -1 :0;
  158. }
  159. }
  160. };