text: /**
   * 设置文字输入的方向的插件
   * @file
   * @since 1.2.6.1
   */
  (function() {
      var block = domUtils.isBlockElm ,
          getObj = function(editor){
  //            var startNode = editor.selection.getStart(),
  //                parents;
  //            if ( startNode ) {
  //                //查找所有的是block的父亲节点
  //                parents = domUtils.findParents( startNode, true, block, true );
  //                for ( var i = 0,ci; ci = parents[i++]; ) {
  //                    if ( ci.getAttribute( 'dir' ) ) {
  //                        return ci;
  //                    }
  //                }
  //            }
              return domUtils.filterNodeList(editor.selection.getStartElementPath(),function(n){return n && n.nodeType == 1 && n.getAttribute('dir')});
  
          },
          doDirectionality = function(range,editor,forward){
              
              var bookmark,
                  filterFn = function( node ) {
                      return   node.nodeType == 1 ? !domUtils.isBookmarkNode(node) : !domUtils.isWhitespace(node);
                  },
  
                  obj = getObj( editor );
  
              if ( obj && range.collapsed ) {
                  obj.setAttribute( 'dir', forward );
                  return range;
              }
              bookmark = range.createBookmark();
              range.enlarge( true );
              var bookmark2 = range.createBookmark(),
                  current = domUtils.getNextDomNode( bookmark2.start, false, filterFn ),
                  tmpRange = range.cloneRange(),
                  tmpNode;
              while ( current &&  !(domUtils.getPosition( current, bookmark2.end ) & domUtils.POSITION_FOLLOWING) ) {
                  if ( current.nodeType == 3 || !block( current ) ) {
                      tmpRange.setStartBefore( current );
                      while ( current && current !== bookmark2.end && !block( current ) ) {
                          tmpNode = current;
                          current = domUtils.getNextDomNode( current, false, null, function( node ) {
                              return !block( node );
                          } );
                      }
                      tmpRange.setEndAfter( tmpNode );
                      var common = tmpRange.getCommonAncestor();
                      if ( !domUtils.isBody( common ) && block( common ) ) {
                          //遍历到了block节点
                          common.setAttribute( 'dir', forward );
                          current = common;
                      } else {
                          //没有遍历到，添加一个block节点
                          var p = range.document.createElement( 'p' );
                          p.setAttribute( 'dir', forward );
                          var frag = tmpRange.extractContents();
                          p.appendChild( frag );
                          tmpRange.insertNode( p );
                          current = p;
                      }
  
                      current = domUtils.getNextDomNode( current, false, filterFn );
                  } else {
                      current = domUtils.getNextDomNode( current, true, filterFn );
                  }
              }
              return range.moveToBookmark( bookmark2 ).moveToBookmark( bookmark );
          };
  
      /**
       * 文字输入方向
       * @command directionality
       * @method execCommand
       * @param { String } cmdName 命令字符串
       * @param { String } forward 传入'ltr'表示从左向右输入，传入'rtl'表示从右向左输入
       * @example
       * ```javascript
       * editor.execCommand( 'directionality', 'ltr');
       * ```
       */
  
      /**
       * 查询当前选区的文字输入方向
       * @command directionality
       * @method queryCommandValue
       * @param { String } cmdName 命令字符串
       * @return { String } 返回'ltr'表示从左向右输入，返回'rtl'表示从右向左输入
       * @example
       * ```javascript
       * editor.queryCommandValue( 'directionality');
       * ```
       */
      UE.commands['directionality'] = {
          execCommand : function( cmdName,forward ) {
              var range = this.selection.getRange();
              //闭合时单独处理
              if(range.collapsed){
                  var txt = this.document.createTextNode('d');
                  range.insertNode(txt);
              }
              doDirectionality(range,this,forward);
              if(txt){
                  range.setStartBefore(txt).collapse(true);
                  domUtils.remove(txt);
              }
  
              range.select();
              return true;
          },
          queryCommandValue : function() {
              var node = getObj(this);
              return node ? node.getAttribute('dir') : 'ltr';
          }
      };
  })();
  
  