static/tinymce/plugins/paste/editor_plugin_src.js
function grabContent(e) {
				var n, or, rng, oldRng, sel = ed.selection, dom = ed.dom, body = ed.getBody(), posY, textContent;

				// Check if browser supports direct plaintext access
				if (e.clipboardData || dom.doc.dataTransfer) {
					textContent = (e.clipboardData || dom.doc.dataTransfer).getData('Text');

					if (ed.pasteAsPlainText) {
						e.preventDefault();
						process({content : dom.encode(textContent).replace(/\r?\n/g, '<br />')});
						return;
					}
				}

				if (dom.get('_mcePaste'))
					return;

				// Create container to paste into
				n = dom.add(body, 'div', {id : '_mcePaste', 'class' : 'mcePaste', 'data-mce-bogus' : '1'}, '\uFEFF\uFEFF');

				// If contentEditable mode we need to find out the position of the closest element
				if (body != ed.getDoc().body)
					posY = dom.getPos(ed.selection.getStart(), body).y;
				else
					posY = body.scrollTop + dom.getViewPort(ed.getWin()).y;

				// Styles needs to be applied after the element is added to the document since WebKit will otherwise remove all styles
				// If also needs to be in view on IE or the paste would fail
				dom.setStyles(n, {
					position : 'absolute',
					left : tinymce.isGecko ? -40 : 0, // Need to move it out of site on Gecko since it will othewise display a ghost resize rect for the div
					top : posY - 25,
					width : 1,
					height : 1,
					overflow : 'hidden'
				});

				if (tinymce.isIE) {
					// Store away the old range
					oldRng = sel.getRng();

					// Select the container
					rng = dom.doc.body.createTextRange();
					rng.moveToElementText(n);
					rng.execCommand('Paste');

					// Remove container
					dom.remove(n);

					// Check if the contents was changed, if it wasn't then clipboard extraction failed probably due
					// to IE security settings so we pass the junk though better than nothing right
					if (n.innerHTML === '\uFEFF\uFEFF') {
						ed.execCommand('mcePasteWord');
						e.preventDefault();
						return;
					}

					// Restore the old range and clear the contents before pasting
					sel.setRng(oldRng);
					sel.setContent('');

					// For some odd reason we need to detach the the mceInsertContent call from the paste event
					// It's like IE has a reference to the parent element that you paste in and the selection gets messed up
					// when it tries to restore the selection
					setTimeout(function() {
						// Process contents
						process({content : n.innerHTML});
					}, 0);

					// Block the real paste event
					return tinymce.dom.Event.cancel(e);
				} else {
					function block(e) {
						e.preventDefault();
					};

					// Block mousedown and click to prevent selection change
					dom.bind(ed.getDoc(), 'mousedown', block);
					dom.bind(ed.getDoc(), 'keydown', block);

					or = ed.selection.getRng();

					// Move select contents inside DIV
					n = n.firstChild;
					rng = ed.getDoc().createRange();
					rng.setStart(n, 0);
					rng.setEnd(n, 2);
					sel.setRng(rng);

					// Wait a while and grab the pasted contents
					window.setTimeout(function() {
						var h = '', nl;

						// Paste divs duplicated in paste divs seems to happen when you paste plain text so lets first look for that broken behavior in WebKit
						if (!dom.select('div.mcePaste > div.mcePaste').length) {
							nl = dom.select('div.mcePaste');

							// WebKit will split the div into multiple ones so this will loop through then all and join them to get the whole HTML string
							each(nl, function(n) {
								var child = n.firstChild;

								// WebKit inserts a DIV container with lots of odd styles
								if (child && child.nodeName == 'DIV' && child.style.marginTop && child.style.backgroundColor) {
									dom.remove(child, 1);
								}

								// Remove apply style spans
								each(dom.select('span.Apple-style-span', n), function(n) {
									dom.remove(n, 1);
								});

								// Remove bogus br elements
								each(dom.select('br[data-mce-bogus]', n), function(n) {
									dom.remove(n);
								});

								// WebKit will make a copy of the DIV for each line of plain text pasted and insert them into the DIV
								if (n.parentNode.className != 'mcePaste')
									h += n.innerHTML;
							});
						} else {
							// Found WebKit weirdness so force the content into paragraphs this seems to happen when you paste plain text from Nodepad etc
							// So this logic will replace double enter with paragraphs and single enter with br so it kind of looks the same
							h = '<p>' + dom.encode(textContent).replace(/\r?\n\r?\n/g, '</p><p>').replace(/\r?\n/g, '<br />') + '</p>';
						}

						// Remove the nodes
						each(dom.select('div.mcePaste'), function(n) {
							dom.remove(n);
						});

						// Restore the old selection
						if (or)
							sel.setRng(or);

						process({content : h});

						// Unblock events ones we got the contents
						dom.unbind(ed.getDoc(), 'mousedown', block);
						dom.unbind(ed.getDoc(), 'keydown', block);
					}, 0);
				}
			}
