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