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;
 | 
						|
	}
 | 
						|
};
 |