| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172 | /** * 添加引用 * @file * @since 1.2.6.1 *//** * 添加引用 * @command blockquote * @method execCommand * @param { String } cmd 命令字符串 * @example * ```javascript * editor.execCommand( 'blockquote' ); * ``` *//** * 添加引用 * @command blockquote * @method execCommand * @param { String } cmd 命令字符串 * @param { Object } attrs 节点属性 * @example * ```javascript * editor.execCommand( 'blockquote',{ *     style: "color: red;" * } ); * ``` */UE.plugins['blockquote'] = function(){    var me = this;    function getObj(editor){        return domUtils.filterNodeList(editor.selection.getStartElementPath(),'blockquote');    }    me.commands['blockquote'] = {        execCommand : function( cmdName, attrs ) {            var range = this.selection.getRange(),                obj = getObj(this),                blockquote = dtd.blockquote,                bookmark = range.createBookmark();            if ( obj ) {                    var start = range.startContainer,                        startBlock = domUtils.isBlockElm(start) ? start : domUtils.findParent(start,function(node){return domUtils.isBlockElm(node)}),                        end = range.endContainer,                        endBlock = domUtils.isBlockElm(end) ? end :  domUtils.findParent(end,function(node){return domUtils.isBlockElm(node)});                    //处理一下li                    startBlock = domUtils.findParentByTagName(startBlock,'li',true) || startBlock;                    endBlock = domUtils.findParentByTagName(endBlock,'li',true) || endBlock;                    if(startBlock.tagName == 'LI' || startBlock.tagName == 'TD' || startBlock === obj || domUtils.isBody(startBlock)){                        domUtils.remove(obj,true);                    }else{                        domUtils.breakParent(startBlock,obj);                    }                    if(startBlock !== endBlock){                        obj = domUtils.findParentByTagName(endBlock,'blockquote');                        if(obj){                            if(endBlock.tagName == 'LI' || endBlock.tagName == 'TD'|| domUtils.isBody(endBlock)){                                obj.parentNode && domUtils.remove(obj,true);                            }else{                                domUtils.breakParent(endBlock,obj);                            }                        }                    }                    var blockquotes = domUtils.getElementsByTagName(this.document,'blockquote');                    for(var i=0,bi;bi=blockquotes[i++];){                        if(!bi.childNodes.length){                            domUtils.remove(bi);                        }else if(domUtils.getPosition(bi,startBlock)&domUtils.POSITION_FOLLOWING && domUtils.getPosition(bi,endBlock)&domUtils.POSITION_PRECEDING){                            domUtils.remove(bi,true);                        }                    }            } else {                var tmpRange = range.cloneRange(),                    node = tmpRange.startContainer.nodeType == 1 ? tmpRange.startContainer : tmpRange.startContainer.parentNode,                    preNode = node,                    doEnd = 1;                //调整开始                while ( 1 ) {                    if ( domUtils.isBody(node) ) {                        if ( preNode !== node ) {                            if ( range.collapsed ) {                                tmpRange.selectNode( preNode );                                doEnd = 0;                            } else {                                tmpRange.setStartBefore( preNode );                            }                        }else{                            tmpRange.setStart(node,0);                        }                        break;                    }                    if ( !blockquote[node.tagName] ) {                        if ( range.collapsed ) {                            tmpRange.selectNode( preNode );                        } else{                            tmpRange.setStartBefore( preNode);                        }                        break;                    }                    preNode = node;                    node = node.parentNode;                }                //调整结束                if ( doEnd ) {                    preNode = node =  node = tmpRange.endContainer.nodeType == 1 ? tmpRange.endContainer : tmpRange.endContainer.parentNode;                    while ( 1 ) {                        if ( domUtils.isBody( node ) ) {                            if ( preNode !== node ) {                                tmpRange.setEndAfter( preNode );                            } else {                                tmpRange.setEnd( node, node.childNodes.length );                            }                            break;                        }                        if ( !blockquote[node.tagName] ) {                            tmpRange.setEndAfter( preNode );                            break;                        }                        preNode = node;                        node = node.parentNode;                    }                }                node = range.document.createElement( 'blockquote' );                domUtils.setAttributes( node, attrs );                node.appendChild( tmpRange.extractContents() );                tmpRange.insertNode( node );                //去除重复的                var childs = domUtils.getElementsByTagName(node,'blockquote');                for(var i=0,ci;ci=childs[i++];){                    if(ci.parentNode){                        domUtils.remove(ci,true);                    }                }            }            range.moveToBookmark( bookmark ).select();        },        queryCommandState : function() {            return getObj(this) ? 1 : 0;        }    };};
 |