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