Ticket #23497: 23497.diff

File 23497.diff, 45.4 KB (added by wonderboymusic, 3 months ago)
  • wp-admin/admin-ajax.php

    diff --git wp-admin/admin-ajax.php wp-admin/admin-ajax.php
    index 9f5f025..92bb43a 100644
    do_action( 'admin_init' ); 
    4242 
    4343$core_actions_get = array( 
    4444        'fetch-list', 'ajax-tag-search', 'wp-compression-test', 'imgedit-preview', 'oembed-cache', 
    45         'autocomplete-user', 'dashboard-widgets', 'logged-in', 
     45        'autocomplete-user', 'dashboard-widgets', 'logged-in', 'revisions-data' 
    4646); 
    4747 
    4848$core_actions_post = array( 
    $core_actions_post = array( 
    5656        'save-widget', 'set-post-thumbnail', 'date_format', 'time_format', 'wp-fullscreen-save-post', 
    5757        'wp-remove-post-lock', 'dismiss-wp-pointer', 'upload-attachment', 'get-attachment', 
    5858        'query-attachments', 'save-attachment', 'save-attachment-compat', 'send-link-to-editor', 
    59         'send-attachment-to-editor', 'save-attachment-order', 'heartbeat', 
     59        'send-attachment-to-editor', 'save-attachment-order', 'heartbeat' 
    6060); 
    6161 
    6262// Register core Ajax calls. 
  • wp-admin/css/colors-fresh.css

    diff --git wp-admin/css/colors-fresh.css wp-admin/css/colors-fresh.css
    index febb39f..6b1db5d 100644
    div.wp-menu-image { 
    12991299 
    13001300/* Diff */ 
    13011301table.diff .diff-deletedline { 
    1302         background-color: #fdd; 
     1302        background-color: #fae6e6; 
     1303        color: #d2281f; 
     1304        text-decoration: line-through; 
    13031305} 
    13041306 
    13051307table.diff .diff-deletedline del { 
    13061308        background-color: #f99; 
    13071309} 
    13081310 
     1311table.diff .diff-deletedline-symbol { 
     1312        color: #d2281f; 
     1313} 
     1314 
    13091315table.diff .diff-addedline { 
    1310         background-color: #dfd; 
     1316        background-color: #edf5ea; 
     1317        color: #00a100; 
     1318} 
     1319 
     1320table.diff .diff-addedline-symbol { 
     1321        color: #00a100; 
    13111322} 
    13121323 
    13131324table.diff .diff-addedline ins { 
  • new file wp-admin/css/revisions.css

    diff --git wp-admin/css/revisions.css wp-admin/css/revisions.css
    new file mode 100644
    index 0000000..bd10f76
    - +  
     1/* Styles for the revision screen */ 
     2 
     3.revisiondiffcontainer { 
     4        width: 96%; 
     5} 
     6 
     7.revisiondiffcontainer input.button { 
     8        margin: 2px; 
     9} 
     10 
     11#diffrestore, #diffnext { 
     12        float: right; 
     13        margin-right: 5px; 
     14} 
     15 
     16#diffprevious, #difftitle { 
     17        float: left; 
     18        margin-left: 5px; 
     19} 
     20 
     21#diffheader, #diffsubheader { 
     22        clear: both; 
     23        width: 100%; 
     24} 
     25 
     26#diffheader { 
     27        border-bottom: 2px solid #999; 
     28        width: 100%; 
     29        height: 55px; 
     30        line-height: 55px; 
     31        padding-top: 10px; 
     32} 
     33 
     34#diffsubheader { 
     35        background-color: #eee; 
     36        border-bottom: 2px solid #999; 
     37        width: 100%; 
     38        height: 2.8em; 
     39        line-height: 2.8em; 
     40} 
     41 
     42#diffslider { 
     43        width: 70%; 
     44        margin-left: auto; 
     45        margin-right: auto; 
     46        text-align: center; 
     47        height: 3.5em; 
     48 
     49} 
     50 
     51#revisioncount { 
     52        width: 50%; 
     53        margin-left: auto; 
     54        margin-right: auto; 
     55        margin-top: 0; 
     56        line-height: 1em; 
     57        height: 1em; 
     58        text-align: center; 
     59        clear: none; 
     60        padding: 5px; 
     61} 
     62 
     63.revisiondiffcontainer { 
     64        margin-top: 10px; 
     65} 
     66 
     67#diffsliderwrap { 
     68        width: 80%; 
     69        margin-left: auto; 
     70        margin-right: auto; 
     71} 
     72 
     73#diffsliderwrap #sliderinner { 
     74        position: relative; 
     75        top: 47px; 
     76} 
     77 
     78#removedandadded { 
     79        width: 96%; 
     80        padding-left: 10px; 
     81        padding-right: 20px; 
     82        padding-bottom: 30px; 
     83        padding-top: 3px; 
     84        font-size: 16px; 
     85} 
     86 
     87#removed, #added, #unchanged { 
     88        width: auto; 
     89        text-align: left; 
     90        padding-left: 5px; 
     91        padding-right: 5px; 
     92        padding-top: 5px; 
     93        padding-bottom: 5px; 
     94        float: left; 
     95} 
     96.diffsplit #added { 
     97        float: right; 
     98} 
     99 
     100.diffsplit #unchanged { 
     101        float: left; 
     102        margin-left: 40%; 
     103} 
     104 
     105#unchanged, #added { 
     106        padding-left: 10px; 
     107} 
     108 
     109#removed { 
     110        padding-left: 0px; 
     111 } 
     112 
     113#removed { 
     114        color: #d2281f; 
     115} 
     116 
     117#added { 
     118        color: #00a100; 
     119} 
     120 
     121#revisionoptions { 
     122        margin-top: 30px; 
     123        line-height: 40px; 
     124} 
     125 
     126#previousrevisioninterfacelink { 
     127        margin-top: 30px; 
     128} 
  • wp-admin/css/wp-admin.css

    diff --git wp-admin/css/wp-admin.css wp-admin/css/wp-admin.css
    index c22c591..248b0ad 100644
    table.diff { 
    34273427} 
    34283428 
    34293429table.diff col.content { 
     3430        width: auto; 
     3431} 
     3432 
     3433table.diff col.content.diffsplit { 
    34303434        width: 50%; 
    34313435} 
    34323436 
     3437table.diff col.ltype { 
     3438        width: 30px; 
     3439} 
     3440 
    34333441table.diff tr { 
    34343442        background-color: transparent; 
    34353443} 
  • wp-admin/includes/ajax-actions.php

    diff --git wp-admin/includes/ajax-actions.php wp-admin/includes/ajax-actions.php
    index bd4d5b9..cc8158e 100644
    function wp_ajax_inline_save_tax() { 
    13791379        global $wp_list_table; 
    13801380 
    13811381        check_ajax_referer( 'taxinlineeditnonce', '_inline_edit' ); 
    1382          
     1382 
    13831383        $post_data = wp_unslash( $_POST ); 
    13841384 
    13851385        $taxonomy = sanitize_key( $post_data['taxonomy'] ); 
    function wp_ajax_heartbeat() { 
    20862086                $screen_id = sanitize_key($_POST['screenid']); 
    20872087        else 
    20882088                $screen_id = 'site'; 
    2089          
     2089 
    20902090        if ( ! empty($_POST['data']) ) { 
    20912091                $data = wp_unslash( (array) $_POST['data'] ); 
    20922092                // todo: how much to sanitize and preset and what to leave to be accessed from $data or $_POST..? 
    function wp_ajax_heartbeat() { 
    21122112 
    21132113        wp_send_json($response); 
    21142114} 
     2115 
     2116function wp_ajax_revisions_data() { 
     2117        global $postid, $revision, $showautosaves, $showsplitview; 
     2118 
     2119        $alltherevisions = array(); 
     2120 
     2121        wp_reset_vars( array( 'postid', 'revision', 'showautosaves', 'showsplitview' ) ); 
     2122 
     2123        if ( ! $revisions = wp_get_post_revisions( $postid ) ) 
     2124                return; 
     2125 
     2126        $count = 1; 
     2127        foreach ( $revisions as $revision ) : 
     2128                if ( ! current_user_can( 'read_post', $revision->ID ) 
     2129                        ||      'true' != $showautosaves && wp_is_post_autosave( $revision ) 
     2130                ) 
     2131                        continue; 
     2132 
     2133                $author = get_the_author_meta( 'display_name', $revision->post_author ); 
     2134                /* translators: revision date format, see http://php.net/date */ 
     2135                $datef = _x( 'j F, Y @ G:i', 'revision date format'); 
     2136 
     2137                $date = date_i18n( $datef, strtotime( $revision->post_modified ) ); 
     2138                $revision_date_author = sprintf( 
     2139                        '%s %s %s %s (%s)', 
     2140                        __( 'Viewing revision from' ), 
     2141                        human_time_diff( strtotime( $revision->post_modified ), current_time( 'timestamp' ) ), 
     2142                        __( ' ago, by ' ), 
     2143                        $author, 
     2144                        $date 
     2145                ); 
     2146                $restoreaction = wp_nonce_url( 
     2147                        add_query_arg( 
     2148                                array( 'revision' => $revision->ID, 'action' => 'restore' ), 
     2149                                '/wp-admin/revision.php' 
     2150                        ), 
     2151                        "restore-post_$postid|$revision->ID" 
     2152                ); 
     2153 
     2154                $alltherevisions[] = array ( 
     2155                        'ID' => $revision->ID, 
     2156                        'revision_date_author' => $revision_date_author, 
     2157                        'revisiondiff' => '', 
     2158                        'restoreaction' => urldecode( $restoreaction ) 
     2159                ); 
     2160        endforeach; 
     2161 
     2162        $x = 0; 
     2163        $allreversed = array_reverse( $alltherevisions, true ); //reverse to iterate backwards calculating diff for each revision 
     2164 
     2165        foreach ( $allreversed as $revkey => $arevision ) { 
     2166                $content = ''; 
     2167 
     2168                if ( $x++ < 1 ){ 
     2169                        $revision_previous = $arevision; 
     2170                } else { 
     2171                        $left_revision = get_post( $revision_previous[ 'ID' ] ); 
     2172                        $right_revision = get_post( $arevision[ 'ID' ] ); 
     2173 
     2174                        if ( ! $left_revision 
     2175                                || ! $right_revision 
     2176                                || ! $left_revision->post_parent == $right_revision->post_parent // both are revisions of common parent 
     2177                                || ( 
     2178                                        $left_revision->ID == $right_revision->ID 
     2179                                        || ( ! wp_get_post_revision( $left_revision->ID ) && ! wp_get_post_revision( $right_revision->ID ) ) 
     2180                                ) 
     2181                        ) 
     2182                                break; 
     2183 
     2184                        foreach ( array_keys( _wp_post_revision_fields() ) as $field ) { 
     2185                                $left_content = apply_filters( "_wp_post_revision_field_$field", $left_revision->$field, $field, $left_revision, 'left' ); 
     2186                                $right_content = apply_filters( "_wp_post_revision_field_$field", $right_revision->$field, $field, $right_revision, 'right' ); 
     2187 
     2188                                add_filter( "_wp_post_revision_field_$field", 'wp_kses_post' ); 
     2189 
     2190                                $args = array(); 
     2191 
     2192                                if ( $showsplitview ) 
     2193                                         $args = array( 'showsplitview' => 'true' ); 
     2194 
     2195                                if ( $content = wp_text_diff( $left_content, $right_content, $args ) ) 
     2196                                        $allreversed[ $revkey ][ 'revisiondiff' ] .=  $content; 
     2197                        } 
     2198 
     2199                        if ( empty( $allreversed[ $revkey ][ 'revisiondiff' ] ) ) 
     2200                                unset( $allreversed[ $revkey ] ); 
     2201 
     2202                        $revision_previous = $arevision; 
     2203                } 
     2204        } 
     2205        $allrevisions = array_reverse( $allreversed ); //reverse again before returning 
     2206 
     2207        array_pop( $allrevisions ); 
     2208 
     2209        echo json_encode( $allrevisions ); 
     2210        exit(); 
     2211} 
     2212 No newline at end of file 
  • wp-admin/includes/meta-boxes.php

    diff --git wp-admin/includes/meta-boxes.php wp-admin/includes/meta-boxes.php
    index 18fc9eb..cc57be5 100644
    if ( $can_publish ) : // Contributors don't get to choose the date of publish ?> 
    178178        <a href="#edit_timestamp" class="edit-timestamp hide-if-no-js"><?php _e('Edit') ?></a> 
    179179        <div id="timestampdiv" class="hide-if-js"><?php touch_time(($action == 'edit'), 1); ?></div> 
    180180</div><?php // /misc-pub-section ?> 
     181<?php endif; 
     182 
     183        $the_revisions = wp_get_post_revisions( $post->ID ); 
     184 
     185        if ( post_type_supports( $post_type, 'revisions' ) && count( $the_revisions ) ) : 
     186?> 
     187<div id="post-revisions-link" class="misc-pub-section" > 
     188        <span id="revisions-link"><?php _e( 'Revisions:' ) ?></span> 
     189        <a href="<?php printf( 'revisions.php?revision=%s&postid=%s&action=edit', key( $the_revisions ), $post->ID )?>" class="edit-revisions hide-if-no-js"> 
     190                <?php _e( 'View' ); ?> 
     191        </a> 
     192</div> 
    181193<?php endif; ?> 
    182194 
    183195<?php do_action('post_submitbox_misc_actions'); ?> 
    function link_advanced_meta_box($link) { 
    979991function post_thumbnail_meta_box( $post ) { 
    980992        $thumbnail_id = get_post_meta( $post->ID, '_thumbnail_id', true ); 
    981993        echo _wp_post_thumbnail_html( $thumbnail_id, $post->ID ); 
    982 } 
    983  No newline at end of file 
     994} 
  • new file wp-admin/revisions.php

    diff --git wp-admin/revisions.php wp-admin/revisions.php
    new file mode 100644
    index 0000000..ef155d6
    - +  
     1<?php 
     2/** 
     3 * Revisions administration panel. 
     4 * 
     5 * @package WordPress 
     6 * @subpackage Administration 
     7 */ 
     8 
     9/** WordPress Administration Bootstrap */ 
     10require( './admin.php' ); 
     11wp_enqueue_style( 'revisions' ); 
     12wp_enqueue_style( 'wp-jquery-ui-slider' ); 
     13 
     14wp_enqueue_script( 'jquery-ui-slider' ); 
     15wp_enqueue_script( 'backbone' ); 
     16wp_enqueue_script( 'revisions' ); 
     17 
     18require( './admin-header.php' ); 
     19wp_reset_vars( array( 'postid', 'revision', 'action' ) ); 
     20 
     21$post_title = '<a href="' . get_edit_post_link( $postid ) . '">' . get_the_title( $postid ) . '</a>'; 
     22$h2 = sprintf( __( 'Compare Revisions of &#8220;%1$s&#8221;' ), $post_title ); 
     23?> 
     24<script type="text/javascript"> 
     25var postid = <?php echo $postid; ?>; 
     26</script> 
     27<div class="wrap"> 
     28        <div class="icon32 icon32-posts-post" id="icon-edit"><br></div> 
     29        <h2 class="long-header"><?php echo $h2; ?></h2> 
     30        <div class="revisiondiffcontainer"> 
     31                <div id="diffheader"> 
     32                        <div id="diffprevious"><input class="button" type="submit" id="previous" value="Previous" /></div> 
     33                        <div id="diffnext"><input class="button" type="submit" id="next" value="Next" /></div> 
     34                        <div id="diffslider"><div id="revisioncount"><?php _e( 'Revision' ); ?> <span id="diff_count"></span> <?php _e( ' of ' ); ?><span id="diff_max" ></span></div><div id="slider"></div></div> 
     35                </div> 
     36                <div id="backbonerevisionsdiff"></div> 
     37        </div> 
     38</div> 
     39<script id="tmpl-revision" type="text/html"> 
     40        <div id="diffsubheader"> 
     41                <div id="difftitle">{{{ data.revision_date_author }}}</div> 
     42                <div id="diffrestore"><input class="button button-primary" onClick="document.location='<%= restoreaction %>'" type="submit" id="restore" value="<?php esc_attr_e( 'Restore this Revision' )?>" /></div> 
     43        </div> 
     44        <div id="removedandadded"> 
     45                <div id="removed"><?php _e( '- Removed' ); ?></div> 
     46                <div id="unchanged"><?php _e( '= Unchanged' ); ?></div> 
     47                <div id="added"><?php _e( '+ Added' ); ?></div> 
     48        </div 
     49        <div>{{{ data.revisiondiff }}}</div> 
     50</script> 
     51 
     52<div id="backbonerevisionslist"></div> 
     53 
     54<div id="revisionoptions"> 
     55        <input type='checkbox' id="showsplitview" value="1" /> <?php _e( 'Show split diff view' ); ?> 
     56        <br /> 
     57        <input type='checkbox' id="toggleshowautosaves" value="1" /> <?php _e( 'Show autosaves' ); ?> 
     58</div> 
     59<div id="previousrevisioninterfacelink"> 
     60<?php 
     61        $old_revisions_link = admin_url ( sprintf( 'revision.php?revision=%d&action=edit', $revision ) ); 
     62        printf( '<a href="%s">%s</a>', $old_revisions_link, __( 'Use previous revisions interface' ) ) 
     63?> 
     64</div> 
     65<?php 
     66 
     67require( './admin-footer.php' ); 
     68 No newline at end of file 
  • new file wp-includes/css/jquery-ui-slider.css

    diff --git wp-includes/css/jquery-ui-slider.css wp-includes/css/jquery-ui-slider.css
    new file mode 100644
    index 0000000..4ac53e2
    - +  
     1/*! jQuery UI - v1.10.1 - 2013-02-15 
     2* http://jqueryui.com 
     3* Includes: jquery.ui.core.css, jquery.ui.slider.css 
     4* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Trebuchet%20MS%2CTahoma%2CVerdana%2CArial%2Csans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=f6a828&bgTextureHeader=gloss_wave&bgImgOpacityHeader=35&borderColorHeader=e78f08&fcHeader=ffffff&iconColorHeader=ffffff&bgColorContent=eeeeee&bgTextureContent=highlight_soft&bgImgOpacityContent=100&borderColorContent=dddddd&fcContent=333333&iconColorContent=222222&bgColorDefault=f6f6f6&bgTextureDefault=glass&bgImgOpacityDefault=100&borderColorDefault=cccccc&fcDefault=1c94c4&iconColorDefault=ef8c08&bgColorHover=fdf5ce&bgTextureHover=glass&bgImgOpacityHover=100&borderColorHover=fbcb09&fcHover=c77405&iconColorHover=ef8c08&bgColorActive=ffffff&bgTextureActive=glass&bgImgOpacityActive=65&borderColorActive=fbd850&fcActive=eb8f00&iconColorActive=ef8c08&bgColorHighlight=ffe45c&bgTextureHighlight=highlight_soft&bgImgOpacityHighlight=75&borderColorHighlight=fed22f&fcHighlight=363636&iconColorHighlight=228ef1&bgColorError=b81900&bgTextureError=diagonals_thick&bgImgOpacityError=18&borderColorError=cd0a0a&fcError=ffffff&iconColorError=ffd27a&bgColorOverlay=666666&bgTextureOverlay=diagonals_thick&bgImgOpacityOverlay=20&opacityOverlay=50&bgColorShadow=000000&bgTextureShadow=flat&bgImgOpacityShadow=10&opacityShadow=20&thicknessShadow=5px&offsetTopShadow=-5px&offsetLeftShadow=-5px&cornerRadiusShadow=5px 
     5* Copyright (c) 2013 jQuery Foundation and other contributors Licensed MIT */ 
     6 
     7/* Layout helpers 
     8----------------------------------*/ 
     9.ui-helper-hidden { 
     10        display: none; 
     11} 
     12.ui-helper-hidden-accessible { 
     13        border: 0; 
     14        clip: rect(0 0 0 0); 
     15        height: 1px; 
     16        margin: -1px; 
     17        overflow: hidden; 
     18        padding: 0; 
     19        position: absolute; 
     20        width: 1px; 
     21} 
     22.ui-helper-reset { 
     23        margin: 0; 
     24        padding: 0; 
     25        border: 0; 
     26        outline: 0; 
     27        line-height: 1.3; 
     28        text-decoration: none; 
     29        font-size: 100%; 
     30        list-style: none; 
     31} 
     32.ui-helper-clearfix:before, 
     33.ui-helper-clearfix:after { 
     34        content: ""; 
     35        display: table; 
     36        border-collapse: collapse; 
     37} 
     38.ui-helper-clearfix:after { 
     39        clear: both; 
     40} 
     41.ui-helper-clearfix { 
     42        min-height: 0; /* support: IE7 */ 
     43} 
     44.ui-helper-zfix { 
     45        width: 100%; 
     46        height: 100%; 
     47        top: 0; 
     48        left: 0; 
     49        position: absolute; 
     50        opacity: 0; 
     51        filter:Alpha(Opacity=0); 
     52} 
     53 
     54.ui-front { 
     55        z-index: 100; 
     56} 
     57 
     58 
     59/* Interaction Cues 
     60----------------------------------*/ 
     61.ui-state-disabled { 
     62        cursor: default !important; 
     63} 
     64 
     65 
     66/* Icons 
     67----------------------------------*/ 
     68 
     69/* states and images */ 
     70.ui-icon { 
     71        display: block; 
     72        text-indent: -99999px; 
     73        overflow: hidden; 
     74        background-repeat: no-repeat; 
     75} 
     76 
     77 
     78/* Misc visuals 
     79----------------------------------*/ 
     80 
     81/* Overlays */ 
     82.ui-widget-overlay { 
     83        position: fixed; 
     84        top: 0; 
     85        left: 0; 
     86        width: 100%; 
     87        height: 100%; 
     88} 
     89.ui-slider { 
     90        position: relative; 
     91        text-align: left; 
     92} 
     93.ui-slider .ui-slider-handle { 
     94        position: absolute; 
     95        z-index: 2; 
     96        width: 1.2em; 
     97        height: 1.2em; 
     98        cursor: default; 
     99} 
     100.ui-slider .ui-slider-range { 
     101        position: absolute; 
     102        z-index: 1; 
     103        font-size: .7em; 
     104        display: block; 
     105        border: 0; 
     106        background-position: 0 0; 
     107} 
     108 
     109/* For IE8 - See #6727 */ 
     110.ui-slider.ui-state-disabled .ui-slider-handle, 
     111.ui-slider.ui-state-disabled .ui-slider-range { 
     112        filter: inherit; 
     113} 
     114 
     115.ui-slider-horizontal { 
     116        height: .8em; 
     117} 
     118.ui-slider-horizontal .ui-slider-handle { 
     119        top: -.3em; 
     120        margin-left: -.6em; 
     121} 
     122.ui-slider-horizontal .ui-slider-range { 
     123        top: 0; 
     124        height: 100%; 
     125} 
     126.ui-slider-horizontal .ui-slider-range-min { 
     127        left: 0; 
     128} 
     129.ui-slider-horizontal .ui-slider-range-max { 
     130        right: 0; 
     131} 
     132 
     133.ui-slider-vertical { 
     134        width: .8em; 
     135        height: 100px; 
     136} 
     137.ui-slider-vertical .ui-slider-handle { 
     138        left: -.3em; 
     139        margin-left: 0; 
     140        margin-bottom: -.6em; 
     141} 
     142.ui-slider-vertical .ui-slider-range { 
     143        left: 0; 
     144        width: 100%; 
     145} 
     146.ui-slider-vertical .ui-slider-range-min { 
     147        bottom: 0; 
     148} 
     149.ui-slider-vertical .ui-slider-range-max { 
     150        top: 0; 
     151} 
     152 
     153/* Component containers 
     154----------------------------------*/ 
     155.ui-widget { 
     156        font-family: Trebuchet MS,Tahoma,Verdana,Arial,sans-serif; 
     157        font-size: 1.1em; 
     158} 
     159.ui-widget .ui-widget { 
     160        font-size: 1em; 
     161} 
     162.ui-widget input, 
     163.ui-widget select, 
     164.ui-widget textarea, 
     165.ui-widget button { 
     166        font-family: Trebuchet MS,Tahoma,Verdana,Arial,sans-serif; 
     167        font-size: 1em; 
     168} 
     169.ui-widget-content { 
     170        border: 1px solid #dddddd; 
     171        background: #eeeeee url(../images/ui-bg_highlight-soft_100_eeeeee_1x100.png) 50% top repeat-x; 
     172        color: #333333; 
     173} 
     174.ui-widget-content a { 
     175        color: #333333; 
     176} 
     177.ui-widget-header { 
     178        border: 1px solid #e78f08; 
     179        background: #f6a828 url(../images/ui-bg_gloss-wave_35_f6a828_500x100.png) 50% 50% repeat-x; 
     180        color: #ffffff; 
     181        font-weight: bold; 
     182} 
     183.ui-widget-header a { 
     184        color: #ffffff; 
     185} 
     186 
     187/* Interaction states 
     188----------------------------------*/ 
     189.ui-state-default, 
     190.ui-widget-content .ui-state-default, 
     191.ui-widget-header .ui-state-default { 
     192        border: 1px solid #cccccc; 
     193        background: #f6f6f6 url(../images/ui-bg_glass_100_f6f6f6_1x400.png) 50% 50% repeat-x; 
     194        font-weight: bold; 
     195        color: #1c94c4; 
     196} 
     197.ui-state-default a, 
     198.ui-state-default a:link, 
     199.ui-state-default a:visited { 
     200        color: #1c94c4; 
     201        text-decoration: none; 
     202} 
     203.ui-state-hover, 
     204.ui-widget-content .ui-state-hover, 
     205.ui-widget-header .ui-state-hover, 
     206.ui-state-focus, 
     207.ui-widget-content .ui-state-focus, 
     208.ui-widget-header .ui-state-focus { 
     209        border: 1px solid #fbcb09; 
     210        background: #fdf5ce url(../images/ui-bg_glass_100_fdf5ce_1x400.png) 50% 50% repeat-x; 
     211        font-weight: bold; 
     212        color: #c77405; 
     213} 
     214.ui-state-hover a, 
     215.ui-state-hover a:hover, 
     216.ui-state-hover a:link, 
     217.ui-state-hover a:visited { 
     218        color: #c77405; 
     219        text-decoration: none; 
     220} 
     221.ui-state-active, 
     222.ui-widget-content .ui-state-active, 
     223.ui-widget-header .ui-state-active { 
     224        border: 1px solid #fbd850; 
     225        background: #ffffff url(../images/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x; 
     226        font-weight: bold; 
     227        color: #eb8f00; 
     228} 
     229.ui-state-active a, 
     230.ui-state-active a:link, 
     231.ui-state-active a:visited { 
     232        color: #eb8f00; 
     233        text-decoration: none; 
     234} 
     235 
     236/* Interaction Cues 
     237----------------------------------*/ 
     238.ui-state-highlight, 
     239.ui-widget-content .ui-state-highlight, 
     240.ui-widget-header .ui-state-highlight { 
     241        border: 1px solid #fed22f; 
     242        background: #ffe45c url(../images/ui-bg_highlight-soft_75_ffe45c_1x100.png) 50% top repeat-x; 
     243        color: #363636; 
     244} 
     245.ui-state-highlight a, 
     246.ui-widget-content .ui-state-highlight a, 
     247.ui-widget-header .ui-state-highlight a { 
     248        color: #363636; 
     249} 
     250.ui-state-error, 
     251.ui-widget-content .ui-state-error, 
     252.ui-widget-header .ui-state-error { 
     253        border: 1px solid #cd0a0a; 
     254        background: #b81900 url(../images/ui-bg_diagonals-thick_18_b81900_40x40.png) 50% 50% repeat; 
     255        color: #ffffff; 
     256} 
     257.ui-state-error a, 
     258.ui-widget-content .ui-state-error a, 
     259.ui-widget-header .ui-state-error a { 
     260        color: #ffffff; 
     261} 
     262.ui-state-error-text, 
     263.ui-widget-content .ui-state-error-text, 
     264.ui-widget-header .ui-state-error-text { 
     265        color: #ffffff; 
     266} 
     267.ui-priority-primary, 
     268.ui-widget-content .ui-priority-primary, 
     269.ui-widget-header .ui-priority-primary { 
     270        font-weight: bold; 
     271} 
     272.ui-priority-secondary, 
     273.ui-widget-content .ui-priority-secondary, 
     274.ui-widget-header .ui-priority-secondary { 
     275        opacity: .7; 
     276        filter:Alpha(Opacity=70); 
     277        font-weight: normal; 
     278} 
     279.ui-state-disabled, 
     280.ui-widget-content .ui-state-disabled, 
     281.ui-widget-header .ui-state-disabled { 
     282        opacity: .35; 
     283        filter:Alpha(Opacity=35); 
     284        background-image: none; 
     285} 
     286.ui-state-disabled .ui-icon { 
     287        filter:Alpha(Opacity=35); /* For IE8 - See #6059 */ 
     288} 
     289 
     290/* Icons 
     291----------------------------------*/ 
     292 
     293/* states and images */ 
     294.ui-icon { 
     295        width: 16px; 
     296        height: 16px; 
     297        background-position: 16px 16px; 
     298} 
     299.ui-icon, 
     300.ui-widget-content .ui-icon { 
     301        background-image: url(../images/ui-icons_222222_256x240.png); 
     302} 
     303.ui-widget-header .ui-icon { 
     304        background-image: url(../images/ui-icons_ffffff_256x240.png); 
     305} 
     306.ui-state-default .ui-icon { 
     307        background-image: url(../images/ui-icons_ef8c08_256x240.png); 
     308} 
     309.ui-state-hover .ui-icon, 
     310.ui-state-focus .ui-icon { 
     311        background-image: url(../images/ui-icons_ef8c08_256x240.png); 
     312} 
     313.ui-state-active .ui-icon { 
     314        background-image: url(../images/ui-icons_ef8c08_256x240.png); 
     315} 
     316.ui-state-highlight .ui-icon { 
     317        background-image: url(../images/ui-icons_228ef1_256x240.png); 
     318} 
     319.ui-state-error .ui-icon, 
     320.ui-state-error-text .ui-icon { 
     321        background-image: url(../images/ui-icons_ffd27a_256x240.png); 
     322} 
     323 
     324/* positioning */ 
     325.ui-icon-carat-1-n { background-position: 0 0; } 
     326.ui-icon-carat-1-ne { background-position: -16px 0; } 
     327.ui-icon-carat-1-e { background-position: -32px 0; } 
     328.ui-icon-carat-1-se { background-position: -48px 0; } 
     329.ui-icon-carat-1-s { background-position: -64px 0; } 
     330.ui-icon-carat-1-sw { background-position: -80px 0; } 
     331.ui-icon-carat-1-w { background-position: -96px 0; } 
     332.ui-icon-carat-1-nw { background-position: -112px 0; } 
     333.ui-icon-carat-2-n-s { background-position: -128px 0; } 
     334.ui-icon-carat-2-e-w { background-position: -144px 0; } 
     335.ui-icon-triangle-1-n { background-position: 0 -16px; } 
     336.ui-icon-triangle-1-ne { background-position: -16px -16px; } 
     337.ui-icon-triangle-1-e { background-position: -32px -16px; } 
     338.ui-icon-triangle-1-se { background-position: -48px -16px; } 
     339.ui-icon-triangle-1-s { background-position: -64px -16px; } 
     340.ui-icon-triangle-1-sw { background-position: -80px -16px; } 
     341.ui-icon-triangle-1-w { background-position: -96px -16px; } 
     342.ui-icon-triangle-1-nw { background-position: -112px -16px; } 
     343.ui-icon-triangle-2-n-s { background-position: -128px -16px; } 
     344.ui-icon-triangle-2-e-w { background-position: -144px -16px; } 
     345.ui-icon-arrow-1-n { background-position: 0 -32px; } 
     346.ui-icon-arrow-1-ne { background-position: -16px -32px; } 
     347.ui-icon-arrow-1-e { background-position: -32px -32px; } 
     348.ui-icon-arrow-1-se { background-position: -48px -32px; } 
     349.ui-icon-arrow-1-s { background-position: -64px -32px; } 
     350.ui-icon-arrow-1-sw { background-position: -80px -32px; } 
     351.ui-icon-arrow-1-w { background-position: -96px -32px; } 
     352.ui-icon-arrow-1-nw { background-position: -112px -32px; } 
     353.ui-icon-arrow-2-n-s { background-position: -128px -32px; } 
     354.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; } 
     355.ui-icon-arrow-2-e-w { background-position: -160px -32px; } 
     356.ui-icon-arrow-2-se-nw { background-position: -176px -32px; } 
     357.ui-icon-arrowstop-1-n { background-position: -192px -32px; } 
     358.ui-icon-arrowstop-1-e { background-position: -208px -32px; } 
     359.ui-icon-arrowstop-1-s { background-position: -224px -32px; } 
     360.ui-icon-arrowstop-1-w { background-position: -240px -32px; } 
     361.ui-icon-arrowthick-1-n { background-position: 0 -48px; } 
     362.ui-icon-arrowthick-1-ne { background-position: -16px -48px; } 
     363.ui-icon-arrowthick-1-e { background-position: -32px -48px; } 
     364.ui-icon-arrowthick-1-se { background-position: -48px -48px; } 
     365.ui-icon-arrowthick-1-s { background-position: -64px -48px; } 
     366.ui-icon-arrowthick-1-sw { background-position: -80px -48px; } 
     367.ui-icon-arrowthick-1-w { background-position: -96px -48px; } 
     368.ui-icon-arrowthick-1-nw { background-position: -112px -48px; } 
     369.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; } 
     370.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; } 
     371.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; } 
     372.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; } 
     373.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; } 
     374.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; } 
     375.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; } 
     376.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; } 
     377.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; } 
     378.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; } 
     379.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; } 
     380.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; } 
     381.ui-icon-arrowreturn-1-w { background-position: -64px -64px; } 
     382.ui-icon-arrowreturn-1-n { background-position: -80px -64px; } 
     383.ui-icon-arrowreturn-1-e { background-position: -96px -64px; } 
     384.ui-icon-arrowreturn-1-s { background-position: -112px -64px; } 
     385.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; } 
     386.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; } 
     387.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; } 
     388.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; } 
     389.ui-icon-arrow-4 { background-position: 0 -80px; } 
     390.ui-icon-arrow-4-diag { background-position: -16px -80px; } 
     391.ui-icon-extlink { background-position: -32px -80px; } 
     392.ui-icon-newwin { background-position: -48px -80px; } 
     393.ui-icon-refresh { background-position: -64px -80px; } 
     394.ui-icon-shuffle { background-position: -80px -80px; } 
     395.ui-icon-transfer-e-w { background-position: -96px -80px; } 
     396.ui-icon-transferthick-e-w { background-position: -112px -80px; } 
     397.ui-icon-folder-collapsed { background-position: 0 -96px; } 
     398.ui-icon-folder-open { background-position: -16px -96px; } 
     399.ui-icon-document { background-position: -32px -96px; } 
     400.ui-icon-document-b { background-position: -48px -96px; } 
     401.ui-icon-note { background-position: -64px -96px; } 
     402.ui-icon-mail-closed { background-position: -80px -96px; } 
     403.ui-icon-mail-open { background-position: -96px -96px; } 
     404.ui-icon-suitcase { background-position: -112px -96px; } 
     405.ui-icon-comment { background-position: -128px -96px; } 
     406.ui-icon-person { background-position: -144px -96px; } 
     407.ui-icon-print { background-position: -160px -96px; } 
     408.ui-icon-trash { background-position: -176px -96px; } 
     409.ui-icon-locked { background-position: -192px -96px; } 
     410.ui-icon-unlocked { background-position: -208px -96px; } 
     411.ui-icon-bookmark { background-position: -224px -96px; } 
     412.ui-icon-tag { background-position: -240px -96px; } 
     413.ui-icon-home { background-position: 0 -112px; } 
     414.ui-icon-flag { background-position: -16px -112px; } 
     415.ui-icon-calendar { background-position: -32px -112px; } 
     416.ui-icon-cart { background-position: -48px -112px; } 
     417.ui-icon-pencil { background-position: -64px -112px; } 
     418.ui-icon-clock { background-position: -80px -112px; } 
     419.ui-icon-disk { background-position: -96px -112px; } 
     420.ui-icon-calculator { background-position: -112px -112px; } 
     421.ui-icon-zoomin { background-position: -128px -112px; } 
     422.ui-icon-zoomout { background-position: -144px -112px; } 
     423.ui-icon-search { background-position: -160px -112px; } 
     424.ui-icon-wrench { background-position: -176px -112px; } 
     425.ui-icon-gear { background-position: -192px -112px; } 
     426.ui-icon-heart { background-position: -208px -112px; } 
     427.ui-icon-star { background-position: -224px -112px; } 
     428.ui-icon-link { background-position: -240px -112px; } 
     429.ui-icon-cancel { background-position: 0 -128px; } 
     430.ui-icon-plus { background-position: -16px -128px; } 
     431.ui-icon-plusthick { background-position: -32px -128px; } 
     432.ui-icon-minus { background-position: -48px -128px; } 
     433.ui-icon-minusthick { background-position: -64px -128px; } 
     434.ui-icon-close { background-position: -80px -128px; } 
     435.ui-icon-closethick { background-position: -96px -128px; } 
     436.ui-icon-key { background-position: -112px -128px; } 
     437.ui-icon-lightbulb { background-position: -128px -128px; } 
     438.ui-icon-scissors { background-position: -144px -128px; } 
     439.ui-icon-clipboard { background-position: -160px -128px; } 
     440.ui-icon-copy { background-position: -176px -128px; } 
     441.ui-icon-contact { background-position: -192px -128px; } 
     442.ui-icon-image { background-position: -208px -128px; } 
     443.ui-icon-video { background-position: -224px -128px; } 
     444.ui-icon-script { background-position: -240px -128px; } 
     445.ui-icon-alert { background-position: 0 -144px; } 
     446.ui-icon-info { background-position: -16px -144px; } 
     447.ui-icon-notice { background-position: -32px -144px; } 
     448.ui-icon-help { background-position: -48px -144px; } 
     449.ui-icon-check { background-position: -64px -144px; } 
     450.ui-icon-bullet { background-position: -80px -144px; } 
     451.ui-icon-radio-on { background-position: -96px -144px; } 
     452.ui-icon-radio-off { background-position: -112px -144px; } 
     453.ui-icon-pin-w { background-position: -128px -144px; } 
     454.ui-icon-pin-s { background-position: -144px -144px; } 
     455.ui-icon-play { background-position: 0 -160px; } 
     456.ui-icon-pause { background-position: -16px -160px; } 
     457.ui-icon-seek-next { background-position: -32px -160px; } 
     458.ui-icon-seek-prev { background-position: -48px -160px; } 
     459.ui-icon-seek-end { background-position: -64px -160px; } 
     460.ui-icon-seek-start { background-position: -80px -160px; } 
     461/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */ 
     462.ui-icon-seek-first { background-position: -80px -160px; } 
     463.ui-icon-stop { background-position: -96px -160px; } 
     464.ui-icon-eject { background-position: -112px -160px; } 
     465.ui-icon-volume-off { background-position: -128px -160px; } 
     466.ui-icon-volume-on { background-position: -144px -160px; } 
     467.ui-icon-power { background-position: 0 -176px; } 
     468.ui-icon-signal-diag { background-position: -16px -176px; } 
     469.ui-icon-signal { background-position: -32px -176px; } 
     470.ui-icon-battery-0 { background-position: -48px -176px; } 
     471.ui-icon-battery-1 { background-position: -64px -176px; } 
     472.ui-icon-battery-2 { background-position: -80px -176px; } 
     473.ui-icon-battery-3 { background-position: -96px -176px; } 
     474.ui-icon-circle-plus { background-position: 0 -192px; } 
     475.ui-icon-circle-minus { background-position: -16px -192px; } 
     476.ui-icon-circle-close { background-position: -32px -192px; } 
     477.ui-icon-circle-triangle-e { background-position: -48px -192px; } 
     478.ui-icon-circle-triangle-s { background-position: -64px -192px; } 
     479.ui-icon-circle-triangle-w { background-position: -80px -192px; } 
     480.ui-icon-circle-triangle-n { background-position: -96px -192px; } 
     481.ui-icon-circle-arrow-e { background-position: -112px -192px; } 
     482.ui-icon-circle-arrow-s { background-position: -128px -192px; } 
     483.ui-icon-circle-arrow-w { background-position: -144px -192px; } 
     484.ui-icon-circle-arrow-n { background-position: -160px -192px; } 
     485.ui-icon-circle-zoomin { background-position: -176px -192px; } 
     486.ui-icon-circle-zoomout { background-position: -192px -192px; } 
     487.ui-icon-circle-check { background-position: -208px -192px; } 
     488.ui-icon-circlesmall-plus { background-position: 0 -208px; } 
     489.ui-icon-circlesmall-minus { background-position: -16px -208px; } 
     490.ui-icon-circlesmall-close { background-position: -32px -208px; } 
     491.ui-icon-squaresmall-plus { background-position: -48px -208px; } 
     492.ui-icon-squaresmall-minus { background-position: -64px -208px; } 
     493.ui-icon-squaresmall-close { background-position: -80px -208px; } 
     494.ui-icon-grip-dotted-vertical { background-position: 0 -224px; } 
     495.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; } 
     496.ui-icon-grip-solid-vertical { background-position: -32px -224px; } 
     497.ui-icon-grip-solid-horizontal { background-position: -48px -224px; } 
     498.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; } 
     499.ui-icon-grip-diagonal-se { background-position: -80px -224px; } 
     500 
     501 
     502/* Misc visuals 
     503----------------------------------*/ 
     504 
     505/* Corner radius */ 
     506.ui-corner-all, 
     507.ui-corner-top, 
     508.ui-corner-left, 
     509.ui-corner-tl { 
     510        border-top-left-radius: 4px; 
     511} 
     512.ui-corner-all, 
     513.ui-corner-top, 
     514.ui-corner-right, 
     515.ui-corner-tr { 
     516        border-top-right-radius: 4px; 
     517} 
     518.ui-corner-all, 
     519.ui-corner-bottom, 
     520.ui-corner-left, 
     521.ui-corner-bl { 
     522        border-bottom-left-radius: 4px; 
     523} 
     524.ui-corner-all, 
     525.ui-corner-bottom, 
     526.ui-corner-right, 
     527.ui-corner-br { 
     528        border-bottom-right-radius: 4px; 
     529} 
     530 
     531/* Overlays */ 
     532.ui-widget-overlay { 
     533        background: #666666 url(../images/ui-bg_diagonals-thick_20_666666_40x40.png) 50% 50% repeat; 
     534        opacity: .5; 
     535        filter: Alpha(Opacity=50); 
     536} 
     537.ui-widget-shadow { 
     538        margin: -5px 0 0 -5px; 
     539        padding: 5px; 
     540        background: #000000 url(../images/ui-bg_flat_10_000000_40x100.png) 50% 50% repeat-x; 
     541        opacity: .2; 
     542        filter: Alpha(Opacity=20); 
     543        border-radius: 5px; 
     544} 
  • new file wp-includes/js/revisions.js

    diff --git wp-includes/js/revisions.js wp-includes/js/revisions.js
    new file mode 100644
    index 0000000..c8e4cb7
    - +  
     1window.wp = window.wp || {}; 
     2 
     3(function ($) { 
     4        wp.revisions = { 
     5                views : {}, 
     6                Model : Backbone.Model.extend({ 
     7                        defaults: { //include all fields for now, pair it down later 
     8                                ID : 0, 
     9                                revision_date_author : '', 
     10                                revisiondiff : '', 
     11                                restoreaction: '', 
     12                                diff_max : 0, 
     13                                diff_count : 0 
     14                        } 
     15                }), 
     16                App : Backbone.Router.extend({ 
     17                        _revisionListView : null, 
     18                        _revisionDifflView : null, 
     19                        _revisions : null, 
     20                        routes : { 
     21                                "*actions": "revisionDiff", 
     22                                "revisiondetail/:id": "revisionDetail" 
     23                        }, 
     24                        showsplitview : '', 
     25                        autosaves : false, 
     26                        /* 
     27                         * initialize the revision appl;ication 
     28                         */ 
     29                        initialize : function (options) { 
     30                                var self = this; //store the application instance 
     31                                if (this._revisions === null) { 
     32                                        self.autosaves = ''; 
     33                                        self._revisions = new wp.revisions.Collection(); //set up collection 
     34                                        self._revisions.autosaves = 'true'; 
     35                                        self._revisions.fetch({ //load revision data 
     36                                                success : function () { 
     37                                                        self.revisionDiffSetup(); 
     38                                                }, 
     39                                                error :  function () { 
     40                                                        window.console && console.log( 'Error loading revision data' ); 
     41                                                } 
     42                                        }); 
     43 
     44                                } 
     45                                return this; 
     46                        }, 
     47 
     48                        revisionDiffSetup : function () { 
     49                                var modelcount = this._revisions.length, self = this, slider; 
     50 
     51                                this._revisionView = new wp.revisions.views.View({ 
     52                                        model : this._revisions 
     53                                }); 
     54                                this._revisionView.render(); 
     55 
     56                                slider = $("#slider"); 
     57 
     58                                //set up slider 
     59                                slider.slider({ 
     60                                        value:0, 
     61                                        min : 0, 
     62                                        max : modelcount-1, 
     63                                        step : 1, 
     64                                        slide : function ( event, ui ) { 
     65                                                 self._revisionView.current_diff = ui.value+1; 
     66                                                 self._revisionView.render(); 
     67                                        } 
     68                                }); 
     69 
     70                                //set up buttons 
     71                                $( 'input#previous' ).on("click", function () { 
     72                                        self._revisionView.current_diff--; 
     73                                        if ( self._revisionView.current_diff <= 1) 
     74                                                self._revisionView.current_diff = 1; 
     75 
     76                                        self._revisionView.render(); 
     77                                        slider.slider('value', self._revisionView.current_diff - 1); 
     78                                        slider.trigger( 'slide' ); 
     79                                }); 
     80 
     81                                $( 'input#next' ).on( 'click', function () { 
     82                                        self._revisionView.current_diff++; 
     83                                        if ( self._revisionView.current_diff >= self._revisionView.total_length ) 
     84                                                self._revisionView.current_diff = self._revisionView.total_length; 
     85 
     86                                        self._revisionView.render(); 
     87                                        slider.slider('value', self._revisionView.current_diff-1); 
     88                                        slider.trigger('slide'); 
     89                                }); 
     90 
     91                                //set up autosave toggle 
     92                                $( 'input#toggleshowautosaves' ).on( 'click', function () { 
     93                                        if ( $( 'input#toggleshowautosaves' ).is( ':checked' ) ) { 
     94                                                self.autosaves = true; 
     95                                        } else { 
     96                                                self.autosaves = false; 
     97                                        } 
     98                                        self._revisions.url =  'data/revisions-data.php?action=get&postid=' + postid + '&showautosaves=' + self.autosaves +  '&showsplitview=' +  self.showsplitview; 
     99 
     100                                        self._revisions.fetch({ //reload revision data 
     101                                                success : function () { 
     102                                                        var revisioncount = self._revisionView.model.length; 
     103                                                        if ( self._revisionView.current_diff > revisioncount ) 
     104                                                                self._revisionView.current_diff = revisioncount; 
     105                                                        self._revisionView.render(); 
     106                                                        slider.slider( 'option', 'max', revisioncount-1 ); 
     107                                                } 
     108                                        }); 
     109                                } ); 
     110 
     111                                //set up showsplitview toggle 
     112                                $( 'input#showsplitview' ).on( 'click', function () { 
     113                                        if ( $( 'input#showsplitview' ).is( ':checked' ) ) { 
     114                                                self.showsplitview = 'true'; 
     115                                                $('.revisiondiffcontainer').addClass('diffsplit'); 
     116                                        } else { 
     117                                                self.showsplitview = ''; 
     118                                                $('.revisiondiffcontainer').removeClass('diffsplit'); 
     119                                        } 
     120                                        self._revisions.url =  'data/revisions-data.php?action=get&postid=' + postid + '&showautosaves=' + self.autosaves +  '&showsplitview=' +  self.showsplitview; 
     121                                        self._revisions.fetch({ //reload revision data 
     122                                                success : function () { 
     123                                                        self._revisionView.render(); 
     124                                                } 
     125                                        }); 
     126                                } ); 
     127                        } 
     128                }) 
     129        }; 
     130 
     131        wp.revisions.Collection = Backbone.Collection.extend({ 
     132                model : wp.revisions.Model, 
     133                url : ajaxurl + '?action=revisions-data&postid=' + postid + '&showautosaves=false' 
     134        }); 
     135 
     136        _.extend(wp.revisions.views, { 
     137                View : Backbone.View.extend({ 
     138                        el : $('#backbonerevisionsdiff')[0], 
     139                        tagName : 'revisionvview', 
     140                        className : 'revisionview-container', 
     141                        template : wp.template('revision'), 
     142                        current_diff : 1, 
     143                        total_length : 0, 
     144                        initialize : function (){ 
     145                                this.total_length = this.model.length; 
     146                                self = this; 
     147                        }, 
     148                        render : function () { 
     149                                var addhtml = ''; 
     150                                therevisions = this.model; 
     151                                if ( therevisions.at( this.current_diff-1 ) ) { 
     152                                        addhtml = this.template( therevisions.at( this.current_diff-1 ).toJSON() ); 
     153                                } 
     154                                this.$el.html( addhtml ); 
     155                                $( '#diff_max' ).html( this.model.length ); 
     156                                $( '#diff_count' ).html( this.current_diff ); 
     157                                return this; 
     158                        } 
     159                }), 
     160                List : Backbone.View.extend({ 
     161                        el : $('#backbonerevisionslist')[0], 
     162                        render : function () { 
     163                                var self = this, addhtml = '', therevisions = self.model; 
     164                                therevisions.each(function ( arevision ) { 
     165                                        addhtml = addhtml + '<br />' + (arevision.get("revision_date_author")); 
     166                                }); 
     167                                self.$el.html( addhtml ); 
     168                                return this; 
     169                        }, 
     170                        clear : function () { 
     171                                this.model.destroy(); 
     172                        } 
     173                }) 
     174        }); 
     175 
     176        //instantiate RevisionApplication object 
     177        revapp = new wp.revisions.App(); 
     178        Backbone.history.start(); 
     179 
     180}(jQuery)); 
     181 No newline at end of file 
  • new file wp-includes/js/template.js

    diff --git wp-includes/js/template.js wp-includes/js/template.js
    new file mode 100644
    index 0000000..8b4e818
    - +  
     1window.wp = window.wp || {}; 
     2 
     3(function ($) { 
     4        var template; 
     5        /** 
     6         * wp.template( id ) 
     7         * 
     8         * Fetches a template by id. 
     9         * 
     10         * @param  {string} id   A string that corresponds to a DOM element with an id prefixed with "tmpl-". 
     11         *                       For example, "attachment" maps to "tmpl-attachment". 
     12         * @return {function}    A function that lazily-compiles the template requested. 
     13         */ 
     14        template = wp.template = _.memoize(function ( id ) { 
     15                var compiled, 
     16                        options = { 
     17                                evaluate:    /<#([\s\S]+?)#>/g, 
     18                                interpolate: /\{\{\{([\s\S]+?)\}\}\}/g, 
     19                                escape:      /\{\{([^\}]+?)\}\}(?!\})/g, 
     20                                variable:    'data' 
     21                        }; 
     22 
     23                return function ( data ) { 
     24                        compiled = compiled || _.template( $( '#tmpl-' + id ).html(), null, options ); 
     25                        return compiled( data ); 
     26                }; 
     27        }); 
     28 
     29}(jQuery)); 
     30 No newline at end of file 
  • new file wp-includes/js/template.min.js

    diff --git wp-includes/js/template.min.js wp-includes/js/template.min.js
    new file mode 100644
    index 0000000..8b4e818
    - +  
     1window.wp = window.wp || {}; 
     2 
     3(function ($) { 
     4        var template; 
     5        /** 
     6         * wp.template( id ) 
     7         * 
     8         * Fetches a template by id. 
     9         * 
     10         * @param  {string} id   A string that corresponds to a DOM element with an id prefixed with "tmpl-". 
     11         *                       For example, "attachment" maps to "tmpl-attachment". 
     12         * @return {function}    A function that lazily-compiles the template requested. 
     13         */ 
     14        template = wp.template = _.memoize(function ( id ) { 
     15                var compiled, 
     16                        options = { 
     17                                evaluate:    /<#([\s\S]+?)#>/g, 
     18                                interpolate: /\{\{\{([\s\S]+?)\}\}\}/g, 
     19                                escape:      /\{\{([^\}]+?)\}\}(?!\})/g, 
     20                                variable:    'data' 
     21                        }; 
     22 
     23                return function ( data ) { 
     24                        compiled = compiled || _.template( $( '#tmpl-' + id ).html(), null, options ); 
     25                        return compiled( data ); 
     26                }; 
     27        }); 
     28 
     29}(jQuery)); 
     30 No newline at end of file 
  • wp-includes/pluggable.php

    diff --git wp-includes/pluggable.php wp-includes/pluggable.php
    index 99aaad1..df8dedb 100644
    function wp_text_diff( $left_string, $right_string, $args = null ) { 
    17131713 
    17141714        $left_lines  = explode("\n", $left_string); 
    17151715        $right_lines = explode("\n", $right_string); 
    1716  
    17171716        $text_diff = new Text_Diff($left_lines, $right_lines); 
    1718         $renderer  = new WP_Text_Diff_Renderer_Table(); 
     1717        $renderer  = new WP_Text_Diff_Renderer_Table( $args ); 
    17191718        $diff = $renderer->render($text_diff); 
    17201719 
    17211720        if ( !$diff ) 
    17221721                return ''; 
    17231722 
    17241723        $r  = "<table class='diff'>\n"; 
    1725         $r .= "<col class='ltype' /><col class='content' /><col class='ltype' /><col class='content' />"; 
     1724 
     1725        if ( isset( $args[ 'showsplitview' ] ) && 'true' == $args[ 'showsplitview' ] ) { 
     1726                $r .= "<col class='ltype' /><col class='content diffsplit' /><col class='ltype' /><col class='content diffsplit' />"; 
     1727        } else { 
     1728                $r .= "<col class='ltype' /><col class='content' />"; 
     1729        } 
    17261730 
    17271731        if ( $args['title'] || $args['title_left'] || $args['title_right'] ) 
    17281732                $r .= "<thead>"; 
  • wp-includes/script-loader.php

    diff --git wp-includes/script-loader.php wp-includes/script-loader.php
    index 139cd95..4eedc21 100644
    function wp_default_scripts( &$scripts ) { 
    270270        $scripts->add( 'json2', "/wp-includes/js/json2$suffix.js", array(), '2011-02-23'); 
    271271 
    272272        $scripts->add( 'underscore', '/wp-includes/js/underscore.min.js', array(), '1.4.4', 1 ); 
    273         $scripts->add( 'backbone', '/wp-includes/js/backbone.min.js', array('underscore','jquery'), '0.9.2', 1 ); 
     273        $scripts->add( 'template', "/wp-includes/js/template$suffix.js", array('underscore'), '1.4.4', 1 ); 
     274        $scripts->add( 'backbone', '/wp-includes/js/backbone.min.js', array('underscore','jquery', 'template'), '0.9.2', 1 ); 
     275 
     276        $scripts->add( 'revisions', "/wp-includes/js/revisions.js", array ('backbone'), '', 1 ); 
    274277 
    275278        $scripts->add( 'imgareaselect', "/wp-includes/js/imgareaselect/jquery.imgareaselect$suffix.js", array('jquery'), '0.9.8', 1 ); 
    276279 
    function wp_default_styles( &$styles ) { 
    535538        $styles->add( 'customize-controls', "/wp-admin/css/customize-controls$suffix.css", array( 'wp-admin', 'colors', 'ie' ) ); 
    536539        $styles->add( 'media-views', "/wp-includes/css/media-views$suffix.css", array( 'buttons' ) ); 
    537540        $styles->add( 'buttons', "/wp-includes/css/buttons$suffix.css" ); 
     541        $styles->add( 'revisions', "/wp-admin/css/revisions$suffix.css" ); 
     542        $styles->add( 'wp-jquery-ui-slider', "/wp-includes/css/jquery-ui-slider$suffix.css" ); 
    538543 
    539544        foreach ( $rtl_styles as $rtl_style ) { 
    540545                $styles->add_data( $rtl_style, 'rtl', true ); 
  • wp-includes/wp-diff.php

    diff --git wp-includes/wp-diff.php wp-includes/wp-diff.php
    index 65dd007..cfeb69a 100644
    class WP_Text_Diff_Renderer_Table extends Text_Diff_Renderer { 
    5959         */ 
    6060        var $inline_diff_renderer = 'WP_Text_Diff_Renderer_inline'; 
    6161 
     62        var $_showsplitview = false; 
     63 
    6264        /** 
    6365         * Constructor - Call parent constructor with params array. 
    6466         * 
    class WP_Text_Diff_Renderer_Table extends Text_Diff_Renderer { 
    7072         */ 
    7173        function __construct( $params = array() ) { 
    7274                parent::__construct( $params ); 
     75                if ( isset( $params[ 'showsplitview' ] ) ) 
     76                        $this -> _showsplitview = $params[ 'showsplitview' ]; 
    7377        } 
    7478 
    7579        /** 
    class WP_Text_Diff_Renderer_Table extends Text_Diff_Renderer { 
    98102         * @return string 
    99103         */ 
    100104        function addedLine( $line ) { 
    101                 return "<td>+</td><td class='diff-addedline'>{$line}</td>"; 
     105                return "<td class='diff-addedline-symbol'>+</td><td class='diff-addedline'>{$line}</td>"; 
    102106        } 
    103107 
    104108        /** 
    class WP_Text_Diff_Renderer_Table extends Text_Diff_Renderer { 
    108112         * @return string 
    109113         */ 
    110114        function deletedLine( $line ) { 
    111                 return "<td>-</td><td class='diff-deletedline'>{$line}</td>"; 
     115                return "<td class='diff-deletedline-symbol'>-</td><td class='diff-deletedline'>{$line}</td>"; 
    112116        } 
    113117 
    114118        /** 
    class WP_Text_Diff_Renderer_Table extends Text_Diff_Renderer { 
    118122         * @return string 
    119123         */ 
    120124        function contextLine( $line ) { 
    121                 return "<td> </td><td class='diff-context'>{$line}</td>"; 
     125                return "<td class='diff-context-symbol'>=</td><td class='diff-context'>{$line}</td>"; 
    122126        } 
    123127 
    124128        /** 
    class WP_Text_Diff_Renderer_Table extends Text_Diff_Renderer { 
    142146                $r = ''; 
    143147                foreach ($lines as $line) { 
    144148                        if ( $encode ) 
    145                                 $line = htmlspecialchars( $line ); 
    146                         $r .= '<tr>' . $this->emptyLine() . $this->addedLine( $line ) . "</tr>\n"; 
     149                                $line = wp_kses_post( $line ); 
     150                        if ( ! $this->_showsplitview ) { 
     151                                $r .= '<tr>' . $this->addedLine( $line ) . "</tr>\n"; 
     152                        } else { 
     153                                $r .= '<tr>' . $this->emptyLine() . $this->addedLine( $line ) . "</tr>\n"; 
     154                        } 
    147155                } 
    148156                return $r; 
    149157        } 
    class WP_Text_Diff_Renderer_Table extends Text_Diff_Renderer { 
    160168                $r = ''; 
    161169                foreach ($lines as $line) { 
    162170                        if ( $encode ) 
    163                                 $line = htmlspecialchars( $line ); 
    164                         $r .= '<tr>' . $this->deletedLine( $line ) . $this->emptyLine() . "</tr>\n"; 
     171                                $line = wp_kses_post( $line ); 
     172                        if ( ! $this->_showsplitview ) { 
     173                                $r .= '<tr>' . $this->deletedLine( $line ) . "</tr>\n"; 
     174                        } else { 
     175                                $r .= '<tr>' . $this->deletedLine( $line ) . $this->emptyLine() . "</tr>\n"; 
     176                        } 
     177 
    165178                } 
    166179                return $r; 
    167180        } 
    class WP_Text_Diff_Renderer_Table extends Text_Diff_Renderer { 
    178191                $r = ''; 
    179192                foreach ($lines as $line) { 
    180193                        if ( $encode ) 
    181                                 $line = htmlspecialchars( $line ); 
    182                         $r .= '<tr>' . 
    183                                 $this->contextLine( $line ) . $this->contextLine( $line ) . "</tr>\n"; 
     194                                $line = wp_kses_post( $line ); 
     195                        if (  ! $this->_showsplitview ) { 
     196                                $r .= '<tr>' . $this->contextLine( $line ) . "</tr>\n"; 
     197                        } else { 
     198                                $r .= '<tr>' . $this->contextLine( $line ) . $this->contextLine( $line ) . "</tr>\n"; 
     199                        } 
    184200                } 
    185201                return $r; 
    186202        } 
    class WP_Text_Diff_Renderer_Table extends Text_Diff_Renderer { 
    264280                        } elseif ( $final_rows[$row] < 0 ) { // Final is blank. This is really a deleted row. 
    265281                                $r .= $this->_deleted( array($orig_line), false ); 
    266282                        } else { // A true changed row. 
    267                                 $r .= '<tr>' . $this->deletedLine( $orig_line ) . $this->addedLine( $final_line ) . "</tr>\n"; 
     283                                $r .= '<tr>' . $this->deletedLine( $orig_line ) . "</tr><tr>" . $this->addedLine( $final_line ) . "</tr>\n"; 
    268284                        } 
    269285                } 
    270286