/** * 设置文字输入的方向的插件 * @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'; } }; })();