function grabContent(e) {
				var n, or, rng, oldRng, sel = ed.selection, dom = ed.dom, body = ed.getBody(), posY, textContent;

				// Check if browser supports direct plaintext access
				if (e.clipboardData || dom.doc.dataTransfer) {
					textContent = (e.clipboardData || dom.doc.dataTransfer).getData('Text');

					if (ed.pasteAsPlainText) {
						e.preventDefault();
						process({content : dom.encode(textContent).replace(/\r?\n/g, '<br />')});
						return;
					}
				}

				if (dom.get('_mcePaste'))
					return;

				// Create container to paste into
				n = dom.add(body, 'div', {id : '_mcePaste', 'class' : 'mcePaste', 'data-mce-bogus' : '1'}, '\uFEFF\uFEFF');

				// If contentEditable mode we need to find out the position of the closest element
				if (body != ed.getDoc().body)
					posY = dom.getPos(ed.selection.getStart(), body).y;
				else
					posY = body.scrollTop + dom.getViewPort(ed.getWin()).y;

				// Styles needs to be applied after the element is added to the document since WebKit will otherwise remove all styles
				// If also needs to be in view on IE or the paste would fail
				dom.setStyles(n, {
					position : 'absolute',
					left : tinymce.isGecko ? -40 : 0, // Need to move it out of site on Gecko since it will othewise display a ghost resize rect for the div
					top : posY - 25,
					width : 1,
					height : 1,
					overflow : 'hidden'
				});

				if (tinymce.isIE) {
					// Store away the old range
					oldRng = sel.getRng();

					// Select the container
					rng = dom.doc.body.createTextRange();
					rng.moveToElementText(n);
					rng.execCommand('Paste');

					// Remove container
					dom.remove(n);

					// Check if the contents was changed, if it wasn't then clipboard extraction failed probably due
					// to IE security settings so we pass the junk though better than nothing right
					if (n.innerHTML === '\uFEFF\uFEFF') {
						ed.execCommand('mcePasteWord');
						e.preventDefault();
						return;
					}

					// Restore the old range and clear the contents before pasting
					sel.setRng(oldRng);
					sel.setContent('');

					// For some odd reason we need to detach the the mceInsertContent call from the paste event
					// It's like IE has a reference to the parent element that you paste in and the selection gets messed up
					// when it tries to restore the selection
					setTimeout(function() {
						// Process contents
						process({content : n.innerHTML});
					}, 0);

					// Block the real paste event
					return tinymce.dom.Event.cancel(e);
				} else {
					function block(e) {
						e.preventDefault();
					};

					// Block mousedown and click to prevent selection change
					dom.bind(ed.getDoc(), 'mousedown', block);
					dom.bind(ed.getDoc(), 'keydown', block);

					or = ed.selection.getRng();

					// Move select contents inside DIV
					n = n.firstChild;
					rng = ed.getDoc().createRange();
					rng.setStart(n, 0);
					rng.setEnd(n, 2);
					sel.setRng(rng);

					// Wait a while and grab the pasted contents
					window.setTimeout(function() {
						var h = '', nl;

						// Paste divs duplicated in paste divs seems to happen when you paste plain text so lets first look for that broken behavior in WebKit
						if (!dom.select('div.mcePaste > div.mcePaste').length) {
							nl = dom.select('div.mcePaste');

							// WebKit will split the div into multiple ones so this will loop through then all and join them to get the whole HTML string
							each(nl, function(n) {
								var child = n.firstChild;

								// WebKit inserts a DIV container with lots of odd styles
								if (child && child.nodeName == 'DIV' && child.style.marginTop && child.style.backgroundColor) {
									dom.remove(child, 1);
								}

								// Remove apply style spans
								each(dom.select('span.Apple-style-span', n), function(n) {
									dom.remove(n, 1);
								});

								// Remove bogus br elements
								each(dom.select('br[data-mce-bogus]', n), function(n) {
									dom.remove(n);
								});

								// WebKit will make a copy of the DIV for each line of plain text pasted and insert them into the DIV
								if (n.parentNode.className != 'mcePaste')
									h += n.innerHTML;
							});
						} else {
							// Found WebKit weirdness so force the content into paragraphs this seems to happen when you paste plain text from Nodepad etc
							// So this logic will replace double enter with paragraphs and single enter with br so it kind of looks the same
							h = '<p>' + dom.encode(textContent).replace(/\r?\n\r?\n/g, '</p><p>').replace(/\r?\n/g, '<br />') + '</p>';
						}

						// Remove the nodes
						each(dom.select('div.mcePaste'), function(n) {
							dom.remove(n);
						});

						// Restore the old selection
						if (or)
							sel.setRng(or);

						process({content : h});

						// Unblock events ones we got the contents
						dom.unbind(ed.getDoc(), 'mousedown', block);
						dom.unbind(ed.getDoc(), 'keydown', block);
					}, 0);
				}
			}
