WordPress.org

Make WordPress Core

Ticket #23497: 23497.36.diff

File 23497.36.diff, 66.3 KB (added by adamsilverstein, 13 months ago)
  • wp-includes/default-filters.php

     
    250250add_action( 'plugins_loaded',             'wp_maybe_load_widgets',                    0    ); 
    251251add_action( 'plugins_loaded',             'wp_maybe_load_embeds',                     0    ); 
    252252add_action( 'shutdown',                   'wp_ob_end_flush_all',                      1    ); 
    253 add_action( 'pre_post_update',            'wp_save_post_revision',                   10, 2 ); 
     253add_action( 'pre_post_update',            'wp_save_post_revision',                   10, 1 ); 
     254add_action( 'post_updated',               'wp_save_post_revision',                   10, 1 ); 
    254255add_action( 'publish_post',               '_publish_post_hook',                       5, 1 ); 
    255256add_action( 'transition_post_status',     '_transition_post_status',                  5, 3 ); 
    256257add_action( 'transition_post_status',     '_update_term_count_on_transition_post_status', 10, 3 ); 
  • wp-includes/post-template.php

     
    13061306        if ( !in_array( $revision->post_type, array( 'post', 'page', 'revision' ) ) ) 
    13071307                return false; 
    13081308 
     1309        /* translators: revision date format, see http://php.net/date */ 
     1310        $datef = _x( 'j F, Y @ G:i', 'revision date format'); 
     1311        /* translators: 1: date */ 
     1312        $autosavef = __( '%1$s [Autosave]' ); 
     1313        /* translators: 1: date */ 
     1314        $currentf  = __( '%1$s [Current Revision]' ); 
     1315 
     1316        $date = date_i18n( $datef, strtotime( $revision->post_modified ) ); 
     1317        if ( $link && current_user_can( 'edit_post', $revision->ID ) && $link = get_edit_post_link( $revision->ID ) ) 
     1318                $date = "<a href='$link'>$date</a>"; 
     1319 
     1320        if ( !wp_is_post_revision( $revision ) ) 
     1321                $date = sprintf( $currentf, $date ); 
     1322        elseif ( wp_is_post_autosave( $revision ) ) 
     1323                $date = sprintf( $autosavef, $date ); 
     1324 
     1325        return $date; 
     1326} 
     1327 
     1328/** 
     1329 * Retrieve formatted date timestamp of a revision (linked to that revisions's page). 
     1330 * 
     1331 * @package WordPress 
     1332 * @subpackage Post_Revisions 
     1333 * @since 3.6.0 
     1334 * 
     1335 * @uses date_i18n() 
     1336 * 
     1337 * @param int|object $revision Revision ID or revision object. 
     1338 * @param bool $link Optional, default is true. Link to revisions's page? 
     1339 * @return string gravatar, user, i18n formatted datetimestamp or localized 'Current Revision'. 
     1340 */ 
     1341function wp_post_revision_title_expanded( $revision, $link = true ) { 
     1342        if ( !$revision = get_post( $revision ) ) 
     1343                return $revision; 
     1344 
     1345        if ( !in_array( $revision->post_type, array( 'post', 'page', 'revision' ) ) ) 
     1346                return false; 
     1347 
    13091348        $author = get_the_author_meta( 'display_name', $revision->post_author ); 
    13101349        /* translators: revision date format, see http://php.net/date */ 
    13111350        $datef = _x( 'j F, Y @ G:i:s', 'revision date format'); 
    13121351 
    1313         $gravatar = get_avatar( $revision->post_author, 18 ); 
     1352        $gravatar = get_avatar( $revision->post_author, 24 ); 
    13141353 
    13151354        $date = date_i18n( $datef, strtotime( $revision->post_modified ) ); 
    13161355        if ( $link && current_user_can( 'edit_post', $revision->ID ) && $link = get_edit_post_link( $revision->ID ) ) 
     
    13881427        } 
    13891428 
    13901429        /* translators: post revision: 1: when, 2: author name */ 
    1391         $titlef = _x( '%1$s by %2$s', 'post revision' ); 
     1430        $titlef = _x( '%1$s', 'post revision' ); 
    13921431 
    13931432        if ( $parent ) 
    13941433                array_unshift( $revisions, $post ); 
    13951434 
     1435        // since 3.6 revisions include a copy of the current post data as a revision 
     1436        // the collowing removes this current revision if present from the list of 
     1437        // revisions returned by wp_list_post_revisions, remove these to include the 
     1438        // crrent post revision in the list of revisions 
     1439        if ( wp_first_revision_matches_current_version( $post_id ) ) 
     1440                array_pop( $revisions ); 
     1441 
    13961442        $rows = $right_checked = ''; 
    13971443        $class = false; 
    13981444        $can_edit_post = current_user_can( 'edit_post', $post->ID ); 
     
    14021448                if ( 'revision' === $type && wp_is_post_autosave( $revision ) ) 
    14031449                        continue; 
    14041450 
    1405                 $date = wp_post_revision_title( $revision ); 
    1406                 $name = get_the_author_meta( 'display_name', $revision->post_author ); 
     1451                $date = wp_post_revision_title_expanded( $revision ); 
    14071452 
    1408                 if ( 'form-table' == $format ) { 
    1409                         if ( $left ) 
    1410                                 $left_checked = $left == $revision->ID ? ' checked="checked"' : ''; 
    1411                         else 
    1412                                 $left_checked = $right_checked ? ' checked="checked"' : ''; // [sic] (the next one) 
    1413                         $right_checked = $right == $revision->ID ? ' checked="checked"' : ''; 
     1453                $title = sprintf( $titlef, $date ); 
     1454                $rows .= "\t<li>$title</li>\n"; 
    14141455 
    1415                         $class = $class ? '' : " class='alternate'"; 
    1416  
    1417                         if ( $post->ID != $revision->ID && $can_edit_post ) 
    1418                                 $actions = '<a href="' . wp_nonce_url( add_query_arg( array( 'revision' => $revision->ID, 'action' => 'restore' ) ), "restore-post_$post->ID|$revision->ID" ) . '">' . __( 'Restore' ) . '</a>'; 
    1419                         else 
    1420                                 $actions = ''; 
    1421  
    1422                         $rows .= "<tr$class>\n"; 
    1423                         $rows .= "\t<th style='white-space: nowrap' scope='row'><input type='radio' name='left' value='$revision->ID'$left_checked /></th>\n"; 
    1424                         $rows .= "\t<th style='white-space: nowrap' scope='row'><input type='radio' name='right' value='$revision->ID'$right_checked /></th>\n"; 
    1425                         $rows .= "\t<td>$date</td>\n"; 
    1426                         $rows .= "\t<td>$name</td>\n"; 
    1427                         $rows .= "\t<td class='action-links'>$actions</td>\n"; 
    1428                         $rows .= "</tr>\n"; 
    1429                 } else { 
    1430                         $title = sprintf( $titlef, $date, $name ); 
    1431                         $rows .= "\t<li>$title</li>\n"; 
    1432                 } 
    14331456        } 
    14341457 
    14351458        if ( 'form-table' == $format ) : ?> 
     
    14791502                // if the post was previously restored from a revision 
    14801503                // show the restore event details 
    14811504                // 
    1482                 if ( $restored_from_meta = get_post_meta( $post->ID, '_post_restored_from', true ) ) {  
    1483                         $author = get_the_author_meta( 'display_name', $restored_from_meta[ 'restored_by_user' ] );  
    1484                         /* translators: revision date format, see http://php.net/date */  
    1485                         $datef = _x( 'j F, Y @ G:i:s', 'revision date format');  
    1486                         $date = date_i18n( $datef, strtotime( $restored_from_meta[ 'restored_time' ] ) );  
    1487                         $timesince = human_time_diff( $restored_from_meta[ 'restored_time' ], current_time( 'timestamp' ) ) . __( ' ago ' );  
    1488                         ?>  
     1505                if ( $restored_from_meta = get_post_meta( $post->ID, '_post_restored_from', true ) ) { 
     1506                        $author = get_the_author_meta( 'display_name', $restored_from_meta[ 'restored_by_user' ] ); 
     1507                        /* translators: revision date format, see http://php.net/date */ 
     1508                        $datef = _x( 'j F, Y @ G:i:s', 'revision date format'); 
     1509                        $date = date_i18n( $datef, strtotime( $restored_from_meta[ 'restored_time' ] ) ); 
     1510                        $timesince = human_time_diff( $restored_from_meta[ 'restored_time' ], current_time( 'timestamp' ) ) . __( ' ago ' ); 
     1511                        ?> 
    14891512                        <hr /> 
    1490                         <div id="revisions-meta-restored">  
    1491                                 <?php  
    1492                                 printf( 'Previously restored from Revision ID %d, %s by %s (%s)',  
    1493                                 $restored_from_meta[ 'restored_revision_id'],  
    1494                                 $timesince,  
    1495                                 $author,  
    1496                                 $date );  
    1497                                 ?>  
    1498                         </div>  
    1499                         <?php  
     1513                        <div id="revisions-meta-restored"> 
     1514                                <?php 
     1515                                printf( 'Previously restored from Revision ID %d, %s by %s (%s)', 
     1516                                $restored_from_meta[ 'restored_revision_id'], 
     1517                                $timesince, 
     1518                                $author, 
     1519                                $date ); 
     1520                                ?> 
     1521                        </div> 
     1522                        <?php 
    15001523                echo "</ul>"; 
    1501                 }  
     1524                } 
    15021525 
    15031526        endif; 
    15041527 
  • wp-includes/revision.php

     
    6262/** 
    6363 * Saves an already existing post as a post revision. 
    6464 * 
    65  * Typically used immediately prior to post updates. 
     65 * Typically used immediately prior and after post updates. 
     66 * Prior to update checks for old revision data (latest revision != current post before update) and adds a copy of the current post as a revision if missing 
     67 * After update adds a copy of the current post as a revision, so latest revision always matches current post 
    6668 * 
    6769 * @package WordPress 
    6870 * @subpackage Post_Revisions 
    6971 * @since 2.6.0 
    7072 * 
    7173 * @uses _wp_put_post_revision() 
     74 * @uses wp_first_revision_matches_current_version() 
    7275 * 
    7376 * @param int $post_id The ID of the post to save as a revision. 
    7477 * @return mixed Null or 0 if error, new revision ID, if success. 
    7578 */ 
    76 function wp_save_post_revision( $post_id, $new_data = null ) { 
    77         // We do autosaves manually with wp_create_post_autosave() 
     79function wp_save_post_revision( $post_id ) { 
     80        //check to see if the post's first revision already matches the post data 
     81        //should be true before post update, _except_ for old data which 
     82        //doesn't include a copy of the current post data in revisions 
     83        if ( wp_first_revision_matches_current_version( $post_id ) ) 
     84                return; 
     85 
    7886        if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) 
    7987                return; 
    8088 
     
    8290        if ( ! WP_POST_REVISIONS ) 
    8391                return; 
    8492 
    85         if ( !$post = get_post( $post_id, ARRAY_A ) ) 
     93        if ( ! $post = get_post( $post_id, ARRAY_A ) ) 
    8694                return; 
    8795 
    8896        if ( 'auto-draft' == $post['post_status'] ) 
    8997                return; 
    9098 
    91         if ( !post_type_supports($post['post_type'], 'revisions') ) 
     99        if ( ! post_type_supports( $post['post_type'], 'revisions' ) ) 
    92100                return; 
    93101 
    94         // if new data is supplied, check that it is different from last saved revision, unless a plugin tells us to always save regardless 
    95         if ( apply_filters( 'wp_save_post_revision_check_for_changes', true, $post, $new_data ) && is_array( $new_data ) ) { 
    96                 $post_has_changed = false; 
    97                 foreach ( array_keys( _wp_post_revision_fields() ) as $field ) { 
    98                         if ( normalize_whitespace( $new_data[ $field ] ) != normalize_whitespace( $post[ $field ] ) ) { 
    99                                 $post_has_changed = true; 
    100                                 break; 
     102        // compare the proposed update with the last stored revision, verify 
     103        // different, unless a plugin tells us to always save regardless 
     104        if ( $revisions = wp_get_post_revisions( $post_id ) ) { // grab the last revision 
     105                $last_revision = array_shift( $revisions ); 
     106 
     107                if ( $last_revision_array = get_post( $last_revision->ID, ARRAY_A ) ) { //if no previous revisions, save one for sure 
     108 
     109                        if ( apply_filters( 'wp_save_post_revision_check_for_changes', true, $last_revision_array, $post ) && is_array( $post ) ) { 
     110                                $post_has_changed = false; 
     111 
     112                                foreach ( array_keys( _wp_post_revision_fields() ) as $field ) { 
     113 
     114                                        if ( normalize_whitespace( $post[ $field ] ) != normalize_whitespace( $last_revision_array[ $field ] ) ) { 
     115                                                $post_has_changed = true; 
     116                                                break; 
     117 
     118                                        } 
     119                                } 
     120 
     121                                //don't save revision if post unchanged 
     122                                if( ! $post_has_changed ) 
     123                                        return; 
    101124                        } 
    102125                } 
    103                 //don't save revision if post unchanged 
    104                 if( ! $post_has_changed ) 
    105                         return; 
    106126        } 
    107127 
    108128        $return = _wp_put_post_revision( $post ); 
    109129 
    110130        // WP_POST_REVISIONS = true (default), -1 
    111         if ( !is_numeric( WP_POST_REVISIONS ) || WP_POST_REVISIONS < 0 ) 
     131        if ( ! is_numeric( WP_POST_REVISIONS ) || WP_POST_REVISIONS < 0 ) 
    112132                return $return; 
    113133 
    114134        // all revisions and (possibly) one autosave 
    115135        $revisions = wp_get_post_revisions( $post_id, array( 'order' => 'ASC' ) ); 
    116136 
    117137        // WP_POST_REVISIONS = (int) (# of autosaves to save) 
    118         $delete = count($revisions) - WP_POST_REVISIONS; 
     138        $delete = count( $revisions ) - WP_POST_REVISIONS; 
    119139 
    120140        if ( $delete < 1 ) 
    121141                return $return; 
     
    123143        $revisions = array_slice( $revisions, 0, $delete ); 
    124144 
    125145        for ( $i = 0; isset($revisions[$i]); $i++ ) { 
    126                 if ( false !== strpos( $revisions[$i]->post_name, 'autosave' ) ) 
     146                if ( false !== strpos( $revisions[ $i ]->post_name, 'autosave' ) ) 
    127147                        continue; 
    128                 wp_delete_post_revision( $revisions[$i]->ID ); 
     148                wp_delete_post_revision( $revisions[ $i ]->ID ); 
    129149        } 
    130150 
    131151        return $return; 
     
    316336        if ( $post_id ) 
    317337                do_action( 'wp_restore_post_revision', $post_id, $revision['ID'] ); 
    318338 
     339        //store revision event in post meta 
     340        $restore_details = array( 
     341                'restored_revision_id' => $revision_id, 
     342                'restored_by_user' => get_current_user_id(), 
     343                'restored_time' => time() 
     344        ); 
     345        update_post_meta( $post_id, '_post_restored_from', $restore_details ); 
     346        update_post_meta( $post_id, '_edit_last', get_current_user_id() ); 
     347 
    319348        return $post_id; 
    320349} 
    321350 
     
    404433                add_filter('the_preview', '_set_preview'); 
    405434        } 
    406435} 
     436 
     437/** 
     438 * Determines if the specified post's most recent revision matches the post (by checking post_modified). 
     439 * 
     440 * @package WordPress 
     441 * @subpackage Post_Revisions 
     442 * @since 3.6.0 
     443 * 
     444 * @param int|object $post Post ID or post object. 
     445 * @return bool false if not a match, otherwise true. 
     446 */ 
     447function wp_first_revision_matches_current_version( $post ) { 
     448 
     449        if ( ! $post = get_post( $post ) ) 
     450                return false; 
     451 
     452        if ( ! $revisions = wp_get_post_revisions( $post->ID ) ) 
     453                return false; 
     454 
     455        $last_revision = array_shift( $revisions ); 
     456 
     457        if ( ! ($last_revision->post_modified == $post->post_modified ) ) 
     458                return false; 
     459 
     460        return true; 
     461} 
  • wp-includes/pluggable.php

     
    17441744        return $r; 
    17451745} 
    17461746endif; 
     1747 
     1748if ( !function_exists( 'wp_text_diff_with_count' ) ) : 
     1749/** 
     1750 * Displays a human readable HTML representation of the difference between two strings. 
     1751 * similar to wp_text_diff, but tracks and returns could of lines added and removed 
     1752 * 
     1753 * @since 3.6 
     1754 * @see wp_parse_args() Used to change defaults to user defined settings. 
     1755 * @uses Text_Diff 
     1756 * @uses WP_Text_Diff_Renderer_Table 
     1757 * 
     1758 * @param string $left_string "old" (left) version of string 
     1759 * @param string $right_string "new" (right) version of string 
     1760 * @param string|array $args Optional. Change 'title', 'title_left', and 'title_right' defaults. 
     1761 * @return array contains html, linesadded & linesdeletd, empty string if strings are equivalent. 
     1762 */ 
     1763function wp_text_diff_with_count( $left_string, $right_string, $args = null ) { 
     1764        $defaults = array( 'title' => '', 'title_left' => '', 'title_right' => '' ); 
     1765        $args = wp_parse_args( $args, $defaults ); 
     1766 
     1767        if ( !class_exists( 'WP_Text_Diff_Renderer_Table' ) ) 
     1768                        require( ABSPATH . WPINC . '/wp-diff.php' ); 
     1769 
     1770        $left_string  = normalize_whitespace( $left_string ); 
     1771        $right_string = normalize_whitespace( $right_string ); 
     1772 
     1773        $left_lines  = explode( "\n", $left_string ); 
     1774        $right_lines = explode( "\n", $right_string) ; 
     1775 
     1776        $text_diff = new Text_Diff($left_lines, $right_lines  ); 
     1777        $linesadded = $text_diff->countAddedLines(); 
     1778        $linesdeleted = $text_diff->countDeletedLines(); 
     1779 
     1780        $renderer  = new WP_Text_Diff_Renderer_Table(); 
     1781        $diff = $renderer->render( $text_diff ); 
     1782 
     1783        if ( !$diff ) 
     1784                        return ''; 
     1785 
     1786                $r  = "<table class='diff'>\n"; 
     1787 
     1788        if ( ! empty( $args[ 'show_split_view' ] ) ) { 
     1789                $r .= "<col class='content diffsplit left' /><col class='content diffsplit middle' /><col class='content diffsplit right' />"; 
     1790        } else { 
     1791                $r .= "<col class='content' />"; 
     1792        } 
     1793 
     1794        if ( $args['title'] || $args['title_left'] || $args['title_right'] ) 
     1795                $r .= "<thead>"; 
     1796        if ( $args['title'] ) 
     1797                $r .= "<tr class='diff-title'><th colspan='4'>$args[title]</th></tr>\n"; 
     1798        if ( $args['title_left'] || $args['title_right'] ) { 
     1799                $r .= "<tr class='diff-sub-title'>\n"; 
     1800                $r .= "\t<td></td><th>$args[title_left]</th>\n"; 
     1801                $r .= "\t<td></td><th>$args[title_right]</th>\n"; 
     1802                $r .= "</tr>\n"; 
     1803        } 
     1804        if ( $args['title'] || $args['title_left'] || $args['title_right'] ) 
     1805                $r .= "</thead>\n"; 
     1806 
     1807        $r .= "<tbody>\n$diff\n</tbody>\n"; 
     1808        $r .= "</table>"; 
     1809 
     1810        return array( 'html' => $r, 'linesadded' => $linesadded, 'linesdeleted' => $linesdeleted ); 
     1811        } 
     1812        endif; 
  • wp-includes/script-loader.php

     
    273273        $scripts->add( 'template', "/wp-includes/js/template$suffix.js", array('underscore'), '1.4.4', 1 ); 
    274274        $scripts->add( 'backbone', '/wp-includes/js/backbone.min.js', array('underscore','jquery', 'template'), '0.9.10', 1 ); 
    275275 
    276         $scripts->add( 'revisions', "/wp-admin/js/revisions$suffix.js", array( 'backbone', 'jquery-ui-slider' ), false, 1 ); 
     276        $scripts->add( 'revisions', "/wp-admin/js/revisions$suffix.js", array( 'backbone', 'jquery-ui-slider', 'jquery-ui-tooltip' ), false, 1 ); 
    277277 
    278278        $scripts->add( 'imgareaselect', "/wp-includes/js/imgareaselect/jquery.imgareaselect$suffix.js", array('jquery'), '0.9.8', 1 ); 
    279279 
  • wp-admin/includes/ajax-actions.php

     
    21232123        /* translators: revision date format, see http://php.net/date */ 
    21242124        $datef = _x( 'j F, Y @ G:i:s', 'revision date format'); 
    21252125 
     2126        $left_revision = get_post( $compare_to ); 
     2127        //error_log($left_revision); 
    21262128        //single model fetch mode 
     2129        //return the diff of a single revision comparison 
    21272130        if ( 0 != $single_revision_id ) { 
    2128                 $left_revision = get_post( $compare_to ); 
    21292131                $right_revision = get_post( $single_revision_id ); 
    21302132 
    2131                 if ( $compare_two_mode ) { 
    2132                         $compare_to_gravatar = get_avatar( $left_revision->post_author, 18 ); 
    2133                         $compare_to_author = get_the_author_meta( 'display_name', $left_revision->post_author ); 
    2134                         $compare_to_date = date_i18n( $datef, strtotime( $left_revision->post_modified ) ); 
    2135  
    2136                         $revision_from_date_author = sprintf( 
    2137                                 '%s %s, %s %s (%s)', 
    2138                                 $compare_to_gravatar, 
    2139                                 $compare_to_author, 
    2140                                 human_time_diff( strtotime( $left_revision->post_modified ), current_time( 'timestamp' ) ), 
    2141                                 __( ' ago ' ), 
    2142                                 $compare_to_date 
    2143                         ); 
    2144                 } 
    2145  
    21462133                // 
    21472134                //make sure the left revision is the most recent 
    21482135                // 
     
    21522139                        $right_revision = $temp; 
    21532140                } 
    21542141 
     2142                $linesadded=0; 
     2143                $linesdeleted=0; 
     2144 
    21552145                // 
    21562146                //compare from left to right, passed from application 
    21572147                // 
     
    21672157                        if ( ! empty( $show_split_view ) ) 
    21682158                                 $args = array( 'show_split_view' => true ); 
    21692159 
    2170                         $content .= wp_text_diff( $left_content, $right_content, $args ); 
     2160                        $diff = wp_text_diff_with_count( $left_content, $right_content, $args ); 
     2161 
     2162                        if ( isset( $diff[ 'html' ] ) ) 
     2163                                $content .= $diff[ 'html' ]; 
     2164 
     2165                        if ( isset( $diff[ 'linesadded' ] ) ) 
     2166                                $linesadded = $linesadded + $diff[ 'linesadded' ]; 
     2167 
     2168                        if ( isset( $diff[ 'linesdeleted' ] ) ) 
     2169                                $linesdeleted = $linesdeleted + $diff[ 'linesdeleted' ]; 
     2170 
     2171 
    21712172                } 
    2172                         $content = '' == $content ? __( 'No difference' ) : $content; 
    2173                         $alltherevisions = array ( 
    2174                                 'revisiondiff' => $content 
    2175                         ); 
     2173                $content = '' == $content ? __( 'No difference' ) : $content; 
     2174 
     2175                $alltherevisions = array ( 
     2176                        'revisiondiff' => $content, 
     2177                        'lines_deleted' => $linesdeleted, 
     2178                        'lines_added' => $linesadded 
     2179                ); 
    21762180                echo json_encode( $alltherevisions ); 
    21772181                exit(); 
    2178         } 
     2182        } //end single model fetch 
    21792183 
     2184        //fetch the list of revisions available 
     2185 
    21802186        //if we are comparing two revisions, the first 'revision' represented by the leftmost 
    21812187        //slider position is the current revision, prepend a comparison to this revision 
    2182         if ( $compare_two_mode )  
    2183                 array_unshift( $revisions, get_post( $post_id ) ); 
    2184                  
     2188        if ( ! wp_first_revision_matches_current_version( $post_id ) ) //revisions don't have current version 
     2189                array_unshift( $revisions, get_post( $post_id ) ) ; 
     2190        //$revisions->append ( get_post( $post_id ) ); 
     2191        //error_log( var_dump( $revisions )); 
    21852192        $count = -1; 
    21862193 
     2194        //reverse the list to start with oldes revision 
     2195        $revisions = array_reverse( $revisions ); 
     2196 
     2197        $previous_revision_id = 0; 
    21872198        foreach ( $revisions as $revision ) : 
    2188                 if ( ! empty( $show_autosaves ) && wp_is_post_autosave( $revision ) ) 
     2199                //error_log( ( $show_autosaves  )); 
     2200                if ( empty( $show_autosaves ) && wp_is_post_autosave( $revision ) ) 
    21892201                                continue; 
    21902202 
    21912203                $revision_from_date_author = ''; 
    21922204                $count++; 
    21932205                // return blank data for diffs to the left of the left handle (for right handel model) 
    21942206                // or to the right of the right handle (for left handel model) 
    2195                 if ( ( 0 != $left_handle_at && $count <= $left_handle_at ) ||  
    2196                          ( 0 != $right_handle_at && $count > $right_handle_at )) {  
     2207                if ( ( 0 != $left_handle_at && $count <= $left_handle_at ) || 
     2208                         ( 0 != $right_handle_at && $count > $right_handle_at )) { 
    21972209                        $alltherevisions[] = array ( 
    21982210                                'ID' => $revision->ID, 
    21992211                        ); 
    2200                          
    22012212                        continue; 
    22022213                } 
    22032214 
    2204                 $gravatar = get_avatar( $revision->post_author, 18 ); 
     2215                if ( $compare_two_mode ) { 
     2216                        $compare_to_gravatar = get_avatar( $left_revision->post_author, 24 ); 
     2217                        $compare_to_author = get_the_author_meta( 'display_name', $left_revision->post_author ); 
     2218                        $compare_to_date = date_i18n( $datef, strtotime( $left_revision->post_modified ) ); 
     2219 
     2220                        $revision_from_date_author = sprintf( 
     2221                                '%s %s, %s %s (%s)', 
     2222                                $compare_to_gravatar, 
     2223                                $compare_to_author, 
     2224                                human_time_diff( strtotime( $left_revision->post_modified ), current_time( 'timestamp' ) ), 
     2225                                __( ' ago ' ), 
     2226                                $compare_to_date 
     2227                        ); 
     2228                } 
     2229 
     2230                $gravatar = get_avatar( $revision->post_author, 24 ); 
    22052231                $author = get_the_author_meta( 'display_name', $revision->post_author ); 
    22062232                $date = date_i18n( $datef, strtotime( $revision->post_modified ) ); 
    22072233                $revision_date_author = sprintf( 
     
    22132239                        $date 
    22142240                ); 
    22152241 
     2242                $autosavef = __( '%1$s [Autosave]' ); 
     2243                $currentf  = __( '%1$s [Current Revision]' ); 
     2244 
     2245                if ( ! $post = get_post( $post_id)) 
     2246                        exit(); 
     2247 
     2248                if ( $left_revision->post_modified === $post->post_modified ) 
     2249                        $revision_from_date_author = sprintf( $currentf, $revision_from_date_author ); 
     2250                elseif ( wp_is_post_autosave( $left_revision ) ) 
     2251                        $revision_from_date_author = sprintf( $autosavef, $revision_from_date_author ); 
     2252 
     2253                if ( $revision->post_modified === $post->post_modified ) 
     2254                        $revision_date_author = sprintf( $currentf, $revision_date_author ); 
     2255                elseif ( wp_is_post_autosave( $revision ) ) 
     2256                        $revision_date_author = sprintf( $autosavef, $revision_date_author ); 
     2257 
     2258                $date_short_format = __( 'j M @ G:i' ); 
     2259                $date_short = date_i18n( $date_short_format, strtotime( $revision->post_modified ) ); 
     2260 
     2261                $revision_date_author_short = sprintf( 
     2262                        '%s <strong>%s</strong><br />%s', 
     2263                        $gravatar, 
     2264                        $author, 
     2265                        $date_short 
     2266                ); 
     2267 
    22162268                $restoreaction = wp_nonce_url( 
    22172269                        add_query_arg( 
    22182270                                array( 'revision' => $revision->ID, 
    22192271                                        'action' => 'restore' ), 
    22202272                                        admin_url( 'revision.php' ) 
    22212273                        ), 
    2222                         "restore-post_{$compare_to}|{$revision->ID}" 
     2274                        "restore-post_{$revision->ID}" 
    22232275                ); 
    22242276 
    2225                 $alltherevisions[] = array ( 
     2277                if ( ( $compare_two_mode || 0 !== $previous_revision_id ) ) { 
     2278                        $alltherevisions[] = array ( 
    22262279                                'ID' => $revision->ID, 
    22272280                                'revision_date_author' => $revision_date_author, 
    22282281                                'revision_from_date_author' => $revision_from_date_author, 
     2282                                'revision_date_author_short' => $revision_date_author_short, 
    22292283                                'restoreaction' => urldecode( $restoreaction ), 
    2230                                 'revision_toload' => true 
     2284                                'revision_toload' => true, 
     2285                                'previous_revision_id' => $previous_revision_id 
    22312286                        ); 
     2287                } 
     2288                $previous_revision_id = $revision->ID; 
    22322289 
    22332290        endforeach; 
    22342291 
  • wp-admin/js/revisions.js

     
    77 
    88                Model : Backbone.Model.extend({ 
    99                        idAttribute : 'ID', 
    10                         urlRoot : ajaxurl +     '?action=revisions-data&compare_to=' + wpRevisionsSettings.post_id + 
    11                                 '&show_autosaves=false&show_split_view=true&nonce=' + wpRevisionsSettings.nonce, 
     10                        urlRoot : ajaxurl +     '?action=revisions-data' + 
     11                                '&show_autosaves=true&show_split_view=true&nonce=' + wpRevisionsSettings.nonce, 
    1212                        defaults: { 
    1313                                ID : 0, 
    1414                                revision_date_author : '', 
     15                                revision_date_author_short: '', 
    1516                                revisiondiff : '<div class="diff-loading"><div class="spinner"></div></div>', 
    1617                                restoreaction : '', 
    1718                                revision_from_date_author : '', 
    18                                 revision_toload : false 
     19                                revision_toload : false, 
     20                                lines_added : 0, 
     21                                lines_deleted : 0, 
     22                                scope_of_changes : 'none', 
     23                                previous_revision_id : 0 
    1924                        }, 
    2025 
    2126                        url : function() { 
    22                                 return this.urlRoot + '&single_revision_id=' + this.id; 
     27                                if ( 1 === REVAPP._compareoneortwo ) { 
     28                                        return this.urlRoot + 
     29                                                '&single_revision_id=' + this.id + 
     30                                                '&compare_to=' + this.get( 'previous_revision_id' ) + 
     31                                                '&post_id=' + wpRevisionsSettings.post_id; 
     32                                } else { 
     33                                        return this.urlRoot + 
     34                                '&single_revision_id=' + this.id; 
     35                                } 
     36 
    2337                        } 
    2438 
    2539                }), 
     
    3549                        _revisionsOptions : null, 
    3650                        _left_diff : 0, 
    3751                        _right_diff : 1, 
    38                         _autosaves : false, 
     52                        _autosaves : true, 
    3953                        _show_split_view : true, 
    4054                        _compareoneortwo : 1, 
    4155                        _left_model_loading : false,    //keep track of model loads 
    4256                        _right_model_loading : false,   //disallow slider interaction, also repeat loads, while loading 
     57                        _tickmarkView : null, //the slider tickmarks 
     58                        _has_tooltip : false, 
    4359 
    44                         //TODO add ability to arrive on specific revision 
    4560                        routes : { 
    4661                        }, 
    4762 
    48                         viewrevision : function( revision ) { 
    49                                 //coming soon 
    50                         }, 
    51  
    5263                        reload_toload_revisions : function( model_collection, reverse_direction ) { 
    5364                                var self = this; 
    5465                                var revisions_to_load = model_collection.where( { revision_toload : true } ); 
    55                                 //console.log(revisions_to_load); 
    5666                                var delay=0; 
    57                                 _.each(revisions_to_load, function( the_model ) { 
     67                                //match slider to passed revision_id 
     68                                _.each( revisions_to_load, function( the_model ) { 
     69                                        if ( the_model.get( 'ID' )  == wpRevisionsSettings.revision_id ) { 
     70                                                self._right_diff = self._revisions.indexOf( the_model ) + 1; 
     71                                        } 
     72 
     73                                }); 
     74                                _.each( revisions_to_load, function( the_model ) { 
    5875                                                the_model.urlRoot = model_collection.url; 
    5976                                                _.delay( function() { 
    6077                                                        the_model.fetch( { 
    6178                                                                update : true, 
    6279                                                                add : false, 
    6380                                                                remove : false, 
    64                                                                 //async : false, 
    6581                                                                success : function( model ) { 
    66                                                                         //console.log(model.get( 'ID' ) +'-'+self._revisions.at( self._right_diff ).get( 'ID' )); 
    67                                                                         if ( model.get( 'ID' ) === self._revisions.at( self._right_diff - 1 ).get( 'ID' ) ) { //reload if current model refreshed 
    68                                                                                 //console.log('render'); 
     82                                                                        model.set( 'revision_toload', 'false' ); 
     83 
     84                                                                        //stop spinner when all models are loaded 
     85                                                                        if ( 0 === model_collection.where( { revision_toload : true } ).length ) 
     86                                                                                self.stop_model_loading_spinner(); 
     87 
     88                                                                        self._tickmarkView.render(); 
     89 
     90                                                                        var total_changes = model.get( 'lines_added' ) + model.get( 'lines_deleted'); 
     91                                                                        var scope_of_changes = 'vsmall'; 
     92 
     93                                                                        // Note: hard coded scope of changes 
     94                                                                        // TODO change to dynamic based on range of values 
     95                                                                        if  ( total_changes > 1 && total_changes <= 3 ) { 
     96                                                                                scope_of_changes = 'small'; 
     97                                                                        } else if(total_changes > 3 && total_changes <= 5 ) { 
     98                                                                                scope_of_changes = 'med'; 
     99                                                                        } else if(total_changes > 5 && total_changes <= 10 ) { 
     100                                                                                scope_of_changes = 'large'; 
     101                                                                        } else if(total_changes > 10 ) { 
     102                                                                                scope_of_changes = 'vlarge'; 
     103                                                                        } 
     104                                                                        model.set( 'scope_of_changes', scope_of_changes ); 
     105                                                                        if ( 0 !== self._right_diff && 
     106                                                                                model.get( 'ID' ) === self._revisions.at( self._right_diff - 1 ).get( 'ID' ) ) { 
     107                                                                                //reload if current model refreshed 
    69108                                                                                self._revisionView.render(); 
    70109                                                                        } 
     110 
    71111                                                                } 
    72112                                                } ); 
    73113                                                }, delay ) ; 
    74                                                 delay = delay + 200; //stagger model loads by 200 ms to avoid hammering server with requests 
     114                                                delay = delay + 150; //stagger model loads to avoid hammering server with requests 
    75115                                        } 
    76116                                ); 
    77117                        }, 
     
    83123 
    84124                        stop_left_model_loading : function() { 
    85125                                this._left_model_loading = false; 
    86                                 $('.revisiondiffcontainer').removeClass('leftmodelloading'); 
    87126                        }, 
    88127 
    89128                        start_right_model_loading : function() { 
     
    93132 
    94133                        stop_right_model_loading : function() { 
    95134                                this._right_model_loading = false; 
     135                        }, 
     136 
     137                        stop_model_loading_spinner : function() { 
    96138                                $('.revisiondiffcontainer').removeClass('rightmodelloading'); 
     139                                $('.revisiondiffcontainer').removeClass('leftmodelloading'); 
    97140                        }, 
    98141 
    99142                        reloadmodel : function() { 
     
    107150                        reloadmodelsingle : function() { 
    108151                                var self = this; 
    109152                                self._revisions.url = ajaxurl + '?action=revisions-data&compare_to=' + wpRevisionsSettings.post_id + 
    110                                                                                         '&show_autosaves=' + self._autosaves + 
     153                                                                                        '&show_autosaves=' + REVAPP._autosaves + 
    111154                                                                                        '&show_split_view=' +  REVAPP._show_split_view + 
    112155                                                                                        '&nonce=' + wpRevisionsSettings.nonce; 
    113156                                self.start_right_model_loading(); 
    114                                 this._revisions.fetch({ //reload revision data 
     157                                self._revisions.fetch({ //reload revision data 
    115158                                        success : function() { 
    116159                                                self.stop_right_model_loading(); 
    117160                                                var revisioncount = self._revisions.length; 
    118                                                 if ( self._right_diff > revisioncount ) //if right handle past rightmost, move 
    119                                                         self._right_diff = revisioncount; 
    120161 
    121162                                                self._revisionView.render(); 
    122163                                                self.reload_toload_revisions( self._revisions ); 
    123164 
    124                                                 $( '#slider' ).slider( 'option', 'max', revisioncount-1 ); //TODO test this, autsaves changed 
     165                                                $( '#slider' ).slider( 'option', 'max', revisioncount-1 ); //TODO test this, if autsave option changed 
     166                                                $( '#slider' ).slider( 'value', REVAPP._right_diff - 1 ).trigger( 'slide' ); 
     167                                                REVAPP._tickmarkView.model = self._revisions; 
     168                                                REVAPP._tickmarkView.render(); 
    125169                                        }, 
    126170 
    127171                                        error : function () { 
    128172                                                self.stop_right_model_loading(); 
    129                                                 //console.log( 'Error loading revision data' ); 
    130173                                        } 
    131174 
    132175                                }); 
     
    136179                                var self = this; 
    137180                                self.start_left_model_loading(); 
    138181                                self._left_handle_revisions = new wp.revisions.Collection(); 
     182 
    139183                                self._left_handle_revisions.url = 
    140184                                        ajaxurl + 
    141185                                        '?action=revisions-data&compare_to=' + self._revisions.at( self._right_diff - 1 ).get( 'ID' ) + 
    142186                                        '&post_id=' + wpRevisionsSettings.post_id + 
    143                                         '&show_autosaves=' + self._autosaves + 
    144                                         '&show_split_view=' +  self._show_split_view + 
     187                                        '&show_autosaves=' + REVAPP._autosaves + 
     188                                        '&show_split_view=' +  REVAPP._show_split_view + 
    145189                                        '&nonce=' + wpRevisionsSettings.nonce + 
    146190                                        '&right_handle_at='  + ( self._right_diff ); 
    147191 
     
    150194                                        success : function(){ 
    151195                                                self.stop_left_model_loading(); 
    152196                                                self.reload_toload_revisions( self._left_handle_revisions ); 
    153                                         }, 
     197                                                self._tickmarkView.model = self._left_handle_revisions; 
     198                                                $( '#slider' ).slider( 'option', 'max', self._revisions.length ); 
     199                                                // ensure right handle not beyond length, in particular if viewing autosaves is switched from on to off 
     200                                                // the number of models in the collection might get shorter, this ensures right handle is not beyond last model 
     201                                                if ( self._right_diff > self._revisions.length ) 
     202                                                        self._right_diff = self._revisions.length; 
     203                                                }, 
    154204 
    155205                                        error : function () { 
    156                                                 //console.log( 'Error loading revision data' ); 
    157206                                                self.stop_left_model_loading(); 
    158207                                        } 
    159208                                }); 
     
    163212                                var self = this; 
    164213                                self.start_right_model_loading(); 
    165214                                self._right_handle_revisions = new wp.revisions.Collection(); 
    166                                 if ( 0 === self._left_diff ) { 
     215 
    167216                                        self._right_handle_revisions.url = 
    168217                                                ajaxurl + 
    169                                                 '?action=revisions-data&compare_to=' + wpRevisionsSettings.post_id + 
     218                                                '?action=revisions-data&compare_to=' + ( self._revisions.at( self._left_diff ).get( 'ID' ) - 1 )+ 
    170219                                                '&post_id=' + wpRevisionsSettings.post_id + 
    171                                                 '&show_autosaves=' + self._autosaves + 
    172                                                 '&show_split_view=' +  self._show_split_view + 
     220                                                '&show_autosaves=' + REVAPP._autosaves + 
     221                                                '&show_split_view=' +  REVAPP._show_split_view + 
    173222                                                '&nonce=' + wpRevisionsSettings.nonce; 
    174                                 } else { 
    175                                         self._right_handle_revisions.url = 
    176                                                 ajaxurl + 
    177                                                 '?action=revisions-data&compare_to=' + self._revisions.at( self._left_diff - 1 ).get( 'ID' ) + 
    178                                                 '&post_id=' + wpRevisionsSettings.post_id + 
    179                                                 '&show_autosaves=' + self._autosaves + 
    180                                                 '&show_split_view=' +  self._show_split_view + 
    181                                                 '&nonce=' + wpRevisionsSettings.nonce + 
    182                                                 '&left_handle_at=' + (self._left_diff ) ; 
    183                                 } 
    184223 
    185224                                self._right_handle_revisions.fetch({ 
    186225 
    187226                                        success : function(){ 
    188227                                                self.stop_right_model_loading(); 
    189228                                                self.reload_toload_revisions( self._right_handle_revisions ); 
     229                                                self._tickmarkView.model = self._right_handle_revisions; 
     230                                                $( '#slider' ).slider( 'option', 'max', self._revisions.length ); 
     231                                                $( '#slider' ).slider( 'values', [ REVAPP._left_diff, REVAPP._right_diff] ).trigger( 'slide' ); 
     232 
     233                                                //REVAPP._revisionView.render(); 
     234 
    190235                                        }, 
    191236 
    192237                                        error : function ( response ) { 
    193                                                 //console.log( 'Error loading revision data - ' + response.toSource() ); 
    194238                                                self.stop_right_model_loading(); 
    195239                                        } 
    196240                                }); 
     
    198242                        }, 
    199243 
    200244                        reloadleftright : function() { 
     245                                this.start_right_model_loading(); 
     246                                this.start_left_model_loading(); 
    201247                                this.reloadleft(); 
    202248                                this.reloadright(); 
    203249                        }, 
     
    208254                        initialize : function( options ) { 
    209255                                var self = this; //store the application instance 
    210256                                if (this._revisions === null) { 
    211                                         self._autosaves = ''; 
    212257                                        self._revisions = new wp.revisions.Collection(); //set up collection 
    213258                                        self.start_right_model_loading(); 
    214259                                        self._revisions.fetch({ //load revision data 
    215260 
    216261                                                success : function() { 
    217262                                                        self.stop_right_model_loading(); 
    218                                                         self.revisionDiffSetup(); 
     263                                                        //self._right_handle_revisions = self._revisions; 
     264                                                        self.completeApplicationSetup(); 
    219265                                                } 
    220266                                        }); 
    221267                                } 
    222268                                return this; 
    223269                        }, 
    224270 
    225                         revisionDiffSetup : function() { 
     271                        addTooltip : function( handle, message ) { 
     272 
     273                                handle.attr( 'title', '' ).tooltip({ 
     274                                        track: false, 
     275 
     276                                        position: { 
     277                                                my: "left-30 top-66", 
     278                                                at: "top left", 
     279                                                using: function( position, feedback ) { 
     280                                                        $( this ).css( position ); 
     281                                                        $( "<div>" ) 
     282                                                        .addClass( "arrow" ) 
     283                                                        .addClass( feedback.vertical ) 
     284                                                        .addClass( feedback.horizontal ) 
     285                                                        .appendTo( $( this ) ); 
     286                                                } 
     287                                        }, 
     288                                        show: false, 
     289                                        hide: false, 
     290                                        content:  function() { 
     291                                                return message; 
     292                                        } 
     293 
     294                                } ); 
     295                        }, 
     296/**/ 
     297 
     298                        completeApplicationSetup : function() { 
    226299                                this._revisionView = new wp.revisions.views.View({ 
    227300                                        model : this._revisions 
    228301                                }); 
    229302                                this._revisionView.render(); 
    230                                 $( '#diff_max, #diff_maxof' ).html( this._revisions.length ); 
    231                                 $( '#diff_count' ).html( REVAPP._right_diff ); 
    232303                                $( '#slider' ).slider( 'option', 'max', this._revisions.length - 1 ); 
    233304 
    234305                                this.reload_toload_revisions( this._revisions ); 
     306 
    235307                                this._revisionsInteractions = new wp.revisions.views.Interact({ 
    236308                                        model : this._revisions 
    237309                                }); 
    238310                                this._revisionsInteractions.render(); 
    239311 
     312                                this._tickmarkView = new wp.revisions.views.Tickmarks({ 
     313                                        model : this._revisions 
     314                                }); 
     315                                this._tickmarkView.render(); 
     316                                this._tickmarkView.resetticks(); 
     317 
     318 
    240319                                /* 
     320                                .on( 'mouseup', function( event ) { 
     321                                        REVAPP._keep_tooltip_open = false; 
     322                                        $( this ).find('.ui-slider-tooltip').hide(); 
     323                                } ).on( 'mousedown', function( event ) { 
     324                                        REVAPP._keep_tooltip_open = true; 
     325                                } ).on( 'mouseout', function( event ) { 
     326                                        if ( REVAPP._keep_tooltip_open) 
     327                                                event.stopImmediatePropagation(); 
     328                                        }); 
     329                                */ 
     330                                /* 
    241331                                //Options hidden for now, moving to screen options 
    242332                                this._revisionsOptions = new wp.revisions.views.Options({ 
    243333                                        model : this._revisions 
     
    252342        wp.revisions.Collection = Backbone.Collection.extend({ 
    253343                model : wp.revisions.Model, 
    254344                url : ajaxurl + '?action=revisions-data&compare_to=' + wpRevisionsSettings.post_id + 
    255                         '&show_autosaves=false&show_split_view=true&nonce=' + wpRevisionsSettings.nonce, 
     345                        '&show_autosaves=true&show_split_view=true&nonce=' + wpRevisionsSettings.nonce, 
    256346 
    257347                initialize : function() { 
    258348                        } 
    259349        } ); 
    260350 
    261351        _.extend(wp.revisions.views, { 
     352 
     353                //Ticks inside slider view 
    262354                // 
     355                Tickmarks : Backbone.View.extend({ 
     356                        el : $('#diff-slider-ticks')[0], 
     357                        tagName : 'diff-slider-ticks-view', 
     358                        className : 'diff-slider-ticks-container', 
     359                        template : wp.template('revision-ticks'), 
     360                        model : wp.revisions.Model, 
     361 
     362                        resetticks : function() { 
     363                                var slider_max = $( '#slider' ).slider( 'option', 'max'); 
     364                                var slider_width = $( '#slider' ).width(); 
     365                                var adjust_max = ( 2 === REVAPP._compareoneortwo ) ? 1 : 0; 
     366                                var tick_width = Math.floor( slider_width / ( slider_max - adjust_max ) ); 
     367 
     368                                //TODO: adjust right margins for wider ticks so they stay centered on handle stop point 
     369 
     370                                //set minimum and maximum widths for tick marks 
     371                                tick_width = (tick_width > 50 ) ? 50 : tick_width; 
     372                                tick_width = (tick_width < 10 ) ? 10 : tick_width; 
     373 
     374                                slider_width = tick_width * (slider_max - adjust_max ) +1; 
     375 
     376                                $( '#slider' ).width( slider_width ); 
     377                                $( '.diff-slider-ticks-wrapper' ).width( slider_width ); 
     378                                $( '#diffslider' ).width( slider_width ); 
     379                                $( '#diff-slider-ticks' ).width( slider_width ); 
     380 
     381                                var a_tick_width = $( '.revision-tick' ).width(); 
     382 
     383                                if ( tick_width !==  a_tick_width ) { // is the width already set correctly? 
     384                                        $( '.revision-tick' ).each( function( ) { 
     385                                                $(this).css( 'margin-right', tick_width - 1 + 'px'); //space the ticks out using right margin 
     386                                        }); 
     387 
     388                                        if( 2 === REVAPP._compareoneortwo ) { 
     389                                                $( '.revision-tick' ).first().remove(); //TODO - remove the check 
     390                                        } 
     391                                        $( '.revision-tick' ).last().css( 'margin-right', '0' ); // last tick gets no right margin 
     392                                } 
     393 
     394                        }, 
     395 
     396                        //render the tickmark view 
     397                        render : function() { 
     398                                var self = this; 
     399 
     400                                if ( null !== self.model ) { 
     401                                        var addhtml = ""; 
     402                                        _.each ( self.model.models, function ( the_model ) { 
     403                                                addhtml = addhtml + self.template ( the_model.toJSON() ); 
     404                                        }); 
     405                                        self.$el.html( addhtml ); 
     406 
     407                                } 
     408                                self.resetticks(); 
     409                                return self; 
     410                        } 
     411                }), 
     412 
     413                // 
    263414                //primary revision diff view 
    264415                // 
    265416                View : Backbone.View.extend({ 
     
    267418                        tagName : 'revisionvview', 
    268419                        className : 'revisionview-container', 
    269420                        template : wp.template('revision'), 
    270                         revvapp : null, 
    271421                        comparetwochecked : '', 
    272422                        draggingleft : false, 
    273423 
    274                         initialize : function(){ 
    275                         }, 
    276  
    277424                        // 
    278425                        //render the revisions 
    279426                        // 
    280427                        render : function() { 
    281428                                var addhtml = ''; 
    282429                                //compare two revisions mode? 
     430 
    283431                                if ( 2 === REVAPP._compareoneortwo ) { 
    284432                                        this.comparetwochecked = 'checked'; 
    285433                                        if ( this.draggingleft ) { 
     
    310458                                this.$el.html( addhtml ); 
    311459                                if ( this.model.length < 3 ) { 
    312460                                        $( 'div#comparetworevisions' ).hide(); //don't allow compare two if fewer than three revisions 
     461                                } 
     462                                if ( this.model.length < 2 ) { 
     463                                        $( 'div#diffslider' ).hide(); //don't allow compare two if fewer than three revisions 
     464                                        $( 'div.diff-slider-ticks-wrapper' ).hide(); 
     465                                } 
    313466 
     467                                // 
     468                                // add tooltips to the handles 
     469                                // 
     470                                if ( 2 === REVAPP._compareoneortwo ) { 
     471                                        REVAPP.addTooltip ( $( 'a.ui-slider-handle.left-handle' ), 
     472                                                ( REVAPP._right_diff >= REVAPP._revisions.length ) ? '' : REVAPP._revisions.at( REVAPP._left_diff ).get( 'revision_date_author_short' ) ); 
     473                                        REVAPP.addTooltip ( $( 'a.ui-slider-handle.right-handle' ), 
     474                                                ( REVAPP._right_diff >= REVAPP._revisions.length ) ? '' : REVAPP._revisions.at( REVAPP._right_diff ).get( 'revision_date_author_short' ) ); 
     475                                } else { 
     476                                        REVAPP.addTooltip ( $( 'a.ui-slider-handle' ), 
     477                                                ( REVAPP._right_diff >= REVAPP._revisions.length ) ? '' : REVAPP._revisions.at( REVAPP._right_diff ).get( 'revision_date_author_short' ) ); 
    314478                                } 
    315                                 //console.log ( (this.model.at( REVAPP._right_diff - 1 )).url()); 
     479 
     480                                // 
     481                                // hide the restore button when on the last sport/current post data 
     482                                // 
     483                                if ( (  2 === REVAPP._compareoneortwo  &&  ! REVAPP._revisionView.draggingleft ) || 
     484                                                1 === REVAPP._compareoneortwo ) { 
     485                                        if (  REVAPP._right_diff === REVAPP._revisions.length ){ 
     486                                                $( '.restore-button' ).hide(); 
     487                                        } else { 
     488                                                $( '.restore-button' ).show(); 
     489                                        } 
     490                                } 
     491 
    316492                                return this; 
    317493                        }, 
    318494 
     
    326502                        // 
    327503                        clickcomparetwo : function(){ 
    328504                                self = this; 
    329                                 if ( $( 'input#comparetwo' ).is( ':checked' ) ) { 
     505 
     506                                if ( $( 'input#comparetwo' ).is( ':checked' ) ) { //compare 2 mode 
    330507                                        REVAPP._compareoneortwo = 2 ; 
    331                                         REVAPP.reloadleftright(); 
    332                                 } else { 
    333                                         REVAPP._compareoneortwo = 1 ; 
    334                                         REVAPP._revisionView.draggingleft = false; 
    335                                         REVAPP._left_diff = 0; 
    336                                         REVAPP.reloadmodelsingle(); 
    337                                 } 
    338                                 REVAPP._revisionsInteractions.render(); 
     508 
     509                                        if ( 1 === REVAPP._right_diff ) 
     510                                                REVAPP._right_diff = 2; 
     511 
     512                                                REVAPP._revisionView.draggingleft = true; 
     513 
     514                                                wpRevisionsSettings.revision_id = ''; // reset passed revision id so switching back to one handle mode doesn't re-select revision 
     515                                                REVAPP.reloadleftright(); 
     516                                                //REVAPP._right_handle_revisions = REVAPP._revisionView.model; 
     517 
     518                                        } else { //compare one mode 
     519                                                REVAPP._compareoneortwo = 1 ; 
     520                                                REVAPP._revisionView.draggingleft = false; 
     521                                                REVAPP._left_diff = 0; 
     522                                                REVAPP._right_diff = (REVAPP._revisions.length <= REVAPP._right_diff ) ? REVAPP._right_diff : REVAPP._right_diff +1; 
     523                                                REVAPP.reloadmodelsingle(); 
     524                                        } 
     525                                        REVAPP._revisionsInteractions.render(); 
     526                                        REVAPP._tickmarkView.render(); 
     527                                //REVAPP._revisionView.render(); 
    339528                        } 
    340529                }), 
    341530 
    342531                // 
    343532                //options view for show autosaves and show split view options 
    344533                // 
     534                /* DISABLED for now 
    345535                Options : Backbone.View.extend({ 
    346536                        el : $('#backbonerevisionsoptions')[0], 
    347537                        tagName : 'revisionoptionsview', 
    348538                        className : 'revisionoptions-container', 
    349539                        template : wp.template('revisionoptions'), 
    350540 
    351                         initialize : function() { 
    352                         }, 
    353  
    354541                        //render the options view 
    355542                        render : function() { 
    356543                                var addhtml = this.template; 
     
    396583                                REVAPP.reloadmodel(); 
    397584                        } 
    398585                }), 
    399  
     586                */ 
    400587                // 
    401588                //main interactions view 
    402589                // 
     
    405592                        tagName : 'revisionvinteract', 
    406593                        className : 'revisionvinteract-container', 
    407594                        template : wp.template('revisionvinteract'), 
    408                         _restoreword : '', 
    409595 
    410596                        initialize : function() { 
    411                                 this._restoreword = $( 'input#restore' ).attr( 'value' ); 
    412597                        }, 
    413598 
    414                         reset_restore_button : function() { 
    415                                 $( 'input#restore' ).attr( 'value', this._restoreword + ' ' + REVAPP._revisions.at( REVAPP._right_diff - 1 ).get( 'ID' ) ); 
    416                         }, 
    417  
    418599                        render : function() { 
    419600                                var self = this; 
    420601 
    421602                                var addhtml = this.template; 
    422603                                this.$el.html( addhtml ); 
    423                                 $( '#diff_max, #diff_maxof' ).html( this.model.length ); 
    424                                 $( '#diff_count' ).html( REVAPP._right_diff ); 
    425                                 $( '#diff_left_count_inner' ).html( 0 === REVAPP._left_diff ? '' : 'revision' + REVAPP._left_diff ); 
    426                                 self.reset_restore_button(); 
    427604 
    428605                                var modelcount = REVAPP._revisions.length; 
    429606 
     
    431608                                if ( 1 === REVAPP._compareoneortwo ) { 
    432609                                        //set up the slider with a single handle 
    433610                                        slider.slider({ 
    434                                                 value : REVAPP._right_diff-1, 
    435                                                 min : 0, 
    436                                                 max : modelcount-1, 
    437                                                 step : 1, 
     611                                                value: REVAPP._right_diff-1, 
     612                                                min: 0, 
     613                                                max: modelcount-1, 
     614                                                step: 1, 
    438615 
     616 
    439617                                                //slide interactions for one handles slider 
    440618                                                slide : function( event, ui ) { 
    441                                                         if ( REVAPP._right_model_loading ) //left model stoll loading, prevent sliding left handle 
    442                                                                                 return false; 
    443619 
    444                                                         REVAPP._right_diff =( ui.value+1 ); 
    445                                                         $( '#diff_count' ).html( REVAPP._right_diff ); 
     620                                                        REVAPP._right_diff = ( ui.value +1 ); 
    446621                                                        REVAPP._revisionView.render(); 
    447                                                         self.reset_restore_button(); 
    448                                                 } 
     622                                                        /* 
     623                                                        $( 'a.ui-slider-handle' ).tooltip( { 
     624                                                                content: REVAPP._revisions.at( ui.value ).get( 'revision_date_author_short' ), 
     625                                                                position: { 
     626                                                                my: "top-65", 
     627                                                                using: function( position, feedback ) { 
     628                                                                        $( this ).css( position ); 
     629                                                                        $( "<div>" ) 
     630                                                                        .addClass( "arrow" ) 
     631                                                                        .addClass( feedback.vertical ) 
     632                                                                        .addClass( feedback.horizontal ) 
     633                                                                        .appendTo( this ); 
     634                                                                        } 
     635                                                                } 
     636                                                        });//.trigger( 'close' ).trigger( 'open' ); 
     637*/ 
     638                                                        } 
    449639                                        }); 
    450640                                        $( '.revisiondiffcontainer' ).removeClass( 'comparetwo' ); 
     641 
    451642                                } else { //comparing more than one, eg 2 
    452643                                        //set up the slider with two handles 
    453644                                        slider.slider({ 
     
    460651                                                //in two handled mode when user starts dragging, swap in precalculated diff for handle 
    461652                                                start : function (event, ui ) { 
    462653                                                        var index = $( ui.handle ).index(); //0 (left) or 1 (right) 
    463  
    464654                                                        switch ( index ) { 
    465655                                                                case 1: //left handle drag 
    466                                                                         if ( REVAPP._left_model_loading ) //left model stoll loading, prevent sliding left handle 
     656                                                                        if ( REVAPP._left_model_loading ) //left model still loading, prevent sliding left handle 
    467657                                                                                return false; 
    468658 
    469659                                                                        if ( REVAPP._revisionView.model !== REVAPP._left_handle_revisions && 
    470                                                                                         null !== REVAPP._left_handle_revisions ) 
     660                                                                                        null !== REVAPP._left_handle_revisions ) { 
    471661                                                                                REVAPP._revisionView.model = REVAPP._left_handle_revisions; 
    472  
     662                                                                                REVAPP._tickmarkView.model = REVAPP._left_handle_revisions; 
     663                                                                                REVAPP._tickmarkView.render(); 
     664                                                                        } 
    473665                                                                        REVAPP._revisionView.draggingleft = true; 
    474666                                                                        REVAPP._left_diff_start = ui.values[ 0 ]; 
    475667                                                                        break; 
    476668 
    477669                                                                case 2: //right 
    478                                                                         if ( REVAPP._right_model_loading ) //right model stoll loading, prevent sliding right handle 
     670                                                                        if ( REVAPP._right_model_loading || 0 === REVAPP._right_handle_revisions.length) //right model still loading, prevent sliding right handle 
    479671                                                                                return false; 
    480672 
    481                                                                         //one extra spot at left end when comparing two 
    482673                                                                        if ( REVAPP._revisionView.model !== REVAPP._right_handle_revisions && 
    483                                                                                         null !== REVAPP._right_handle_revisions ) 
     674                                                                                        null !== REVAPP._right_handle_revisions ) { 
    484675                                                                                REVAPP._revisionView.model = REVAPP._right_handle_revisions; 
     676                                                                                REVAPP._tickmarkView.model = REVAPP._right_handle_revisions; 
     677                                                                                REVAPP._tickmarkView.render(); 
     678                                                                        } 
    485679 
    486680                                                                        REVAPP._revisionView.draggingleft = false; 
    487681                                                                        REVAPP._right_diff_start = ui.values[ 1 ]; 
     
    501695                                                                        if ( REVAPP._left_model_loading ) //left model still loading, prevent sliding left handle 
    502696                                                                                return false; 
    503697 
    504                                                                         REVAPP._left_diff = ui.values[ 0 ] - 1; //one extra spot at left end when comparing two 
     698                                                                        REVAPP._left_diff = ui.values[ 0 ]; 
    505699                                                                        break; 
    506700 
    507701                                                                case 2: //right 
    508702                                                                        if ( REVAPP._right_model_loading ) //right model still loading, prevent sliding right handle 
    509703                                                                                return false; 
    510704 
    511                                                                         REVAPP._right_diff = ui.values[ 1 ] - 1 ; 
     705                                                                        REVAPP._right_diff = ui.values[ 1 ]; 
    512706                                                                        break; 
    513707                                                        } 
    514708 
    515                                                         $( '#diff_count' ).html( REVAPP._right_diff ); 
    516  
    517709                                                        if ( 0 === REVAPP._left_diff ) { 
    518710                                                                $( '.revisiondiffcontainer' ).addClass( 'currentversion' ); 
    519711 
    520712                                                        } else { 
    521713                                                                $( '.revisiondiffcontainer' ).removeClass( 'currentversion' ); 
    522                                                                 $( '#diff_left_count_inner' ).html( REVAPP._left_diff ); 
    523714                                                        } 
    524715 
    525                                                         REVAPP._revisionView.render(); //render the diff view 
    526                                                         self.reset_restore_button(); 
     716                                                        REVAPP._revisionView.render(); 
     717 
    527718                                                }, 
    528719 
    529720                                                //when the user stops sliding  in 2 handle mode, recalculate diffs 
     
    536727 
    537728                                                                switch ( index ) { 
    538729                                                                        case 1: //left 
     730 
    539731                                                                                //left handle dragged & changed, reload right handle model 
    540                                                                                 if ( ! ( REVAPP._left_diff_start === ui.values[ 0 ] || REVAPP._left_model_loading ) ) 
     732                                                                                if ( REVAPP._left_diff_start !== ui.values[ 0 ] ) 
    541733                                                                                        REVAPP.reloadright(); 
    542734 
    543735                                                                                break; 
    544736 
    545737                                                                        case 2: //right 
     738                                                                                //REVAPP._right_diff =  ( 1 >= REVAPP._right_diff ) ? 1  : REVAPP._right_diff-1; 
    546739                                                                                //right handle dragged & changed, reload left handle model if changed 
    547                                                                                 if ( ! ( REVAPP._right_diff_start === ui.values[ 1 ] || REVAPP._right_model_loading ) ) { 
     740                                                                                if ( REVAPP._right_diff_start !== ui.values[ 1 ] ) 
    548741                                                                                        REVAPP.reloadleft(); 
    549                                                                                 } 
     742 
    550743                                                                                break; 
    551744                                                                } 
    552745                                                        } 
    553746                                                } 
    554747                                        }); 
    555748                                        $( '.revisiondiffcontainer' ).addClass( 'comparetwo' ); 
     749                                        $( '#diffslider a.ui-slider-handle' ).first().addClass( 'left-handle' ).next().addClass( 'right-handle' ); 
    556750                                } 
    557751 
    558752                                return this; 
     
    571765 
    572766                                REVAPP._revisionView.render(); 
    573767 
    574                                 $( '#diff_count' ).html( REVAPP._right_diff ); 
    575768                                $( '#slider' ).slider( 'value', REVAPP._right_diff - 1 ).trigger( 'slide' ); 
    576                                 this.reset_restore_button(); 
    577769                        }, 
    578770 
    579771                        //go the the previous revision 
     
    583775 
    584776                                REVAPP._revisionView.render(); 
    585777 
    586                                 $( '#diff_count' ).html( REVAPP._right_diff ); 
    587778                                $( '#slider' ).slider( 'value', REVAPP._right_diff - 1 ).trigger( 'slide' ); 
    588                                 this.reset_restore_button(); 
    589779                        } 
    590780                }) 
    591781        }); 
    592782 
    593783        //instantiate Revision Application 
    594784        REVAPP = new wp.revisions.App(); 
    595         //TODO consider enable back button to step back thru states? 
    596         //Backbone.history.start({pushState: true}); 
    597785 
    598786}(jQuery)); 
  • wp-admin/revision.php

     
    1717case 'restore' : 
    1818        if ( ! $revision = wp_get_post_revision( $revision_id ) ) 
    1919                break; 
     20 
    2021        if ( ! current_user_can( 'edit_post', $revision->post_parent ) ) 
    2122                break; 
     23 
     24 
    2225        if ( ! $post = get_post( $revision->post_parent ) ) 
    2326                break; 
    2427 
    25         // Revisions disabled and we're not looking at an autosave 
    26         if ( ( ! WP_POST_REVISIONS || ! post_type_supports( $post->post_type, 'revisions' ) ) && ! wp_is_post_autosave( $revision ) ) { 
     28        // Revisions disabled (previously checked autosavegs && ! wp_is_post_autosave( $revision )) 
     29        if ( ( ! WP_POST_REVISIONS || ! post_type_supports( $post->post_type, 'revisions' ) ) ) { 
    2730                $redirect = 'edit.php?post_type=' . $post->post_type; 
    2831                break; 
    2932        } 
    30         check_admin_referer( "restore-post_{$post->ID}|{$revision->ID}" ); 
    3133 
    32         //store revision event in post meta 
    33         $restore_details = array( 
    34                 'restored_revision_id' => $revision->ID, 
    35                 'restored_by_user' => get_current_user_id(), 
    36                 'restored_time' => time() 
    37         ); 
    38         update_post_meta( $post->ID, '_post_restored_from', $restore_details ); 
     34        check_admin_referer( "restore-post_{$revision->ID}" ); 
    3935 
    4036        wp_restore_post_revision( $revision->ID ); 
    4137        $redirect = add_query_arg( array( 'message' => 5, 'revision' => $revision->ID ), get_edit_post_link( $post->ID, 'url' ) ); 
     
    5854        } 
    5955 
    6056        $post_title = '<a href="' . get_edit_post_link() . '">' . get_the_title() . '</a>'; 
    61         $revision_title = wp_post_revision_title( $revision, false ); 
    6257        $h2 = sprintf( __( 'Compare Revisions of &#8220;%1$s&#8221;' ), $post_title ); 
    6358        $title = __( 'Revisions' ); 
    6459 
     
    8075        $parent_file = $submenu_file = 'edit.php?post_type=' . $post->post_type; 
    8176else 
    8277        $parent_file = $submenu_file = 'edit.php'; 
    83  
    8478wp_enqueue_script( 'revisions' ); 
    8579 
    8680require_once( './admin-header.php' ); 
    8781 
    8882//TODO - Some of the translations below split things into multiple strings that are contextually related and this makes it pretty impossible for RTL translation. 
    8983//TODO can we pass the context in a better way 
     84$wpRevisionsSettings = array( 'post_id' => $post->ID, 
     85                                                'nonce' => wp_create_nonce( 'revisions-ajax-nonce' ), 
     86                                                'revision_id' => $revision_id ); 
     87wp_localize_script( 'revisions', 'wpRevisionsSettings', $wpRevisionsSettings ); 
     88 
     89$comparetworevisionslink = get_edit_post_link( $revision->ID ); 
    9090?> 
    91 <script type="text/javascript"> 
    92 var wpRevisionsSettings = <?php echo json_encode( array( 'post_id' => $post->ID, 'nonce' => wp_create_nonce( 'revisions-ajax-nonce' ) ) ); ?>; 
    93 </script> 
    94 <?php 
    95         $comparetworevisionslink = get_edit_post_link( $revision->ID ); 
    96 ?> 
    9791 
    98 <div id="backbonerevisionsoptions"></div> 
     92<div id="backbonerevisionsoptions"> 
     93</div> 
    9994<div class="wrap"> 
    100         <div class="icon32 icon32-posts-post" id="icon-edit"><br></div> 
     95        <div class="icon32 icon32-posts-post" id="icon-edit"> 
     96                <br> 
     97        </div> 
    10198        <div class="revisiondiffcontainer diffsplit currentversion rightmodelloading"> 
    102                 <div id="modelsloading" class="updated message"><span class="spinner" ></span> <?php _e( 'Calculating revision diffs' ); ?></div> 
     99                <div id="modelsloading" class="updated message"> 
     100                        <span class="spinner" ></span> <?php _e( 'Calculating revision diffs' ); ?> 
     101                </div> 
    103102                <h2 class="long-header"><?php echo $h2; ?></h2> 
    104                 <div id="backbonerevisionsinteract"></div> 
    105                 <div id="backbonerevisionsdiff"></div> 
     103                <div class="diff-slider-ticks-wrapper"> 
     104                        <div id="diff-slider-ticks"> 
     105                        </div> 
     106                </div> 
     107                <div id="backbonerevisionsinteract"> 
     108                </div> 
     109                <div id="backbonerevisionsdiff"> 
     110                </div> 
    106111                <hr /> 
    107112        </div> 
    108113</div> 
    109114 
    110115<script id="tmpl-revision" type="text/html"> 
     116        <div id="diffsubheader" class="diff-left-hand-meta-row"> 
     117                <div id="diff_from_current_revision"> 
     118                        <?php printf( '<b>%1$s</b> %2$s.' , __( 'From:' ), __( 'the current version' ) ); ?> 
     119                </div> 
     120                <div id="difftitlefrom"> 
     121                        <div class="diff-from-title"><?php _e( 'From:' ); ?></div>{{{ data.revision_from_date_author }}} 
     122                </div> 
     123        </div> 
     124 
    111125        <div id="diffsubheader"> 
    112                 <span id="diff_from_current_revision"><?php _e( 'Current version' ); ?><?php _e( '- compared to -' ); ?></span> 
    113                 <div id="difftitlefrom">{{{ data.revision_from_date_author }}} <?php _e( '- compared to -' ); ?></div> 
    114                 <div id="difftitle">{{{ data.revision_date_author }}}</div> 
    115                 <div id="diffcancel"><input class="button" onClick="document.location='<?php echo get_edit_post_link( $post->ID ); ?>'" type="submit" id="cancel" value="<?php esc_attr_e( 'Cancel' )?>" /></div> 
    116                 <div id="diffrestore"><input class="button button-primary" onClick="document.location='{{{ data.restoreaction }}}'" type="submit" id="restore" value="<?php esc_attr_e( 'Restore revision ID' )?>" /></div> 
    117                 <div id="comparetworevisions"><input type="checkbox" id="comparetwo" value="comparetwo" {{{ data.comparetwochecked }}} name="comparetwo"/> <label for="comparetwo"><?php esc_attr_e( 'Compare two revisions' ); ?></a></div>    </div> 
     126                <div id="difftitle"> 
     127                        <div class="diff-to-title"><?php _e( 'To:' ); ?></div>{{{ data.revision_date_author }}} 
     128                </div> 
     129                <div id="diffrestore"> 
     130                        <input class="button button-primary restore-button" onClick="document.location='{{{ data.restoreaction }}}'" type="submit" id="restore" value="<?php esc_attr_e( 'Restore This Revision' )?>" /> 
     131                </div> 
     132                <div id="comparetworevisions"> 
     133                        <input type="checkbox" id="comparetwo" value="comparetwo" {{{ data.comparetwochecked }}} name="comparetwo"/> 
     134                                <label for="comparetwo"><?php esc_attr_e( 'Compare two revisions' ); ?></a></label> 
     135                </div> 
     136        </div> 
     137 
    118138        <div id="removedandadded"> 
    119139                <div id="removed"><?php _e( 'Removed -' ); ?></div> 
    120140                <div id="added"><?php _e( 'Added +' ); ?></div> 
     
    124144 
    125145<script id="tmpl-revisionvinteract" type="text/html"> 
    126146        <div id="diffheader"> 
    127 <div id="diffprevious"><input class="button" type="submit" id="previous" value="<?php esc_attr_e( 'Previous' ); ?>" /></div> 
    128                         <div id="diffnext"><input class="button" type="submit" id="next" value="<?php esc_attr_e( 'Next' ); ?>" /></div> 
    129                         <div id="diffslider"> 
    130         <div id="revisioncount"> 
    131                                         <?php _e( 'Comparing' ); ?> 
    132                                         <span id="diff_left_count"> <?php _e( 'revision' ); ?></span> <span id="diff_left_count_inner"></span> 
    133                                         <span id="diff_left_current_revision"><?php _e( 'current version' ); ?></span> 
    134                                         <span id="diff_revision_from">{{{ data.diff_revision_from }}}</span> 
    135                                         <?php _e( ' to revision' ); ?> 
    136                                         <span id="diff_count">{{{ data.current_diff }}}</span> 
    137                                         <?php _e( ' of ' ); ?> 
    138                                         <span id="diff_max" ></span> 
    139                                 </div> 
    140  
    141                         <div id="slider" class="wp-slider"></div> 
     147                <div id="diffprevious"><input class="button" type="submit" id="previous" value="<?php esc_attr_e( 'Previous' ); ?>" /> 
    142148                </div> 
     149                <div id="diffnext"><input class="button" type="submit" id="next" value="<?php esc_attr_e( 'Next' ); ?>" /> 
     150                </div> 
     151                <div id="diffslider"> 
     152                        <div id="slider" class="wp-slider"> 
     153                        </div> 
     154                </div> 
    143155        </div> 
    144156</script> 
     157<script id="tmpl-revision-ticks" type="text/html"> 
     158        <div class="revision-tick revision-toload{{{ data.revision_toload }}} revision-scopeofchanges-{{{ data.scope_of_changes }}}"> 
     159        </div> 
     160</script> 
    145161<?php 
    146162/* 
    147163TODO Convert these into screen options 
  • wp-admin/css/colors-fresh.css

     
    175175.sidebar-name, 
    176176#nav-menu-header, 
    177177#nav-menu-footer, 
    178 .menu-item-handle, 
    179 .wp-slider .ui-slider-handle { 
     178.menu-item-handle { 
    180179        background: #f1f1f1; 
    181180        background-image: -webkit-gradient(linear, left bottom, left top, from(#ececec), to(#f9f9f9)); 
    182181        background-image: -webkit-linear-gradient(bottom, #ececec, #f9f9f9); 
     
    185184        background-image: linear-gradient(to top, #ececec, #f9f9f9); 
    186185} 
    187186 
     187 
     188 
    188189.widget .widget-top, 
    189190.postbox h3, 
    190191.stuffbox h3 { 
     
    13781379        background-color: #e9f6ea; 
    13791380} 
    13801381 
     1382.diff-to-title { 
     1383        color: #0080AA; 
     1384} 
     1385 
    13811386#diffsubheader{ 
    13821387        background-color: #f7f7f7; 
    13831388} 
    13841389 
     1390.comparetwo#diffsubheader.diff-left-hand-meta-row { 
     1391        background-color: #fcfcfc; 
     1392} 
     1393 
     1394.revision-tick.revision-toloadtrue { 
     1395        background-color: #9999cc; 
     1396        background: url(../images/wpspin_light.gif) no-repeat; 
     1397        background-position: middle; 
     1398        background-size: 1px 10px; 
     1399} 
     1400 
     1401.revision-tick.revision-toloadfalse { 
     1402        background-color: #aaa; 
     1403} 
     1404 
    13851405#att-info { 
    13861406        background-color: #e4f2Fd; 
    13871407} 
    13881408 
     1409body .ui-tooltip { 
     1410        border-color: #d7d7d7; 
     1411        background-color: #fff; 
     1412} 
     1413 
    13891414/* jQuery UI Slider */ 
    13901415.wp-slider.ui-slider { 
    13911416        border-color: #d7d7d7; 
     
    13931418} 
    13941419 
    13951420.wp-slider .ui-slider-handle { 
    1396         border-color: #d7d7d7; 
     1421        border-color: none; 
    13971422} 
    13981423 
     1424.wp-slider .ui-slider-handle.left-handle { 
     1425background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAAAA3NCSVQICAjb4U/gAAABAlBMVEXR2uHM1dzCzNW4ydOzxtSxw9Gqwc+bs7+Ss8SVscaZrLqQq7yNrMCKqr+EqsGDqb6GpruCpbl8pL15o7t1n7hwnLVika1djq5giqJXiqlYiqNJgp9ieYlDfqA/epw3dpk7dpg2dpo3dZo6dZc4dJY4dJg3cZY2bpE1bosxaIYxZIMrYX0tXnwtXHYsWHEnVW0mTmglT2cjTGIhRVsfQlYaN0kYM0QULDgTKTYRJzQTJzINISoLHCYNGyYKGCEIFxwJEhcJEhsHEhQDDAkHCg8EBwwCBwoEBAQBAwIBAQEBAQMAAgEBAAAAAAQAAQMBAAIAAAICAAEBAQAAAQAAAAD///+62qV+AAAAVnRSTlP/////////////////////////////////////////////////////////////////////////////////////////////////////////////////AEpNbNkAAAAJcEhZcwAACusAAArrAYKLDVoAAAAUdEVYdENyZWF0aW9uIFRpbWUAMy85LzEzrdD8jAAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNui8sowAAACbSURBVBiVVcvVDoNQEEXRqbu781B3d/dQQknh/P+vtBQKt/tpsnKGEOW4klkQFFvIsqwYzUJUvCts1wJl9gIruxT5hpLEyMBLKG+Z0ToJgrPLTDqOjyCxNN7mcahiaz50uDWsX0Fk+tKahKGJpX55qp1qpAsCY0lt5MdPUD2KoniowBRXn+f5Xp4RZDfCKg1W0D637P/iznn06w0M+083NZW9ZwAAAABJRU5ErkJggg==); 
     1426} 
     1427 
     1428.wp-slider .ui-slider-handle.ui-state-active.left-handle { 
     1429background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAAAA3NCSVQICAjb4U/gAAAAzFBMVEXZ5ejU4eXM3ODG2NzE1tvB1Nq90deux86sxs2qxcynwsqlwcmjwMihvseevMWdvMSbusOXuMGTtb6IrbiHrLeCqbSBqLN/p7J3oa11oKxzn6tvnKhrmaZqmKVpmKVol6RllaJhk6Bej51djptaiZZZiJVYhpNWg5BUf4xSfYlRfIhPeYRMdYBKcXxFaXNDZnA+X2g9XmY8XGU4VV43VFw2U1s0UFgyTVQxS1IwSVAuR00sREosQ0orQkgqQEYpPkQoPkMoPUMoPUL///8pY4MvAAAARHRSTlP/////////////////////////////////////////////////////////////////////////////////////////AHHSjxIAAAAJcEhZcwAACusAAArrAYKLDVoAAAAUdEVYdENyZWF0aW9uIFRpbWUAMy85LzEzrdD8jAAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNui8sowAAACUSURBVBiVVctXEoJQEETRMaIo5qwF5hwxYOY9ev97EiQ43q+pUz2EYk9n5UElU0rpRO016toO79WhxlVysWqkroRgsswSjAsbnasgpGdsMk25gooZvR3K8CQxCuU9jH8FhZ3022rwJTZ4CK9nnwJBbiO8yVpFKDButm1bOn6iLFyZt5igeZLHOrhgfJ8k/yXTVoLrAxo1P5iCdUg7AAAAAElFTkSuQmCC); 
     1430} 
     1431 
     1432.wp-slider .ui-slider-handle { 
     1433        /* Slider drag Triangle CSS */ 
     1434background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAAAA3NCSVQICAjb4U/gAAAA8FBMVEU2dZipwNBJl8VGmcX///+EpLlBgqpymrNFjru3ydNWiKs6eZzY4uuRrL08faPL3OZBjLSBqsCTssRHlMJEf59cj657o7xKl8OEqsE9gag2dJtEkb+ct8iZs8BHmMePq8BejKZAiK5llK5FjrlJl8c6dZdGl8avxdBJlcZ4nbc6ep6XrbpKgZ+Lqr5KmcdIkbqsws1Gk8E+f6c4dptaiadFirRKl8V8pblImcNIl8eGpruVscZCh7BMlsdIlcFImchEkbs9eJpCjbdGjbk8fJ84dp02dpo8gatMlsM2dps8faVAg61Ej71Ek75IksFIlcOaLCw7AAAAUHRSTlP/////AP///////////////////////////////////////////////////////////////////////////////////////////////////xB6m5UAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAUdEVYdENyZWF0aW9uIFRpbWUAMy85LzEzrdD8jAAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNui8sowAAACaSURBVBiVVcxZD8FAGIXhjxzUVktQgqKmo7ZYhkgsiS1tQuj//zeomo736uS5OFSo2W6UXc/R5hxXW5foxDlXqUKZx0GFZpXynuM4kXhjgjgyJkGzQIjpvi9Fx1uQ0iQUh4GkR/Ini0CQ2IfQ24YC4X8T+Mn0zj8lO1IgnqZpzlxE0m4YhrFsKYJVn126UGV+W1wHf4LdpByuF0goFKI7tv/dAAAAAElFTkSuQmCC); 
     1435} 
     1436 
    13991437.wp-slider .ui-slider-handle.ui-state-hover, 
    14001438.wp-slider .ui-slider-handle.ui-state-focus { 
    1401         border-color: #aaa; 
     1439        border-color: none; 
     1440        outline: none; 
    14021441} 
    14031442 
    14041443.wp-slider .ui-slider-handle.ui-state-active { 
    1405         border-color: #aaa; 
    1406         background: #eee; 
    1407         background-image: -webkit-gradient(linear, left bottom, left top, from(#f9f9f9), to(#ececec)); 
    1408         background-image: -webkit-linear-gradient(bottom, #f9f9f9, #ececec); 
    1409         background-image:    -moz-linear-gradient(bottom, #f9f9f9, #ececec); 
    1410         background-image:      -o-linear-gradient(bottom, #f9f9f9, #ececec); 
    1411         background-image: linear-gradient(to top, #f9f9f9, #ececec); 
     1444        background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAAAA3NCSVQICAjb4U/gAAAA51BMVEUgZpDkzc0yd6f///8mcqFJm8cjbZZzr80mg78lh8BDk8UngLl+s9AmfKk4hrGeweBaoMhNlMORwt4nd6Zdm8BAjMEnf7RYmsMkb50mhsFWlsYhZ5ImhbwocZg0f61Lk8E9i7twqNBgo8VSmMUofLBcm8o3faUpfK8mh8Aia5MgZpFMmcgpeapDmcJjo8sliMEmh70nhLkkcKAqgLF2sc8sc5ojbZsngrMkh8EnfKw1eaUjbpkkapImeKQgaJAohb0mh8MmhcMng7kkcKEpf68iZ48haJMmhb8kicEmc6MibJkia5UnhLsw1mWvAAAATXRSTlP/AP8A/////////////////////////////////////////////////////////////////////////////////////////////////9/iR18AAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAUdEVYdENyZWF0aW9uIFRpbWUAMy85LzEzrdD8jAAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNui8sowAAACaSURBVBiVVc15D8FAEIfh+Ymj6761LIrSiCNVVyjbRGgifP/PQ6q22/evyZPJDNXzD6G0qNDq5PtO3DJDFyfRpk+po2Eo0h5Qx9U0LRa3SejdlR2rDMLI41yKh6/AtOSzUiuU4kvemSMUDBsRXGuRIHj/CvCXyTNcSXelQBQYY1uBWMY651xfK4KzbdgzqJI73LK7hGC6r0bTB5apIhqIH/YIAAAAAElFTkSuQmCC); 
    14121445} 
    14131446 
    14141447/* edit image */ 
  • wp-admin/css/wp-admin.css

     
    35823582        vertical-align: middle; 
    35833583} 
    35843584 
     3585.diff-from-title, 
     3586.diff-to-title { 
     3587        font-size: 14px; 
     3588        font-weight: bold; 
     3589        width:60px; 
     3590        text-align: right; 
     3591        float: left; 
     3592        margin-right: 5px; 
     3593} 
     3594 
    35853595.revisiondiffcontainer { 
    35863596        width: 96%; 
    35873597} 
     
    35903600        margin: 2px; 
    35913601} 
    35923602 
    3593 #diffrestore, 
    3594 #diffnext, 
    3595 #diffcancel { 
     3603#diffnext { 
    35963604        float: right; 
    35973605        margin-right: 5px; 
    35983606} 
    35993607 
     3608#diffrestore input{ 
     3609        margin-left: 10px; 
     3610} 
     3611 
    36003612#diffprevious, 
    36013613#difftitle, 
    36023614#difftitlefrom, 
     
    36083620 
    36093621#diffprevious, 
    36103622#diffnext { 
    3611         margin-top: 7px; 
    36123623        height: 30px; 
    36133624} 
    36143625 
     
    36203631#diffheader { 
    36213632        border-bottom: 1px solid #dfdfdf; 
    36223633        width: 100%; 
    3623         height: 45px; 
    3624         line-height: 45px; 
    3625         padding-top: 10px; 
     3634        height: 40px; 
     3635        line-height: 40px; 
     3636        padding-top: 30px; 
    36263637} 
    36273638 
    3628 #diffsubheader { 
    3629         border-bottom: 1px solid #dfdfdf; 
     3639#diffsubheader,.diff-left-hand-meta-row { 
    36303640        width: 100%; 
    36313641        height:35px; 
    36323642        line-height: 35px; 
     3643        display: block; 
    36333644} 
    36343645 
    3635 #diffslider { 
     3646#diffslider{ 
    36363647        width: 70%; 
    36373648        margin-left: auto; 
    36383649        margin-right: auto; 
    36393650        text-align: center; 
    3640         height: 3.5em; 
     3651        height: 0.8em; 
     3652        margin-top: 20px; 
    36413653} 
    36423654 
     3655.diff-slider-ticks-wrapper { 
     3656        margin-left: auto; 
     3657        margin-right: auto; 
     3658        text-align: center; 
     3659} 
     3660 
     3661#diff-slider-ticks { 
     3662        position: absolute; 
     3663        margin-top: 50px; 
     3664        z-index: 1; 
     3665} 
     3666 
    36433667#revisioncount { 
    36443668        width: 50%; 
    36453669        margin-left: auto; 
     
    37073731 
    37083732#comparetworevisions { 
    37093733        float: right; 
     3734        position: absolute; 
     3735        top: 10px; 
     3736        right: 10px; 
    37103737        line-height: 35px; 
    37113738        padding-right: 5px; 
    37123739} 
     
    37163743} 
    37173744 
    37183745#difftitle img, 
    3719 #difftitlefrom img { 
     3746#difftitlefrom img, 
     3747.post-revisions li img { 
    37203748        vertical-align: middle; 
    37213749        margin-left: 5px; 
    37223750} 
     3751.post-revisions li { 
     3752        vertical-align: middle; 
     3753        height: 28px; 
     3754} 
    37233755 
    37243756#showsplitviewoption, 
    37253757#toggleshowautosavesoption { 
     
    37423774.comparetwo #diffprevious, 
    37433775.comparetwo #diffnext, 
    37443776span#diff_left_current_revision, 
    3745 span#diff_from_current_revision, 
     3777#diff_from_current_revision, 
    37463778.currentversion span#diff_left_count, 
    37473779.currentversion span#diff_left_count_inner, 
    3748 .currentversion #difftitlefrom, 
    3749 .comparetwo.currentversion #difftitlefrom { 
     3780.comparetwo.currentversion #diff_from_current_revision, 
     3781#diffsubheader.diff-left-hand-meta-row { 
    37503782        display: none; 
    37513783} 
    37523784 
     
    37543786span#diff_left_count, 
    37553787span#diff_left_count_inner, 
    37563788.comparetwo #difftitlefrom, 
    3757 .comparetwo.currentversion span#diff_from_current_revision, 
    37583789.leftmodelloading #modelsloading, 
    37593790.rightmodelloading #modelsloading, 
    37603791.leftmodelloading #modelsloading .spinner, 
    37613792.rightmodelloading #modelsloading .spinner, 
    3762 { 
    3763         display: inline; 
     3793.comparetwo #diffsubheader.diff-left-hand-meta-row { 
     3794        display: block; 
    37643795} 
    37653796 
     3797.revision-tick { 
     3798        width: 1px; 
     3799        float: left; 
     3800        margin-right: 15px; 
     3801        height: 11px; 
     3802        padding: 0; 
     3803        margin-left: 0px; 
     3804} 
     3805 
     3806.revision-tick.revision-scopeofchanges-vsmall { 
     3807                width: 1px; 
     3808                background-color: #aaa; 
     3809} 
     3810 
     3811.revision-tick.revision-scopeofchanges-small { 
     3812                width: 2px; 
     3813                background-color: #aaa; 
     3814                margin-left: -1px; 
     3815} 
     3816 
     3817.revision-tick.revision-scopeofchanges-med { 
     3818                width: 3px; 
     3819                margin-left: -2px; 
     3820                background-color: #666; 
     3821} 
     3822 
     3823.revision-tick.revision-scopeofchanges-large { 
     3824                width: 4px; 
     3825                margin-left: -3px; 
     3826                background-color: #333; 
     3827} 
     3828 
     3829.revision-tick.revision-scopeofchanges-vlarge { 
     3830                margin-left: -3px; 
     3831                width: 4px; 
     3832                background-color: #111; 
     3833                left: 1; 
     3834} 
     3835 
    37663836.diff-loading { 
    37673837        margin-top: 50px; 
    37683838        width: 100%; 
     
    37773847        float: none; 
    37783848} 
    37793849 
    3780 #difftitlefrom { 
    3781         float: left; 
    3782         display: none; 
    3783 } 
    3784  
    37853850#modelsloading { 
    37863851        float: right; 
     3852        position: absolute; 
    37873853        line-height: 30px; 
    37883854        display: none; 
    37893855        clear: none; 
    3790         margin: 0; 
     3856        right: 170px; 
    37913857        margin-top: -40px; 
    37923858} 
    37933859 
    37943860#modelsloading .spinner { 
    37953861        float: left; 
    3796  } 
     3862} 
    37973863 
     3864.ui-tooltip-content img { 
     3865        float: left; 
     3866        margin-right: 5px; 
     3867} 
     3868 
     3869 
     3870 
     3871/*  jQuery UI Tooltip 1.10.1 */ 
     3872 
     3873.ui-tooltip { 
     3874        padding: 8px; 
     3875        position: absolute; 
     3876        z-index: 9999; 
     3877        max-width: 300px; 
     3878        min-width: 130px; 
     3879} 
     3880 
     3881body .ui-tooltip { 
     3882        border-width: 1px; 
     3883} 
     3884 
     3885.ui-tooltip, .arrow:after { 
     3886        border: 1px solid #d7d7d7; 
     3887} 
     3888 
     3889.ui-tooltip { 
     3890        padding: 5px 10px; 
     3891} 
     3892 
     3893.arrow { 
     3894        width: 70px; 
     3895        height: 16px; 
     3896        overflow: hidden; 
     3897        position: absolute; 
     3898        left: 50%; 
     3899        margin-left: -35px; 
     3900        bottom: -16px; 
     3901        z-index: 99999; 
     3902 
     3903} 
     3904 
     3905.arrow.top { 
     3906        top: -16px; 
     3907        bottom: auto; 
     3908} 
     3909 
     3910.arrow.left { 
     3911        left: 20%; 
     3912} 
     3913 
     3914.arrow:after { 
     3915        content: ""; 
     3916        position: absolute; 
     3917        left: 20px; 
     3918        top: -20px; 
     3919        width: 25px; 
     3920        height: 25px; 
     3921        background-color: #FFF; 
     3922        -webkit-transform: rotate(45deg); 
     3923        -moz-transform: rotate(45deg); 
     3924        -ms-transform: rotate(45deg); 
     3925        -o-transform: rotate(45deg); 
     3926        tranform: rotate(45deg); 
     3927} 
     3928 
     3929.arrow.top:after { 
     3930        bottom: -20px; 
     3931        top: auto; 
     3932} 
     3933 
    37983934 /* jQuery UI Slider */ 
    37993935 
    38003936.wp-slider.ui-slider { 
     
    38093945.wp-slider .ui-slider-handle { 
    38103946        position: absolute; 
    38113947        z-index: 2; 
    3812         width: 1.2em; 
    3813         height: 1.2em; 
    3814         border-width: 1px; 
    3815         border-style: solid; 
    3816         border-radius: 3px; 
     3948        width: 17px; 
     3949        height: 17px; 
     3950        border: none; 
    38173951} 
    38183952 
    38193953.wp-slider .ui-slider-range {