WordPress.org

Make WordPress Core

Ticket #17902: 17902.2.patch

File 17902.2.patch, 16.5 KB (added by kurtpayne, 6 years ago)

Fixed patch, removed EOL property changes

  • wp-admin/plugin-install.php

     
    66 * @subpackage Administration
    77 */
    88// TODO route this pages via a specific iframe handler instead of the do_action below
    9 if ( !defined( 'IFRAME_REQUEST' ) && isset( $_GET['tab'] ) && ( 'plugin-information' == $_GET['tab'] ) )
     9if ( !defined( 'IFRAME_REQUEST' ) && isset( $_GET['tab'] ) && ( in_array( $_GET['tab'], array( 'plugin-information', 'plugin-readme' ) ) ) )
    1010        define( 'IFRAME_REQUEST', true );
    1111
    1212/** WordPress Administration Bootstrap */
     
    2828$parent_file = 'plugins.php';
    2929
    3030wp_enqueue_script( 'plugin-install' );
    31 if ( 'plugin-information' != $tab )
     31if ( !in_array( $tab, array('plugin-information', 'plugin-readme') ) )
    3232        add_thickbox();
    3333
    3434$body_id = $tab;
  • wp-admin/css/colors-classic.dev.css

     
    583583}
    584584
    585585div#media-upload-header,
    586 div#plugin-information-header {
     586div#plugin-information-header,
     587div#plugin-readme-header {
    587588        background-color: #f9f9f9;
    588589        border-bottom-color: #dfdfdf;
    589590}
     
    17251726        border-right: 1px solid #fff;
    17261727}
    17271728
    1728 #plugin-information .fyi ul {
     1729#plugin-information .fyi ul,
     1730#plugin-readme .fyi ul {
    17291731        background-color: #eaf3fa;
    17301732}
    17311733
    1732 #plugin-information .fyi h2.mainheader {
     1734#plugin-information .fyi h2.mainheader,
     1735#plugin-readme .fyi h2.mainheader {
    17331736        background-color: #cee1ef;
    17341737}
    17351738
    17361739#plugin-information pre,
    1737 #plugin-information code {
     1740#plugin-information code,
     1741#plugin-readme pre,
     1742#plugin-readme code {
    17381743        background-color: #ededff;
    17391744}
    17401745
    1741 #plugin-information pre {
     1746#plugin-information pre,
     1747#plugin-readme pre {
    17421748        border: 1px solid #ccc;
    17431749}
    17441750
  • wp-admin/css/colors-fresh.dev.css

     
    591591}
    592592
    593593div#media-upload-header,
    594 div#plugin-information-header {
     594div#plugin-information-header,
     595div#plugin-readme-header {
    595596        background-color: #f9f9f9;
    596597        border-bottom-color: #dfdfdf;
    597598}
     
    13601361        border-right: 1px solid #f9f9f9;
    13611362}
    13621363
    1363 #plugin-information .fyi ul {
     1364#plugin-information .fyi ul,
     1365#plugin-readme .fyi ul {
    13641366        background-color: #eaf3fa;
    13651367}
    13661368
    1367 #plugin-information .fyi h2.mainheader {
     1369#plugin-information .fyi h2.mainheader,
     1370#plugin-readme .fyi h2.mainheader {
    13681371        background-color: #cee1ef;
    13691372}
    13701373
    13711374#plugin-information pre,
    1372 #plugin-information code {
     1375#plugin-information code,
     1376#plugin-readme pre,
     1377#plugin-readme code {
    13731378        background-color: #ededff;
    13741379}
    13751380
    1376 #plugin-information pre {
     1381#plugin-information pre,
     1382#plugin-readme pre {
    13771383        border: 1px solid #ccc;
    13781384}
    13791385
  • wp-admin/css/wp-admin-rtl.dev.css

     
    21592159        left: 0;
    21602160}
    21612161
    2162 #plugin-information ul#sidemenu {
     2162#plugin-information ul#sidemenu,
     2163#plugin-readme ul#sidemenu {
    21632164        left: auto;
    21642165        right: 0;
    21652166}
    21662167
    2167 #plugin-information h2 {
     2168#plugin-information h2,
     2169#plugin-readme h2 {
    21682170        margin-right: 0;
    21692171        margin-left: 200px;
    21702172}
    21712173
    2172 #plugin-information .fyi {
     2174#plugin-information .fyi,
     2175#plugin-readme .fyi {
    21732176        margin-left: 5px;
    21742177        margin-right: 20px;
    21752178}
    21762179
    2177 #plugin-information .fyi h2 {
     2180#plugin-information .fyi h2,
     2181#plugin-readme .fyi h2 {
    21782182        margin-left: 0;
    21792183}
    21802184
    2181 #plugin-information .fyi ul {
     2185#plugin-information .fyi ul,
     2186#plugin-readme .fyi ul {
    21822187        padding: 10px 7px 10px 5px;
    21832188}
    21842189
     
    21892194
    21902195#plugin-information #section-screenshots ol,
    21912196#plugin-information .updated,
    2192 #plugin-information pre {
     2197#plugin-information pre,
     2198#plugin-readme .updated,
     2199#plugin-readme pre {
    21932200        margin-right: 0;
    21942201        margin-left: 215px;
    21952202}
    21962203
    21972204#plugin-information .updated,
    2198 #plugin-information .error {
     2205#plugin-information .error,
     2206#plugin-readme .updated,
     2207#plugin-readme .error {
    21992208        clear: none;
    22002209        direction: rtl;
    22012210}
  • wp-admin/css/wp-admin.dev.css

     
    68526852}
    68536853
    68546854/* Header on thickbox */
    6855 #plugin-information-header {
     6855#plugin-information-header,
     6856#plugin-readme-header {
    68566857        margin: 0;
    68576858        padding: 0 5px;
    68586859        font-weight: bold;
     
    68616862        border-bottom-style: solid;
    68626863        height: 2.5em;
    68636864}
    6864 #plugin-information ul#sidemenu {
     6865#plugin-information ul#sidemenu,
     6866#plugin-readme ul#sidemenu {
    68656867        font-weight: normal;
    68666868        margin: 0 5px;
    68676869        position: absolute;
     
    68896891        line-height: 2em;
    68906892}
    68916893
    6892 #plugin-information h2 {
     6894#plugin-information h2,
     6895#plugin-readme h2 {
    68936896        clear: none !important;
    68946897        margin-right: 200px;
    68956898}
    68966899
    6897 #plugin-information .fyi {
     6900#plugin-information .fyi,
     6901#plugin-readme .fyi {
    68986902        margin: 0 10px 50px;
    68996903        width: 210px;
    69006904}
    69016905
    6902 #plugin-information .fyi h2 {
     6906#plugin-information .fyi h2,
     6907#plugin-readme .fyi h2 {
    69036908        font-size: 0.9em;
    69046909        margin-bottom: 0;
    69056910        margin-right: 0;
    69066911}
    69076912
    6908 #plugin-information .fyi h2.mainheader {
     6913#plugin-information .fyi h2.mainheader,
     6914#plugin-readme .fyi h2.mainheader {
    69096915        padding: 5px;
    69106916        -webkit-border-top-left-radius: 3px;
    69116917        border-top-left-radius: 3px;
    69126918}
    69136919
     6920#plugin-readme .fyi ul,
    69146921#plugin-information .fyi ul {
    69156922        padding: 10px 5px 10px 7px;
    69166923        margin: 0;
     
    69196926        border-bottom-left-radius: 3px;
    69206927}
    69216928
    6922 #plugin-information .fyi li {
     6929#plugin-information .fyi li,
     6930#plugin-readme .fyi li {
    69236931        margin-right: 0;
    69246932}
    69256933
    6926 #plugin-information #section-holder {
     6934#plugin-information #section-holder,
     6935#plugin-readme #section-holder {
    69276936        padding: 10px;
    69286937}
    69296938
    69306939#plugin-information .section ul,
    6931 #plugin-information .section ol {
     6940#plugin-information .section ol,
     6941#plugin-readme .section ul,
     6942#plugin-readme .section ol {
    69326943        margin-left: 16px;
    69336944        list-style-type: square;
    69346945        list-style-image: none;
     
    69546965
    69556966#plugin-information #section-screenshots ol,
    69566967#plugin-information .updated,
    6957 #plugin-information pre {
     6968#plugin-information pre,
     6969#plugin-readme .updated,
     6970#plugin-readme pre {
    69586971        margin-right: 215px;
    69596972}
    69606973
    6961 #plugin-information pre {
     6974#plugin-information pre,
     6975#plugin-readme pre {
    69626976        padding: 7px;
    69636977        overflow: auto;
    69646978}
  • wp-admin/includes/class-wp-plugin-install-list-table.php

     
    3434                $tabs['popular']  = _x( 'Popular','Plugin Installer' );
    3535                $tabs['new']      = _x( 'Newest','Plugin Installer' );
    3636
    37                 $nonmenu_tabs = array( 'plugin-information' ); //Valid actions to perform which do not have a Menu item.
     37                $nonmenu_tabs = array( 'plugin-information', 'plugin-readme' ); //Valid actions to perform which do not have a Menu item.
    3838
    3939                $tabs = apply_filters( 'install_plugins_tabs', $tabs );
    4040                $nonmenu_tabs = apply_filters( 'install_plugins_nonmenu_tabs', $nonmenu_tabs );
  • wp-admin/includes/class-wp-plugins-list-table.php

     
    427427                                                        $author = '<a href="' . $plugin_data['AuthorURI'] . '" title="' . esc_attr__( 'Visit author homepage' ) . '">' . $plugin_data['Author'] . '</a>';
    428428                                                $plugin_meta[] = sprintf( __( 'By %s' ), $author );
    429429                                        }
     430                                        $slug = basename( $plugin_file, '.php' );
     431                                        $plugin_meta[] = '<a href="' . self_admin_url( 'plugin-install.php?tab=plugin-readme&amp;readme=true&amp;plugin=' . $slug .
     432                                                                '&amp;TB_iframe=true&amp;width=600&amp;height=550' ) . '" class="thickbox" title="' .
     433                                                                esc_attr( sprintf( __( 'More information about %s' ), "{$plugin_data['Name']} {$plugin_data['Version']}" ) ) . '">' . __( 'Details' ) . '</a>';
    430434                                        if ( ! empty( $plugin_data['PluginURI'] ) )
    431435                                                $plugin_meta[] = '<a href="' . $plugin_data['PluginURI'] . '" title="' . esc_attr__( 'Visit plugin site' ) . '">' . __( 'Visit plugin site' ) . '</a>';
    432436
  • wp-admin/includes/plugin-install.php

     
    384384        exit;
    385385}
    386386add_action('install_plugins_pre_plugin-information', 'install_plugin_information');
     387
     388/**
     389 * Get information from a plugin locally
     390 * @param string $slug
     391 * @since 3.4.0
     392 */
     393function local_plugin_api( $slug ) {
     394
     395        // Try to find the plugin file from the slug
     396        $plugin_data = array();
     397        if ( file_exists( ABSPATH . PLUGINDIR . "/$slug.php" ) ) {
     398                $plugin_data = get_plugin_data( ABSPATH . PLUGINDIR . "/$slug.php" );
     399        } elseif ( file_exists( ABSPATH . PLUGINDIR . "/$slug/$slug.php" ) ) {
     400                $plugin_data = get_plugin_data( ABSPATH . PLUGINDIR . "/$slug/$slug.php" );
     401        }
     402       
     403        // Try to load data from readme.txt
     404        $readme_data = false;
     405        if ( file_exists( ABSPATH . PLUGINDIR . "/$slug/readme.txt" ) ) {
     406
     407                // Get markddown library, turn off plugin functionality
     408                if ( !defined( 'MARKDOWN_WP_POSTS' ) )
     409                        define( 'MARKDOWN_WP_POSTS', false );
     410                if ( !defined( 'MARKDOWN_WP_COMMENTS' ) )
     411                        define( 'MARKDOWN_WP_COMMENTS', false );
     412                if ( !class_exists( 'Markdown_Parser' ) )
     413                        include_once( ABSPATH . 'wp-admin/includes/markdown.php' );
     414               
     415                include_once( ABSPATH . 'wp-admin/includes/class-wp-plugin-readme-parser.php' );
     416                $readme_parser = new wp_plugin_readme_parser();
     417                $readme_data = $readme_parser->parse_readme_file( ABSPATH . PLUGINDIR . "/$slug/readme.txt" );
     418        }
     419       
     420        // If there's no readme (e.g. hello.php) create a fake structure
     421        if ( empty( $readme_data ) ) {
     422                $readme_data = array(
     423                        'contributors'      => '',
     424                        'requires_at_least' => '',
     425                        'tested_up_to'      => '',
     426                        'tags'              => array(),
     427                        'sections'          => array(
     428                                'description'   => !empty( $plugin_data['Description'] ) ? $plugin_data['Description'] : ''
     429                        )
     430                );
     431        }
     432
     433        // Convert to an API-style response
     434        $api = array(
     435                'name'           => !empty( $plugin_data['Name'] ) ? $plugin_data['Name'] : $slug,
     436                'slug'           => $slug,
     437                'version'        => !empty( $plugin_data['Version'] ) ? $plugin_data['Version'] : '',
     438                'author'         => !empty( $plugin_data['AuthorName'] ) ? $plugin_data['AuthorName'] : '',
     439                'author_profile' => null,
     440                'contributors'   => $readme_data['contributors'],
     441                'requires'       => $readme_data['requires_at_least'],
     442                'tested'         => $readme_data['tested_up_to'],
     443                'compatibility'  => null,
     444                'rating'         => null,
     445                'num_ratings'    => null,
     446                'downloaded'     => null,
     447                'last_updated'   => null,
     448                'added'          => null,
     449                'homepage'       => !empty( $plugin_data['PluginURI'] ) ? $plugin_data['PluginURI'] : '',
     450                'sections'       => $readme_data['sections'],
     451                'download_link'  => null,
     452                'tags'           => $readme_data['tags']
     453        );
     454
     455        // Done
     456        return (object) $api;
     457}
     458
     459/**
     460 * Display local plugin information in dialog box form.
     461 * Pull from the readme.txt file and the plugin header
     462 * @since 3.4.0
     463 */
     464function plugin_readme_information() {
     465        global $tab;
     466
     467        $api = local_plugin_api( stripslashes( $_REQUEST['plugin'] ) );
     468
     469        if ( is_wp_error($api) )
     470                wp_die($api);
     471
     472        $plugins_allowedtags = array(
     473                'a'    => array(
     474                        'href'   => array(),
     475                        'title'  => array(),
     476                        'target' => array()
     477                ),
     478                'abbr' => array(
     479                        'title' => array()
     480                ),
     481                'acronym' => array(
     482                        'title' => array()
     483                ),
     484                'code'   => array(),
     485                'pre'    => array(),
     486                'em'     => array(),
     487                'strong' => array(),
     488                'div'    => array(),
     489                'p'      => array(),
     490                'ul'     => array(),
     491                'ol'     => array(),
     492                'li'     => array(),
     493                'h1'     => array(),
     494                'h2'     => array(),
     495                'h3'     => array(),
     496                'h4'     => array(),
     497                'h5'     => array(),
     498                'h6'     => array(),
     499                'img'    => array(
     500                        'src'   => array(),
     501                        'class' => array(),
     502                        'alt'   => array()
     503                )
     504        );
     505
     506        $plugins_section_titles = array(
     507                'description'  => _x('Description',  'Plugin installer section title'),
     508                'installation' => _x('Installation', 'Plugin installer section title'),
     509                'faq'          => _x('FAQ',          'Plugin installer section title'),
     510                'changelog'    => _x('Changelog',    'Plugin installer section title'),
     511                'other_notes'  => _x('Other Notes',  'Plugin installer section title')
     512        );
     513
     514        // No screenshots at this time
     515        if ( !empty( $api->sections['screenshots'] ) )
     516                unset( $api->sections['screenshots'] );
     517       
     518        // Sanitize HTML
     519        foreach ( (array)$api->sections as $section_name => $content )
     520                $api->sections[$section_name] = wp_kses( $content, $plugins_allowedtags );
     521        foreach ( array( 'version', 'author', 'requires', 'tested', 'homepage', 'downloaded', 'slug' ) as $key ) {
     522                if ( isset( $api->$key ) )
     523                        $api->$key = wp_kses( $api->$key, $plugins_allowedtags );
     524        }
     525
     526        // Default to the Description tab, Do not translate, API returns English.
     527        $section = isset( $_REQUEST['section'] ) ? stripslashes( $_REQUEST['section'] ) : 'description';
     528        if ( empty($section) || ! isset($api->sections[ $section ]) )
     529                $section = array_shift( $section_titles = array_keys((array)$api->sections) );
     530
     531        iframe_header( __( 'Plugin Details' ) );
     532        ?>
     533        <div id="<?php echo $tab; ?>-header">
     534                <ul id="sidemenu">
     535                        <?php foreach ( (array) $api->sections as $section_name => $content ) : ?>
     536                                <?php                           
     537                                        if ( isset( $plugins_section_titles[ $section_name ] ) )
     538                                                $title = $plugins_section_titles[ $section_name ];
     539                                        else
     540                                                $title = ucwords( str_replace( '_', ' ', $section_name ) );
     541
     542                                        $class = ( $section_name == $section ) ? ' class="current"' : '';
     543                                        $href = add_query_arg( array('tab' => $tab, 'section' => $section_name) );
     544                                        $href = esc_url($href);
     545                                        $san_section = esc_attr( $section_name );
     546                                ?>
     547                                <li><a name="<?php echo $san_section; ?>" href="<?php echo $href; ?>" <?php echo $class; ?>><?php echo $title; ?></a></li>
     548                        <?php endforeach ; ?>
     549                </ul>
     550        </div>
     551        <div class="alignright fyi">
     552                <h2 class="mainheader"><?php /* translators: For Your Information */ _e('FYI') ?></h2>
     553                <ul>
     554                        <?php if ( !empty( $api->version ) ) : ?>
     555                                <li><strong><?php _e('Version:') ?></strong> <?php echo $api->version ?></li>
     556                        <?php endif; ?>
     557                        <?php if ( !empty( $api->author ) ) : ?>
     558                                <li><strong><?php _e('Author:') ?></strong> <?php echo $api->author ?></li>
     559                        <?php endif; ?>
     560                        <?php if ( !empty( $api->requires ) ) : ?>
     561                                <li><strong><?php _e('Requires WordPress Version:') ?></strong> <?php printf(__('%s or higher'), $api->requires) ?></li>
     562                        <?php endif; ?>
     563                        <?php if ( !empty( $api->tested ) ) : ?>
     564                                <li><strong><?php _e('Compatible up to:') ?></strong> <?php echo $api->tested ?></li>
     565                        <?php endif; ?>         
     566                        <?php if ( !empty( $api->homepage ) ) : ?>
     567                                <li><a target="_blank" href="<?php echo $api->homepage ?>"><?php _e('Plugin Homepage &#187;') ?></a></li>
     568                        <?php endif; ?>
     569                </ul>
     570        </div>
     571        <div id="section-holder" class="wrap">
     572        <?php
     573                if ( !empty( $api->tested ) && version_compare( substr( $GLOBALS['wp_version'], 0, strlen( $api->tested ) ), $api->tested, '>' ) )
     574                        echo '<div class="updated"><p>' . __('<strong>Warning:</strong> This plugin has <strong>not been tested</strong> with your current version of WordPress.') . '</p></div>';
     575
     576                elseif ( !empty( $api->requires ) && version_compare( substr( $GLOBALS['wp_version'], 0, strlen( $api->requires ) ), $api->requires, '<' ) )
     577                        echo '<div class="updated"><p>' . __('<strong>Warning:</strong> This plugin has <strong>not been marked as compatible</strong> with your version of WordPress.') . '</p></div>';
     578
     579                foreach ( (array) $api->sections as $section_name => $content ) {
     580                        if ( isset( $plugins_section_titles[ $section_name ] ) )
     581                                $title = $plugins_section_titles[ $section_name ];
     582                        else
     583                                $title = ucwords( str_replace( '_', ' ', $section_name ) );
     584
     585                        $content = links_add_target($content, '_blank');
     586                        $san_section = esc_attr( $section_name );
     587                        $display = ( $section_name == $section ) ? 'block' : 'none';
     588                        ?>
     589                        <div id="section-<?php echo $san_section; ?>" class="section" style="display: <?php echo $display; ?>;">
     590                                <h2 class="long-header"><?php echo $title; ?></h2>
     591                                <?php echo $content; ?>
     592                        </div>
     593                        <?php
     594                }
     595        echo "</div>\n";
     596        iframe_footer();
     597        exit;
     598}
     599add_action('install_plugins_pre_plugin-readme', 'plugin_readme_information');