docs: function( editor ) {
  			var commandName = 'pastefromword',
  				// Flag indicate this command is actually been asked instead of a generic pasting.
  				forceFromWord = 0,
  				path = this.path;
  
  			editor.addCommand( commandName, {
  				// Snapshots are done manually by editable.insertXXX methods.
  				canUndo: false,
  				async: true,
  
  				exec: function( editor ) {
  					var cmd = this;
  
  					forceFromWord = 1;
  					// Force html mode for incomming paste events sequence.
  					editor.once( 'beforePaste', forceHtmlMode );
  
  					editor.getClipboardData( { title: editor.lang.pastefromword.title }, function( data ) {
  						// Do not use editor#paste, because it would start from beforePaste event.
  						data && editor.fire( 'paste', { type: 'html', dataValue: data.dataValue } );
  
  						editor.fire( 'afterCommandExec', {
  							name: commandName,
  							command: cmd,
  							returnValue: !!data
  						} );
  					} );
  				}
  			} );
  
  			// Register the toolbar button.
  			editor.ui.addButton && editor.ui.addButton( 'PasteFromWord', {
  				label: editor.lang.pastefromword.toolbar,
  				command: commandName,
  				toolbar: 'clipboard,50'
  			} );
  
  			editor.on( 'pasteState', function( evt ) {
  				editor.getCommand( commandName ).setState( evt.data );
  			} );
  
  			// 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.)
  			// 3. Listen with high priority (3), so clean up is done before content
  			// type sniffing (priority = 6).
  			editor.on( 'paste', function( evt ) {
  				var data = evt.data,
  					mswordHtml = data.dataValue;
  
  				// MS-WORD format sniffing.
  				if ( mswordHtml && ( forceFromWord || ( /(class=\"?Mso|style=\"[^\"]*\bmso\-|w:WordDocument)/ ).test( mswordHtml ) ) ) {
  					// If filter rules aren't loaded then cancel 'paste' event,
  					// load them and when they'll get loaded fire new paste event
  					// for which data will be filtered in second execution of
  					// this listener.
  					var isLazyLoad = loadFilterRules( editor, path, 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.dataValue = CKEDITOR.cleanWord( mswordHtml, editor );
  
  					} );
  
  					// The cleanup rules are to be loaded, we should just cancel
  					// this event.
  					isLazyLoad && evt.cancel();
  				}
  			}, null, null, 3 );
  
  			function resetFromWord( evt ) {
  				evt && evt.removeListener();
  				editor.removeListener( 'beforePaste', forceHtmlMode );
  				forceFromWord && setTimeout( function() {
  					forceFromWord = 0;
  				}, 0 );
  			}
  		}