136 lines
3.6 KiB
JavaScript
136 lines
3.6 KiB
JavaScript
/*
|
|
Copyright (c) 2003-2011, CKSource - Frederico Knabben. All rights reserved.
|
|
For licensing, see LICENSE.html or http://ckeditor.com/license
|
|
*/
|
|
(function()
|
|
{
|
|
CKEDITOR.plugins.add( 'pastefromword',
|
|
{
|
|
init : function( editor )
|
|
{
|
|
|
|
// Flag indicate this command is actually been asked instead of a generic
|
|
// pasting.
|
|
var forceFromWord = 0;
|
|
var resetFromWord = function( evt )
|
|
{
|
|
evt && evt.removeListener();
|
|
forceFromWord && setTimeout( function() { forceFromWord = 0; }, 0 );
|
|
};
|
|
|
|
// Features bring by this command beside the normal process:
|
|
// 1. No more bothering of user about the clean-up.
|
|
// 2. Perform the clean-up even if content is not from MS-Word.
|
|
// (e.g. from a MS-Word similar application.)
|
|
editor.addCommand( 'pastefromword',
|
|
{
|
|
canUndo : false,
|
|
exec : function()
|
|
{
|
|
forceFromWord = 1;
|
|
if ( editor.execCommand( 'paste' ) === false )
|
|
{
|
|
editor.on( 'dialogShow', function ( evt )
|
|
{
|
|
evt.removeListener();
|
|
evt.data.on( 'cancel', resetFromWord );
|
|
});
|
|
|
|
editor.on( 'dialogHide', function( evt )
|
|
{
|
|
evt.data.removeListener( 'cancel', resetFromWord );
|
|
} );
|
|
}
|
|
|
|
editor.on( 'afterPaste', resetFromWord );
|
|
}
|
|
});
|
|
|
|
// Register the toolbar button.
|
|
editor.ui.addButton( 'PasteFromWord',
|
|
{
|
|
label : editor.lang.pastefromword.toolbar,
|
|
command : 'pastefromword'
|
|
});
|
|
|
|
editor.on( 'pasteState', function( evt )
|
|
{
|
|
editor.getCommand( 'pastefromword' ).setState( evt.data );
|
|
});
|
|
|
|
editor.on( 'paste', function( evt )
|
|
{
|
|
var data = evt.data,
|
|
mswordHtml;
|
|
|
|
// MS-WORD format sniffing.
|
|
if ( ( mswordHtml = data[ 'html' ] )
|
|
&& ( forceFromWord || ( /(class=\"?Mso|style=\"[^\"]*\bmso\-|w:WordDocument)/ ).test( mswordHtml ) ) )
|
|
{
|
|
var isLazyLoad = this.loadFilterRules( function()
|
|
{
|
|
// Event continuation with the original data.
|
|
if ( isLazyLoad )
|
|
editor.fire( 'paste', data );
|
|
else if ( !editor.config.pasteFromWordPromptCleanup
|
|
|| ( forceFromWord || confirm( editor.lang.pastefromword.confirmCleanup ) ) )
|
|
{
|
|
data[ 'html' ] = CKEDITOR.cleanWord( mswordHtml, editor );
|
|
}
|
|
});
|
|
|
|
// The cleanup rules are to be loaded, we should just cancel
|
|
// this event.
|
|
isLazyLoad && evt.cancel();
|
|
}
|
|
}, this );
|
|
},
|
|
|
|
loadFilterRules : function( callback )
|
|
{
|
|
|
|
var isLoaded = CKEDITOR.cleanWord;
|
|
|
|
if ( isLoaded )
|
|
callback();
|
|
else
|
|
{
|
|
var filterFilePath = CKEDITOR.getUrl(
|
|
CKEDITOR.config.pasteFromWordCleanupFile
|
|
|| ( this.path + 'filter/default.js' ) );
|
|
|
|
// Load with busy indicator.
|
|
CKEDITOR.scriptLoader.load( filterFilePath, callback, null, true );
|
|
}
|
|
|
|
return !isLoaded;
|
|
},
|
|
|
|
requires : [ 'clipboard' ]
|
|
});
|
|
})();
|
|
|
|
/**
|
|
* Whether to prompt the user about the clean up of content being pasted from
|
|
* MS Word.
|
|
* @name CKEDITOR.config.pasteFromWordPromptCleanup
|
|
* @since 3.1
|
|
* @type Boolean
|
|
* @default undefined
|
|
* @example
|
|
* config.pasteFromWordPromptCleanup = true;
|
|
*/
|
|
|
|
/**
|
|
* The file that provides the MS Word cleanup function for pasting operations.
|
|
* Note: This is a global configuration shared by all editor instances present
|
|
* in the page.
|
|
* @name CKEDITOR.config.pasteFromWordCleanupFile
|
|
* @since 3.1
|
|
* @type String
|
|
* @default 'default'
|
|
* @example
|
|
* // Load from 'pastefromword' plugin 'filter' sub folder (custom.js file).
|
|
* CKEDITOR.config.pasteFromWordCleanupFile = 'custom';
|
|
*/
|