/* Copyright (c) 2003-2011, CKSource - Frederico Knabben. All rights reserved. For licensing, see LICENSE.html or http://ckeditor.com/license */ (function() { function forceHtmlMode( evt ) { evt.data.mode = 'html'; } 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(); editor.removeListener( 'beforePaste', forceHtmlMode ); 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() { // Ensure the received data format is HTML and apply content filtering. (#6718) forceFromWord = 1; editor.on( 'beforePaste', forceHtmlMode ); if ( editor.execCommand( 'paste', 'html' ) === 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'; */