mediawiki.action.edit.preview: Run hook on detached node
authorTimo Tijhof <krinklemail@gmail.com>
Sat, 14 Dec 2013 03:00:43 +0000 (04:00 +0100)
committerKrinkle <krinklemail@gmail.com>
Fri, 20 Dec 2013 08:08:32 +0000 (08:08 +0000)
Change-Id: Ie5b70c6681bab51e9ac7067b9293b4e2cccd0574

resources/mediawiki.action/mediawiki.action.edit.preview.js

index c5cd61e..664bf89 100644 (file)
                // TODO: This should use the action=parse API instead of loading the entire page,
                // although that requires figuring out how to convert that raw data into proper HTML.
                $previewDataHolder.load( targetUrl + ' ' + copySelectors.join( ',' ), postData, function () {
-                       var i, $from;
+                       var i, $from, $next, $parent;
 
                        // Copy the contents of the specified elements from the loaded page to the real page.
                        // Also copy their class attributes.
                        for ( i = 0; i < copySelectors.length; i++ ) {
                                $from = $previewDataHolder.find( copySelectors[i] );
 
-                               $( copySelectors[i] )
-                                       .empty()
-                                       .append( $from.contents() )
-                                       .attr( 'class', $from.attr( 'class' ) );
+                               if ( copySelectors[i] === '#wikiPreview' ) {
+                                       $next = $wikiPreview.next();
+                                       // If there is no next node, use parent instead.
+                                       // Only query parent if needed, false otherwise.
+                                       $parent = !$next.length && $wikiPreview.parent();
+
+                                       $wikiPreview
+                                               .detach()
+                                               .empty()
+                                               .append( $from.contents() )
+                                               .attr( 'class', $from.attr( 'class' ) );
+
+                                       mw.hook( 'wikipage.content' ).fire( $wikiPreview );
+
+                                       // Reattach
+                                       if ( $parent ) {
+                                               $parent.append( $wikiPreview );
+                                       } else {
+                                               $next.before( $wikiPreview );
+                                       }
+
+                               } else {
+                                       $( copySelectors[i] )
+                                               .empty()
+                                               .append( $from.contents() )
+                                               .attr( 'class', $from.attr( 'class' ) );
+                               }
                        }
 
                        // Deprecated: Use mw.hook instead
                        $( mw ).trigger( 'LivePreviewDone', [copySelectors] );
 
-                       mw.hook( 'wikipage.content' ).fire( $wikiPreview );
-
                        $spinner.remove();
                        $copyElements.animate( {
                                opacity: 1