WordPress.org

Plugin Directory

Changeset 634121


Ignore:
Timestamp:
12/04/12 18:21:05 (17 months ago)
Author:
cfinke
Message:

Custom CSS: Code reorganization and cleanup.

Most of the functions for custom CSS have been moved out of the global namespace and into Jetpack_Custom_CSS, and because of this, the following functions are now deprecated:

migrate()
safecss_revision_redirect()
safecss_revision_post_link()
get_safecss_post()
custom_css_post_id()
get_current_revision()
save_revision()
safecss_skip_stylesheet()
safecss_init()
safecss_is_preview()
safecss_is_freetrial()
safecss()
safecss_print()
safecss_style()
safecss_style_filter()
safecss_buffer()
safecss_preview_links()
safecss_preview_flag()
safecss_menu()
update_title()
safecss_prettify_post_revisions()
safecss_remove_title_excerpt_from_revisions()
safecss_post_title()
safe_css_enqueue_scripts()
safecss_admin_head()
safecss_saved()
safecss_admin()
custom_css_meta_box()
custom_css_post_revisions_meta_box()
disable_safecss_style()
custom_css_reset()
custom_css_is_customizer_preview()
custom_css_minify()
custom_css_restore_revision()

These functions will be removed in a later version of Jetpack, so if your plugin code relies on them, make the necessary changes now.

Location:
jetpack/trunk/modules/custom-css
Files:
1 added
2 edited

Legend:

