paragraph.js 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  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. }
  46. para.appendChild( tmpRange.extractContents() );
  47. //需要内容占位
  48. if(domUtils.isEmptyNode(para)){
  49. domUtils.fillChar(range.document,para);
  50. }
  51. tmpRange.insertNode( para );
  52. var parent = para.parentNode;
  53. //如果para上一级是一个block元素且不是body,td就删除它
  54. if ( block( parent ) && !domUtils.isBody( para.parentNode ) && utils.indexOf(notExchange,parent.tagName)==-1) {
  55. //存储dir,style
  56. if(!(sourceCmdName && sourceCmdName == 'customstyle')){
  57. parent.getAttribute('dir') && para.setAttribute('dir',parent.getAttribute('dir'));
  58. //trace:1070
  59. parent.style.cssText && (para.style.cssText = parent.style.cssText + ';' + para.style.cssText);
  60. //trace:1030
  61. parent.style.textAlign && !para.style.textAlign && (para.style.textAlign = parent.style.textAlign);
  62. parent.style.textIndent && !para.style.textIndent && (para.style.textIndent = parent.style.textIndent);
  63. parent.style.padding && !para.style.padding && (para.style.padding = parent.style.padding);
  64. }
  65. //trace:1706 选择的就是h1-6要删除
  66. if(attrs && /h\d/i.test(parent.tagName) && !/h\d/i.test(para.tagName) ){
  67. domUtils.setAttributes(parent,attrs);
  68. if(sourceCmdName && sourceCmdName == 'customstyle' && attrs.style){
  69. parent.style.cssText = attrs.style;
  70. }
  71. domUtils.remove(para,true);
  72. para = parent;
  73. }else{
  74. domUtils.remove( para.parentNode, true );
  75. }
  76. }
  77. if( utils.indexOf(notExchange,parent.tagName)!=-1){
  78. current = parent;
  79. }else{
  80. current = para;
  81. }
  82. current = domUtils.getNextDomNode( current, false, filterFn );
  83. } else {
  84. current = domUtils.getNextDomNode( current, true, filterFn );
  85. }
  86. }
  87. return range.moveToBookmark( bookmark2 ).moveToBookmark( bookmark );
  88. };
  89. me.setOpt('paragraph',{'p':'', 'h1':'', 'h2':'', 'h3':'', 'h4':'', 'h5':'', 'h6':''});
  90. me.commands['paragraph'] = {
  91. execCommand : function( cmdName, style,attrs,sourceCmdName ) {
  92. var range = this.selection.getRange();
  93. //闭合时单独处理
  94. if(range.collapsed){
  95. var txt = this.document.createTextNode('p');
  96. range.insertNode(txt);
  97. //去掉冗余的fillchar
  98. if(browser.ie){
  99. var node = txt.previousSibling;
  100. if(node && domUtils.isWhitespace(node)){
  101. domUtils.remove(node);
  102. }
  103. node = txt.nextSibling;
  104. if(node && domUtils.isWhitespace(node)){
  105. domUtils.remove(node);
  106. }
  107. }
  108. }
  109. range = doParagraph(range,style,attrs,sourceCmdName);
  110. if(txt){
  111. range.setStartBefore(txt).collapse(true);
  112. pN = txt.parentNode;
  113. domUtils.remove(txt);
  114. if(domUtils.isBlockElm(pN)&&domUtils.isEmptyNode(pN)){
  115. domUtils.fillNode(this.document,pN);
  116. }
  117. }
  118. if(browser.gecko && range.collapsed && range.startContainer.nodeType == 1){
  119. var child = range.startContainer.childNodes[range.startOffset];
  120. if(child && child.nodeType == 1 && child.tagName.toLowerCase() == style){
  121. range.setStart(child,0).collapse(true);
  122. }
  123. }
  124. //trace:1097 原来有true,原因忘了,但去了就不能清除多余的占位符了
  125. range.select();
  126. return true;
  127. },
  128. queryCommandValue : function() {
  129. var node = domUtils.filterNodeList(this.selection.getStartElementPath(),'p h1 h2 h3 h4 h5 h6');
  130. return node ? node.tagName.toLowerCase() : '';
  131. }
  132. };
  133. };