function grabContent ( e ) { var n , or , rng , oldRng , sel = ed . selection , dom = ed . dom , body = ed . getBody ( ) , posY , textContent ; // Check if browser supports direct plaintext access
 if ( e . clipboardData || dom . doc . dataTransfer ) { textContent = ( e . clipboardData || dom . doc . dataTransfer ) . getData ( 'Text' ) ; if ( ed . pasteAsPlainText ) { e . preventDefault ( ) ; process ( { content : dom . encode ( textContent ) . replace ( / \r?\n / g , '<br />' ) } ) ; return ; } } if ( dom . get ( '_mcePaste' ) ) return ; // Create container to paste into
 n = dom . add ( body , 'div' , { id : '_mcePaste' , 'class' : 'mcePaste' , 'data-mce-bogus' : '1' } , '\uFEFF\uFEFF' ) ; // If contentEditable mode we need to find out the position of the closest element
 if ( body != ed . getDoc ( ) . body ) posY = dom . getPos ( ed . selection . getStart ( ) , body ) . y ; else posY = body . scrollTop + dom . getViewPort ( ed . getWin ( ) ) . y ; // Styles needs to be applied after the element is added to the document since WebKit will otherwise remove all styles
 // If also needs to be in view on IE or the paste would fail
 dom . setStyles ( n , { position : 'absolute' , left : tinymce . isGecko ? - 40 : 0 , // Need to move it out of site on Gecko since it will othewise display a ghost resize rect for the div
 top : posY - 25 , width : 1 , height : 1 , overflow : 'hidden' } ) ; if ( tinymce . isIE ) { // Store away the old range
 oldRng = sel . getRng ( ) ; // Select the container
 rng = dom . doc . body . createTextRange ( ) ; rng . moveToElementText ( n ) ; rng . execCommand ( 'Paste' ) ; // Remove container
 dom . remove ( n ) ; // Check if the contents was changed, if it wasn't then clipboard extraction failed probably due
 // to IE security settings so we pass the junk though better than nothing right
 if ( n . innerHTML === '\uFEFF\uFEFF' ) { ed . execCommand ( 'mcePasteWord' ) ; e . preventDefault ( ) ; return ; } // Restore the old range and clear the contents before pasting
 sel . setRng ( oldRng ) ; sel . setContent ( '' ) ; // For some odd reason we need to detach the the mceInsertContent call from the paste event
 // It's like IE has a reference to the parent element that you paste in and the selection gets messed up
 // when it tries to restore the selection
 setTimeout ( function ( ) { // Process contents
 process ( { content : n . innerHTML } ) ; } , 0 ) ; // Block the real paste event
 return tinymce . dom . Event . cancel ( e ) ; } else { function block ( e ) { e . preventDefault ( ) ; } ; // Block mousedown and click to prevent selection change
 dom . bind ( ed . getDoc ( ) , 'mousedown' , block ) ; dom . bind ( ed . getDoc ( ) , 'keydown' , block ) ; or = ed . selection . getRng ( ) ; // Move select contents inside DIV
 n = n . firstChild ; rng = ed . getDoc ( ) . createRange ( ) ; rng . setStart ( n , 0 ) ; rng . setEnd ( n , 2 ) ; sel . setRng ( rng ) ; // Wait a while and grab the pasted contents
 window . setTimeout ( function ( ) { var h = '' , nl ; // Paste divs duplicated in paste divs seems to happen when you paste plain text so lets first look for that broken behavior in WebKit
 if ( ! dom . select ( 'div.mcePaste > div.mcePaste' ) . length ) { nl = dom . select ( 'div.mcePaste' ) ; // WebKit will split the div into multiple ones so this will loop through then all and join them to get the whole HTML string
 each ( nl , function ( n ) { var child = n . firstChild ; // WebKit inserts a DIV container with lots of odd styles
 if ( child && child . nodeName == 'DIV' && child . style . marginTop && child . style . backgroundColor ) { dom . remove ( child , 1 ) ; } // Remove apply style spans
 each ( dom . select ( 'span.Apple-style-span' , n ) , function ( n ) { dom . remove ( n , 1 ) ; } ) ; // Remove bogus br elements
 each ( dom . select ( 'br[data-mce-bogus]' , n ) , function ( n ) { dom . remove ( n ) ; } ) ; // WebKit will make a copy of the DIV for each line of plain text pasted and insert them into the DIV
 if ( n . parentNode . className != 'mcePaste' ) h += n . innerHTML ; } ) ; } else { // Found WebKit weirdness so force the content into paragraphs this seems to happen when you paste plain text from Nodepad etc
 // So this logic will replace double enter with paragraphs and single enter with br so it kind of looks the same
 h = '<p>' + dom . encode ( textContent ) . replace ( / \r?\n\r?\n / g , '</p><p>' ) . replace ( / \r?\n / g , '<br />' ) + '</p>' ; } // Remove the nodes
 each ( dom . select ( 'div.mcePaste' ) , function ( n ) { dom . remove ( n ) ; } ) ; // Restore the old selection
 if ( or ) sel . setRng ( or ) ; process ( { content : h } ) ; // Unblock events ones we got the contents
 dom . unbind ( ed . getDoc ( ) , 'mousedown' , block ) ; dom . unbind ( ed . getDoc ( ) , 'keydown' , block ) ; } , 0 ) ; } }
This function grabs the contents from the clipboard by adding a hidden div and placing the caret inside it and after the browser paste is done it grabs that contents and processes that
This function grabs the contents from the clipboard by adding a hidden div and placing the caret inside it and after the browser paste is done it grabs that contents and processes that