Unmodified
Added
Removed
  • jetpack/trunk/modules/custom-css/custom-css.php

    r631023 r634121  
    11<?php 
    22 
    3 /** 
    4  * Migration routine for moving safecss from wp_options to wp_posts to support revisions 
    5  * 
    6  * @return void 
    7  */ 
    8 function migrate() { 
    9     $css = get_option( 'safecss' ); 
    10  
    11     // Check if CSS is stored in wp_options 
    12     if ( $css ) { 
    13         // Remove the async actions from publish_post 
    14         remove_action( 'publish_post', 'queue_publish_post' ); 
    15  
    16         $post = array(); 
    17         $post['post_content'] = $css; 
    18         $post['post_title'] = 'safecss'; 
    19         $post['post_status'] = 'publish'; 
    20         $post['post_type'] = 'safecss'; 
    21  
    22         // Insert the CSS into wp_posts 
    23         $post_id = wp_insert_post( $post ); 
    24         // Check for errors 
    25         if ( !$post_id or is_wp_error( $post_id ) ) 
    26             die( $post_id->get_error_message() ); 
    27  
    28         // Delete safecss option 
    29         delete_option( 'safecss' ); 
    30     } 
    31  
    32     unset( $css ); 
    33  
    34     // Check if we have already done this 
    35     if ( !get_option( 'safecss_revision_migrated' ) ) { 
    36         define( 'DOING_MIGRATE', true ); 
    37  
    38         // Get hashes of safecss post and current revision 
    39         $safecss_post = get_safecss_post(); 
    40         if ( empty( $safecss_post ) ) 
     3class Jetpack_Custom_CSS { 
     4    static function init() { 
     5        add_action( 'switch_theme', array( __CLASS__, 'reset' ) ); 
     6        add_action( 'wp_restore_post_revision', array( __CLASS__, 'restore_revision' ), 10, 2 ); 
     7 
     8        // Save revisions for posts of type safecss. 
     9        add_filter( 'revision_redirect', array( __CLASS__, 'revision_redirect' ) ); 
     10 
     11        // Override the edit link, the default link causes a redirect loop 
     12        add_filter( 'get_edit_post_link', array( __CLASS__, 'revision_post_link' ), 10, 3 ); 
     13 
     14        if ( ! is_admin() ) 
     15            add_filter( 'stylesheet_uri', array( __CLASS__, 'style_filter' ) ); 
     16 
     17        define( 'SAFECSS_USE_ACE', ! jetpack_is_mobile() && ! Jetpack_User_Agent_Info::is_ipad() && apply_filters( 'safecss_use_ace', true ) ); 
     18 
     19        // Register safecss as a custom post_type 
     20        // Explicit capability definitions are largely unnecessary because the posts are manipulated in code via an options page, managing CSS revisions does check the capabilities, so let's ensure that the proper caps are checked. 
     21        register_post_type( 'safecss', array( 
     22    //      These are the defaults 
     23    //      'exclude_from_search' => true, 
     24    //      'public' => false, 
     25    //      'publicly_queryable' => false, 
     26    //      'show_ui' => false, 
     27            'supports' => array( 'revisions' ), 
     28            'label' => 'Custom CSS', 
     29            'can_export' => false, 
     30            'rewrite' => false, 
     31            'capabilities' => array( 
     32                'edit_post' => 'edit_theme_options', 
     33                'read_post' => 'read', 
     34                'delete_post' => 'edit_theme_options', 
     35                'edit_posts' => 'edit_theme_options', 
     36                'edit_others_posts' => 'edit_theme_options', 
     37                'publish_posts' => 'edit_theme_options', 
     38                'read_private_posts' => 'read' 
     39            ) 
     40        ) ); 
     41 
     42        // Short-circuit WP if this is a CSS stylesheet request 
     43        if ( isset( $_GET['custom-css'] ) ) { 
     44            header( 'Content-Type: text/css', true, 200 ); 
     45            header( 'Expires: ' . gmdate( 'D, d M Y H:i:s', time() + 31536000) . ' GMT' ); // 1 year 
     46            Jetpack_Custom_CSS::print_css(); 
     47            exit; 
     48        } 
     49 
     50        if ( isset( $_GET['page'] ) && 'editcss' == $_GET['page'] && is_admin() ) { 
     51            // Do migration routine if necessary 
     52            Jetpack_Custom_CSS::upgrade(); 
     53 
     54            do_action( 'safecss_migrate_post' ); 
     55        } 
     56 
     57        add_action( 'wp_head', array( 'Jetpack_Custom_CSS', 'link_tag' ), 101 ); 
     58 
     59        if ( !current_user_can( 'switch_themes' ) && !is_super_admin() ) 
    4160            return; 
    42         $safecss_post_hash = md5( $safecss_post['post_content'] ); 
    43         $current_revision = get_current_revision(); 
    44         if ( null == $current_revision ) 
    45             return; 
    46         $current_revision_hash = md5( $current_revision['post_content'] ); 
    47  
    48         // If hashes are not equal, set safecss post with content from current revision 
    49         if ( $safecss_post_hash !== $current_revision_hash ) { 
    50             save_revision( $current_revision['post_content'] ); 
    51             // Reset post_content to display the migrated revsion 
    52             $safecss_post['post_content'] = $current_revision['post_content']; 
    53         } 
    54  
    55         // Set option so that we dont keep doing this 
    56         update_option( 'safecss_revision_migrated', time() ); 
    57     } 
    58  
    59     $newest_safecss_post = get_current_revision(); 
    60  
    61     if ( $newest_safecss_post ) { 
    62         if ( get_option( 'safecss_content_width' ) ) { 
    63             // Add the meta to the post and the latest revision. 
    64             update_post_meta( $newest_safecss_post['ID'], 'content_width', get_option( 'safecss_content_width' ) ); 
    65             update_metadata( 'post', $newest_safecss_post['ID'], 'content_width', get_option( 'safecss_content_width' ) ); 
    66  
    67             delete_option( 'safecss_content_width' ); 
    68         } 
    69  
    70         if ( get_option( 'safecss_add' ) ) { 
    71             update_post_meta( $newest_safecss_post['ID'], 'custom_css_add', get_option( 'safecss_add' ) ); 
    72             update_metadata( 'post', $newest_safecss_post['ID'], 'custom_css_add', get_option( 'safecss_add' ) ); 
    73  
    74             delete_option( 'safecss_add' ); 
    75         } 
    76     } 
    77 } 
    78  
    79 function safecss_revision_redirect( $redirect ) { 
    80     global $post; 
    81  
    82     if ( 'safecss' == $post->post_type ) { 
    83         if ( strstr( $redirect, 'action=edit' ) ) { 
    84             return 'themes.php?page=editcss'; 
    85         } 
    86  
    87         if ( 'edit.php' == $redirect ) { 
    88             return ''; 
    89         } 
    90     } 
    91  
    92     return $redirect; 
    93 } 
    94  
    95 // Add safecss to allowed post_type's for revision 
    96 add_filter('revision_redirect', 'safecss_revision_redirect'); 
    97  
    98 function safecss_revision_post_link( $post_link, $post_id, $context ) { 
    99     if ( !$post_id = (int) $post_id ) { 
    100         return $post_link; 
    101     } 
    102  
    103     if ( !$post = get_post( $post_id ) ) { 
    104         return $post_link; 
    105     } 
    106  
    107     if ( 'safecss' != $post->post_type ) { 
    108         return $post_link; 
    109     } 
    110  
    111     $post_link = admin_url( 'themes.php?page=editcss' ); 
    112  
    113     if ( 'display' == $context ) { 
    114         return esc_url( $post_link ); 
    115     } 
    116  
    117     return esc_url_raw( $post_link ); 
    118 } 
    119  
    120 // Override the edit link, the default link causes a redirect loop 
    121 add_filter( 'get_edit_post_link', 'safecss_revision_post_link', 10, 3 ); 
    122  
    123 /** 
    124  * Get the published custom CSS post. 
    125  * 
    126  * @return array 
    127  */ 
    128 function get_safecss_post() { 
    129     $custom_css_post_id = custom_css_post_id(); 
    130  
    131     if ( $custom_css_post_id ) 
    132         return get_post( $custom_css_post_id, ARRAY_A ); 
    133  
    134     return array(); 
    135 } 
    136  
    137 /** 
    138  * Get the post ID of the published custom CSS post. 
    139  * 
    140  * @return int|bool The post ID if it exists; false otherwise. 
    141  */ 
    142 function custom_css_post_id() { 
    143     $custom_css_post_id = wp_cache_get( 'custom_css_post_id' ); 
    144  
    145     if ( false === $custom_css_post_id ) { 
    146         $custom_css_post = array_shift( get_posts( array( 
    147             'posts_per_page' => 1, 
    148             'post_type' => 'safecss', 
    149             'post_status' => 'publish', 
    150             'orderby' => 'date', 
    151             'order' => 'DESC' 
    152         ) ) ); 
    153  
    154         if ( $custom_css_post ) 
    155             $custom_css_post_id = $custom_css_post->ID; 
    156         else 
    157             $custom_css_post_id = 0; 
    158  
    159         // Save post_id=0 to note that no safecss post exists. 
    160         wp_cache_set( 'custom_css_post_id', $custom_css_post_id ); 
    161     } 
    162  
    163     if ( ! $custom_css_post_id ) 
    164         return false; 
    165  
    166     return $custom_css_post_id; 
    167 } 
    168  
    169 /** 
    170  * Get the current revision of the original safecss record 
    171  * 
    172  * @return object 
    173  */ 
    174 function get_current_revision() { 
    175     $safecss_post = get_safecss_post(); 
    176  
    177     if ( empty( $safecss_post ) ) { 
    178         return false; 
    179     } 
    180  
    181     $revisions = wp_get_post_revisions( $safecss_post['ID'], array( 'posts_per_page' => 1, 'orderby' => 'date', 'order' => 'DESC' ) ); 
    182  
    183     // Empty array if no revisions exist 
    184     if ( empty( $revisions ) ) { 
    185         // Return original post 
    186         return $safecss_post; 
    187     } else { 
    188         // Return the first entry in $revisions, this will be the current revision 
    189         $current_revision = get_object_vars( array_shift( $revisions ) ); 
    190         return $current_revision; 
    191     } 
    192 } 
    193  
    194 /** 
    195  * Save new revision of CSS 
    196  * Checks to see if content was modified before really saving 
    197  * 
    198  * @param string $css 
    199  * @param bool $is_preview 
    200  * @return bool|int If nothing was saved, returns false. If a post 
    201  *                  or revision was saved, returns the post ID. 
    202  */ 
    203 function save_revision( $css, $is_preview = false, $preprocessor = '' ) { 
    204     $safecss_post = get_safecss_post(); 
    205  
    206     $compressed_css = custom_css_minify( $css, $preprocessor ); 
    207  
    208     // If null, there was no original safecss record, so create one 
    209     if ( null == $safecss_post ) { 
    210         if ( ! $css ) 
     61 
     62        add_action( 'admin_menu', array( 'Jetpack_Custom_CSS', 'menu' ) ); 
     63 
     64        if ( isset( $_POST['safecss'] ) && false == strstr( $_SERVER[ 'REQUEST_URI' ], 'options.php' ) ) { 
     65            check_admin_referer( 'safecss' ); 
     66 
     67            // Remove wp_filter_post_kses, this causes CSS escaping issues 
     68            remove_filter( 'content_save_pre', 'wp_filter_post_kses' ); 
     69            remove_filter( 'content_filtered_save_pre', 'wp_filter_post_kses' ); 
     70            remove_all_filters( 'content_save_pre' ); 
     71 
     72            do_action( 'safecss_save_pre' ); 
     73 
     74            $warnings = array(); 
     75 
     76            safecss_class(); 
     77            $csstidy = new csstidy(); 
     78            $csstidy->optimise = new safecss( $csstidy ); 
     79 
     80            $csstidy->set_cfg( 'remove_bslash',              false ); 
     81            $csstidy->set_cfg( 'compress_colors',            false ); 
     82            $csstidy->set_cfg( 'compress_font-weight',       false ); 
     83            $csstidy->set_cfg( 'optimise_shorthands',        0 ); 
     84            $csstidy->set_cfg( 'remove_last_;',              false ); 
     85            $csstidy->set_cfg( 'case_properties',            false ); 
     86            $csstidy->set_cfg( 'discard_invalid_properties', true ); 
     87            $csstidy->set_cfg( 'css_level',                  'CSS3.0' ); 
     88            $csstidy->set_cfg( 'preserve_css',               true ); 
     89            $csstidy->set_cfg( 'template',                   dirname( __FILE__ ) . '/csstidy/wordpress-standard.tpl' ); 
     90 
     91            $css = $orig = stripslashes( $_POST['safecss'] ); 
     92 
     93            $css = preg_replace( '/\\\\([0-9a-fA-F]{4})/', '\\\\\\\\$1', $prev = $css ); 
     94 
     95            if ( $css != $prev ) 
     96                $warnings[] = 'preg_replace found stuff'; 
     97 
     98            // Some people put weird stuff in their CSS, KSES tends to be greedy 
     99            $css = str_replace( '<=', '&lt;=', $css ); 
     100            // Why KSES instead of strip_tags?  Who knows? 
     101            $css = wp_kses_split( $prev = $css, array(), array() ); 
     102            $css = str_replace( '&gt;', '>', $css ); // kses replaces lone '>' with &gt; 
     103            // Why both KSES and strip_tags?  Because we just added some '>'. 
     104            $css = strip_tags( $css ); 
     105 
     106            if ( $css != $prev ) 
     107                $warnings[] = 'kses found stuff'; 
     108 
     109            // if we're not using a preprocessor 
     110            if ( ! isset( $_POST['custom_css_preprocessor'] ) || empty( $_POST['custom_css_preprocessor'] ) ) { 
     111                do_action( 'safecss_parse_pre', $csstidy, $css ); 
     112 
     113                $csstidy->parse( $css ); 
     114 
     115                do_action( 'safecss_parse_post', $csstidy, $warnings ); 
     116 
     117                $css = $csstidy->print->plain(); 
     118            } 
     119 
     120            if ( isset( $_POST['custom_content_width'] ) && intval( $_POST['custom_content_width'] ) > 0 ) 
     121                $custom_content_width = intval( $_POST['custom_content_width'] ); 
     122            else 
     123                $custom_content_width = false; 
     124 
     125            if ( $_POST['add_to_existing'] == 'true' ) 
     126                $add_to_existing = 'yes'; 
     127            else 
     128                $add_to_existing = 'no'; 
     129 
     130            $preprocessor = isset( $_POST['custom_css_preprocessor'] ) ? $_POST['custom_css_preprocessor'] : ''; 
     131 
     132            if ( $_POST['action'] == 'preview' || Jetpack_Custom_CSS::is_freetrial() ) { 
     133                // Save the CSS 
     134                $safecss_revision_id = Jetpack_Custom_CSS::save_revision( $css, true, $preprocessor ); 
     135 
     136                // Cache Buster 
     137                update_option( 'safecss_preview_rev', intval( get_option( 'safecss_preview_rev' ) ) + 1); 
     138 
     139                update_metadata( 'post', $safecss_revision_id, 'custom_css_add', $add_to_existing ); 
     140                update_metadata( 'post', $safecss_revision_id, 'content_width', $custom_content_width ); 
     141                update_metadata( 'post', $safecss_revision_id, 'custom_css_preprocessor', $preprocessor ); 
     142 
     143                if ( $_POST['action'] == 'preview' ) { 
     144                    wp_safe_redirect( add_query_arg( 'csspreview', 'true', get_option( 'home' ) ) ); 
     145                    exit; 
     146                } 
     147 
     148                do_action( 'safecss_save_preview_post' ); 
     149            } 
     150 
     151            // Save the CSS 
     152            $safecss_post_id = Jetpack_Custom_CSS::save_revision( $css, false, $preprocessor ); 
     153 
     154            $safecss_post_revision = Jetpack_Custom_CSS::get_current_revision(); 
     155 
     156            update_option( 'safecss_rev', intval( get_option( 'safecss_rev' ) ) + 1 ); 
     157 
     158            update_post_meta( $safecss_post_id, 'custom_css_add', $add_to_existing ); 
     159            update_post_meta( $safecss_post_id, 'content_width', $custom_content_width ); 
     160            update_post_meta( $safecss_post_id, 'custom_css_preprocessor', $preprocessor ); 
     161            update_metadata( 'post', $safecss_post_revision['ID'], 'custom_css_add', $add_to_existing ); 
     162            update_metadata( 'post', $safecss_post_revision['ID'], 'content_width', $custom_content_width ); 
     163            update_metadata( 'post', $safecss_post_revision['ID'], 'custom_css_preprocessor', $preprocessor ); 
     164 
     165            add_action( 'admin_notices', array( 'Jetpack_Custom_CSS', 'saved_message' ) ); 
     166        } 
     167 
     168        // Modify all internal links so that preview state persists 
     169        if ( Jetpack_Custom_CSS::is_preview() ) 
     170            ob_start( array( 'Jetpack_Custom_CSS', 'buffer' ) ); 
     171    } 
     172 
     173    /** 
     174     * Get the published custom CSS post. 
     175     * 
     176     * @return array 
     177     */ 
     178    static function get_post() { 
     179        $custom_css_post_id = Jetpack_Custom_CSS::post_id(); 
     180 
     181        if ( $custom_css_post_id ) 
     182            return get_post( $custom_css_post_id, ARRAY_A ); 
     183 
     184        return array(); 
     185    } 
     186 
     187    /** 
     188     * Get the post ID of the published custom CSS post. 
     189     * 
     190     * @return int|bool The post ID if it exists; false otherwise. 
     191     */ 
     192    static function post_id() { 
     193        $custom_css_post_id = wp_cache_get( 'custom_css_post_id' ); 
     194 
     195        if ( 1 || false === $custom_css_post_id ) { 
     196            $custom_css_post = array_shift( get_posts( array( 
     197                'posts_per_page' => 1, 
     198                'post_type' => 'safecss', 
     199                'post_status' => 'publish', 
     200                'orderby' => 'date', 
     201                'order' => 'DESC' 
     202            ) ) ); 
     203 
     204            if ( $custom_css_post ) 
     205                $custom_css_post_id = $custom_css_post->ID; 
     206            else 
     207                $custom_css_post_id = 0; 
     208 
     209            // Save post_id=0 to note that no safecss post exists. 
     210            wp_cache_set( 'custom_css_post_id', $custom_css_post_id ); 
     211        } 
     212 
     213        if ( ! $custom_css_post_id ) 
    211214            return false; 
    212215 
    213         $post = array(); 
    214         $post['post_content'] = $css; 
    215         $post['post_title'] = 'safecss'; 
    216         $post['post_status'] = 'publish'; 
    217         $post['post_type'] = 'safecss'; 
    218         $post['post_content_filtered'] = $compressed_css; 
     216        return $custom_css_post_id; 
     217    } 
     218 
     219    /** 
     220     * Get the current revision of the original safecss record 
     221     * 
     222     * @return object 
     223     */ 
     224    static function get_current_revision() { 
     225        $safecss_post = Jetpack_Custom_CSS::get_post(); 
     226 
     227        if ( empty( $safecss_post ) ) { 
     228            return false; 
     229        } 
     230 
     231        $revisions = wp_get_post_revisions( $safecss_post['ID'], array( 'posts_per_page' => 1, 'orderby' => 'date', 'order' => 'DESC' ) ); 
     232 
     233        // Empty array if no revisions exist 
     234        if ( empty( $revisions ) ) { 
     235            // Return original post 
     236            return $safecss_post; 
     237        } else { 
     238            // Return the first entry in $revisions, this will be the current revision 
     239            $current_revision = get_object_vars( array_shift( $revisions ) ); 
     240            return $current_revision; 
     241        } 
     242    } 
     243 
     244    /** 
     245     * Save new revision of CSS 
     246     * Checks to see if content was modified before really saving 
     247     * 
     248     * @param string $css 
     249     * @param bool $is_preview 
     250     * @return bool|int If nothing was saved, returns false. If a post 
     251     *                  or revision was saved, returns the post ID. 
     252     */ 
     253    static function save_revision( $css, $is_preview = false, $preprocessor = '' ) { 
     254        $safecss_post = Jetpack_Custom_CSS::get_post(); 
     255 
     256        $compressed_css = Jetpack_Custom_CSS::minify( $css, $preprocessor ); 
     257 
     258        // If null, there was no original safecss record, so create one 
     259        if ( null == $safecss_post ) { 
     260            if ( ! $css ) 
     261                return false; 
     262 
     263            $post = array(); 
     264            $post['post_content'] = $css; 
     265            $post['post_title'] = 'safecss'; 
     266            $post['post_status'] = 'publish'; 
     267            $post['post_type'] = 'safecss'; 
     268            $post['post_content_filtered'] = $compressed_css; 
     269 
     270            // Set excerpt to current theme, for display in revisions list 
     271            if ( function_exists( 'wp_get_theme' ) ) { 
     272                $current_theme = wp_get_theme(); 
     273                $post['post_excerpt'] = $current_theme->Name; 
     274            } 
     275            else { 
     276                $post['post_excerpt'] = get_current_theme(); 
     277            } 
     278 
     279            // Insert the CSS into wp_posts 
     280            $post_id = wp_insert_post( $post ); 
     281            wp_cache_set( 'custom_css_post_id', $post_id ); 
     282            return $post_id; 
     283        } 
     284 
     285        // Update CSS in post array with new value passed to this function 
     286        $safecss_post['post_content'] = $css; 
     287        $safecss_post['post_content_filtered'] = $compressed_css; 
    219288 
    220289        // Set excerpt to current theme, for display in revisions list 
    221290        if ( function_exists( 'wp_get_theme' ) ) { 
    222291            $current_theme = wp_get_theme(); 
    223             $post['post_excerpt'] = $current_theme->Name; 
     292            $safecss_post['post_excerpt'] = $current_theme->Name; 
    224293        } 
    225294        else { 
    226             $post['post_excerpt'] = get_current_theme(); 
    227         } 
    228  
    229         // Insert the CSS into wp_posts 
    230         $post_id = wp_insert_post( $post ); 
    231         wp_cache_set( 'custom_css_post_id', $post_id ); 
    232         return $post_id; 
    233     } 
    234  
    235     // Update CSS in post array with new value passed to this function 
    236     $safecss_post['post_content'] = $css; 
    237     $safecss_post['post_content_filtered'] = $compressed_css; 
    238  
    239     // Set excerpt to current theme, for display in revisions list 
    240     if ( function_exists( 'wp_get_theme' ) ) { 
    241         $current_theme = wp_get_theme(); 
    242         $safecss_post['post_excerpt'] = $current_theme->Name; 
    243     } 
    244     else { 
    245         $safecss_post['post_excerpt'] = get_current_theme(); 
    246     } 
    247  
    248     // Don't carry over last revision's timestamps, otherwise revisions all have matching timestamps 
    249     unset( $safecss_post['post_date'] ); 
    250     unset( $safecss_post['post_date_gmt'] ); 
    251     unset( $safecss_post['post_modified'] ); 
    252     unset( $safecss_post['post_modified_gmt'] ); 
    253  
    254     // Do not update post if we are only saving a preview 
    255     if ( false === $is_preview ) { 
    256         $post_id = wp_update_post( $safecss_post ); 
    257         wp_cache_set( 'custom_css_post_id', $post_id ); 
    258         return $post_id; 
    259     } 
    260     else if ( !defined( 'DOING_MIGRATE' ) ) { 
    261         return _wp_put_post_revision( $safecss_post ); 
    262     } 
    263 } 
    264  
    265 function safecss_skip_stylesheet() { 
    266     if ( custom_css_is_customizer_preview() ) 
     295            $safecss_post['post_excerpt'] = get_current_theme(); 
     296        } 
     297 
     298        // Don't carry over last revision's timestamps, otherwise revisions all have matching timestamps 
     299        unset( $safecss_post['post_date'] ); 
     300        unset( $safecss_post['post_date_gmt'] ); 
     301        unset( $safecss_post['post_modified'] ); 
     302        unset( $safecss_post['post_modified_gmt'] ); 
     303 
     304        // Do not update post if we are only saving a preview 
     305        if ( false === $is_preview ) { 
     306            $post_id = wp_update_post( $safecss_post ); 
     307            wp_cache_set( 'custom_css_post_id', $post_id ); 
     308            return $post_id; 
     309        } 
     310        else if ( ! defined( 'DOING_MIGRATE' ) ) { 
     311            return _wp_put_post_revision( $safecss_post ); 
     312        } 
     313    } 
     314 
     315    static function skip_stylesheet() { 
     316        if ( Jetpack_Custom_CSS::is_customizer_preview() ) { 
     317            return false; 
     318        } 
     319        else { 
     320            if ( Jetpack_Custom_CSS::is_preview() ) { 
     321                $safecss_post = Jetpack_Custom_CSS::get_current_revision(); 
     322 
     323                return (bool) ( get_option( 'safecss_preview_add' ) == 'no' || get_post_meta( $safecss_post['ID'], 'custom_css_add', true ) == 'no' ); 
     324            } 
     325            else { 
     326                $custom_css_post_id = Jetpack_Custom_CSS::post_id(); 
     327 
     328                return (bool) ( get_option( 'safecss_add' ) == 'no' || ( $custom_css_post_id && get_post_meta( $custom_css_post_id, 'custom_css_add', true ) == 'no' ) ); 
     329            } 
     330        } 
     331    } 
     332 
     333    static function is_preview() { 
     334        return isset( $_GET['csspreview'] ) && $_GET['csspreview'] === 'true'; 
     335    } 
     336 
     337    /* 
     338     * False when the site has the Custom Design upgrade. 
     339     * Used only on WordPress.com. 
     340     */ 
     341    static function is_freetrial() { 
     342        return apply_filters( 'safecss_is_freetrial', false ); 
     343    } 
     344 
     345    static function get_css( $compressed = false ) { 
     346        $default_css = apply_filters( 'safecss_get_css_error', false ); 
     347 
     348        if ( $default_css !== false ) 
     349            return $default_css; 
     350 
     351        $option = ( Jetpack_Custom_CSS::is_preview() || Jetpack_Custom_CSS::is_freetrial() ) ? 'safecss_preview' : 'safecss'; 
     352 
     353        if ( 'safecss' == $option ) { 
     354            if ( get_option( 'safecss_revision_migrated' ) ) { 
     355                $safecss_post = Jetpack_Custom_CSS::get_post(); 
     356                $css = ( $compressed && $safecss_post['post_content_filtered'] ) ? $safecss_post['post_content_filtered'] : $safecss_post['post_content']; 
     357            } else { 
     358                $current_revision = Jetpack_Custom_CSS::get_current_revision(); 
     359                if ( false === $current_revision ) { 
     360                    $css = ''; 
     361                } else { 
     362                    $css = ( $compressed && $current_revision['post_content_filtered'] ) ? $current_revision['post_content_filtered'] : $current_revision['post_content']; 
     363                } 
     364            } 
     365 
     366            // Fix for un-migrated Custom CSS 
     367            if ( empty( $safecss_post ) ) { 
     368                $_css = get_option( 'safecss' ); 
     369                if ( !empty( $_css ) ) { 
     370                    $css = $_css; 
     371                } 
     372            } 
     373        } 
     374        else if ( 'safecss_preview' == $option ) { 
     375            $safecss_post = Jetpack_Custom_CSS::get_current_revision(); 
     376            $css = $safecss_post['post_content']; 
     377            $css = stripslashes( $css ); 
     378            $css = Jetpack_Custom_CSS::minify( $css, get_post_meta( $safecss_post['ID'], 'custom_css_preprocessor', true ) ); 
     379        } 
     380 
     381        $css = str_replace( array( '\\\00BB \\\0020', '\0BB \020', '0BB 020' ), '\00BB \0020', $css ); 
     382 
     383        if ( empty( $css ) ) { 
     384            $css = "/*\n" 
     385                . wordwrap( 
     386                    apply_filters( 
     387                        'safecss_default_css', 
     388                        __( 
     389                            "Welcome to Custom CSS!\n\nCSS (Cascading Style Sheets) is a kind of code that tells the browser how to render a web page. You may delete these comments and get started with your customizations.\n\nBy default, your stylesheet will be loaded after the theme stylesheets, which means that your rules can take precedence and override the theme CSS rules. Just write here what you want to change, you don't need to copy all your theme's stylesheet content.", 
     390                            'jetpack' 
     391                        ) 
     392                    ) 
     393                ) 
     394                . "\n*/"; 
     395        } 
     396 
     397        $css = apply_filters( 'safecss_css', $css ); 
     398 
     399        return $css; 
     400    } 
     401 
     402    static function print_css() { 
     403        do_action( 'safecss_print_pre' ); 
     404 
     405        echo Jetpack_Custom_CSS::get_css( true ); 
     406    } 
     407 
     408    static function link_tag() { 
     409        global $blog_id, $current_blog; 
     410 
     411        if ( apply_filters( 'safecss_style_error', false ) ) 
     412            return; 
     413 
     414        if ( ! is_super_admin() && isset( $current_blog ) && ( 1 == $current_blog->spam || 1 == $current_blog->deleted ) ) 
     415            return; 
     416 
     417        if ( Jetpack_Custom_CSS::is_customizer_preview() ) 
     418            return; 
     419 
     420        $css    = ''; 
     421        $option = Jetpack_Custom_CSS::is_preview() ? 'safecss_preview' : 'safecss'; 
     422 
     423        if ( 'safecss' == $option ) { 
     424            if ( get_option( 'safecss_revision_migrated' ) ) { 
     425                $safecss_post = Jetpack_Custom_CSS::get_post(); 
     426 
     427                if ( ! empty( $safecss_post['post_content'] ) ) { 
     428                    $css = $safecss_post['post_content']; 
     429                } 
     430            } else { 
     431                $current_revision = Jetpack_Custom_CSS::get_current_revision(); 
     432 
     433                if ( ! empty( $current_revision['post_content'] ) ) { 
     434                    $css = $current_revision['post_content']; 
     435                } 
     436            } 
     437 
     438            // Fix for un-migrated Custom CSS 
     439            if ( empty( $safecss_post ) ) { 
     440                $_css = get_option( 'safecss' ); 
     441                if ( !empty( $_css ) ) { 
     442                    $css = $_css; 
     443                } 
     444            } 
     445        } 
     446 
     447        if ( 'safecss_preview' == $option ) { 
     448            $safecss_post = Jetpack_Custom_CSS::get_current_revision(); 
     449 
     450            if ( !empty( $safecss_post['post_content'] ) ) { 
     451                $css = $safecss_post['post_content']; 
     452            } 
     453        } 
     454 
     455        $css = str_replace( array( '\\\00BB \\\0020', '\0BB \020', '0BB 020' ), '\00BB \0020', $css ); 
     456 
     457        if ( $css == '' ) 
     458            return; 
     459 
     460        $href = trailingslashit( site_url() ); 
     461        $href = add_query_arg( 'custom-css', 1, $href ); 
     462        $href = add_query_arg( 'csblog', $blog_id, $href ); 
     463        $href = add_query_arg( 'cscache', 6, $href ); 
     464        $href = add_query_arg( 'csrev', (int) get_option( $option . '_rev' ), $href ); 
     465 
     466        $href = apply_filters( 'safecss_href', $href, $blog_id ); 
     467 
     468        if ( Jetpack_Custom_CSS::is_preview() ) 
     469            $href = add_query_arg( 'csspreview', 'true', $href ); 
     470 
     471        ?> 
     472        <link rel="stylesheet" type="text/css" href="<?php echo esc_url( $href ); ?>" /> 
     473        <?php 
     474    } 
     475 
     476    static function style_filter( $current ) { 
     477        if ( Jetpack_Custom_CSS::is_freetrial() && ( ! Jetpack_Custom_CSS::is_preview() || ! current_user_can( 'switch_themes' ) ) ) 
     478            return $current; 
     479        else if ( Jetpack_Custom_CSS::skip_stylesheet() ) 
     480            return apply_filters( 'safecss_style_filter_url', 'http://' . $_SERVER['HTTP_HOST'] . '/wp-content/plugins/safecss/blank.css' ); 
     481 
     482        return $current; 
     483    } 
     484 
     485    static function buffer( $html ) { 
     486        $html = str_replace( '</body>', Jetpack_Custom_CSS::preview_flag(), $html ); 
     487        return preg_replace_callback( '!href=([\'"])(.*?)\\1!', array( 'Jetpack_Custom_CSS', 'preview_links' ), $html ); 
     488    } 
     489 
     490    static function preview_links( $matches ) { 
     491        if ( 0 !== strpos( $matches[2], get_option( 'home' ) ) ) 
     492            return $matches[0]; 
     493 
     494        $link = wp_specialchars_decode( $matches[2] ); 
     495        $link = add_query_arg( 'csspreview', 'true', $link ); 
     496        $link = esc_url( $link ); 
     497        return "href={$matches[1]}$link{$matches[1]}"; 
     498    } 
     499 
     500    /** 
     501     * Places a black bar above every preview page 
     502     */ 
     503    static function preview_flag() { 
     504        if ( is_admin() ) 
     505            return; 
     506 
     507        $message = esc_html__( 'Preview: changes must be saved or they will be lost', 'jetpack' ); 
     508        $message = apply_filters( 'safecss_preview_message', $message ); 
     509 
     510        $preview_flag_js = "var flag = document.createElement('div'); 
     511    flag.innerHTML = " . json_encode( $message ) . "; 
     512    flag.style.background = 'black'; 
     513    flag.style.color = 'white'; 
     514    flag.style.textAlign = 'center'; 
     515    flag.style.fontSize = '15px'; 
     516    flag.style.padding = '1px'; 
     517    document.body.style.paddingTop = '32px'; 
     518    document.body.insertBefore(flag, document.body.childNodes[0]); 
     519    "; 
     520 
     521        $preview_flag_js = apply_filters( 'safecss_preview_flag_js', $preview_flag_js ); 
     522        if ( $preview_flag_js ) { 
     523            $preview_flag_js = '<script type="text/javascript"> 
     524    // <![CDATA[ 
     525    ' . $preview_flag_js . ' 
     526    // ]]> 
     527    </script>'; 
     528        } 
     529 
     530        return $preview_flag_js; 
     531    } 
     532 
     533    static function menu() { 
     534        $parent = 'themes.php'; 
     535        $title = __( 'Edit CSS', 'jetpack' ); 
     536        $hook = add_theme_page( $title, $title, 'edit_theme_options', 'editcss', array( 'Jetpack_Custom_CSS', 'admin' ) ); 
     537        add_action( "admin_print_scripts-$hook", array( 'Jetpack_Custom_CSS', 'enqueue_scripts' ) ); 
     538        add_action( "admin_head-$hook", array( 'Jetpack_Custom_CSS', 'admin_head' ) ); 
     539        add_action( "load-revision.php", array( 'Jetpack_Custom_CSS', 'prettify_post_revisions' ) ); 
     540        add_action( "load-$hook", array( 'Jetpack_Custom_CSS', 'update_title' ) ); 
     541    } 
     542 
     543    /** 
     544     * Adds a menu item in the appearance section for this plugin's administration 
     545     * page. Also adds hooks to enqueue the CSS and JS for the admin page. 
     546     */ 
     547    static function update_title() { 
     548        global $title; 
     549        $title = __( 'CSS', 'jetpack' ); 
     550    } 
     551 
     552    static function prettify_post_revisions() { 
     553        add_filter( 'the_title', array( 'Jetpack_Custom_CSS', 'post_title' ), 10, 2 ); 
     554        add_action( 'admin_head', array( 'Jetpack_Custom_CSS', 'remove_title_excerpt_from_revisions' ) ); 
     555    } 
     556 
     557    static function remove_title_excerpt_from_revisions() { 
     558        global $post; 
     559 
     560        if ( !$post ) { 
     561            return; 
     562        } 
     563 
     564        if ( 'safecss' != $post->post_type ) { 
     565            return; 
     566        } 
     567    ?> 
     568    <style type="text/css"> 
     569    #revision-field-post_title, #revision-field-post_excerpt { 
     570        display: none; 
     571    } 
     572    </style> 
     573    <?php 
     574    } 
     575 
     576    static function post_title( $title, $post_id ) { 
     577        if ( !$post_id = (int) $post_id ) { 
     578            return $title; 
     579        } 
     580 
     581        if ( !$post = get_post( $post_id ) ) { 
     582            return $title; 
     583        } 
     584 
     585        if ( 'safecss' != $post->post_type ) { 
     586            return $title; 
     587        } 
     588 
     589        return __( 'Custom CSS Stylesheet', 'jetpack' ); 
     590    } 
     591 
     592    static function enqueue_scripts() { 
     593        wp_enqueue_script( 'postbox' ); 
     594 
     595        if ( defined( 'SAFECSS_USE_ACE' ) && SAFECSS_USE_ACE ) { 
     596            $url = plugins_url( 'custom-css/js/', __FILE__ ); 
     597            wp_enqueue_script( 'jquery.spin' ); 
     598            wp_enqueue_script( 'safecss-ace', $url . 'ace/ace.js', array(), false, true ); 
     599            wp_enqueue_script( 'safecss-ace-css', $url . 'ace/mode-css.js', array( 'safecss-ace' ), false, true ); 
     600            wp_enqueue_script( 'safecss-ace-use', $url . 'safecss-ace.js', array( 'jquery', 'safecss-ace-css' ), false, true ); 
     601        } 
     602    } 
     603 
     604    static function admin_head() { 
     605        ?> 
     606        <style type="text/css"> 
     607            #safecssform { 
     608                position: relative; 
     609            } 
     610 
     611            #poststuff { 
     612                padding-top: 0; 
     613            } 
     614 
     615            #safecss { 
     616                min-height: 250px; 
     617                width: 100%; 
     618            } 
     619 
     620            .misc-pub-section > span { 
     621                font-weight: bold; 
     622            } 
     623 
     624            .misc-pub-section > div { 
     625                margin-top: 3px; 
     626            } 
     627 
     628            <?php 
     629 
     630            if ( defined( 'SAFECSS_USE_ACE' ) && SAFECSS_USE_ACE ) { 
     631 
     632                ?> 
     633                #safecss-container { 
     634                    position: relative; 
     635                    width: 99.5%; 
     636                    height: 400px; 
     637                    border: 1px solid #dfdfdf; 
     638                    border-radius: 3px; 
     639                } 
     640 
     641                #safecss-container .ace_editor { 
     642                    font-family: Consolas, Monaco, Courier, monospace; 
     643                } 
     644 
     645                #safecss-ace { 
     646                    width: 100%; 
     647                    height: 100%; 
     648                    display: none; /* Hide on load otherwise it looks weird */ 
     649                } 
     650 
     651                #safecss-ace.ace_editor { 
     652                    display: block; 
     653                } 
     654 
     655                #safecss-container .ace-tm .ace_gutter { 
     656                    background-color: #ededed; 
     657                } 
     658                <?php 
     659            } 
     660 
     661            ?> 
     662        </style> 
     663        <script type="text/javascript"> 
     664            /*<![CDATA[*/ 
     665            var safecssResize, safecssInit; 
     666 
     667            ( function ( $ ) { 
     668                var safe, win; 
     669 
     670                safecssResize = function () { 
     671                    safe.height( win.height() - safe.offset().top - 250 ); 
     672                }; 
     673 
     674                safecssInit = function() { 
     675                    safe = $('#safecss'); 
     676                    win  = $(window); 
     677 
     678                    postboxes.add_postbox_toggles('editcss'); 
     679                    safecssResize(); 
     680                    var button = document.getElementById( 'preview' ); 
     681                    button.onclick = function ( event ) { 
     682                        <?php 
     683 
     684                        // hack for now for previewing. 
     685                        // TODO: move all of this JS into its own file. 
     686                        if ( defined( 'SAFECSS_USE_ACE' ) && SAFECSS_USE_ACE ) { echo "\t\taceSyncCSS();\n"; } 
     687 
     688                        ?> 
     689                        document.forms["safecssform"].target = "csspreview"; 
     690                        document.forms["safecssform"].action.value = 'preview'; 
     691                        document.forms["safecssform"].submit(); 
     692                        document.forms["safecssform"].target = ""; 
     693                        document.forms["safecssform"].action.value = 'save'; 
     694 
     695                        event = event || window.event; 
     696 
     697                        if ( event.preventDefault ) 
     698                            event.preventDefault(); 
     699 
     700                        return false; 
     701                    } 
     702                }; 
     703 
     704                window.onresize = safecssResize; 
     705                addLoadEvent( safecssInit ); 
     706            } )( jQuery ); 
     707 
     708            jQuery( function ( $ ) { 
     709                $( '.edit-preprocessor' ).bind( 'click', function ( e ) { 
     710                    e.preventDefault(); 
     711 
     712                    $( '#preprocessor-select' ).slideDown(); 
     713                    $( this ).hide(); 
     714                } ); 
     715 
     716                $( '.cancel-preprocessor' ).bind( 'click', function ( e ) { 
     717                    e.preventDefault(); 
     718 
     719                    $( '#preprocessor-select' ).slideUp( function () { 
     720                        $( '.edit-preprocessor' ).show(); 
     721                        $( '#preprocessor_choices' ).val( $( '#custom_css_preprocessor' ).val() ); 
     722                    } ); 
     723                } ); 
     724 
     725                $( '.save-preprocessor' ).bind( 'click', function ( e ) { 
     726                    e.preventDefault(); 
     727 
     728                    $( '#preprocessor-select' ).slideUp(); 
     729                    $( '#preprocessor-display' ).text( $( '#preprocessor_choices option:selected' ).text() ); 
     730                    $( '#custom_css_preprocessor' ).val( $( '#preprocessor_choices' ).val() ); 
     731                    $( '.edit-preprocessor' ).show(); 
     732                } ); 
     733            } ); 
     734            /*]]>*/ 
     735        </script> 
     736        <?php 
     737    } 
     738 
     739    static function saved_message() { 
     740        echo '<div id="message" class="updated fade"><p><strong>' . __( 'Stylesheet saved.', 'jetpack' ) . '</strong></p></div>'; 
     741    } 
     742 
     743    static function admin() { 
     744        add_meta_box( 'submitdiv', __( 'Publish', 'jetpack' ), array( __CLASS__, 'publish_box' ), 'editcss', 'side' ); 
     745        add_meta_box( 'settingsdiv', __( 'CSS Settings', 'jetpack' ), array( __CLASS__, 'meta_box' ), 'editcss', 'side' ); 
     746 
     747        $safecss_post = Jetpack_Custom_CSS::get_post(); 
     748 
     749        if ( ! empty( $safecss_post ) && 0 < $safecss_post['ID'] && wp_get_post_revisions( $safecss_post['ID'] ) ) { 
     750                add_meta_box( 'revisionsdiv', __( 'CSS Revisions', 'jetpack' ), array( __CLASS__, 'revisions_meta_box' ), 'editcss', 'side' ); 
     751        } 
     752 
     753        ?> 
     754        <div class="wrap"> 
     755            <?php do_action( 'custom_design_header' ); ?> 
     756            <h2><?php _e( 'CSS Stylesheet Editor', 'jetpack' ); ?></h2> 
     757            <form id="safecssform" action="" method="post"> 
     758                <?php wp_nonce_field( 'safecss' ) ?> 
     759                <?php wp_nonce_field( 'meta-box-order', 'meta-box-order-nonce', false ); ?> 
     760                <?php wp_nonce_field( 'closedpostboxes', 'closedpostboxesnonce', false ); ?> 
     761                <input type="hidden" name="action" value="save" /> 
     762                <div id="poststuff"> 
     763                    <p class="css-support"><?php echo apply_filters( 'safecss_intro_text', __( 'New to CSS? Start with a <a href="http://www.htmldog.com/guides/cssbeginner/">beginner tutorial</a>. Questions? 
     764        Ask in the <a href="http://wordpress.org/support/forum/themes-and-templates">Themes and Templates forum</a>.', 'jetpack' ) ); ?></p> 
     765                    <div id="post-body" class="metabox-holder columns-2"> 
     766                        <div id="post-body-content"> 
     767                            <div class="postarea"> 
     768                                <?php if ( defined( 'SAFECSS_USE_ACE' ) && SAFECSS_USE_ACE ) { ?> 
     769                                    <div id="safecss-container"> 
     770                                        <div id="safecss-ace"></div> 
     771                                    </div> 
     772                                    <script type="text/javascript"> 
     773                                        jQuery.fn.spin && jQuery("#safecss-container").spin( 'large' ); 
     774                                    </script> 
     775                                    <textarea id="safecss" name="safecss" class="hide-if-js"><?php echo esc_textarea( Jetpack_Custom_CSS::get_css() ); ?></textarea> 
     776                                    <div class="clear"></div> 
     777                                <?php } else { ?> 
     778                                    <p><textarea id="safecss" name="safecss"><?php echo str_replace('</textarea>', '&lt;/textarea&gt', Jetpack_Custom_CSS::get_css()); ?></textarea></p> 
     779                                <?php } ?> 
     780                            </div> 
     781                        </div> 
     782                        <div id="postbox-container-1" class="postbox-container"> 
     783                            <?php do_meta_boxes( 'editcss', 'side', $safecss_post ); ?> 
     784                        </div> 
     785                    </div> 
     786                    <br class="clear" /> 
     787                </div> 
     788            </form> 
     789        </div> 
     790        <?php 
     791    } 
     792 
     793    static function publish_box() { 
     794        $preprocessors = apply_filters( 'jetpack_custom_css_preprocessors', array() ); 
     795 
     796        if ( ! empty( $preprocessors ) ) { 
     797            $safecss_post = Jetpack_Custom_CSS::get_current_revision(); 
     798            $selected_preprocessor_key = get_post_meta( $safecss_post['ID'], 'custom_css_preprocessor', true ); 
     799            $selected_preprocessor = isset( $preprocessors[$selected_preprocessor_key] ) ? $preprocessors[$selected_preprocessor_key] : null; 
     800 
     801            ?> 
     802            <div id="minor-publishing"> 
     803                <div id="misc-publishing-actions"> 
     804                    <div class="misc-pub-section"> 
     805                        <label><?php esc_html_e( 'Preprocessor:' ); ?></label> 
     806                        <span id="preprocessor-display"><?php echo esc_html( $selected_preprocessor ? $selected_preprocessor['name'] : __( 'None', 'jetpack' ) ); ?></span> 
     807                        <a class="edit-preprocessor hide-if-no-js" href="#preprocessor"><?php echo esc_html_e( 'Edit', 'jetpack' ); ?></a> 
     808                        <div id="preprocessor-select" class="hide-if-js"> 
     809                            <input type="hidden" name="custom_css_preprocessor" id="custom_css_preprocessor" value="<?php echo esc_attr( $selected_preprocessor_key ); ?>" /> 
     810                            <select id="preprocessor_choices"> 
     811                                <option value=""><?php esc_html_e( 'None' ); ?></option> 
     812                                <?php 
     813 
     814                                foreach ( $preprocessors as $preprocessor_key => $preprocessor ) { 
     815                                ?> 
     816                                    <option value="<?php echo esc_attr( $preprocessor_key ); ?>" <?php selected( $selected_preprocessor_key, $preprocessor_key ); ?>><?php echo esc_html( $preprocessor['name'] ); ?></option> 
     817                                    <?php 
     818                                } 
     819 
     820                                ?> 
     821                            </select> 
     822                            <a class="save-preprocessor hide-if-no-js button" href="#preprocessor"><?php esc_html_e( 'OK', 'jetpack' ); ?></a> 
     823                            <a class="cancel-preprocessor hide-if-no-js" href="#preprocessor"><?php esc_html_e( 'Cancel', 'jetpack' ); ?></a> 
     824                        </div> 
     825                    </div> 
     826                    <?php do_action( 'custom_css_submitbox_misc_actions' ); ?> 
     827                </div> 
     828            </div> 
     829            <?php 
     830 
     831        } 
     832 
     833        ?> 
     834        <div id="major-publishing-actions"> 
     835            <input type="button" class="button" id="preview" name="preview" value="<?php esc_attr_e( 'Preview', 'jetpack' ) ?>" /> 
     836            <div id="publishing-action"> 
     837                <input type="submit" class="button-primary" id="save" name="save" value="<?php ( Jetpack_Custom_CSS::is_freetrial() ) ? esc_attr_e( 'Save &amp; Buy Upgrade', 'jetpack' ) : esc_attr_e( 'Save Stylesheet', 'jetpack' ); ?>" /> 
     838            </div> 
     839        </div> 
     840        <?php 
     841    } 
     842 
     843    /** 
     844     * Render CSS Settings metabox 
     845     * Called by afecss_admin    * 
     846     * @uses get_option, checked, __, get_current_theme, apply_filters, get_stylesheet_uri, _e, esc_attr, wp_get_theme 
     847     * @return string 
     848     */ 
     849    static function meta_box() { 
     850        if ( function_exists( 'wp_get_theme' ) ) { 
     851            $current_theme = wp_get_theme(); 
     852            $current_theme = $current_theme->Name; 
     853        } 
     854        else { 
     855            $current_theme = get_current_theme(); 
     856        } 
     857 
     858        $safecss_post = Jetpack_Custom_CSS::get_current_revision(); 
     859 
     860        ?> 
     861        <p class="css-settings"> 
     862            <label><input type="radio" name="add_to_existing" value="true" <?php checked( get_post_meta( $safecss_post['ID'], 'custom_css_add', true ) != 'no' ); ?> /> <?php printf( __( 'Add my CSS to <strong>%s&apos;s</strong> CSS.', 'jetpack' ), $current_theme ); ?></label><br /> 
     863            <label><input type="radio" name="add_to_existing" value="false" <?php checked( get_post_meta( $safecss_post['ID'], 'custom_css_add', true ) == 'no' ); ?> /> <?php printf( __( 'Replace <strong>%s&apos;s</strong> CSS with my own.', 'jetpack' ), $current_theme ); ?></label> 
     864            <p><?php printf( __( '<a href="%s">View the original stylesheet</a> for the %s theme. Use this as a reference and do not copy and paste all of it into the CSS Editor.', 'jetpack' ), apply_filters( 'safecss_theme_stylesheet_url', get_stylesheet_uri() ), $current_theme ); ?></p> 
     865        </p> 
     866        <?php 
     867 
     868        do_action( 'custom_css_meta_fields' ); 
     869    } 
     870 
     871    /** 
     872     * Render metabox listing CSS revisions and the themes that correspond to the revisions. 
     873     * Called by afecss_admin    * 
     874     * @param array $safecss_post 
     875     * @global $post 
     876     * @uses WP_Query, wp_post_revision_title, esc_html, add_query_arg, menu_page_url, wp_reset_query 
     877     * @return string 
     878     */ 
     879    static function revisions_meta_box( $safecss_post ) { 
     880        $max_revisions = defined( 'WP_POST_REVISIONS' ) && is_numeric( WP_POST_REVISIONS ) ? (int) WP_POST_REVISIONS : 25; 
     881        $posts_per_page = isset( $_GET['show_all_rev'] ) ? $max_revisions : 6; 
     882 
     883        $revisions = new WP_Query( array( 
     884            'posts_per_page' => $posts_per_page, 
     885            'post_type' => 'revision', 
     886            'post_status' => 'inherit', 
     887            'post_parent' => $safecss_post['ID'], 
     888            'orderby' => 'date', 
     889            'order' => 'DESC' 
     890        ) ); 
     891 
     892        if ( $revisions->have_posts() ) { ?> 
     893            <ul class="post-revisions"><?php 
     894 
     895            global $post; 
     896 
     897            while ( $revisions->have_posts() ) : 
     898                $revisions->the_post(); 
     899 
     900                ?><li> 
     901                    <?php 
     902                        echo wp_post_revision_title( $post ); 
     903 
     904                        if ( ! empty( $post->post_excerpt ) ) 
     905                            echo ' (' . esc_html( $post->post_excerpt ) . ')'; 
     906                    ?> 
     907                </li><?php 
     908 
     909            endwhile; 
     910 
     911            ?></ul><?php 
     912 
     913            if ( $revisions->found_posts > 6 ) { 
     914                ?> 
     915                <br> 
     916                <a href="<?php echo add_query_arg( 'show_all_rev', 'true', menu_page_url( 'editcss', false ) ); ?>"><?php esc_html_e( 'Show more', 'jetpack' ); ?></a> 
     917                <?php 
     918            } 
     919        } 
     920 
     921        wp_reset_query(); 
     922    } 
     923 
     924    /** 
     925     * Hook in init at priority 11 to disable custom CSS. 
     926     */ 
     927    static function disable() { 
     928        remove_action( 'wp_head', array( 'Jetpack_Custom_CSS', 'link_tag' ), 101 ); 
     929        remove_filter( 'stylesheet_uri', array( 'Jetpack_Custom_CSS', 'style_filter' ) ); 
     930    } 
     931 
     932    /** 
     933     * Reset all aspects of Custom CSS on a theme switch so that changing 
     934     * themes is a sure-fire way to get a clean start. 
     935     */ 
     936    static function reset() { 
     937        $safecss_post_id = Jetpack_Custom_CSS::save_revision( '' ); 
     938        $safecss_revision = Jetpack_Custom_CSS::get_current_revision(); 
     939 
     940        update_option( 'safecss_rev', intval( get_option( 'safecss_rev' ) ) + 1 ); 
     941 
     942        update_post_meta( $safecss_post_id, 'custom_css_add', 'yes' ); 
     943        update_post_meta( $safecss_post_id, 'content_width', false ); 
     944        update_post_meta( $safecss_post_id, 'custom_css_preprocessor', '' ); 
     945        update_metadata( 'post', $safecss_revision['ID'], 'custom_css_add', 'yes' ); 
     946        update_metadata( 'post', $safecss_revision['ID'], 'content_width', false ); 
     947        update_metadata( 'post', $safecss_revision['ID'], 'custom_css_preprocessor', '' ); 
     948    } 
     949 
     950    static function is_customizer_preview() { 
     951        if ( isset ( $GLOBALS['wp_customize'] ) ) 
     952            return ! $GLOBALS['wp_customize']->is_theme_active(); 
     953 
    267954        return false; 
    268     else { 
    269         if ( safecss_is_preview() ) { 
    270             $safecss_post = get_current_revision(); 
    271  
    272             return (bool) ( get_option('safecss_preview_add') == 'no' || get_post_meta( $safecss_post['ID'], 'custom_css_add', true ) == 'no' ); 
    273         } 
    274         else { 
    275             $custom_css_post_id = custom_css_post_id(); 
    276  
    277             return (bool) ( get_option('safecss_add') == 'no' || ( $custom_css_post_id && get_post_meta( $custom_css_post_id, 'custom_css_add', true ) == 'no' ) ); 
    278         } 
    279     } 
    280 } 
    281  
    282 function safecss_init() { 
    283     define( 'SAFECSS_USE_ACE', ! jetpack_is_mobile() && ! Jetpack_User_Agent_Info::is_ipad() && apply_filters( 'safecss_use_ace', true ) ); 
    284  
    285     // Register safecss as a custom post_type 
    286     // Explicit capability definitions are largely unnecessary because the posts are manipulated in code via an options page, managing CSS revisions does check the capabilities, so let's ensure that the proper caps are checked. 
    287     register_post_type( 'safecss', array( 
    288 //      These are the defaults 
    289 //      'exclude_from_search' => true, 
    290 //      'public' => false, 
    291 //      'publicly_queryable' => false, 
    292 //      'show_ui' => false, 
    293         'supports' => array( 'revisions' ), 
    294         'label' => 'Custom CSS', 
    295         'can_export' => false, 
    296         'rewrite' => false, 
    297         'capabilities' => array( 
    298             'edit_post' => 'edit_theme_options', 
    299             'read_post' => 'read', 
    300             'delete_post' => 'edit_theme_options', 
    301             'edit_posts' => 'edit_theme_options', 
    302             'edit_others_posts' => 'edit_theme_options', 
    303             'publish_posts' => 'edit_theme_options', 
    304             'read_private_posts' => 'read' 
    305         ) 
    306     ) ); 
    307  
    308     // Short-circuit WP if this is a CSS stylesheet request 
    309     if ( isset( $_GET['custom-css'] ) ) { 
    310         header( 'Content-Type: text/css', true, 200 ); 
    311         header( 'Expires: ' . gmdate( 'D, d M Y H:i:s', time() + 31536000) . ' GMT' ); // 1 year 
    312         safecss_print(); 
    313         exit; 
    314     } 
    315  
    316     if ( isset( $_GET['page'] ) && 'editcss' == $_GET['page'] && is_admin() ) { 
    317         // Do migration routine if necessary 
    318         migrate(); 
    319  
    320         do_action( 'safecss_migrate_post' ); 
    321     } 
    322  
    323     add_action( 'wp_head', 'safecss_style', 101 ); 
    324  
    325     if ( !current_user_can('switch_themes') && !is_super_admin() ) 
    326         return; 
    327  
    328     add_action('admin_menu', 'safecss_menu'); 
    329  
    330     if ( isset($_POST['safecss']) && false == strstr( $_SERVER[ 'REQUEST_URI' ], 'options.php' ) ) { 
    331         check_admin_referer('safecss'); 
    332  
    333         // Remove wp_filter_post_kses, this causes CSS escaping issues 
    334         remove_filter( 'content_save_pre', 'wp_filter_post_kses' ); 
    335         remove_filter( 'content_filtered_save_pre', 'wp_filter_post_kses' ); 
    336         remove_all_filters( 'content_save_pre' ); 
    337  
    338         do_action( 'safecss_save_pre' ); 
    339  
    340         $warnings = array(); 
     955    } 
     956 
     957    static function minify( $css, $preprocessor = '' ) { 
     958        if ( ! $css ) 
     959            return ''; 
     960 
     961        if ( $preprocessor ) { 
     962            $preprocessors = apply_filters( 'jetpack_custom_css_preprocessors', array() ); 
     963 
     964            if ( isset( $preprocessors[$preprocessor] ) ) { 
     965                $css = call_user_func( $preprocessors[$preprocessor]['callback'], $css ); 
     966            } 
     967        } 
    341968 
    342969        safecss_class(); 
    343970        $csstidy = new csstidy(); 
    344         $csstidy->optimise = new safecss($csstidy); 
     971        $csstidy->optimise = new safecss( $csstidy ); 
    345972 
    346973        $csstidy->set_cfg( 'remove_bslash',              false ); 
    347         $csstidy->set_cfg( 'compress_colors',            false ); 
    348         $csstidy->set_cfg( 'compress_font-weight',       false ); 
    349         $csstidy->set_cfg( 'optimise_shorthands',        0 ); 
    350         $csstidy->set_cfg( 'remove_last_;',              false ); 
    351         $csstidy->set_cfg( 'case_properties',            false ); 
     974        $csstidy->set_cfg( 'compress_colors',            true ); 
     975        $csstidy->set_cfg( 'compress_font-weight',       true ); 
     976        $csstidy->set_cfg( 'remove_last_;',              true ); 
     977        $csstidy->set_cfg( 'case_properties',            true ); 
    352978        $csstidy->set_cfg( 'discard_invalid_properties', true ); 
    353979        $csstidy->set_cfg( 'css_level',                  'CSS3.0' ); 
    354         $csstidy->set_cfg( 'preserve_css',               true ); 
    355         $csstidy->set_cfg( 'template',                   dirname( __FILE__ ) . '/csstidy/wordpress-standard.tpl' ); 
    356  
    357         $css = $orig = stripslashes($_POST['safecss']); 
    358  
    359         $css = preg_replace('/\\\\([0-9a-fA-F]{4})/', '\\\\\\\\$1', $prev = $css); 
    360         if ( $css != $prev ) 
    361             $warnings[] = 'preg_replace found stuff'; 
    362  
    363         // Some people put weird stuff in their CSS, KSES tends to be greedy 
    364         $css = str_replace( '<=', '&lt;=', $css ); 
    365         // Why KSES instead of strip_tags?  Who knows? 
    366         $css = wp_kses_split($prev = $css, array(), array()); 
    367         $css = str_replace( '&gt;', '>', $css ); // kses replaces lone '>' with &gt; 
    368         // Why both KSES and strip_tags?  Because we just added some '>'. 
    369         $css = strip_tags( $css ); 
    370  
    371         if ( $css != $prev ) 
    372             $warnings[] = 'kses found stuff'; 
    373  
    374         // if we're not using a preprocessor 
    375         if ( ! isset( $_POST['custom_css_preprocessor'] ) || empty( $_POST['custom_css_preprocessor'] ) ) { 
    376             do_action( 'safecss_parse_pre', $csstidy, $css ); 
    377  
    378             $csstidy->parse($css); 
    379  
    380             do_action( 'safecss_parse_post', $csstidy, $warnings ); 
    381  
    382             $css = $csstidy->print->plain(); 
    383         } 
    384  
    385         if ( isset( $_POST['custom_content_width'] ) && intval($_POST['custom_content_width']) > 0 ) 
    386             $custom_content_width = intval($_POST['custom_content_width']); 
    387         else 
    388             $custom_content_width = false; 
    389  
    390         if ( $_POST['add_to_existing'] == 'true' ) 
    391             $add_to_existing = 'yes'; 
    392         else 
    393             $add_to_existing = 'no'; 
    394  
    395         $preprocessor = isset( $_POST['custom_css_preprocessor'] ) ? $_POST['custom_css_preprocessor'] : ''; 
    396  
    397         if ( $_POST['action'] == 'preview' || safecss_is_freetrial() ) { 
    398             // Save the CSS 
    399             $safecss_revision_id = save_revision( $css, true, $preprocessor ); 
    400  
    401             // Cache Buster 
    402             update_option('safecss_preview_rev', intval( get_option('safecss_preview_rev') ) + 1); 
    403  
    404             update_metadata( 'post', $safecss_revision_id, 'custom_css_add', $add_to_existing ); 
    405             update_metadata( 'post', $safecss_revision_id, 'content_width', $custom_content_width ); 
    406             update_metadata( 'post', $safecss_revision_id, 'custom_css_preprocessor', $preprocessor ); 
    407  
    408             if ( $_POST['action'] == 'preview' ) { 
    409                 wp_safe_redirect( add_query_arg( 'csspreview', 'true', get_option('home') ) ); 
    410                 exit; 
    411             } 
    412  
    413             do_action( 'safecss_save_preview_post' ); 
    414         } 
    415  
    416         // Save the CSS 
    417         $safecss_post_id = save_revision( $css, false, $preprocessor ); 
    418  
    419         $safecss_post_revision = get_current_revision(); 
    420  
    421         update_option( 'safecss_rev', intval( get_option( 'safecss_rev' ) ) + 1 ); 
    422  
    423         update_post_meta( $safecss_post_id, 'custom_css_add', $add_to_existing ); 
    424         update_post_meta( $safecss_post_id, 'content_width', $custom_content_width ); 
    425         update_post_meta( $safecss_post_id, 'custom_css_preprocessor', $preprocessor ); 
    426         update_metadata( 'post', $safecss_post_revision['ID'], 'custom_css_add', $add_to_existing ); 
    427         update_metadata( 'post', $safecss_post_revision['ID'], 'content_width', $custom_content_width ); 
    428         update_metadata( 'post', $safecss_post_revision['ID'], 'custom_css_preprocessor', $preprocessor ); 
    429  
    430         add_action('admin_notices', 'safecss_saved'); 
    431     } 
    432  
    433     // Modify all internal links so that preview state persists 
    434     if ( safecss_is_preview() ) 
    435         ob_start('safecss_buffer'); 
    436 } 
    437 add_action('init', 'safecss_init'); 
     980        $csstidy->set_cfg( 'template', 'highest'); 
     981        $csstidy->parse( $css ); 
     982 
     983        return $csstidy->print->plain(); 
     984    } 
     985 
     986    /** 
     987     * When restoring a SafeCSS post revision, also copy over the 
     988     * content_width and custom_css_add post metadata. 
     989     */ 
     990    static function restore_revision( $_post_id, $_revision_id ) { 
     991        $_post = get_post( $_post_id ); 
     992 
     993        if ( 'safecss' != $_post->post_type ) 
     994            return; 
     995 
     996        $safecss_revision = Jetpack_Custom_CSS::get_current_revision(); 
     997 
     998        $content_width = get_post_meta( $_revision_id, 'content_width', true ); 
     999        $custom_css_add = get_post_meta( $_revision_id, 'custom_css_add', true ); 
     1000        $preprocessor = get_post_meta( $_revision_id, 'custom_css_preprocessor', true ); 
     1001 
     1002        update_metadata( 'post', $safecss_revision['ID'], 'content_width', $content_width ); 
     1003        update_metadata( 'post', $safecss_revision['ID'], 'custom_css_add', $custom_css_add ); 
     1004        update_metadata( 'post', $safecss_revision['ID'], 'custom_css_preprocessor', $preprocessor ); 
     1005        update_post_meta( $_post->ID, 'content_width', $content_width ); 
     1006        update_post_meta( $_post->ID, 'custom_css_add', $custom_css_add ); 
     1007        update_post_meta( $_post->ID, 'custom_css_preprocessor', $preprocessor ); 
     1008    } 
     1009 
     1010    /** 
     1011     * Migration routine for moving safecss from wp_options to wp_posts to support revisions 
     1012     * 
     1013     * @return void 
     1014     */ 
     1015    static function upgrade() { 
     1016        $css = get_option( 'safecss' ); 
     1017 
     1018        // Check if CSS is stored in wp_options 
     1019        if ( $css ) { 
     1020            // Remove the async actions from publish_post 
     1021            remove_action( 'publish_post', 'queue_publish_post' ); 
     1022 
     1023            $post = array(); 
     1024            $post['post_content'] = $css; 
     1025            $post['post_title'] = 'safecss'; 
     1026            $post['post_status'] = 'publish'; 
     1027            $post['post_type'] = 'safecss'; 
     1028 
     1029            // Insert the CSS into wp_posts 
     1030            $post_id = wp_insert_post( $post ); 
     1031            // Check for errors 
     1032            if ( !$post_id or is_wp_error( $post_id ) ) 
     1033                die( $post_id->get_error_message() ); 
     1034 
     1035            // Delete safecss option 
     1036            delete_option( 'safecss' ); 
     1037        } 
     1038 
     1039        unset( $css ); 
     1040 
     1041        // Check if we have already done this 
     1042        if ( !get_option( 'safecss_revision_migrated' ) ) { 
     1043            define( 'DOING_MIGRATE', true ); 
     1044 
     1045            // Get hashes of safecss post and current revision 
     1046            $safecss_post = Jetpack_Custom_CSS::get_post(); 
     1047 
     1048            if ( empty( $safecss_post ) ) 
     1049                return; 
     1050 
     1051            $safecss_post_hash = md5( $safecss_post['post_content'] ); 
     1052            $current_revision = Jetpack_Custom_CSS::get_current_revision(); 
     1053 
     1054            if ( null == $current_revision ) 
     1055                return; 
     1056 
     1057            $current_revision_hash = md5( $current_revision['post_content'] ); 
     1058 
     1059            // If hashes are not equal, set safecss post with content from current revision 
     1060            if ( $safecss_post_hash !== $current_revision_hash ) { 
     1061                Jetpack_Custom_CSS::save_revision( $current_revision['post_content'] ); 
     1062                // Reset post_content to display the migrated revsion 
     1063                $safecss_post['post_content'] = $current_revision['post_content']; 
     1064            } 
     1065 
     1066            // Set option so that we dont keep doing this 
     1067            update_option( 'safecss_revision_migrated', time() ); 
     1068        } 
     1069 
     1070        $newest_safecss_post = Jetpack_Custom_CSS::get_current_revision(); 
     1071 
     1072        if ( $newest_safecss_post ) { 
     1073            if ( get_option( 'safecss_content_width' ) ) { 
     1074                // Add the meta to the post and the latest revision. 
     1075                update_post_meta( $newest_safecss_post['ID'], 'content_width', get_option( 'safecss_content_width' ) ); 
     1076                update_metadata( 'post', $newest_safecss_post['ID'], 'content_width', get_option( 'safecss_content_width' ) ); 
     1077 
     1078                delete_option( 'safecss_content_width' ); 
     1079            } 
     1080 
     1081            if ( get_option( 'safecss_add' ) ) { 
     1082                update_post_meta( $newest_safecss_post['ID'], 'custom_css_add', get_option( 'safecss_add' ) ); 
     1083                update_metadata( 'post', $newest_safecss_post['ID'], 'custom_css_add', get_option( 'safecss_add' ) ); 
     1084 
     1085                delete_option( 'safecss_add' ); 
     1086            } 
     1087        } 
     1088    } 
     1089 
     1090    static function revision_redirect( $redirect ) { 
     1091        global $post; 
     1092 
     1093        if ( 'safecss' == $post->post_type ) { 
     1094            if ( strstr( $redirect, 'action=edit' ) ) { 
     1095                return 'themes.php?page=editcss'; 
     1096            } 
     1097 
     1098            if ( 'edit.php' == $redirect ) { 
     1099                return ''; 
     1100            } 
     1101        } 
     1102 
     1103        return $redirect; 
     1104    } 
     1105 
     1106    static function revision_post_link( $post_link, $post_id, $context ) { 
     1107        if ( !$post_id = (int) $post_id ) { 
     1108            return $post_link; 
     1109        } 
     1110 
     1111        if ( !$post = get_post( $post_id ) ) { 
     1112            return $post_link; 
     1113        } 
     1114 
     1115        if ( 'safecss' != $post->post_type ) { 
     1116            return $post_link; 
     1117        } 
     1118 
     1119        $post_link = admin_url( 'themes.php?page=editcss' ); 
     1120 
     1121        if ( 'display' == $context ) { 
     1122            return esc_url( $post_link ); 
     1123        } 
     1124 
     1125        return esc_url_raw( $post_link ); 
     1126    } 
     1127} 
     1128 
     1129class Jetpack_Safe_CSS { 
     1130    static function filter_attr( $css, $element = 'div' ) { 
     1131        safecss_class(); 
     1132 
     1133        $css = $element . ' {' . $css . '}'; 
     1134 
     1135        $csstidy = new csstidy(); 
     1136        $csstidy->optimise = new safecss( $csstidy ); 
     1137        $csstidy->set_cfg( 'remove_bslash', false ); 
     1138        $csstidy->set_cfg( 'compress_colors', false ); 
     1139        $csstidy->set_cfg( 'compress_font-weight', false ); 
     1140        $csstidy->set_cfg( 'discard_invalid_properties', true ); 
     1141        $csstidy->set_cfg( 'merge_selectors', false ); 
     1142        $csstidy->set_cfg( 'remove_last_;', false ); 
     1143        $csstidy->set_cfg( 'css_level', 'CSS3.0' ); 
     1144 
     1145        $css = preg_replace( '/\\\\([0-9a-fA-F]{4})/', '\\\\\\\\$1', $css ); 
     1146        $css = wp_kses_split( $css, array(), array() ); 
     1147        $csstidy->parse( $css ); 
     1148 
     1149        $css = $csstidy->print->plain(); 
     1150 
     1151        $css = str_replace( array( "\n","\r","\t" ), '', $css ); 
     1152 
     1153        preg_match( "/^{$element}\s*{(.*)}\s*$/", $css, $matches ); 
     1154 
     1155        if ( empty( $matches[1] ) ) 
     1156            return ''; 
     1157 
     1158        return $matches[1]; 
     1159    } 
     1160} 
     1161 
     1162function migrate() { 
     1163    _deprecated_function( __FUNCTION__, '2.1', 'Jetpack_Custom_CSS::upgrade()' ); 
     1164 
     1165    return Jetpack_Custom_CSS::upgrade(); 
     1166} 
     1167 
     1168function safecss_revision_redirect( $redirect ) { 
     1169    _deprecated_function( __FUNCTION__, '2.1', 'Jetpack_Custom_CSS::revision_redirect()' ); 
     1170 
     1171    return Jetpack_Custom_CSS::revision_redirect( $redirect ); 
     1172} 
     1173 
     1174function safecss_revision_post_link( $post_link, $post_id, $context ) { 
     1175    _deprecated_function( __FUNCTION__, '2.1', 'Jetpack_Custom_CSS::revision_post_link()' ); 
     1176 
     1177    return Jetpack_Custom_CSS::revision_post_link( $post_link, $post_id, $context ); 
     1178} 
     1179 
     1180function get_safecss_post() { 
     1181    _deprecated_function( __FUNCTION__, '2.1', 'Jetpack_Custom_CSS::get_post()' ); 
     1182 
     1183    return Jetpack_Custom_CSS::get_post(); 
     1184} 
     1185 
     1186function custom_css_post_id() { 
     1187    _deprecated_function( __FUNCTION__, '2.1', 'Jetpack_Custom_CSS::post_id()' ); 
     1188 
     1189    return Jetpack_Custom_CSS::post_id(); 
     1190} 
     1191 
     1192function get_current_revision() { 
     1193    _deprecated_function( __FUNCTION__, '2.1', 'Jetpack_Custom_CSS::get_current_revision()' ); 
     1194 
     1195    return Jetpack_Custom_CSS::get_current_revision(); 
     1196} 
     1197 
     1198function save_revision( $css, $is_preview = false, $preprocessor = '' ) { 
     1199    _deprecated_function( __FUNCTION__, '2.1', 'Jetpack_Custom_CSS::save_revision()' ); 
     1200 
     1201    return Jetpack_Custom_CSS::save_revision( $css, $is_preview, $preprocessor ); 
     1202} 
     1203 
     1204function safecss_skip_stylesheet() { 
     1205    _deprecated_function( __FUNCTION__, '2.1', 'Jetpack_Custom_CSS::skip_stylesheet()' ); 
     1206 
     1207    return Jetpack_Custom_CSS::skip_stylesheet(); 
     1208} 
     1209 
     1210function safecss_init() { 
     1211    _deprecated_function( __FUNCTION__, '2.1', 'Jetpack_Custom_CSS::init()' ); 
     1212 
     1213    return Jetpack_Custom_CSS::init(); 
     1214} 
    4381215 
    4391216function safecss_is_preview() { 
    440     return isset($_GET['csspreview']) && $_GET['csspreview'] === 'true'; 
    441 } 
    442  
    443 /* 
    444  * safecss_is_freetrial() is false when the site has the Custom Design upgrade. 
    445  * Used only on WordPress.com. 
    446  */ 
     1217    _deprecated_function( __FUNCTION__, '2.1', 'Jetpack_Custom_CSS::is_preview()' ); 
     1218 
     1219    return Jetpack_Custom_CSS::is_preview(); 
     1220} 
     1221 
    4471222function safecss_is_freetrial() { 
    448     return apply_filters( 'safecss_is_freetrial', false ); 
     1223    _deprecated_function( __FUNCTION__, '2.1', 'Jetpack_Custom_CSS::is_freetrial()' ); 
     1224 
     1225    return Jetpack_Custom_CSS::is_freetrial(); 
    4491226} 
    4501227 
    4511228function safecss( $compressed = false ) { 
    452     $default_css = apply_filters( 'safecss_get_css_error', false ); 
    453  
    454     if ( $default_css !== false ) 
    455         return $default_css; 
    456  
    457     $option = ( safecss_is_preview() || safecss_is_freetrial() ) ? 'safecss_preview' : 'safecss'; 
    458  
    459     if ( 'safecss' == $option ) { 
    460         if ( get_option( 'safecss_revision_migrated' ) ) { 
    461             $safecss_post = get_safecss_post(); 
    462             $css = ( $compressed && $safecss_post['post_content_filtered'] ) ? $safecss_post['post_content_filtered'] : $safecss_post['post_content']; 
    463         } else { 
    464             $current_revision = get_current_revision(); 
    465             if ( false === $current_revision ) { 
    466                 $css = ''; 
    467             } else { 
    468                 $css = ( $compressed && $current_revision['post_content_filtered'] ) ? $current_revision['post_content_filtered'] : $current_revision['post_content']; 
    469             } 
    470         } 
    471  
    472         // Fix for un-migrated Custom CSS 
    473         if ( empty( $safecss_post ) ) { 
    474             $_css = get_option( 'safecss' ); 
    475             if ( !empty( $_css ) ) { 
    476                 $css = $_css; 
    477             } 
    478         } 
    479     } 
    480     else if ( 'safecss_preview' == $option ) { 
    481         $safecss_post = get_current_revision(); 
    482         $css = $safecss_post['post_content']; 
    483         $css = stripslashes( $css ); 
    484         $css = custom_css_minify( $css, get_post_meta( $safecss_post['ID'], 'custom_css_preprocessor', true ) ); 
    485     } 
    486  
    487     $css = str_replace( array( '\\\00BB \\\0020', '\0BB \020', '0BB 020' ), '\00BB \0020', $css ); 
    488  
    489     if ( empty( $css ) ) { 
    490         $css = "/*\n" 
    491             . wordwrap( 
    492                 apply_filters( 
    493                     'safecss_default_css', 
    494                     __( 
    495                         "Welcome to Custom CSS!\n\nCSS (Cascading Style Sheets) is a kind of code that tells the browser how to render a web page. You may delete these comments and get started with your customizations.\n\nBy default, your stylesheet will be loaded after the theme stylesheets, which means that your rules can take precedence and override the theme CSS rules. Just write here what you want to change, you don't need to copy all your theme's stylesheet content.", 
    496                         'jetpack' 
    497                     ) 
    498                 ) 
    499             ) 
    500             . "\n*/"; 
    501     } 
    502  
    503     $css = apply_filters( 'safecss_css', $css ); 
    504  
    505     return $css; 
     1229    _deprecated_function( __FUNCTION__, '2.1', 'Jetpack_Custom_CSS::get_css()' ); 
     1230 
     1231    return Jetpack_Custom_CSS::get_css( $compressed ); 
    5061232} 
    5071233 
    5081234function safecss_print() { 
    509     do_action( 'safecss_print_pre' ); 
    510  
    511     echo safecss( true ); 
     1235    _deprecated_function( __FUNCTION__, '2.1', 'Jetpack_Custom_CSS::print_css()' ); 
     1236 
     1237    return Jetpack_Custom_CSS::print_css(); 
    5121238} 
    5131239 
    5141240function safecss_style() { 
    515     global $blog_id, $current_blog; 
    516  
    517     if ( apply_filters( 'safecss_style_error', false ) ) 
    518         return; 
    519  
    520     if ( ! is_super_admin() && isset( $current_blog ) && ( 1 == $current_blog->spam || 1 == $current_blog->deleted ) ) 
    521         return; 
    522  
    523     if ( custom_css_is_customizer_preview() ) 
    524         return; 
    525  
    526     $css    = ''; 
    527     $option = safecss_is_preview() ? 'safecss_preview' : 'safecss'; 
    528  
    529     if ( 'safecss' == $option ) { 
    530         if ( get_option( 'safecss_revision_migrated' ) ) { 
    531             $safecss_post = get_safecss_post(); 
    532  
    533             if ( ! empty( $safecss_post['post_content'] ) ) { 
    534                 $css = $safecss_post['post_content']; 
    535             } 
    536         } else { 
    537             $current_revision = get_current_revision(); 
    538  
    539             if ( ! empty( $current_revision['post_content'] ) ) { 
    540                 $css = $current_revision['post_content']; 
    541             } 
    542         } 
    543  
    544         // Fix for un-migrated Custom CSS 
    545         if ( empty( $safecss_post ) ) { 
    546             $_css = get_option( 'safecss' ); 
    547             if ( !empty( $_css ) ) { 
    548                 $css = $_css; 
    549             } 
    550         } 
    551     } 
    552  
    553     if ( 'safecss_preview' == $option ) { 
    554         $safecss_post = get_current_revision(); 
    555  
    556         if ( !empty( $safecss_post['post_content'] ) ) { 
    557             $css = $safecss_post['post_content']; 
    558         } 
    559     } 
    560  
    561     $css = str_replace( array( '\\\00BB \\\0020', '\0BB \020', '0BB 020' ), '\00BB \0020', $css ); 
    562  
    563     if ( $css == '' ) 
    564         return; 
    565  
    566     $href = trailingslashit( site_url() ); 
    567     $href = add_query_arg( 'custom-css', 1, $href ); 
    568     $href = add_query_arg( 'csblog', $blog_id, $href ); 
    569     $href = add_query_arg( 'cscache', 6, $href ); 
    570     $href = add_query_arg( 'csrev', (int) get_option( $option . '_rev' ), $href ); 
    571  
    572     $href = apply_filters( 'safecss_href', $href, $blog_id ); 
    573  
    574     if ( safecss_is_preview() ) 
    575         $href = add_query_arg( 'csspreview', 'true', $href ); 
    576 ?> 
    577  
    578     <link rel="stylesheet" type="text/css" href="<?php echo esc_url( $href ); ?>" /> 
    579 <?php 
     1241    _deprecated_function( __FUNCTION__, '2.1', 'Jetpack_Custom_CSS::link_tag()' ); 
     1242 
     1243    return Jetpack_Custom_CSS::link_tag(); 
    5801244} 
    5811245 
    5821246function safecss_style_filter( $current ) { 
    583     if ( safecss_is_freetrial() && ( !safecss_is_preview() || !current_user_can('switch_themes') ) ) 
    584         return $current; 
    585  
    586     else if ( safecss_skip_stylesheet() ) 
    587         return apply_filters( 'safecss_style_filter_url', 'http://' . $_SERVER['HTTP_HOST'] . '/wp-content/plugins/safecss/blank.css' ); 
    588  
    589     return $current; 
    590 } 
    591 add_filter( 'stylesheet_uri', 'safecss_style_filter' ); 
    592  
    593 function safecss_buffer($html) { 
    594     $html = str_replace('</body>', safecss_preview_flag(), $html); 
    595     return preg_replace_callback('!href=([\'"])(.*?)\\1!', 'safecss_preview_links', $html); 
     1247    _deprecated_function( __FUNCTION__, '2.1', 'Jetpack_Custom_CSS::style_filter()' ); 
     1248 
     1249    return Jetpack_Custom_CSS::style_filter( $current ); 
     1250} 
     1251 
     1252function safecss_buffer( $html ) { 
     1253    _deprecated_function( __FUNCTION__, '2.1', 'Jetpack_Custom_CSS::buffer()' ); 
     1254 
     1255    return Jetpack_Custom_CSS::buffer( $html ); 
    5961256} 
    5971257 
    5981258function safecss_preview_links( $matches ) { 
    599     if ( 0 !== strpos( $matches[2], get_option( 'home' ) ) ) 
    600         return $matches[0]; 
    601  
    602     $link = wp_specialchars_decode( $matches[2] ); 
    603     $link = add_query_arg( 'csspreview', 'true', $link ); 
    604     $link = esc_url( $link ); 
    605     return "href={$matches[1]}$link{$matches[1]}"; 
    606 } 
    607  
    608 // Places a black bar above every preview page 
     1259    _deprecated_function( __FUNCTION__, '2.1', 'Jetpack_Custom_CSS::preview_links()' ); 
     1260 
     1261    return Jetpack_Custom_CSS::preview_links( $matches ); 
     1262} 
     1263 
    6091264function safecss_preview_flag() { 
    610     if ( is_admin() ) 
    611         return; 
    612  
    613     $message = esc_html__( 'Preview: changes must be saved or they will be lost', 'jetpack' ); 
    614     $message = apply_filters( 'safecss_preview_message', $message ); 
    615  
    616     $preview_flag_js = "var flag = document.createElement('div'); 
    617 flag.innerHTML = " . json_encode( $message ) . "; 
    618 flag.style.background = 'black'; 
    619 flag.style.color = 'white'; 
    620 flag.style.textAlign = 'center'; 
    621 flag.style.fontSize = '15px'; 
    622 flag.style.padding = '1px'; 
    623 document.body.style.paddingTop = '32px'; 
    624 document.body.insertBefore(flag, document.body.childNodes[0]); 
    625 "; 
    626  
    627     $preview_flag_js = apply_filters( 'safecss_preview_flag_js', $preview_flag_js ); 
    628     if ( $preview_flag_js ) { 
    629         $preview_flag_js = '<script type="text/javascript"> 
    630 // <![CDATA[ 
    631 ' . $preview_flag_js . ' 
    632 // ]]> 
    633 </script>'; 
    634     } 
    635  
    636     return $preview_flag_js; 
     1265    _deprecated_function( __FUNCTION__, '2.1', 'Jetpack_Custom_CSS::preview_flag()' ); 
     1266 
     1267    return Jetpack_Custom_CSS::preview_flag(); 
    6371268} 
    6381269 
    6391270function safecss_menu() { 
    640     $parent = 'themes.php'; 
    641     $title = __( 'Edit CSS', 'jetpack' ); 
    642     $hook = add_theme_page( $title, $title, 'edit_theme_options', 'editcss', 'safecss_admin' ); 
    643     add_action( "admin_print_scripts-$hook", 'safe_css_enqueue_scripts' ); 
    644     add_action( "admin_head-$hook", 'safecss_admin_head' ); 
    645     add_action( "load-revision.php", 'safecss_prettify_post_revisions' ); 
    646     add_action( "load-$hook", 'update_title' ); 
    647 } 
    648  
    649 /** 
    650  * Adds a menu item in the appearance section for this plugin's administration 
    651  * page. Also adds hooks to enqueue the CSS and JS for the admin page. 
    652  */ 
     1271    _deprecated_function( __FUNCTION__, '2.1', 'Jetpack_Custom_CSS::menu()' ); 
     1272 
     1273    return Jetpack_Custom_CSS::menu(); 
     1274} 
     1275 
    6531276function update_title() { 
    654     global $title; 
    655     $title = __( 'CSS', 'jetpack' ); 
     1277    _deprecated_function( __FUNCTION__, '2.1', 'Jetpack_Custom_CSS::update_title()' ); 
     1278 
     1279    return Jetpack_Custom_CSS::update_title(); 
    6561280} 
    6571281 
    6581282function safecss_prettify_post_revisions() { 
    659     add_filter( 'the_title', 'safecss_post_title', 10, 2 ); 
    660     add_action( 'admin_head', 'safecss_remove_title_excerpt_from_revisions' ); 
     1283    _deprecated_function( __FUNCTION__, '2.1', 'Jetpack_Custom_CSS::prettify_post_revisions()' ); 
     1284 
     1285    return Jetpack_Custom_CSS::prettify_post_revisions(); 
    6611286} 
    6621287 
    6631288function safecss_remove_title_excerpt_from_revisions() { 
    664     global $post; 
    665  
    666     if ( !$post ) { 
    667         return; 
    668     } 
    669  
    670     if ( 'safecss' != $post->post_type ) { 
    671         return; 
    672     } 
    673 ?> 
    674 <style type="text/css"> 
    675 #revision-field-post_title, #revision-field-post_excerpt { 
    676     display: none; 
    677 } 
    678 </style> 
    679 <?php 
    680 } 
     1289    _deprecated_function( __FUNCTION__, '2.1', 'Jetpack_Custom_CSS::remove_title_excerpt_from_revisions()' ); 
     1290 
     1291    return Jetpack_Custom_CSS::remove_title_excerpt_from_revisions(); 
     1292} 
     1293 
    6811294function safecss_post_title( $title, $post_id ) { 
    682     if ( !$post_id = (int) $post_id ) { 
    683         return $title; 
    684     } 
    685  
    686     if ( !$post = get_post( $post_id ) ) { 
    687         return $title; 
    688     } 
    689  
    690     if ( 'safecss' != $post->post_type ) { 
    691         return $title; 
    692     } 
    693  
    694     return __( 'Custom CSS Stylesheet', 'jetpack' ); 
     1295    _deprecated_function( __FUNCTION__, '2.1', 'Jetpack_Custom_CSS::post_title()' ); 
     1296 
     1297    return Jetpack_Custom_CSS::post_title( $title, $post_id ); 
    6951298} 
    6961299 
    6971300function safe_css_enqueue_scripts() { 
    698     wp_enqueue_script( 'postbox' ); 
    699     if ( defined('SAFECSS_USE_ACE') && SAFECSS_USE_ACE ) { 
    700         $url = plugins_url( 'custom-css/js/', __FILE__ ); 
    701         wp_enqueue_script( 'jquery.spin' ); 
    702         wp_enqueue_script( 'safecss-ace', $url . 'ace/ace.js', array(), false, true ); 
    703         wp_enqueue_script( 'safecss-ace-css', $url . 'ace/mode-css.js', array( 'safecss-ace' ), false, true ); 
    704         wp_enqueue_script( 'safecss-ace-use', $url . 'safecss-ace.js', array( 'jquery', 'safecss-ace-css' ), false, true ); 
    705     } 
     1301    _deprecated_function( __FUNCTION__, '2.1', 'Jetpack_Custom_CSS::enqueue_scripts()' ); 
     1302 
     1303    return Jetpack_Custom_CSS::enqueue_scripts(); 
     1304} 
     1305 
     1306function safecss_admin_head() { 
     1307    _deprecated_function( __FUNCTION__, '2.1', 'Jetpack_Custom_CSS::admin_head()' ); 
     1308 
     1309    return Jetpack_Custom_CSS::admin_head(); 
     1310} 
     1311 
     1312function safecss_saved() { 
     1313    _deprecated_function( __FUNCTION__, '2.1', 'Jetpack_Custom_CSS::saved_message()' ); 
     1314 
     1315    return Jetpack_Custom_CSS::saved_message(); 
     1316} 
     1317 
     1318function safecss_admin() { 
     1319    _deprecated_function( __FUNCTION__, '2.1', 'Jetpack_Custom_CSS::admin()' ); 
     1320 
     1321    return Jetpack_Custom_CSS::admin(); 
     1322} 
     1323 
     1324function custom_css_meta_box() { 
     1325    _deprecated_function( __FUNCTION__, '2.1', 'Jetpack_Custom_CSS::meta_box()' ); 
     1326 
     1327    return Jetpack_Custom_CSS::meta_box(); 
     1328} 
     1329 
     1330function custom_css_post_revisions_meta_box( $safecss_post ) { 
     1331    _deprecated_function( __FUNCTION__, '2.1', 'Jetpack_Custom_CSS::revisions_meta_box()' ); 
     1332 
     1333    return Jetpack_Custom_CSS::revisions_meta_box( $safecss_post ); 
     1334} 
     1335 
     1336function disable_safecss_style() { 
     1337    _deprecated_function( __FUNCTION__, '2.1', 'Jetpack_Custom_CSS::disable()' ); 
     1338 
     1339    return Jetpack_Custom_CSS::disable(); 
     1340} 
     1341 
     1342function custom_css_reset() { 
     1343    _deprecated_function( __FUNCTION__, '2.1', 'Jetpack_Custom_CSS::reset()' ); 
     1344 
     1345    return Jetpack_Custom_CSS::reset(); 
     1346} 
     1347 
     1348function custom_css_is_customizer_preview() { 
     1349    _deprecated_function( __FUNCTION__, '2.1', 'Jetpack_Custom_CSS::is_customizer_preview()' ); 
     1350 
     1351    return Jetpack_Custom_CSS::is_customizer_preview(); 
     1352} 
     1353 
     1354function custom_css_minify( $css, $preprocessor = '' ) { 
     1355    _deprecated_function( __FUNCTION__, '2.1', 'Jetpack_Custom_CSS::minify()' ); 
     1356 
     1357    return Jetpack_Custom_CSS::minify( $css, $preprocessor ); 
     1358} 
     1359 
     1360function custom_css_restore_revision( $_post_id, $_revision_id ) { 
     1361    _deprecated_function( __FUNCTION__, '2.1', 'Jetpack_Custom_CSS::restore_revision()' ); 
     1362 
     1363    return Jetpack_Custom_CSS::restore_revision( $_post_id, $_revision_id );; 
    7061364} 
    7071365 
     
    7111369        return; 
    7121370 
    713     require_once( 'csstidy/class.csstidy.php' ); 
     1371    require_once( dirname( __FILE__ ) . '/csstidy/class.csstidy.php' ); 
    7141372 
    7151373    class safecss extends csstidy_optimise { 
     
    7321390} 
    7331391 
    734 function safecss_admin_head() { 
    735 ?> 
    736  
    737 <style type="text/css"> 
    738 .wrap form.safecss { 
    739     margin-right: 10px; 
    740 } 
    741 .wrap textarea#safecss { 
    742     min-height: 250px; 
    743     width: 100%; 
    744 } 
    745 p.submit { 
    746     margin: 0 auto; 
    747     overflow: hidden; 
    748     padding: 5px 0 25px; 
    749     width: 65%; 
    750 } 
    751 p.submit span { 
    752     float: right; 
    753     padding-right: 1.5em; 
    754     text-align: right; 
    755 } 
    756 p.css-support { 
    757     color: #777; 
    758     font-size: 15px; 
    759     font-weight: 300; 
    760     margin: -10px 0 15px; 
    761 } 
    762 textarea#safecss { 
    763     background: #f9f9f9; 
    764     color: #444; 
    765     font-family: Consolas, Monaco, Courier, monospace; 
    766     font-size: 12px; 
    767     line-height: 16px; 
    768     outline: none; 
    769     padding: 16px; 
    770 } 
    771 #poststuff .inside p.css-settings { 
    772     margin-top: 15px; 
    773 } 
    774 #safecssform .button, 
    775 #safecssform .button-primary { 
    776     padding: 7px 12px; 
    777     margin-left: 6px; 
    778 } 
    779 <?php 
    780 if ( defined( 'SAFECSS_USE_ACE' ) && SAFECSS_USE_ACE ) : 
    781 ?> 
    782 #safecss-container { 
    783     position: relative; 
    784     width: 99.5%; 
    785     height: 400px; 
    786     border: 1px solid #dfdfdf; 
    787     border-radius: 3px; 
    788 } 
    789 #safecss-container .ace_editor { 
    790     font-family: Consolas, Monaco, Courier, monospace; 
    791 } 
    792 #safecss-ace { 
    793     width: 100%; 
    794     height: 100%; 
    795     display: none; /* Hide on load otherwise it looks weird */ 
    796 } 
    797 #safecss-ace.ace_editor { 
    798     display: block; 
    799 } 
    800 #safecss-container .ace-tm .ace_gutter { 
    801     background-color: #ededed; 
    802 } 
    803  
    804 <?php endif; // ace ?> 
    805  
    806 </style> 
    807 <script type="text/javascript"> 
    808 /*<![CDATA[*/ 
    809 var safecssResize, safecssInit; 
    810  
    811 (function($){ 
    812 var safe, win; 
    813  
    814 safecssResize = function() { 
    815     safe.height( win.height() - safe.offset().top - 250 ); 
    816 }; 
    817  
    818 safecssInit = function() { 
    819     safe = $('#safecss'); 
    820     win  = $(window); 
    821  
    822     postboxes.add_postbox_toggles('editcss'); 
    823     safecssResize(); 
    824     var button = document.getElementById('preview'); 
    825     button.onclick = function(event) { 
    826         //window.open('<?php echo add_query_arg('csspreview', 'true', get_option('home')); ?>'); 
    827 <?php 
    828 // hack for now for previewing. 
    829 // TODO: move all of this JS into its own file. 
    830 if ( defined( 'SAFECSS_USE_ACE' ) && SAFECSS_USE_ACE ) { echo "\t\taceSyncCSS();\n"; } ?> 
    831         document.forms["safecssform"].target = "csspreview"; 
    832         document.forms["safecssform"].action.value = 'preview'; 
    833         document.forms["safecssform"].submit(); 
    834         document.forms["safecssform"].target = ""; 
    835         document.forms["safecssform"].action.value = 'save'; 
    836  
    837         event = event || window.event; 
    838         if ( event.preventDefault ) event.preventDefault(); 
    839         return false; 
    840     } 
    841 }; 
    842  
    843 window.onresize = safecssResize; 
    844 addLoadEvent(safecssInit); 
    845  
    846 })(jQuery); 
    847 /*]]>*/ 
    848 </script> 
    849  
    850 <?php 
    851 } 
    852  
    853 function safecss_saved() { 
    854     echo '<div id="message" class="updated fade"><p><strong>' . __( 'Stylesheet saved.', 'jetpack' ) . '</strong></p></div>'; 
    855 } 
    856  
    857 function safecss_admin() { 
    858 ?> 
    859 <div class="wrap"> 
    860     <?php do_action( 'custom_design_header' ); ?> 
    861     <div id="poststuff" class="has-right-sidebar metabox-holder"> 
    862     <h2><?php _e( 'CSS Stylesheet Editor', 'jetpack' ); ?></h2> 
    863     <p class="css-support"><?php echo apply_filters( 'safecss_intro_text', __( 'New to CSS? Start with a <a href="http://www.htmldog.com/guides/cssbeginner/">beginner tutorial</a>. Questions? 
    864     Ask in the <a href="http://wordpress.org/support/forum/themes-and-templates">Themes and Templates forum</a>.', 'jetpack' ) ); ?></p> 
    865  
    866     <form id="safecssform" action="" method="post"> 
    867         <?php if ( defined( 'SAFECSS_USE_ACE' ) && SAFECSS_USE_ACE ) : ?> 
    868             <div id="safecss-container"> 
    869                 <div id="safecss-ace"></div> 
    870             </div> 
    871             <script type="text/javascript"> 
    872                 jQuery.fn.spin && jQuery("#safecss-container").spin( 'large' ); 
    873             </script> 
    874             <textarea id="safecss" name="safecss" class="hide-if-js"><?php echo esc_textarea( safecss() ); ?></textarea> 
    875             <div class="clear"></div> 
    876         <?php else : ?> 
    877         <p><textarea id="safecss" name="safecss"><?php echo str_replace('</textarea>', '&lt;/textarea&gt', safecss()); ?></textarea></p> 
    878         <?php endif; ?> 
    879         <p class="submit"> 
    880             <span> 
    881                 <input type="hidden" name="action" value="save" /> 
    882                 <?php wp_nonce_field( 'safecss' ) ?> 
    883                 <input type="button" class="button" id="preview" name="preview" value="<?php esc_attr_e( 'Preview', 'jetpack' ) ?>" /> 
    884                 <input type="submit" class="button-primary" id="save" name="save" value="<?php ( safecss_is_freetrial() ) ? esc_attr_e( 'Save Stylesheet &amp; Buy Upgrade', 'jetpack' ) : esc_attr_e( 'Save Stylesheet', 'jetpack' ); ?>" /> 
    885                 <?php wp_nonce_field( 'closedpostboxes', 'closedpostboxesnonce', false ); ?> 
    886             </span> 
    887         </p> 
    888  
    889         <?php add_meta_box( 'settingsdiv', __( 'CSS Settings', 'jetpack' ), 'custom_css_meta_box', 'editcss', 'normal' ); ?> 
    890  
    891         <?php 
    892         $safecss_post = get_safecss_post(); 
    893  
    894         if ( ! empty( $safecss_post ) && 0 < $safecss_post['ID'] && wp_get_post_revisions( $safecss_post['ID'] ) ) { 
    895             echo '<div id="side-info-column" class="inner-sidebar">'; 
    896             add_meta_box( 'revisionsdiv', __( 'CSS Revisions', 'jetpack' ), 'custom_css_post_revisions_meta_box', 'editcss', 'side' ); 
    897             do_meta_boxes( 'editcss', 'side', $safecss_post ); 
    898             echo '</div>'; 
    899  
    900             echo '<div id="post-body"><div id="post-body-content">'; 
    901             do_meta_boxes( 'editcss', 'normal', $safecss_post ); 
    902             echo '</div></div>'; 
    903             echo '<div class="clear"></div>'; 
    904         } else { 
    905             do_meta_boxes( 'editcss', 'normal', $safecss_post ); 
    906         } 
    907         ?> 
    908         </form> 
    909     </div> 
    910 </div> 
    911 <?php 
    912 } 
    913  
    914 /** 
    915  * Render CSS Settings metabox 
    916  * Called by `safecss_admin` 
    917  * 
    918  * @uses get_option, checked, __, get_current_theme, apply_filters, get_stylesheet_uri, _e, esc_attr, wp_get_theme 
    919  * @return string 
    920  */ 
    921 function custom_css_meta_box() { 
    922     if ( function_exists( 'wp_get_theme' ) ) { 
    923         $current_theme = wp_get_theme(); 
    924         $current_theme = $current_theme->Name; 
    925     } 
    926     else { 
    927         $current_theme = get_current_theme(); 
    928     } 
    929  
    930     $safecss_post = get_current_revision(); 
    931  
    932     ?> 
    933     <p class="css-settings"> 
    934         <label><input type="radio" name="add_to_existing" value="true" <?php checked( get_post_meta( $safecss_post['ID'], 'custom_css_add', true ) != 'no' ); ?> /> <?php printf( __( 'Add my CSS to <strong>%s&apos;s</strong> CSS stylesheet.', 'jetpack' ), $current_theme ); ?></label><br /> 
    935         <label><input type="radio" name="add_to_existing" value="false" <?php checked( get_post_meta( $safecss_post['ID'], 'custom_css_add', true ) == 'no' ); ?> /> <?php printf( __( 'Don&apos;t use <strong>%s&apos;s</strong> CSS, and replace everything with my own CSS.', 'jetpack' ), $current_theme ); ?></label> 
    936     </p> 
    937     <p><?php printf( __( '<a href="%s">View the original stylesheet</a> for the %s theme. Use this as a reference and do not copy and paste all of it into the CSS Editor.', 'jetpack' ), apply_filters( 'safecss_theme_stylesheet_url', get_stylesheet_uri() ), $current_theme ); ?></p> 
    938     <?php 
    939  
    940     $preprocessors = apply_filters( 'jetpack_custom_css_preprocessors', array() ); 
    941  
    942     if ( ! empty( $preprocessors ) ) { 
    943         ?> 
    944         <p> 
    945             <?php esc_html_e( 'Preprocessor:' ); ?> 
    946             <select name="custom_css_preprocessor"> 
    947                 <option value=""><?php esc_html_e( 'None' ); ?></option> 
    948                 <?php 
    949  
    950                 foreach ( $preprocessors as $preprocessor_key => $preprocessor ) { 
    951                     ?> 
    952                     <option value="<?php echo esc_attr( $preprocessor_key ); ?>" <?php selected( get_post_meta( $safecss_post['ID'], 'custom_css_preprocessor', true ), $preprocessor_key ); ?>><?php echo esc_html( $preprocessor['name'] ); ?></option> 
    953                     <?php 
    954                 } 
    955  
    956                 ?> 
    957             </select> 
    958         </p> 
    959         <?php 
    960  
    961     } 
    962  
    963     do_action( 'custom_css_meta_fields' ); 
    964  
    965 } 
    966  
    967 /** 
    968  * Render metabox listing CSS revisions and the themes that correspond to the revisions. 
    969  * Called by `safecss_admin` 
    970  * 
    971  * @param array $safecss_post 
    972  * @global $post 
    973  * @uses WP_Query, wp_post_revision_title, esc_html, add_query_arg, menu_page_url, wp_reset_query 
    974  * @return string 
    975  */ 
    976 function custom_css_post_revisions_meta_box( $safecss_post ) { 
    977     $max_revisions = defined( 'WP_POST_REVISIONS' ) && is_numeric( WP_POST_REVISIONS ) ? (int) WP_POST_REVISIONS : 25; 
    978     $posts_per_page = isset( $_GET['show_all_rev'] ) ? $max_revisions : 6; 
    979  
    980     $revisions = new WP_Query( array( 
    981         'posts_per_page' => $posts_per_page, 
    982         'post_type' => 'revision', 
    983         'post_status' => 'inherit', 
    984         'post_parent' => $safecss_post['ID'], 
    985         'orderby' => 'date', 
    986         'order' => 'DESC' 
    987     ) ); 
    988  
    989     if ( $revisions->have_posts() ) : ?> 
    990         <ul class="post-revisions"><?php 
    991  
    992         global $post; 
    993  
    994         while ( $revisions->have_posts() ) : 
    995             $revisions->the_post(); 
    996  
    997             ?><li> 
    998                 <?php 
    999                     echo wp_post_revision_title( $post ); 
    1000  
    1001                     if ( ! empty( $post->post_excerpt ) ) 
    1002                         echo ' (' . esc_html( $post->post_excerpt ) . ')'; 
    1003                 ?> 
    1004             </li><?php 
    1005  
    1006         endwhile; 
    1007  
    1008         ?></ul><?php 
    1009  
    1010         if ( $revisions->found_posts > 6 ) : ?> 
    1011  
    1012         <br> 
    1013         <a href="<?php echo add_query_arg( 'show_all_rev', 'true', menu_page_url( 'editcss', false ) ); ?>">Show more</a> 
    1014  
    1015         <?php endif; // "Show more" 
    1016     endif; // have_posts(); 
    1017  
    1018     wp_reset_query(); 
    1019 } 
    1020  
    1021 if ( !function_exists( 'safecss_filter_attr' ) ) { 
    1022 function safecss_filter_attr($css, $element = 'div') { 
    1023  
    1024     safecss_class(); 
    1025     $css = $element . ' {' . $css . '}'; 
    1026  
    1027     $csstidy = new csstidy(); 
    1028     $csstidy->optimise = new safecss($csstidy); 
    1029     $csstidy->set_cfg('remove_bslash', false); 
    1030     $csstidy->set_cfg('compress_colors', false); 
    1031     $csstidy->set_cfg('compress_font-weight', false); 
    1032     $csstidy->set_cfg('discard_invalid_properties', true); 
    1033     $csstidy->set_cfg('merge_selectors', false); 
    1034     $csstidy->set_cfg('remove_last_;', false); 
    1035     $csstidy->set_cfg('css_level', 'CSS3.0'); 
    1036  
    1037     $css = preg_replace('/\\\\([0-9a-fA-F]{4})/', '\\\\\\\\$1', $css); 
    1038     $css = wp_kses_split($css, array(), array()); 
    1039     $csstidy->parse($css); 
    1040  
    1041     $css = $csstidy->print->plain(); 
    1042  
    1043     $css = str_replace(array("\n","\r","\t"), '', $css); 
    1044  
    1045     preg_match("/^{$element}\s*{(.*)}\s*$/", $css, $matches); 
    1046  
    1047     if ( empty($matches[1]) ) 
    1048         return ''; 
    1049  
    1050     return $matches[1]; 
    1051 } 
    1052 } 
    1053  
    1054 // hook on init at priority 11 
    1055 function disable_safecss_style() { 
    1056     remove_action( 'wp_head', 'safecss_style', 101 ); 
    1057     remove_filter( 'stylesheet_uri', 'safecss_style_filter' ); 
    1058 } 
    1059  
    1060 /** 
    1061  * Reset all aspects of Custom CSS on a theme switch so that changing 
    1062  * themes is a sure-fire way to get a clean start. 
    1063  */ 
    1064 function custom_css_reset() { 
    1065     $safecss_post_id = save_revision( '' ); 
    1066     $safecss_revision = get_current_revision(); 
    1067  
    1068     update_option( 'safecss_rev', intval( get_option( 'safecss_rev' ) ) + 1 ); 
    1069  
    1070     update_post_meta( $safecss_post_id, 'custom_css_add', 'yes' ); 
    1071     update_post_meta( $safecss_post_id, 'content_width', false ); 
    1072     update_post_meta( $safecss_post_id, 'custom_css_preprocessor', '' ); 
    1073     update_metadata( 'post', $safecss_revision['ID'], 'custom_css_add', 'yes' ); 
    1074     update_metadata( 'post', $safecss_revision['ID'], 'content_width', false ); 
    1075     update_metadata( 'post', $safecss_revision['ID'], 'custom_css_preprocessor', '' ); 
    1076 } 
    1077  
    1078 add_action( 'switch_theme', 'custom_css_reset' ); 
    1079  
    1080 function custom_css_is_customizer_preview() { 
    1081     if ( isset ( $GLOBALS['wp_customize'] ) ) 
    1082         return ! $GLOBALS['wp_customize']->is_theme_active(); 
    1083  
    1084     return false; 
    1085 } 
    1086  
    1087 function custom_css_minify( $css, $preprocessor = '' ) { 
    1088     if ( ! $css ) 
    1089         return ''; 
    1090  
    1091     if ( $preprocessor ) { 
    1092         $preprocessors = apply_filters( 'jetpack_custom_css_preprocessors', array() ); 
    1093  
    1094         if ( isset( $preprocessors[$preprocessor] ) ) { 
    1095             $css = call_user_func( $preprocessors[$preprocessor]['callback'], $css ); 
    1096         } 
    1097     } 
    1098  
    1099     safecss_class(); 
    1100     $csstidy = new csstidy(); 
    1101     $csstidy->optimise = new safecss( $csstidy ); 
    1102  
    1103     $csstidy->set_cfg( 'remove_bslash',              false ); 
    1104     $csstidy->set_cfg( 'compress_colors',            true ); 
    1105     $csstidy->set_cfg( 'compress_font-weight',       true ); 
    1106     $csstidy->set_cfg( 'remove_last_;',              true ); 
    1107     $csstidy->set_cfg( 'case_properties',            true ); 
    1108     $csstidy->set_cfg( 'discard_invalid_properties', true ); 
    1109     $csstidy->set_cfg( 'css_level',                  'CSS3.0' ); 
    1110     $csstidy->set_cfg( 'template', 'highest'); 
    1111     $csstidy->parse( $css ); 
    1112  
    1113     return $csstidy->print->plain(); 
    1114 } 
    1115  
    1116 /** 
    1117  * When restoring a SafeCSS post revision, also copy over the 
    1118  * content_width and custom_css_add post metadata. 
    1119  */ 
    1120 function custom_css_restore_revision( $_post_id, $_revision_id ) { 
    1121     $_post = get_post( $_post_id ); 
    1122  
    1123     if ( 'safecss' != $_post->post_type ) 
    1124         return; 
    1125  
    1126     $safecss_revision = get_current_revision(); 
    1127  
    1128     $content_width = get_post_meta( $_revision_id, 'content_width', true ); 
    1129     $custom_css_add = get_post_meta( $_revision_id, 'custom_css_add', true ); 
    1130     $preprocessor = get_post_meta( $_revision_id, 'custom_css_preprocessor', true ); 
    1131  
    1132     update_metadata( 'post', $safecss_revision['ID'], 'content_width', $content_width ); 
    1133     update_metadata( 'post', $safecss_revision['ID'], 'custom_css_add', $custom_css_add ); 
    1134     update_metadata( 'post', $safecss_revision['ID'], 'custom_css_preprocessor', $preprocessor ); 
    1135     update_post_meta( $_post->ID, 'content_width', $content_width ); 
    1136     update_post_meta( $_post->ID, 'custom_css_add', $custom_css_add ); 
    1137     update_post_meta( $_post->ID, 'custom_css_preprocessor', $preprocessor ); 
    1138 } 
    1139  
    1140 add_action( 'wp_restore_post_revision', 'custom_css_restore_revision', 10, 2 ); 
     1392if ( ! function_exists( 'safecss_filter_attr' ) ) { 
     1393    function safecss_filter_attr( $css, $element = 'div' ) { 
     1394        return Jetpack_Safe_CSS::filter_attr( $css, $element ); 
     1395    } 
     1396} 
     1397 
     1398add_action( 'init', array( 'Jetpack_Custom_CSS', 'init' ) ); 
    11411399 
    11421400include dirname( __FILE__ ) . '/custom-css/preprocessors.php'; 
  • jetpack/trunk/modules/custom-css/custom-css/js/safecss-ace.js

    r602072 r634121  
    5151    // syntaxy goodness. 
    5252    else { 
     53        $( '#safecss-ace, #safecss-container' ).css( 'height',  
     54            $( window ).height() - $( '#safecss-container' ).offset().top - $( '#wpadminbar' ).height() 
     55        ); 
     56 
    5357        $(global).load(loadAce); 
    5458    } 
Note: See TracChangeset for help on using the changeset viewer.