http://www.mediawiki.org/wiki/Special:Code/MediaWiki/65646
Revision: 65646 Author: pdhanda Date: 2010-04-28 23:16:52 +0000 (Wed, 28 Apr 2010) Log Message: ----------- Except for the cursor position in same cases and MSWord lists. Paste mostly works. Modified Paths: -------------- trunk/extensions/UsabilityInitiative/UsabilityInitiative.hooks.php trunk/extensions/UsabilityInitiative/js/plugins/jquery.wikiEditor.js trunk/extensions/UsabilityInitiative/js/plugins.combined.js trunk/extensions/UsabilityInitiative/js/plugins.combined.min.js Modified: trunk/extensions/UsabilityInitiative/UsabilityInitiative.hooks.php =================================================================== --- trunk/extensions/UsabilityInitiative/UsabilityInitiative.hooks.php 2010-04-28 23:09:50 UTC (rev 65645) +++ trunk/extensions/UsabilityInitiative/UsabilityInitiative.hooks.php 2010-04-28 23:16:52 UTC (rev 65646) @@ -72,7 +72,7 @@ array( 'src' => 'js/plugins/jquery.delayedBind.js', 'version' => 1 ), array( 'src' => 'js/plugins/jquery.suggestions.js', 'version' => 11 ), array( 'src' => 'js/plugins/jquery.textSelection.js', 'version' => 30 ), - array( 'src' => 'js/plugins/jquery.wikiEditor.js', 'version' => 182 ), + array( 'src' => 'js/plugins/jquery.wikiEditor.js', 'version' => 183 ), array( 'src' => 'js/plugins/jquery.wikiEditor.highlight.js', 'version' => 52 ), array( 'src' => 'js/plugins/jquery.wikiEditor.toolbar.js', 'version' => 59 ), array( 'src' => 'js/plugins/jquery.wikiEditor.dialogs.js', 'version' => 24 ), @@ -82,10 +82,10 @@ array( 'src' => 'js/plugins/jquery.wikiEditor.publish.js', 'version' => 5 ), ), 'combined' => array( - array( 'src' => 'js/plugins.combined.js', 'version' => 386 ), + array( 'src' => 'js/plugins.combined.js', 'version' => 387 ), ), 'minified' => array( - array( 'src' => 'js/plugins.combined.min.js', 'version' => 386 ), + array( 'src' => 'js/plugins.combined.min.js', 'version' => 387 ), ), ), ); Modified: trunk/extensions/UsabilityInitiative/js/plugins/jquery.wikiEditor.js =================================================================== --- trunk/extensions/UsabilityInitiative/js/plugins/jquery.wikiEditor.js 2010-04-28 23:09:50 UTC (rev 65645) +++ trunk/extensions/UsabilityInitiative/js/plugins/jquery.wikiEditor.js 2010-04-28 23:16:52 UTC (rev 65646) @@ -444,57 +444,58 @@ $(this).replaceWith( this.childNodes ); } ); + // If the pasted content is plain text then wrap it in a <p> and adjust the <br> accordingly var pasteContent = context.fn.getOffset( cursorPos[0] ).node; var removeNextBR = false while ( pasteContent != null && ! $( pasteContent ).hasClass( 'wikiEditor' ) ) { var currentNode = pasteContent; pasteContent = pasteContent.nextSibling; - if ( currentNode.nodeName == '#text' && currentNode.nodeValue == currentNode.wholeText ) { - $( currentNode ).wrap( $( '<p></p>' ) ); + if ( currentNode.nodeName == '#text' && currentNode.nodeValue == currentNode.wholeText ) { + var pWrapper = $( '<p></p>' ).addClass( 'wikiEditor' ); + $( currentNode ).wrap( pWrapper ); $( currentNode ).addClass( 'wikiEditor' ); removeNextBR = true; - } else if ( currentNode.nodeName == 'SPAN' ) { - var text = $( currentNode ).text(); - if ( text.length == 0 ) { - $( currentNode ).remove(); - } + } else if ( currentNode.nodeName == 'BR' && removeNextBR ) { + $( currentNode ).remove(); removeNextBR = false; - } else if ( currentNode.nodeName == 'BR' ) { - if (removeNextBR ) { - $( currentNode ).remove(); - } else { - $( currentNode ).addClass( 'wikiEditor' ); - } - removeNextBR = false; } else { removeNextBR = false; } - } - + } var $selection = context.$content.find( ':not(.wikiEditor)' ); while ( $selection.length && $selection.length > 0 ) { var $currentElement = $selection.eq( 0 ); while ( !$currentElement.parent().is( 'body' ) && !$currentElement.parent().is( '.wikiEditor' ) ) { $currentElement = $currentElement.parent(); } - var html = $( '<div></div>' ).text( $currentElement.text().replace( /\r|\n/g, ' ' ) ).html(); - if ( $currentElement.is( 'p' ) || $currentElement.is( 'div' ) ) { - $newElement = $( '<p></p>' ) - .addClass( 'wikiEditor' ) - .insertAfter( $currentElement ); - if ( html.length ) { - $newElement.html( html ); + + var $newElement; + if ( $currentElement.is( 'p' ) || $currentElement.is( 'div' ) || $currentElement.is( 'pre' ) ) { + //Convert all <div>, <p> and <pre> that was pasted into a <p> element + $newElement = $( '<p></p>' ); + } else { + // everything else becomes a <span> + $newElement = $( '<span></span>' ).addClass( 'wikiEditor' ); + } + + // If the pasted content was html, just convert it into text and <br> + var text = $.trim( $currentElement.text() ); + var pieces = text.split('\n'); + for ( var i = 0; i < pieces.length; i++ ) { + if ( pieces[i] ) { + $newElement.html( $newElement.html() + $.trim( pieces[i] ) ); } else { - $newElement.append( $( '<br>' ).addClass( 'wikiEditor' ) ); + var $brElement = $( '<span></span>' ).html( '<br class = "wikiEditor" />' ); + $newElement.html( $newElement.html() + $brElement.html() ); } - $currentElement.remove(); - } else { - $newElement = $( '<span></span>' ).html( html ).insertAfter( $currentElement ); - $newElement.replaceWith( $newElement[0].childNodes ); - $currentElement.remove(); - } + } + $newElement.insertAfter( $currentElement ); + $newElement.addClass( 'wikiEditor' ); + $currentElement.remove(); + $selection = context.$content.find( ':not(.wikiEditor)' ); } + context.$content.find( '.wikiEditor' ).removeClass( 'wikiEditor' ); if ( $.layout.name !== 'webkit' ) { context.$content.removeClass( 'pasting' ); Modified: trunk/extensions/UsabilityInitiative/js/plugins.combined.js =================================================================== --- trunk/extensions/UsabilityInitiative/js/plugins.combined.js 2010-04-28 23:09:50 UTC (rev 65645) +++ trunk/extensions/UsabilityInitiative/js/plugins.combined.js 2010-04-28 23:16:52 UTC (rev 65646) @@ -7029,57 +7029,58 @@ $(this).replaceWith( this.childNodes ); } ); + // If the pasted content is plain text then wrap it in a <p> and adjust the <br> accordingly var pasteContent = context.fn.getOffset( cursorPos[0] ).node; var removeNextBR = false while ( pasteContent != null && ! $( pasteContent ).hasClass( 'wikiEditor' ) ) { var currentNode = pasteContent; pasteContent = pasteContent.nextSibling; - if ( currentNode.nodeName == '#text' && currentNode.nodeValue == currentNode.wholeText ) { - $( currentNode ).wrap( $( '<p></p>' ) ); + if ( currentNode.nodeName == '#text' && currentNode.nodeValue == currentNode.wholeText ) { + var pWrapper = $( '<p></p>' ).addClass( 'wikiEditor' ); + $( currentNode ).wrap( pWrapper ); $( currentNode ).addClass( 'wikiEditor' ); removeNextBR = true; - } else if ( currentNode.nodeName == 'SPAN' ) { - var text = $( currentNode ).text(); - if ( text.length == 0 ) { - $( currentNode ).remove(); - } + } else if ( currentNode.nodeName == 'BR' && removeNextBR ) { + $( currentNode ).remove(); removeNextBR = false; - } else if ( currentNode.nodeName == 'BR' ) { - if (removeNextBR ) { - $( currentNode ).remove(); - } else { - $( currentNode ).addClass( 'wikiEditor' ); - } - removeNextBR = false; } else { removeNextBR = false; } - } - + } var $selection = context.$content.find( ':not(.wikiEditor)' ); while ( $selection.length && $selection.length > 0 ) { var $currentElement = $selection.eq( 0 ); while ( !$currentElement.parent().is( 'body' ) && !$currentElement.parent().is( '.wikiEditor' ) ) { $currentElement = $currentElement.parent(); } - var html = $( '<div></div>' ).text( $currentElement.text().replace( /\r|\n/g, ' ' ) ).html(); - if ( $currentElement.is( 'p' ) || $currentElement.is( 'div' ) ) { - $newElement = $( '<p></p>' ) - .addClass( 'wikiEditor' ) - .insertAfter( $currentElement ); - if ( html.length ) { - $newElement.html( html ); + + var $newElement; + if ( $currentElement.is( 'p' ) || $currentElement.is( 'div' ) || $currentElement.is( 'pre' ) ) { + //Convert all <div>, <p> and <pre> that was pasted into a <p> element + $newElement = $( '<p></p>' ); + } else { + // everything else becomes a <span> + $newElement = $( '<span></span>' ).addClass( 'wikiEditor' ); + } + + // If the pasted content was html, just convert it into text and <br> + var text = $.trim( $currentElement.text() ); + var pieces = text.split('\n'); + for ( var i = 0; i < pieces.length; i++ ) { + if ( pieces[i] ) { + $newElement.html( $newElement.html() + $.trim( pieces[i] ) ); } else { - $newElement.append( $( '<br>' ).addClass( 'wikiEditor' ) ); + var $brElement = $( '<span></span>' ).html( '<br class = "wikiEditor" />' ); + $newElement.html( $newElement.html() + $brElement.html() ); } - $currentElement.remove(); - } else { - $newElement = $( '<span></span>' ).html( html ).insertAfter( $currentElement ); - $newElement.replaceWith( $newElement[0].childNodes ); - $currentElement.remove(); - } + } + $newElement.insertAfter( $currentElement ); + $newElement.addClass( 'wikiEditor' ); + $currentElement.remove(); + $selection = context.$content.find( ':not(.wikiEditor)' ); } + context.$content.find( '.wikiEditor' ).removeClass( 'wikiEditor' ); if ( $.layout.name !== 'webkit' ) { context.$content.removeClass( 'pasting' ); Modified: trunk/extensions/UsabilityInitiative/js/plugins.combined.min.js =================================================================== --- trunk/extensions/UsabilityInitiative/js/plugins.combined.min.js 2010-04-28 23:09:50 UTC (rev 65645) +++ trunk/extensions/UsabilityInitiative/js/plugins.combined.min.js 2010-04-28 23:16:52 UTC (rev 65646) @@ -468,13 +468,11 @@ return true;},'delayedChange':function(event){event.data.scope='division';var newHTML=context.$content.html();if(context.oldDelayedHTML!=newHTML){context.oldDelayedHTML=newHTML;event.data.scope='realchange';var cursorPos=context.fn.getCaretPosition();var t=context.fn.getOffset(cursorPos[0]);if(t&&t.node.nodeName=='#text'&&t.node.parentNode.nodeName.toLowerCase()=='body'){$(t.node).wrap("<p></p>");context.fn.purgeOffsets();context.fn.setSelection({start:cursorPos[0],end:cursorPos[1]});}} context.fn.updateHistory(event.data.scope=='realchange');return true;},'cut':function(event){setTimeout(function(){context.$content.find('br').each(function(){if($(this).parent().is('body')){$(this).wrap($('<p></p>'));}});},100);return true;},'paste':function(event){var cursorPos=context.fn.getCaretPosition();var oldLength=context.fn.getContents().length-(cursorPos[1]-cursorPos[0]);context.$content.find(':not(.wikiEditor)').addClass('wikiEditor');if($.layout.name!=='webkit'){context.$content.addClass('pasting');} setTimeout(function(){context.$content.find('script,style,img,input,select,textarea,hr,button,link,meta').remove();context.$content.find('*').each(function(){if($(this).children().length==0&&this.childNodes.length>0){$(this).text($(this).text());}});context.$content.find('p:not(.wikiEditor) p:not(.wikiEditor)').each(function(){var outerParent=$(this).parent();outerParent.replaceWith(outerParent.childNodes);});context.$content.find('span.Apple-style-span').each(function(){$(this).replaceWith(this.childNodes);});var pasteContent=context.fn.getOffset(cursorPos[0]).node;var removeNextBR=false -while(pasteContent!=null&&!$(pasteContent).hasClass('wikiEditor')){var currentNode=pasteContent;pasteContent=pasteContent.nextSibling;if(currentNode.nodeName=='#text'&¤tNode.nodeValue==currentNode.wholeText){$(currentNode).wrap($('<p></p>'));$(currentNode).addClass('wikiEditor');removeNextBR=true;}else if(currentNode.nodeName=='SPAN'){var text=$(currentNode).text();if(text.length==0){$(currentNode).remove();} -removeNextBR=false;}else if(currentNode.nodeName=='BR'){if(removeNextBR){$(currentNode).remove();}else{$(currentNode).addClass('wikiEditor');} -removeNextBR=false;}else{removeNextBR=false;}} +while(pasteContent!=null&&!$(pasteContent).hasClass('wikiEditor')){var currentNode=pasteContent;pasteContent=pasteContent.nextSibling;if(currentNode.nodeName=='#text'&¤tNode.nodeValue==currentNode.wholeText){var pWrapper=$('<p></p>').addClass('wikiEditor');$(currentNode).wrap(pWrapper);$(currentNode).addClass('wikiEditor');removeNextBR=true;}else if(currentNode.nodeName=='BR'&&removeNextBR){$(currentNode).remove();removeNextBR=false;}else{removeNextBR=false;}} var $selection=context.$content.find(':not(.wikiEditor)');while($selection.length&&$selection.length>0){var $currentElement=$selection.eq(0);while(!$currentElement.parent().is('body')&&!$currentElement.parent().is('.wikiEditor')){$currentElement=$currentElement.parent();} -var html=$('<div></div>').text($currentElement.text().replace(/\r|\n/g,' ')).html();if($currentElement.is('p')||$currentElement.is('div')){$newElement=$('<p></p>').addClass('wikiEditor').insertAfter($currentElement);if(html.length){$newElement.html(html);}else{$newElement.append($('<br>').addClass('wikiEditor'));} -$currentElement.remove();}else{$newElement=$('<span></span>').html(html).insertAfter($currentElement);$newElement.replaceWith($newElement[0].childNodes);$currentElement.remove();} -$selection=context.$content.find(':not(.wikiEditor)');} +var $newElement;if($currentElement.is('p')||$currentElement.is('div')||$currentElement.is('pre')){$newElement=$('<p></p>');}else{$newElement=$('<span></span>').addClass('wikiEditor');} +var text=$.trim($currentElement.text());var pieces=text.split('\n');for(var i=0;i<pieces.length;i++){if(pieces[i]){$newElement.html($newElement.html()+$.trim(pieces[i]));}else{var $brElement=$('<span></span>').html('<br class = "wikiEditor" />');$newElement.html($newElement.html()+$brElement.html());}} +$newElement.insertAfter($currentElement);$newElement.addClass('wikiEditor');$currentElement.remove();$selection=context.$content.find(':not(.wikiEditor)');} context.$content.find('.wikiEditor').removeClass('wikiEditor');if($.layout.name!=='webkit'){context.$content.removeClass('pasting');} context.fn.purgeOffsets();var newLength=context.fn.getContents().length;var restoreTo=cursorPos[0]+newLength-oldLength;context.fn.setSelection({start:restoreTo,end:restoreTo});},0);return true;},'ready':function(event){context.history.push({'html':context.$content.html(),'sel':context.fn.getCaretPosition()});return true;}};context.fn={'trigger':function(name,event){if(typeof event=='undefined'){event={'type':'custom'};} if(typeof event.data=='undefined'){event.data={};} _______________________________________________ MediaWiki-CVS mailing list MediaWiki-CVS@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-cvs