public/ckeditor/_source/plugins/horizontalrule/plugin.js
function( editor )
		{
			var hr = editor.document.createElement( 'hr' ),
				range = new CKEDITOR.dom.range( editor.document );

			editor.insertElement( hr );

			// If there's nothing or a non-editable block followed by, establish a new paragraph
			// to make sure cursor is not trapped.
			range.moveToPosition( hr, CKEDITOR.POSITION_AFTER_END );
			var next = hr.getNext();
			if ( !next || next.type == CKEDITOR.NODE_ELEMENT && !next.isEditable() )
				range.fixBlock( true, editor.config.enterMode == CKEDITOR.ENTER_DIV ? 'div' : 'p'  );

			range.select();
		}
function( editor )
		{
			var hr = editor.document.createElement( 'hr' ),
				range = new CKEDITOR.dom.range( editor.document );

			editor.insertElement( hr );

			// If there's nothing or a non-editable block followed by, establish a new paragraph
			// to make sure cursor is not trapped.
			range.moveToPosition( hr, CKEDITOR.POSITION_AFTER_END );
			var next = hr.getNext();
			if ( !next || next.type == CKEDITOR.NODE_ELEMENT && !next.isEditable() )
				range.fixBlock( true, editor.config.enterMode == CKEDITOR.ENTER_DIV ? 'div' : 'p'  );

			range.select();
		}
function ( editor ) { var hr = editor . document . createElement ( 'hr' ) , range = new CKEDITOR . dom . range ( editor . document ) ; editor . insertElement ( hr ) ; // If there's nothing or a non-editable block followed by, establish a new paragraph
 // to make sure cursor is not trapped.
 range . moveToPosition ( hr , CKEDITOR . POSITION_AFTER_END ) ; var next = hr . getNext ( ) ; if ( ! next || next . type == CKEDITOR . NODE_ELEMENT && ! next . isEditable ( ) ) range . fixBlock ( true , editor . config . enterMode == CKEDITOR . ENTER_DIV ? 'div' : 'p' ) ; range . select ( ) ; }
The undo snapshot will be handled by 'insertElement'.
The undo snapshot will be handled by insertElement .