      1 ﻿/*
      2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
      3 For licensing, see LICENSE.html or http://ckeditor.com/license
      4 */
      5
      6 /**
      7  * @file Paste as plain text plugin
      8  */
      9
     10 (function()
     11 {
     12 	// The pastetext command definition.
     13 	var pasteTextCmd =
     14 	{
     15 		exec : function( editor )
     16 		{
     17 			// We use getClipboardData just to test if the clipboard access has
     18 			// been granted by the user.
     19 			if ( CKEDITOR.getClipboardData() === false || !window.clipboardData )
     20 			{
     21 				editor.openDialog( 'pastetext' );
     22 				return;
     23 			}
     24
     25 			editor.insertText( window.clipboardData.getData( 'Text' ) );
     26 		}
     27 	};
     28
     29 	// Register the plugin.
     30 	CKEDITOR.plugins.add( 'pastetext',
     31 	{
     32 		init : function( editor )
     33 		{
     34 			var commandName = 'pastetext',
     35 				command = editor.addCommand( commandName, pasteTextCmd );
     36
     37 			editor.ui.addButton( 'PasteText',
     38 				{
     39 					label : editor.lang.pasteText.button,
     40 					command : commandName
     41 				});
     42
     43 			CKEDITOR.dialog.add( commandName, CKEDITOR.getUrl( this.path + 'dialogs/pastetext.js' ) );
     44
     45 			if ( editor.config.forcePasteAsPlainText )
     46 			{
     47 				editor.on( 'beforePaste', function( event )
     48 					{
     49 						setTimeout( function() { command.exec(); }, 0 );
     50 						event.cancel();
     51 					},
     52 					null, null, 20 );
     53 			}
     54 		},
     55 		requires : [ 'clipboard' ]
     56 	});
     57
     58 	var clipboardDiv;
     59
     60 	CKEDITOR.getClipboardData = function()
     61 	{
     62 		if ( !CKEDITOR.env.ie )
     63 			return false;
     64
     65 		var doc = CKEDITOR.document,
     66 			body = doc.getBody();
     67
     68 		if ( !clipboardDiv )
     69 		{
     70 			clipboardDiv = doc.createElement( 'div',
     71 				{
     72 					attributes :
     73 						{
     74 							id: 'cke_hiddenDiv'
     75 						},
     76 					styles :
     77 						{
     78 							position : 'absolute',
     79 							visibility : 'hidden',
     80 							overflow : 'hidden',
     81 							width : '1px',
     82 							height : '1px'
     83 						}
     84 				});
     85
     86 			clipboardDiv.setHtml( '' );
     87
     88 			clipboardDiv.appendTo( body );
     89 		}
     90
     91 		// The "enabled" flag is used to check whether the paste operation has
     92 		// been completed (the onpaste event has been fired).
     93 		var	enabled = false;
     94 		var setEnabled = function()
     95 		{
     96 			enabled = true;
     97 		};
     98
     99 		body.on( 'paste', setEnabled );
    100
    101 		// Create a text range and move it inside the div.
    102 		var textRange = body.$.createTextRange();
    103 		textRange.moveToElementText( clipboardDiv.$ );
    104
    105 		// The execCommand in will fire the "onpaste", only if the
    106 		// security settings are enabled.
    107 		textRange.execCommand( 'Paste' );
    108
    109 		// Get the DIV html and reset it.
    110 		var html = clipboardDiv.getHtml();
    111 		clipboardDiv.setHtml( '' );
    112
    113 		body.removeListener( 'paste', setEnabled );
    114
    115 		// Return the HTML or false if not enabled.
    116 		return enabled && html;
    117 	};
    118 })();
    119
    120 CKEDITOR.editor.prototype.insertText = function( text )
    121 {
    122 	text = CKEDITOR.tools.htmlEncode( text );
    123
    124 	// TODO: Replace the following with fill line break processing (see V2).
    125 	text = text.replace( /(?:\r\n)|\n|\r/g, '<br>' );
    126
    127 	this.insertHtml( text );
    128 };
    129
    130 CKEDITOR.config.forcePasteAsPlainText = false;
    131