172 lines
4.1 KiB
JavaScript
172 lines
4.1 KiB
JavaScript
/*
|
|
Copyright (c) 2003-2011, CKSource - Frederico Knabben. All rights reserved.
|
|
For licensing, see LICENSE.html or http://ckeditor.com/license
|
|
*/
|
|
|
|
/**
|
|
* @fileOverview The "placeholder" plugin.
|
|
*
|
|
*/
|
|
|
|
(function()
|
|
{
|
|
var placeholderReplaceRegex = /\[\[[^\]]+\]\]/g;
|
|
CKEDITOR.plugins.add( 'placeholder',
|
|
{
|
|
requires : [ 'dialog' ],
|
|
lang : [ 'en', 'he' ],
|
|
init : function( editor )
|
|
{
|
|
var lang = editor.lang.placeholder;
|
|
|
|
editor.addCommand( 'createplaceholder', new CKEDITOR.dialogCommand( 'createplaceholder' ) );
|
|
editor.addCommand( 'editplaceholder', new CKEDITOR.dialogCommand( 'editplaceholder' ) );
|
|
|
|
editor.ui.addButton( 'CreatePlaceholder',
|
|
{
|
|
label : lang.toolbar,
|
|
command :'createplaceholder',
|
|
icon : this.path + 'placeholder.gif'
|
|
});
|
|
|
|
if ( editor.addMenuItems )
|
|
{
|
|
editor.addMenuGroup( 'placeholder', 20 );
|
|
editor.addMenuItems(
|
|
{
|
|
editplaceholder :
|
|
{
|
|
label : lang.edit,
|
|
command : 'editplaceholder',
|
|
group : 'placeholder',
|
|
order : 1,
|
|
icon : this.path + 'placeholder.gif'
|
|
}
|
|
} );
|
|
|
|
if ( editor.contextMenu )
|
|
{
|
|
editor.contextMenu.addListener( function( element, selection )
|
|
{
|
|
if ( !element || !element.data( 'cke-placeholder' ) )
|
|
return null;
|
|
|
|
return { editplaceholder : CKEDITOR.TRISTATE_OFF };
|
|
} );
|
|
}
|
|
}
|
|
|
|
editor.on( 'doubleclick', function( evt )
|
|
{
|
|
if ( CKEDITOR.plugins.placeholder.getSelectedPlaceHoder( editor ) )
|
|
evt.data.dialog = 'editplaceholder';
|
|
});
|
|
|
|
editor.addCss(
|
|
'.cke_placeholder' +
|
|
'{' +
|
|
'background-color: #ffff00;' +
|
|
( CKEDITOR.env.gecko ? 'cursor: default;' : '' ) +
|
|
'}'
|
|
);
|
|
|
|
editor.on( 'contentDom', function()
|
|
{
|
|
editor.document.getBody().on( 'resizestart', function( evt )
|
|
{
|
|
if ( editor.getSelection().getSelectedElement().data( 'cke-placeholder' ) )
|
|
evt.data.preventDefault();
|
|
});
|
|
});
|
|
|
|
CKEDITOR.dialog.add( 'createplaceholder', this.path + 'dialogs/placeholder.js' );
|
|
CKEDITOR.dialog.add( 'editplaceholder', this.path + 'dialogs/placeholder.js' );
|
|
},
|
|
afterInit : function( editor )
|
|
{
|
|
var dataProcessor = editor.dataProcessor,
|
|
dataFilter = dataProcessor && dataProcessor.dataFilter,
|
|
htmlFilter = dataProcessor && dataProcessor.htmlFilter;
|
|
|
|
if ( dataFilter )
|
|
{
|
|
dataFilter.addRules(
|
|
{
|
|
text : function( text )
|
|
{
|
|
return text.replace( placeholderReplaceRegex, function( match )
|
|
{
|
|
return CKEDITOR.plugins.placeholder.createPlaceholder( editor, null, match, 1 );
|
|
});
|
|
}
|
|
});
|
|
}
|
|
|
|
if ( htmlFilter )
|
|
{
|
|
htmlFilter.addRules(
|
|
{
|
|
elements :
|
|
{
|
|
'span' : function( element )
|
|
{
|
|
if ( element.attributes && element.attributes[ 'data-cke-placeholder' ] )
|
|
delete element.name;
|
|
}
|
|
}
|
|
});
|
|
}
|
|
}
|
|
});
|
|
})();
|
|
|
|
CKEDITOR.plugins.placeholder =
|
|
{
|
|
createPlaceholder : function( editor, oldElement, text, isGet )
|
|
{
|
|
var element = new CKEDITOR.dom.element( 'span', editor.document );
|
|
element.setAttributes(
|
|
{
|
|
contentEditable : 'false',
|
|
'data-cke-placeholder' : 1,
|
|
'class' : 'cke_placeholder'
|
|
}
|
|
);
|
|
|
|
text && element.setText( text );
|
|
|
|
if ( isGet )
|
|
return element.getOuterHtml();
|
|
|
|
if ( oldElement )
|
|
{
|
|
if ( CKEDITOR.env.ie )
|
|
{
|
|
element.insertAfter( oldElement );
|
|
// Some time is required for IE before the element is removed.
|
|
setTimeout( function()
|
|
{
|
|
oldElement.remove();
|
|
element.focus();
|
|
}, 10 );
|
|
}
|
|
else
|
|
element.replace( oldElement );
|
|
}
|
|
else
|
|
editor.insertElement( element );
|
|
|
|
return null;
|
|
},
|
|
|
|
getSelectedPlaceHoder : function( editor )
|
|
{
|
|
var range = editor.getSelection().getRanges()[ 0 ];
|
|
range.shrink( CKEDITOR.SHRINK_TEXT );
|
|
var node = range.startContainer;
|
|
while( node && !( node.type == CKEDITOR.NODE_ELEMENT && node.data( 'cke-placeholder' ) ) )
|
|
node = node.getParent();
|
|
return node;
|
|
}
|
|
};
|