Ckeditor 具有多类选择的stylescombo插件

Ckeditor 具有多类选择的stylescombo插件,ckeditor,Ckeditor,我合并了stylesheetparser和stylescombo插件,并希望从组合中选择多个类。我在onOpen和onClick函数中做了一些更改: onOpen: function() { var selection = editor.getSelection(), selectedElement = selection.getSelectedElement(), selectedRanges = !selectedElement &&

我合并了stylesheetparser和stylescombo插件,并希望从组合中选择多个类。我在onOpen和onClick函数中做了一些更改:

onOpen: function() {
    var selection = editor.getSelection(),
        selectedElement = selection.getSelectedElement(),
        selectedRanges = !selectedElement && selection.getRanges(),
        selectedText = !selectedElement && selection.getSelectedText(),
        nativeRange,
        elementPath = editor.elementPath(),
        element,
        counter = [ 0, 0, 0, 0 ];

    this.showAll();
    this.unmarkAll();
    for ( var name in styles ) {
        var style = styles[ name ],
            type = style._.type;

        if(type == CKEDITOR.STYLE_OBJECT && (selectedElement || selectedText))
            element = !selectedText ? selectedElement : selectedText;

        else if((type == CKEDITOR.STYLE_BLOCK || type == CKEDITOR.STYLE_INLINE) && !selectedText && !selectedElement && selectedRanges[ 0 ] && selectedRanges[ 0 ].getCommonAncestor( 1 ))
            element = selectedRanges[ 0 ].getCommonAncestor( 1 ).getAscendant( style.element );

        else if(type == CKEDITOR.STYLE_INLINE && selectedText && !selectedElement)
            element = selectedText;

        if(element != null) {
            if(style.checkApplicable( elementPath, editor, editor.activeFilter )) {
                counter[ type ]++;

                var classes = !selectedText ? element.getAttribute( 'class' ) : null,
                    classArr = classes != null ? classes.split(' ') : [];

                if(classArr.length > 0) {
                    for(var i = 0; i < classArr.length; i++) {
                        if(classArr[i] == style._.definition.attributes['class'])
                            this.mark( name );
                    }
                }
            }
            else
                this.hideItem( name );
        }
    }

    if ( !counter[ CKEDITOR.STYLE_BLOCK ] )
        this.hideGroup( lang[ 'panelTitle' + String( CKEDITOR.STYLE_BLOCK ) ] );

    if ( !counter[ CKEDITOR.STYLE_INLINE ] )
        this.hideGroup( lang[ 'panelTitle' + String( CKEDITOR.STYLE_INLINE ) ] );

    if ( !counter[ CKEDITOR.STYLE_OBJECT ] )
        this.hideGroup( lang[ 'panelTitle' + String( CKEDITOR.STYLE_OBJECT ) ] );
},
onClick: function( value ) {
    editor.focus();
    editor.fire( 'saveSnapshot' );

    var style = styles[ value ],
        type = style._.type,
        selection = editor.getSelection(),
        selectedElement = selection.getSelectedElement(),
        selectedRanges = !selectedElement && selection.getRanges(),
        selectedText = !selectedElement && selection.getSelectedText(),
        element;

    if(type == CKEDITOR.STYLE_OBJECT && (selectedElement || selectedText))
        element = !selectedText ? selectedElement : selectedText;

    else if((type == CKEDITOR.STYLE_BLOCK || type == CKEDITOR.STYLE_INLINE) && !selectedText && !selectedElement && selectedRanges[ 0 ] && selectedRanges[ 0 ].getCommonAncestor( 1 )) 
        element = selectedRanges[ 0 ].getCommonAncestor( 1 ).getAscendant( style.element );

    else if(type == CKEDITOR.STYLE_INLINE && selectedText && !selectedElement)
        element = selectedText;

    if(element != null) {
        var classes = !selectedText ? element.getAttribute( 'class' ) : null,
            classArr = classes != null ? classes.split(' ') : [],
            selClass = style._.definition.attributes['class'],
            styleClasses = CKEDITOR.tools.clone( style );

        if(classArr.length > 0 && contains(classArr, selClass) && !selectedText) {
            var newClassArr = new Array();
            for(var i = 0; i < classArr.length; i++) {
                if(classArr[i] != selClass)
                    newClassArr.push(classArr[i]);
            }

            if(newClassArr.length == 0) {
                editor.removeStyle( styleClasses );
            }
            else {
                styleClasses._.definition.attributes['class'] = newClassArr.join(' ');
                editor.applyStyle( styleClasses );
            }
        }
        else {
            classArr.push(selClass);
            styleClasses._.definition.attributes['class'] = classArr.join(' ');
            editor.applyStyle( styleClasses );
        }
    }

    editor.fire( 'saveSnapshot' );
},
onOpen:function(){
var selection=editor.getSelection(),
selectedElement=selection.getSelectedElement(),
selectedRanges=!selectedElement&&selection.getRanges(),
selectedText=!selectedElement&&selection.getSelectedText(),
全国,
elementPath=editor.elementPath(),
元素,
计数器=[0,0,0,0];
this.showAll();
this.unmarkAll();
for(样式中的变量名称){
var style=样式[名称],
类型=样式。\类型;
if(type==CKEDITOR.STYLE_OBJECT&&(selectedElement | | selectedText))
元素=!selectedText?selectedElement:selectedText;
else if((type==CKEDITOR.STYLE_BLOCK | | type==CKEDITOR.STYLE_INLINE)&&&!selectedText&!selectedElement&&selectedRanges[0]&&selectedRanges[0]。GetCommon祖先(1))
element=selectedRanges[0]。GetCommonAstenant(1)。GetAstenant(style.element);
else if(type==CKEDITOR.STYLE_INLINE&&selectedText&&selectedElement)
元素=选定的文本;
if(元素!=null){
if(style.checkapplicative(elementPath、editor、editor.activeFilter)){
计数器[类型]+;
var classes=!selectedText?element.getAttribute('class'):null,
classArr=classes!=null?classes.split(“”):[];
如果(classArr.length>0){
对于(变量i=0;i0&&contains(classArr,selClass)&&&selectedText){
var newClassArr=新数组();
对于(变量i=0;i
它适用于块元素和图像(未选中假元素),您可以选择和取消选择所需的所有类。但是我在内联元素方面有一些问题

如果我在块元素内单击,它将列出该元素的所有类,并且我可以选择/取消选择我想要/需要的。如果在内联元素中单击,则不会发生任何事情。getAscendant()找不到内联元素标记吗

如果我选择text,它将列出内联元素的所有类。但我只想要跨类,而不是强类。只有在选择强元素时,强标记的类才可用。可能吗?如何区分不同的内联元素

为什么定位点是对象而不是内联元素?如果我双击一个锚并关闭链接对话框,我可以选择一个锚类

如果没有可用的类,如何禁用组合?我找不到合适的地方。 如何禁用类选择上的组合关闭?如果选择的类是在关闭后设置的,请忘记这个问题-我可以接受它:-)

下面是一个演示:

完整文件:test/plugins/cssclasscombo/plugin.js

插件名为zip:test/plugins/cssclasscombo.zip

如果您尝试该插件,请设置

config.contentsCss = ['contents.css']; // <= it reads the classes from this file
config.extraPlugins = 'cssclasscombo';
config.removePlugins = 'stylescombo';
config.stylesSet = [];
config.allowedContent = true;
// the plugin works with indent and justify classes =>
config.justifyClasses = [ 'alignleft', 'aligncenter', 'alignright', 'alignjustify' ];
config.indentClasses = [ 'indent1', 'indent2', 'indent3', 'indent4', 'indent5' ];
config.contentsCss=['contents.css'];//
config.justifyClasses=['alignleft','aligncenter','alignright','alignjustify'];
config.indentClasses=['indent1','indent2','indent3','indent4','indent5'];
到您的配置并使用此CSS文件:


Thanx的帮助

它并不完美,但插件现在可以工作了。如果你需要的话,这是你要做的
config.removePlugins = 'stylescombo';
config.extraPlugins = 'cssclasscombo';
config.stylesSet = [];
config.contentsCss = ['contents.css']; // <= classes are read from this file(s)