Making WordPress.org

Changeset 1489


Ignore:
Timestamp:
04/20/2015 02:17:13 AM (11 years ago)
Author:
dd32
Message:

Theme Directory: Morph the Theme directory theme into a API front-end rather than a WordPress Theme.
This commit alters the directory to only rely upon the WordPress Query Vars, it doesn't actually use the WordPress posts query to get it's posts, rather it pulls it directly from the API.
This is part of the process of bringing the Theme Directory to rosetta/locallised sites, where the theme data won't live in the localised sites database.

Location:
sites/trunk/wordpress.org/public_html/wp-content
Files:
1 added
2 deleted
9 edited
2 copied

Legend:

Unmodified
Added
Removed
  • sites/trunk/wordpress.org/public_html/wp-content/plugins/theme-directory/theme-directory.php

    r1479 r1489  
    7474            'supports'            => array( 'title', 'editor', 'author', 'custom-fields', 'page-attributes' ),
    7575            'taxonomies'          => array( 'category', 'post_tag', 'type' ),
    76             'public'              => true,
     76            'public'              => false,
    7777            'show_in_nav_menus'   => false,
    7878            'has_archive'         => true,
     
    116116
    117117/**
    118  * Adjusts query to account for custom views.
    119  *
    120  * @param WP_Query $wp_query
    121  * @return WP_Query
    122  */
    123 function wporg_themes_set_up_query( $wp_query ) {
    124     if ( is_admin() || in_array( $wp_query->get( 'pagename' ), array( 'upload', 'commercial', 'getting-started' ) ) || in_array( $wp_query->get( 'post_type' ), array( 'nav_menu_item', 'theme_shop' ) ) ) {
    125         return $wp_query;
    126     }
    127 
    128     $wp_query->set( 'post_type', 'repopackage' );
    129 
    130     if ( $wp_query->is_home() && ! $wp_query->get( 'browse' ) ) {
    131         $wp_query->set( 'browse', 'featured' );
    132     }
    133 
    134     if ( $wp_query->get( 'browse' ) ) {
    135         switch ( $wp_query->get( 'browse' ) ) {
    136             case 'featured':
    137                 $wp_query->set( 'paged', 1 );
    138                 $wp_query->set( 'posts_per_page', 15 );
    139                 $wp_query->set( 'post__in', (array) wp_cache_get( 'browse-featured', 'theme-info' ) );
    140                 break;
    141 
    142             case 'popular':
    143                 add_filter( 'posts_clauses', 'wporg_themes_popular_posts_clauses' );
    144                 break;
    145 
    146             case 'new':
    147                 // Nothing to do here.
    148                 break;
    149 
    150         }
    151 
    152         // Only return themes that were updated in the last two years for all 'browse' requests.
    153         $wp_query->set( 'date_query', array(
    154             array(
    155                 'column' => 'post_modified_gmt',
    156                 'after'  => '-2 years',
    157             ),
    158         ) );
    159 
    160     }
    161 
    162     return $wp_query;
    163 }
    164 add_filter( 'pre_get_posts', 'wporg_themes_set_up_query' );
    165 
    166 /**
    167118 * Filter the permalink for the Packages to be /post_name/
    168119 *
     
    179130}
    180131add_filter( 'post_type_link', 'wporg_themes_package_link', 10, 2 );
    181 
    182 /**
    183  * Adjusts the amount of found posts when browsing featured themes.
    184  *
    185  * @param string   $found_posts
    186  * @param WP_Query $wp_query
    187  * @return string
    188  */
    189 function wporg_themes_found_posts( $found_posts, $wp_query ) {
    190     if ( $wp_query->is_main_query() && 'featured' === $wp_query->get( 'browse' ) ) {
    191         $found_posts = $wp_query->get( 'posts_per_page' );
    192     }
    193 
    194     return $found_posts;
    195 }
    196 add_filter( 'found_posts', 'wporg_themes_found_posts', 10, 2 );
    197 
    198 /**
    199  * Filters SQL clauses, to set up a query for the most popular themes based on downloads.
    200  *
    201  * @param array $clauses
    202  * @return array
    203  */
    204 function wporg_themes_popular_posts_clauses( $clauses ) {
    205     global $wpdb;
    206 
    207     $week = gmdate( 'Y-m-d', strtotime( 'last week' ) );
    208     $clauses['where']  .= " AND s.stamp >= '{$week}'";
    209     $clauses['groupby'] = "{$wpdb->posts}.ID";
    210     $clauses['join']    = "JOIN bb_themes_stats AS s ON ( {$wpdb->posts}.post_name = s.slug )";
    211     $clauses['orderby'] = 'week_downloads DESC';
    212     $clauses['fields'] .= ', SUM(s.downloads) AS week_downloads';
    213 
    214     return $clauses;
    215 }
    216132
    217133/**
     
    611527 * @return array
    612528 */
    613 function wporg_themes_prepare_themes_for_js() {
    614     global $wp_query;
    615 
    616     include_once API_WPORGPATH . 'themes/info/1.0/class-themes-api.php';
    617     $api = new Themes_API( 'get_result' );
    618     $api->fields = array_merge( $api->fields, array(
    619         'description'        => true,
    620         'sections'           => false,
    621         'tested'             => true,
    622         'requires'           => true,
    623         'rating'             => true,
    624         'ratings'            => true,
    625         'downloaded'         => true,
    626         'downloadlink'       => true,
    627         'last_updated'       => true,
    628         'homepage'           => true,
    629         'tags'               => true,
    630         'num_ratings'        => true,
    631         'parent'             => true,
    632         'theme_url'          => true,
    633         'extended_author'    => true,
    634         'photon_screenshots' => true,
    635     ) );
    636 
    637     $themes = array_map( array( $api, 'fill_theme' ), $wp_query->posts );
     529function wporg_themes_get_themes_for_query() {
     530    static $result = null;
     531    if ( $result ) {
     532        return $result;
     533    }
    638534
    639535    $request = array();
    640536    if ( get_query_var( 'browse' ) ) {
    641537        $request['browse'] = get_query_var( 'browse' );
    642     } else if ( $wp_query->is_tag() ) {
     538
     539    } else if ( get_query_var( 'tag' ) ) {
    643540        $request['tag'] = (array) explode( '+', get_query_var( 'tag' ) );
    644     }
    645     else if ( $wp_query->is_search() ) {
     541
     542    } else if ( get_query_var( 's' ) ) {
    646543        $request['search'] = get_query_var( 's' );
    647     }
    648     else if ( $wp_query->is_author() ) {
     544
     545    } else if ( get_query_var( 'author' ) ) {
    649546        $request['author'] = get_user_by( 'id', get_query_var( 'author' ) )->user_nicename;
    650     }
    651     else if ( $wp_query->is_singular( 'repopackage' ) ) {
    652         $request['theme'] = get_query_var( 'name' );
    653     }
    654 
    655     return array(
    656         'themes'  => $themes,
     547
     548    } else if ( get_query_var( 'name' ) || get_query_var( 'pagename' ) ) {
     549        $request['theme'] = basename( get_query_var( 'name' ) ?: get_query_var( 'pagename' ) );
     550    }
     551
     552    if ( get_query_var( 'paged' ) ) {
     553        $request['page'] = (int)get_query_var( 'paged' );
     554    }
     555
     556    if ( empty( $request ) ) {
     557        $request['browse'] = 'featured';
     558    }
     559
     560    $request['fields'] = array(
     561        'description' => true,
     562        'sections' => false,
     563        'tested' => true,
     564        'requires' => true,
     565        'downloaded' => true,
     566        'downloadlink' => true,
     567        'last_updated' => true,
     568        'homepage' => true,
     569        'theme_url' => true,
     570        'parent' => true,
     571        'tags' => true,
     572        'rating' => true,
     573        'ratings' => true,
     574        'num_ratings' => true,
     575        'extended_author' => true,
     576        'photon_screenshots' => true,
     577    );
     578
     579    $api_result = wporg_themes_query_api( 'query_themes', $request );
     580
     581    unset( $request['fields'] );
     582
     583    return $result = array(
     584        'themes'  => $api_result->themes,
    657585        'request' => $request,
    658         'total'   => (int) $wp_query->found_posts,
     586        'total'   => (int) $api_result->info['results'],
     587        'pages'   => (int) $api_result->info['pages'],
    659588    );
     589}
     590function wporg_themes_prepare_themes_for_js() {
     591    return wporg_themes_get_themes_for_query();
    660592}
    661593
  • sites/trunk/wordpress.org/public_html/wp-content/themes/pub/wporg-themes/functions.php

    r1477 r1489  
    1919    load_theme_textdomain( 'wporg-themes' );
    2020
    21     add_theme_support( 'automatic-feed-links' );
    22 
    2321    add_theme_support( 'html5', array(
    2422        'search-form', 'comment-form', 'comment-list', 'gallery', 'caption'
    2523    ) );
    2624
    27     add_filter('redirect_canonical','__return_false');
     25    // No need for canonical lookups
     26    remove_action( 'template_redirect', 'redirect_canonical' );
     27    remove_action( 'template_redirect', 'wp_old_slug_redirect' );
    2828}
    2929add_action( 'after_setup_theme', 'wporg_themes_setup' );
     
    4545    if ( ! is_singular( 'page' ) ) {
    4646        wp_enqueue_script( 'google-jsapi', '//www.google.com/jsapi', array( 'jquery' ), null, true );
    47         wp_enqueue_script( 'wporg-theme', get_template_directory_uri() . "/js/theme{$suffix}.js", array( 'wp-backbone' ), '1', true );
     47        wp_enqueue_script( 'wporg-theme', get_template_directory_uri() . "/js/theme{$suffix}.js", array( 'wp-backbone' ), '2', true );
    4848
    4949        wp_localize_script( 'wporg-theme', '_wpThemeSettings', array(
    5050            'themes'   => false,
    51             'query'    => wporg_themes_prepare_themes_for_js(),
     51            'query'    => wporg_themes_get_themes_for_query(),
    5252            'settings' => array(
    5353                'title'        => __( 'WordPress › %s « Free WordPress Themes', 'wporg-themes' ),
    5454                'isMobile'     => wp_is_mobile(),
    55                 'postsPerPage' => get_option( 'posts_per_page', 15 ),
     55                'postsPerPage' => 24,
    5656                'path'         => trailingslashit( parse_url( home_url(), PHP_URL_PATH ) ),
    5757            ),
     
    7474    // No Jetpack styles needed.
    7575    add_filter( 'jetpack_implode_frontend_css', '__return_false' );
     76
     77    // No dashicons needed.
     78    wp_deregister_style( 'dashicons' );
     79    wp_register_style( 'dashicons', '' );
    7680}
    7781add_action( 'wp_enqueue_scripts', 'wporg_themes_scripts' );
     
    8892 */
    8993function wporg_themes_body_class( $classes ) {
    90     if ( is_singular( 'repopackage' ) ) {
     94
     95    if ( ! is_page() && get_query_var( 'name' ) && ! is_404() ) {
    9196        $classes[] = 'modal-open';
    9297    }
     
    101106
    102107/**
    103  * Create a nicely formatted and more specific title element text for output
    104  * in head of document, based on current view.
    105  *
    106  * @global int $paged WordPress archive pagination page count.
    107  * @global int $page  WordPress paginated post page count.
    108  *
    109  * @param string $title Default title text for current view.
    110  * @param string $sep Optional separator.
    111  * @return string The filtered title.
     108 * Prevent the default posts queries running, allowing pages to bypass
     109 * We do this as the themes are pulled from an API.
    112110 */
    113 function wporg_themes_wp_title( $title, $sep ) {
    114     global $paged, $page;
     111function wporg_themes_prevent_posts_query( $query, $wp_query ) {
     112    if ( is_admin() || ! $wp_query->is_main_query() || $wp_query->get( 'pagename' ) ) {
     113        return $query;
     114    }
     115    $wp_query->set( 'no_found_rows', true );
     116    return ''; // Don't make a query
     117}
     118add_filter( 'posts_request', 'wporg_themes_prevent_posts_query', 10, 2 );
    115119
    116     if ( is_feed() ) {
    117         return $title;
     120/**
     121 * Prevent 404 responses when we've got a theme via the API.
     122 */
     123function wporg_themes_prevent_404() {
     124    global $wp_query;
     125    if ( ! is_404() ) {
     126        return;
    118127    }
     128    $themes = wporg_themes_get_themes_for_query();
     129    if ( $themes['total'] ) {
     130        $wp_query->is_404 = false;
     131        status_header( 200 );
     132    }
     133}
     134add_filter( 'template_redirect', 'wporg_themes_prevent_404' );
    119135
    120     // Add the site name.
    121     $title .= get_bloginfo( 'name', 'display' );
    122 
    123     // Add the site description for the home/front page.
    124     $site_description = get_bloginfo( 'description', 'display' );
    125     if ( $site_description && ( is_home() || is_front_page() ) ) {
    126         $title = "$title $sep $site_description";
     136/**
     137 * Overrides feeds to use a custom RSS2 feed which contains the current requests themes.
     138 */
     139function wporg_themes_custom_feed() {
     140    if ( ! is_feed() ) {
     141        return;
    127142    }
    128 
    129     // Add a page number if necessary.
    130     if ( ( $paged >= 2 || $page >= 2 ) && ! is_404() ) {
    131         $title = "$title $sep " . sprintf( __( 'Page %s', 'wporg-themes' ), max( $paged, $page ) );
    132     }
    133 
    134     return $title;
     143    include __DIR__ . '/rss.php';
     144    die();
    135145}
    136 add_filter( 'wp_title', 'wporg_themes_wp_title', 10, 2 );
     146add_filter( 'template_redirect', 'wporg_themes_custom_feed' );
    137147
    138148/**
     
    145155}
    146156add_action( 'wp_footer', 'wporg_themes_view_templates' );
    147 
    148 add_action('wp_enqueue_scripts','wporg_themes_disable_dashicons');
    149 function wporg_themes_disable_dashicons() {
    150     // Remove it only if the global header is used. (not e.g. chat.wordpress.org)
    151     if ( ! function_exists( 'global_wp_menu' ) ) {
    152         return;
    153     }
    154 
    155     // remove it, then reregister it as empty to maintain the dependencies but not load it a second time
    156     wp_deregister_style('dashicons');
    157     wp_register_style('dashicons','');
    158 }
  • sites/trunk/wordpress.org/public_html/wp-content/themes/pub/wporg-themes/header.php

    r1477 r1489  
    1313<div id="headline">
    1414    <div class="wrapper">
    15         <h2 class="site-title"><a href="<?php echo esc_url( home_url( '/' ) ); ?>" rel="home"><?php _e( 'Theme Directory', 'wporg-themes' ) ?></a></h2>
     15        <h2 class="site-title"><a href="<?php echo esc_url( home_url( '/' ) ); ?>" rel="home"><?php _e( 'Theme Directory', 'wporg-themes' ); ?></a></h2>
    1616    </div>
    1717</div>
  • sites/trunk/wordpress.org/public_html/wp-content/themes/pub/wporg-themes/index.php

    r1477 r1489  
    1212 */
    1313
     14$themes = wporg_themes_get_themes_for_query();
     15
    1416if ( ! function_exists( 'get_theme_feature_list' ) ) {
    1517    include ABSPATH . 'wp-admin/includes/theme.php';
     
    1719get_header();
    1820?>
    19 
    2021    <div id="themes" class="wrap">
    2122        <div class="wp-filter">
    2223            <div class="filter-count">
    23                 <span class="count theme-count"><?php echo $GLOBALS['wp_query']->found_posts; ?></span>
     24                <span class="count theme-count"><?php echo number_format_i18n( $themes['total'] ); ?></span>
    2425            </div>
    2526
    2627            <ul class="filter-links">
    27                 <li><a href="<?php echo esc_url( home_url( 'browse/featured/' ) ); ?>" data-sort="featured"><?php _ex( 'Featured', 'themes', 'wporg-themes' ); ?></a></li>
    28                 <li><a href="<?php echo esc_url( home_url( 'browse/popular/' ) ); ?>" data-sort="popular"><?php _ex( 'Popular', 'themes', 'wporg-themes' ); ?></a></li>
    29                 <li><a href="<?php echo esc_url( home_url( 'browse/new/' ) ); ?>" data-sort="new"><?php _ex( 'Latest', 'themes', 'wporg-themes' ); ?></a></li>
     28                <li><a href="<?php echo esc_url( home_url( 'browse/featured/' ) ); ?>" data-sort="featured" <?php if ( (is_front_page() && !get_query_var('browse') ) || 'featured' == get_query_var('browse') ) { echo 'class="current"'; } ?>><?php _ex( 'Featured', 'themes', 'wporg-themes' ); ?></a></li>
     29                <li><a href="<?php echo esc_url( home_url( 'browse/popular/' ) ); ?>" data-sort="popular" <?php if ( 'popular' == get_query_var('browse') ) { echo 'class="current"'; } ?>><?php _ex( 'Popular', 'themes', 'wporg-themes' ); ?></a></li>
     30                <li><a href="<?php echo esc_url( home_url( 'browse/new/' ) ); ?>" data-sort="new" <?php if ( 'new' == get_query_var('browse') ) { echo 'class="current"'; } ?>><?php _ex( 'Latest', 'themes', 'wporg-themes' ); ?></a></li>
    3031            </ul>
    3132
     
    4647                </div>
    4748
    48                 <?php foreach( get_theme_feature_list() as $feature_name => $features ) : ?>
     49                <?php foreach ( get_theme_feature_list() as $feature_name => $features ) : ?>
    4950                <div class="filter-group">
    5051                    <h4><?php echo esc_html( $feature_name ); ?></h4>
     
    6263        </div><!-- .wp-filter -->
    6364
    64         <div class="theme-browser content-filterable">
     65        <div class="theme-browser content-filterable <?php if ( ! $themes['themes'] ) { echo 'no-results'; } ?>">
    6566            <div class="themes">
    6667                <?php
    67                     while ( have_posts() ) :
    68                         the_post();
    69                         get_template_part( 'content', is_single() ? 'single' : 'index' );
    70                     endwhile;
     68                if ( get_query_var('name') && !is_404() ) {
     69                    $theme = reset( $themes['themes'] );
     70                    include __DIR__ . '/theme-single.php';
     71                } else {
     72                    foreach ( $themes['themes'] as $theme ) {
     73                        include __DIR__ . '/theme.php';
     74                    }
    7175
    72                     the_posts_navigation( array(
    73                         'prev_text' => __( 'Next', 'wporg-themes' ),
    74                         'next_text' => __( 'Previous', 'wporg-themes' ),
    75                     ) );
     76                    // Add the navigation between pages
     77                    if ( $themes['pages'] > 1 ) {
     78                        echo '<nav class="posts-navigation">';
     79                        echo paginate_links( array(
     80                            'total' => $themes['pages'],
     81                            'mid_size' => 3,
     82                        ) );
     83                        echo '</nav>';
     84                    }
     85                }
    7686                ?>
    7787            </div>
     88           
    7889            <p class="no-themes"><?php _e( 'No themes found. Try a different search.', 'wporg-themes' ); ?></p>
    7990        </div>
  • sites/trunk/wordpress.org/public_html/wp-content/themes/pub/wporg-themes/js/theme.js

    r1465 r1489  
    1818    themes.utils = {
    1919        title: function ( item ) {
    20             document.title = $( '<div/>' ).html( themes.data.settings.title.replace( '%s', item ) ).text();
     20            document.title = $( '<div/>' ).html( themes.data.settings.title.replace( '%s', $( '<div/>' ).text(item).html() ) ).text();
    2121        }
    2222    };
     
    216216            instance = instance || 0;
    217217
    218             // Themes per instance are set at 15
     218            // Themes per instance are set at 24
    219219            collection = _( collection.rest( themes.data.settings.postsPerPage * instance ) );
    220220            collection = _( collection.first( themes.data.settings.postsPerPage ) );
     
    337337                            requires: true,
    338338                            downloaded: true,
    339                             downloadLink: true,
     339                            downloadlink: true,
    340340                            last_updated: true,
    341341                            homepage: true,
     
    399399
    400400            data.permalink = themes.data.settings.path + themes.router.baseUrl( data.slug );
     401            data.path = themes.data.settings.path;
    401402
    402403            // Render themes using the html template
     
    491492
    492493            // Make tags click-able and separated by a comma.
    493             data.tags = _.map( data.tags, function( tag ) {
    494                 return '<a href="' + themes.data.settings.path + themes.router.baseUrl( 'tags/' + tag.toLowerCase().replace( ' ', '-' ) ) + '">' + tag + '</a>';
     494            data.tags = _.map( data.tags, function( tag, slug ) {
     495                return '<a href="' + themes.data.settings.path + themes.router.baseUrl( 'tags/' + slug ) + '">' + tag + '</a>';
    495496            }).join( ', ' );
     497
     498            data.path = themes.data.settings.path;
    496499
    497500            this.$el.html( this.html( data ) );
     
    14741477    themes.Router = Backbone.Router.extend({
    14751478        routes: {
    1476             'browse/:sort/'  : 'sort',
    1477             'tags/:tag/'     : 'tag',
    1478             'search/:query/' : 'search',
    1479             'author/:author/': 'author',
    1480             ':slug/'         : 'preview',
    1481             ''               : 'sort'
     1479            'browse/:sort(/)'  : 'sort',
     1480            'tags/:tag(/)'     : 'tag',
     1481            'search/:query(/)' : 'search',
     1482            'author/:author(/)': 'author',
     1483            ':slug(/)'         : 'preview',
     1484            ''                 : 'sort'
    14821485        },
    14831486
  • sites/trunk/wordpress.org/public_html/wp-content/themes/pub/wporg-themes/js/theme.min.js

    r1467 r1489  
    1 window.wp=window.wp||{},function(e){var t,i=wp.themes=wp.themes||{};i.data=_wpThemeSettings,t=i.data.l10n,_.extend(i,{model:{},view:{},routes:{},router:{},template:wp.template}),i.utils={title:function(t){document.title=e("<div/>").html(i.data.settings.title.replace("%s",t)).text()}},i.Model=Backbone.Model.extend({initialize:function(){var e;this.set({id:this.get("slug")||this.get("id")}),this.has("sections")&&(e=this.get("sections").description,this.set({description:e}))}}),i.view.Appearance=wp.Backbone.View.extend({el:"#themes .theme-browser",window:e(window),page:0,initialize:function(e){_.bindAll(this,"scroller"),this.SearchView=e.SearchView?e.SearchView:i.view.Search,this.window.bind("scroll",_.throttle(this.scroller,300))},render:function(){this.view=new i.view.Themes({collection:this.collection,parent:this}),this.search(),this.view.render(),this.$el.find(".themes").remove(),this.$el.append(this.view.el).addClass("rendered")},searchContainer:"",search:function(){var i,s=this;i=new this.SearchView({collection:s.collection,parent:this}),i.render(),this.searchContainer.append(e.parseHTML('<label class="screen-reader-text" for="wp-filter-search-input">'+t.search+"</label>")).append(i.el)},scroller:function(){var e,t,i=this;e=this.window.scrollTop()+i.window.height(),t=i.$el.offset().top+i.$el.outerHeight(!1)-i.window.height(),t=Math.round(.9*t),e>t&&this.trigger("theme:scroll")}}),i.Collection=Backbone.Collection.extend({model:i.Model,terms:"",queries:[],currentQuery:{page:1,request:{}},count:!1,loadingThemes:!1,doSearch:function(e){this.terms!==e&&(this.terms=e,this.terms.length>0&&this.search(this.terms),""===this.terms&&this.reset(i.data.themes),this.trigger("update"))},search:function(t){var s,r,o,n,a,l;this.reset(i.data.themes,{silent:!0}),t=t.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&"),t=t.replace(/ /g,")(?=.*"),s=new RegExp("^(?=.*"+t+").+","i"),r=this.filter(function(e){return n=e.get("name").replace(/(<([^>]+)>)/gi,""),a=e.get("description").replace(/(<([^>]+)>)/gi,""),l=e.get("author").replace(/(<([^>]+)>)/gi,""),o=_.union(n,e.get("id"),a,l,e.get("tags")),s.test(e.get("author"))&&t.length>2&&e.set("displayAuthor",!0),s.test(o)}),0===r.length?this.trigger("query:empty"):e("body").removeClass("no-results"),this.reset(r)},paginate:function(e){var t=this;return e=e||0,t=_(t.rest(i.data.settings.postsPerPage*e)),t=_(t.first(i.data.settings.postsPerPage))},query:function(t){var i,s,r,o=this.queries,n=this;if(this.currentQuery.request=t,i=_.find(o,function(e){return _.isEqual(e.request,t)}),s=_.has(t,"page"),s||(this.currentQuery.page=1),i||s){if(s)return this.apiCall(t,s).done(function(e){n.add(e.themes),n.trigger("query:success",e.info.results),n.loadingThemes=!1}).fail(function(){n.trigger("query:fail")});0===i.themes.length?n.trigger("query:empty"):e("body").removeClass("no-results"),_.isNumber(i.total)&&(this.count=i.total),this.reset(i.themes),i.total||(this.count=this.length),this.trigger("update"),this.trigger("query:success",this.count)}else i=this.apiCall(t).done(function(e){e.themes&&(n.reset(e.themes),r=e.info.results,o.push({themes:e.themes,request:t,total:r})),n.trigger("update"),n.trigger("query:success",r),e.themes&&0===e.themes.length&&n.trigger("query:empty")}).fail(function(){n.trigger("query:fail")})},apiCall:function(t,s){var r={type:"POST",url:"https://api.wordpress.org/themes/info/1.1/",jsonp:"callback",dataType:"jsonp",data:{action:"query_themes",request:_.extend({per_page:i.data.settings.postsPerPage,fields:{description:!0,sections:!1,tested:!0,requires:!0,downloaded:!0,downloadLink:!0,last_updated:!0,homepage:!0,theme_url:!0,parent:!0,tags:!0,rating:!0,ratings:!0,num_ratings:!0,extended_author:!0,photon_screenshots:!0}},t)},beforeSend:function(){s||e("body").addClass("loading-content").removeClass("no-results")}};return e.Deferred(function(t){e.ajax(r).done(function(e){t.resolveWith(this,[e])}).fail(function(){t.rejectWith(this,arguments)})}).promise()}}),i.view.Theme=wp.Backbone.View.extend({className:"theme",state:"grid",html:wp.themes.template("theme"),events:{click:"expand",keydown:"expand",touchend:"expand",keyup:"addFocus",touchmove:"preventExpand"},touchDrag:!1,render:function(){var e=this.model.toJSON();e.permalink=i.data.settings.path+i.router.baseUrl(e.slug),this.$el.html(this.html(e)).attr({tabindex:0,"aria-describedby":e.id+"-action "+e.id+"-name"})},addFocus:function(){var t=e(":focus").hasClass("theme")?e(":focus"):e(":focus").parents(".theme");e(".theme.focus").removeClass("focus"),t.addClass("focus")},expand:function(t){var s=this;return t=t||window.event,!0===t.metaKey&&"click"===t.type||"keydown"===t.type&&13!==t.which&&32!==t.which?void 0:this.touchDrag===!0?this.touchDrag=!1:void(e(t.target).is(".theme-actions a")||(i.focusedTheme=this.$el,this.trigger("theme:expand",s.model.cid),t.preventDefault()))},preventExpand:function(){this.touchDrag=!0}}),i.view.Details=wp.Backbone.View.extend({className:"theme-overlay",events:{click:"collapse","click .left":"previousTheme","click .right":"nextTheme","click .theme-actions .button-secondary":"preview","keydown .theme-actions .button-secondary":"preview","touchend .theme-actions .button-secondary":"preview"},html:i.template("theme-single"),render:function(){var e=this.model.toJSON(),t=new Date;t.setUTCFullYear(e.last_updated.substring(0,4),e.last_updated.substring(5,7)-1,e.last_updated.substring(8,10)),e.last_updated=t.toLocaleDateString(!1,{day:"numeric",month:"long",year:"numeric"}),e.is_outdated=t.setYear(t.getYear()+1902).valueOf()<(new Date).valueOf(),e.tags=_.map(e.tags,function(e){return'<a href="'+i.data.settings.path+i.router.baseUrl("tags/"+e.toLowerCase().replace(" ","-"))+'">'+e+"</a>"}).join(", "),this.$el.html(this.html(e)),this.navigation(),this.screenshotCheck(this.$el),this.containFocus(this.$el),this.renderDownloadsGraph()},preview:function(t){var s,r,o=this;return this.touchDrag===!0?this.touchDrag=!1:void(e(t.target).hasClass("button-primary")||("keydown"!==t.type||13===t.which||32===t.which)&&("keydown"===t.type&&13!==t.which&&e(":focus").hasClass("button")||(t=t||window.event,t.preventDefault(),i.focusedTheme=this.$el,r=new i.view.Preview({model:this.model}),r.render(),this.setNavButtonsState(),r.$el.addClass(i.data.settings.isMobile?"wp-full-overlay collapsed":"wp-full-overlay expanded"),e(".theme-install-overlay").append(r.el),this.listenTo(r,"theme:next",function(){return this.trigger("theme:next"),s=o.model,_.isUndefined(o.current)||(s=o.current),o.current=o.model.collection.at(o.model.collection.indexOf(s)+1),_.isUndefined(o.current)?(o.options.parent.parent.trigger("theme:end"),o.current=s):(r.model=o.current,r.render(),this.setNavButtonsState(),void e(".next-theme").focus())}).listenTo(r,"theme:previous",function(){this.trigger("theme:previous"),s=o.model,0!==o.model.collection.indexOf(o.current)&&(_.isUndefined(o.current)||(s=o.current),o.current=o.model.collection.at(o.model.collection.indexOf(s)-1),_.isUndefined(o.current)||(r.model=o.current,r.render(),this.setNavButtonsState(),e(".previous-theme").focus()))}),this.listenTo(r,"preview:close",function(){o.current=o.model}))))},setNavButtonsState:function(){var t=e(".theme-install-overlay"),i=_.isUndefined(this.current)?this.model:this.current;0===this.model.collection.indexOf(i)&&t.find(".previous-theme").addClass("disabled"),_.isUndefined(this.model.collection.at(this.model.collection.indexOf(i)+1))&&t.find(".next-theme").addClass("disabled")},containFocus:function(t){var i,s=window.event;("undefined"==typeof s||1===e(s.target).closest(".theme").length)&&_.delay(function(){e(".theme-wrap a.button-primary:visible").focus()},500),t.on("keydown.wp-themes",function(s){9===s.which&&(i=e(s.target),i.is("button.close")&&s.shiftKey?(t.find(".theme-tags a:last-child").focus(),s.preventDefault()):i.is(".theme-tags a:last-child")&&(t.find("button.close").focus(),s.preventDefault()))})},collapse:function(t){var s,r,o,n,a,l=this,c={};1!==i.data.themes.length&&(t=t||window.event,(e(t.target).is(".close")||27===t.keyCode)&&(e("body").addClass("closing-overlay"),this.$el.fadeOut(1,function(){e("body").removeClass("closing-overlay"),l.closeOverlay(),s=document.body.scrollTop,(r=i.Collection.prototype.currentQuery.request.author)?(i.router.navigate(i.router.baseUrl("author/"+r)),i.utils.title(r)):(o=i.Collection.prototype.currentQuery.request.search)?(i.router.navigate(i.router.baseUrl(i.router.searchPath+o)),i.utils.title(o)):(n=i.view.Installer.prototype.filtersChecked())?(i.router.navigate(i.router.baseUrl("tags/"+n.join("+"))),i.utils.title(_.each(n,function(t,i){n[i]=e('label[for="filter-id-'+t+'"]').text()}).join(", "))):(a=e(".filter-links .current"))&&(a.length||(a=e('.filter-links [data-sort="featured"]'),c={trigger:!0}),i.router.navigate(i.router.baseUrl(i.router.browsePath+a.data("sort")),c),i.utils.title(a.text())),document.body.scrollTop=s,i.focusedTheme&&i.focusedTheme.focus()})))},renderDownloadsGraph:function(){var t=this;e.getJSON("https://api.wordpress.org/stats/themes/1.0/downloads.php?slug="+t.model.get("id")+"&limit=260&callback=?",function(i){var s=new google.visualization.DataTable,r=0;s.addColumn("string",_wpThemeSettings.l10n.date),s.addColumn("number",_wpThemeSettings.l10n.downloads),e.each(i,function(e,t){s.addRow(),s.setValue(r,0,new Date(e).toLocaleDateString()),s.setValue(r,1,Number(t)),r++}),new google.visualization.ColumnChart(document.getElementById("theme-download-stats-"+t.model.get("id"))).draw(s,{colors:["#253578"],legend:{position:"none"},titlePosition:"in",axisTitlesPosition:"in",chartArea:{height:280,left:35,width:"98%"},hAxis:{textStyle:{color:"black",fontSize:9}},vAxis:{format:"###,###",textPosition:"out",viewWindowMode:"explicit",viewWindow:{min:0}},bar:{groupWidth:s.getNumberOfRows()>100?"100%":null},height:350})})},navigation:function(){this.model.cid===this.model.collection.at(0).cid&&this.$el.find(".left").addClass("disabled"),this.model.cid===this.model.collection.at(this.model.collection.length-1).cid&&this.$el.find(".right").addClass("disabled")},closeOverlay:function(){e("body").removeClass("modal-open"),this.remove(),this.unbind(),this.trigger("theme:collapse")},nextTheme:function(){var e=this;return e.trigger("theme:next",e.model.cid),!1},previousTheme:function(){var e=this;return e.trigger("theme:previous",e.model.cid),!1},screenshotCheck:function(e){var t=new Image;t.src=e.find(".screenshot img").attr("src")}}),i.view.Preview=i.view.Details.extend({className:"wp-full-overlay expanded",el:".theme-install-overlay",events:{"click .close-full-overlay":"close","click .collapse-sidebar":"collapse","click .previous-theme":"previousTheme","click .next-theme":"nextTheme",keyup:"keyEvent"},html:i.template("theme-preview"),render:function(){var t=this.model.toJSON();this.$el.html(this.html(t)),i.router.navigate(i.router.baseUrl(i.router.themePath+this.model.get("id"))),this.$el.fadeIn(200,function(){e("body").addClass("theme-installer-active full-overlay-active"),e(".close-full-overlay").focus()})},close:function(){return this.$el.fadeOut(200,function(){e("body").removeClass("theme-installer-active full-overlay-active"),i.focusedTheme&&i.focusedTheme.focus()}),this.trigger("preview:close"),this.undelegateEvents(),this.unbind(),i.router.navigate(i.router.baseUrl(i.router.themePath+this.model.get("id"))),!1},collapse:function(){return this.$el.toggleClass("collapsed").toggleClass("expanded"),!1},keyEvent:function(){return 27===event.keyCode&&(this.undelegateEvents(),this.close()),39===event.keyCode&&_.once(this.nextTheme()),37===event.keyCode&&this.previousTheme(),!1}}),i.view.Themes=wp.Backbone.View.extend({className:"themes",$overlay:e("div.theme-overlay"),index:0,count:e(".wp-filter .theme-count"),initialize:function(t){var i=this;this.parent=t.parent,this.setView("grid"),this.listenTo(i.collection,"update",function(){i.parent.page=0,i.render(this)}),this.listenTo(i.collection,"query:success",function(e){i.count.text(_.isNumber(e)?e:i.collection.length)}),this.listenTo(i.collection,"query:empty",function(){e("body").addClass("no-results")}),this.listenTo(this.parent,"theme:scroll",function(){i.renderThemes(i.parent.page)}),this.listenTo(this.parent,"theme:close",function(){i.overlay&&i.overlay.closeOverlay()}),e("body").on("keyup",function(e){i.overlay&&(39===e.keyCode&&i.overlay.nextTheme(),37===e.keyCode&&i.overlay.previousTheme(),27===e.keyCode&&i.overlay.collapse(e))})},render:function(){this.$el.empty(),1===i.data.themes.length&&(this.singleTheme=new i.view.Details({model:this.collection.models[0]}),this.singleTheme.render(),this.$el.addClass("single-theme"),this.$el.append(this.singleTheme.el)),this.options.collection.size()>0&&this.renderThemes(this.parent.page),this.count.text(this.collection.count?this.collection.count:this.collection.length)},renderThemes:function(t){var s=this;return s.instance=s.collection.paginate(t),0===s.instance.size()?void this.parent.trigger("theme:end"):(t>=1&&e(".add-new-theme").remove(),s.instance.each(function(e){s.theme=new i.view.Theme({model:e,parent:s}),s.theme.render(),s.$el.append(s.theme.el),s.listenTo(s.theme,"theme:expand",s.expand,s)}),void this.parent.page++)},setView:function(e){return e},expand:function(t){var s=this;this.model=s.collection.get(t),i.router.navigate(i.router.baseUrl(i.router.themePath+this.model.id)),i.utils.title(this.model.attributes.name),this.setView("detail"),e("body").addClass("modal-open"),this.overlay=new i.view.Details({model:s.model}),this.overlay.render(),this.$overlay.html(this.overlay.el),this.listenTo(this.overlay,"theme:next",function(){s.next([s.model.cid]),e(".theme-header").find(".right").focus()}).listenTo(this.overlay,"theme:previous",function(){s.previous([s.model.cid]),e(".theme-header").find(".left").focus()})},next:function(e){var t,i,s=this;t=s.collection.get(e[0]),i=s.collection.at(s.collection.indexOf(t)+1),void 0!==i&&s.theme.trigger("theme:expand",i.cid)},previous:function(e){var t,i,s=this;t=s.collection.get(e[0]),i=s.collection.at(s.collection.indexOf(t)-1),void 0!==i&&s.theme.trigger("theme:expand",i.cid)}}),i.view.Search=wp.Backbone.View.extend({tagName:"input",className:"wp-filter-search",id:"wp-filter-search-input",searching:!1,attributes:{placeholder:t.searchPlaceholder,type:"search"},events:{keyup:"search",search:"search"},initialize:function(e){this.parent=e.parent,this.listenTo(this.parent,"theme:close",function(){this.searching=!1})},search:function(e){("keyup"!==e.type||9!==e.which&&16!==e.which)&&(this.collection=this.options.parent.view.collection,"keyup"===e.type&&27===e.which&&(e.target.value=""),_.debounce(_.bind(this.doSearch,this),300)(e.target.value))},doSearch:_.debounce(function(t){var s={};i.view.Installer.prototype.clearFilters(jQuery.Event("click")),s.search=t,"author:"===t.substring(0,7)&&(s.search="",s.author=t.slice(7)),"tag:"===t.substring(0,4)&&(s.search="",s.tag=[t.slice(4)]),e(".filter-links li > a.current").removeClass("current"),e("body").removeClass("show-filters filters-applied"),t?(i.utils.title(t),i.router.navigate(i.router.baseUrl(i.router.searchPath+t),{replace:!0})):(delete s.search,s.browse="featured",i.utils.title(e('.filter-links [data-sort="featured"]').text()),i.router.navigate(i.router.baseUrl(i.router.browsePath+"featured"),{replace:!0})),this.collection.query(s)},300)}),i.view.Installer=i.view.Appearance.extend({el:"#themes",events:{"click .filter-links li > a":"onSort","click .theme-filter":"onFilter","click .drawer-toggle":"moreFilters","click .filter-drawer .apply-filters":"applyFilters",'click .filter-group [type="checkbox"]':"addFilter","click .filter-drawer .clear-filters":"clearFilters","click .filtered-by":"backToFilters"},activeClass:"current",searchContainer:e(".wp-filter .search-form"),render:function(){var s=this;this.search(),this.collection=new i.Collection,this.listenTo(this,"theme:end",function(){s.collection.loadingThemes||(s.collection.loadingThemes=!0,s.collection.currentQuery.page++,_.extend(s.collection.currentQuery.request,{page:s.collection.currentQuery.page}),s.collection.query(s.collection.currentQuery.request))}),this.listenTo(this.collection,"query:success",function(){e("body").removeClass("loading-content"),e(".theme-browser").find("div.error").remove()}),this.listenTo(this.collection,"query:fail",function(){e("body").removeClass("loading-content"),e(".theme-browser").find("div.error").remove(),e(".theme-browser").find("div.themes").before('<div class="error"><p>'+t.error+"</p></div>")}),this.view&&this.view.remove(),this.view=new i.view.Themes({collection:this.collection,parent:this}),this.page=0,this.$el.find(".themes").remove(),this.view.render(),this.$el.find(".theme-browser").append(this.view.el).addClass("rendered")},browse:function(e){this.collection.query({browse:e})},onSort:function(t){var s=e(t.target),r=s.data("sort");t.preventDefault(),e("body").removeClass("filters-applied show-filters"),s.hasClass(this.activeClass)||(this.sort(r),i.router.navigate(i.router.baseUrl(i.router.browsePath+r)))},sort:function(t){var s=e('.filter-links [data-sort="'+t+'"]'),r=this;r.clearSearch(),_.each(e(".filter-group").find(":checkbox").filter(":checked"),function(t){return e(t).prop("checked",!1),r.filtersChecked()}),e(".filter-links li > a, .theme-filter").removeClass(this.activeClass),s.addClass(this.activeClass),i.utils.title(s.text()),this.browse(t)},onFilter:function(t){var i,s=e(t.target),r=s.data("filter");s.hasClass(this.activeClass)||(e(".filter-links li > a, .theme-section").removeClass(this.activeClass),s.addClass(this.activeClass),r&&(r=_.union(r,this.filtersChecked()),i={tag:[r]},this.collection.query(i)))},addFilter:function(){this.filtersChecked()},applyFilters:function(t){var s,r=[],o=this.filtersChecked(),n={tag:o},a=e(".filtered-by .tags");t&&t.preventDefault(),e("body").addClass("filters-applied"),e(".filter-links li > a.current").removeClass("current"),a.empty(),_.each(o,function(t){s=e('label[for="filter-id-'+t+'"]').text(),r.push(s),a.append('<span class="tag">'+s+"</span>")}),i.router.navigate(i.router.baseUrl("tags/"+o.join("+"))),i.utils.title(r.join(", ")),this.collection.query(n)},filtersChecked:function(){var t=e(".filter-group").find(":checkbox").filter(":checked"),i=e(".filter-drawer"),s=[];return _.each(t,function(t){s.push(e(t).prop("value"))}),0===s.length?(i.find(".apply-filters").prop("disabled",!0).find("span").text(""),i.find(".clear-filters").hide(),e("body").removeClass("filters-applied"),!1):(i.find(".apply-filters").prop("disabled",!1).find("span").text(s.length),i.find(".clear-filters").css("display","inline-block"),s)},moreFilters:function(t){return t.preventDefault(),e("body").hasClass("filters-applied")?this.backToFilters():e("body").hasClass("show-filters")&&this.filtersChecked()?this.addFilter():(this.clearSearch(),void e("body").toggleClass("show-filters"))},clearFilters:function(t){var i=e(".filter-group").find(":checkbox"),s=this;t.preventDefault(),_.each(i.filter(":checked"),function(t){return e(t).prop("checked",!1),s.filtersChecked()})},backToFilters:function(t){t&&t.preventDefault(),e("body").removeClass("filters-applied")},clearSearch:function(){e("#wp-filter-search-input").val("")}}),i.Router=Backbone.Router.extend({routes:{"browse/:sort/":"sort","tags/:tag/":"tag","search/:query/":"search","author/:author/":"author",":slug/":"preview","":"sort"},baseUrl:function(e){return 0!==e.length&&(e+="/"),e},themePath:"",browsePath:"browse/",searchPath:"search/",search:function(t){e(".wp-filter-search").val(t)},navigate:function(){Backbone.history._hasPushState&&Backbone.Router.prototype.navigate.apply(this,arguments),"object"==typeof _gaq&&_gaq.push(["_trackPageview",i.data.settings.path+arguments[0]])}}),i.Run={init:function(){this.view=new i.view.Installer({section:"featured",SearchView:i.view.Search}),this.render()},render:function(){this.view.render(),this.routes(),Backbone.history.start({root:i.data.settings.path,pushState:!0,hashChange:!1})},routes:function(){var t=this,s={};i.router=new i.Router,i.router.on("route:preview",function(e){t.view.collection.queries.push(i.data.query),s.theme=e,t.view.collection.query(s),t.view.view.expand(e)}),i.router.on("route:sort",function(e){t.view.collection.queries.push(i.data.query),e||(e="featured"),t.view.sort(e),t.view.trigger("theme:close")}),i.router.on("route:search",function(){t.view.collection.queries.push(i.data.query),e(".wp-filter-search").focus().trigger("keyup"),t.view.trigger("theme:close")}),i.router.on("route:tag",function(s){t.view.collection.queries.push(i.data.query),_.each(s.split("+"),function(t){e("#filter-id-"+t).prop("checked",!0)}),e("body").removeClass("show-filters").addClass("show-filters"),t.view.applyFilters(),t.view.trigger("theme:close")}),i.router.on("route:author",function(e){t.view.collection.queries.push(i.data.query),s.author=e,t.view.collection.query(s),i.utils.title(e),t.view.trigger("theme:close")})}},e(function(){i.Run.init()})}(jQuery),function(e){e.load("visualization","1",{packages:["corechart"]})}(google);
     1window.wp=window.wp||{},function(a){var b,c=wp.themes=wp.themes||{};c.data=_wpThemeSettings,b=c.data.l10n,_.extend(c,{model:{},view:{},routes:{},router:{},template:wp.template}),c.utils={title:function(b){document.title=a("<div/>").html(c.data.settings.title.replace("%s",a("<div/>").text(b).html())).text()}},c.Model=Backbone.Model.extend({initialize:function(){var a;this.set({id:this.get("slug")||this.get("id")}),this.has("sections")&&(a=this.get("sections").description,this.set({description:a}))}}),c.view.Appearance=wp.Backbone.View.extend({el:"#themes .theme-browser",window:a(window),page:0,initialize:function(a){_.bindAll(this,"scroller"),this.SearchView=a.SearchView?a.SearchView:c.view.Search,this.window.bind("scroll",_.throttle(this.scroller,300))},render:function(){this.view=new c.view.Themes({collection:this.collection,parent:this}),this.search(),this.view.render(),this.$el.find(".themes").remove(),this.$el.append(this.view.el).addClass("rendered")},searchContainer:"",search:function(){var c,d=this;c=new this.SearchView({collection:d.collection,parent:this}),c.render(),this.searchContainer.append(a.parseHTML('<label class="screen-reader-text" for="wp-filter-search-input">'+b.search+"</label>")).append(c.el)},scroller:function(){var a,b,c=this;a=this.window.scrollTop()+c.window.height(),b=c.$el.offset().top+c.$el.outerHeight(!1)-c.window.height(),b=Math.round(.9*b),a>b&&this.trigger("theme:scroll")}}),c.Collection=Backbone.Collection.extend({model:c.Model,terms:"",queries:[],currentQuery:{page:1,request:{}},count:!1,loadingThemes:!1,doSearch:function(a){this.terms!==a&&(this.terms=a,this.terms.length>0&&this.search(this.terms),""===this.terms&&this.reset(c.data.themes),this.trigger("update"))},search:function(b){var d,e,f,g,h,i;this.reset(c.data.themes,{silent:!0}),b=b.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&"),b=b.replace(/ /g,")(?=.*"),d=new RegExp("^(?=.*"+b+").+","i"),e=this.filter(function(a){return g=a.get("name").replace(/(<([^>]+)>)/gi,""),h=a.get("description").replace(/(<([^>]+)>)/gi,""),i=a.get("author").replace(/(<([^>]+)>)/gi,""),f=_.union(g,a.get("id"),h,i,a.get("tags")),d.test(a.get("author"))&&b.length>2&&a.set("displayAuthor",!0),d.test(f)}),0===e.length?this.trigger("query:empty"):a("body").removeClass("no-results"),this.reset(e)},paginate:function(a){var b=this;return a=a||0,b=_(b.rest(c.data.settings.postsPerPage*a)),b=_(b.first(c.data.settings.postsPerPage))},query:function(b){var c,d,e,f=this.queries,g=this;if(this.currentQuery.request=b,c=_.find(f,function(a){return _.isEqual(a.request,b)}),d=_.has(b,"page"),d||(this.currentQuery.page=1),c||d){if(d)return this.apiCall(b,d).done(function(a){g.add(a.themes),g.trigger("query:success",a.info.results),g.loadingThemes=!1}).fail(function(){g.trigger("query:fail")});0===c.themes.length?g.trigger("query:empty"):a("body").removeClass("no-results"),_.isNumber(c.total)&&(this.count=c.total),this.reset(c.themes),c.total||(this.count=this.length),this.trigger("update"),this.trigger("query:success",this.count)}else c=this.apiCall(b).done(function(a){a.themes&&(g.reset(a.themes),e=a.info.results,f.push({themes:a.themes,request:b,total:e})),g.trigger("update"),g.trigger("query:success",e),a.themes&&0===a.themes.length&&g.trigger("query:empty")}).fail(function(){g.trigger("query:fail")})},apiCall:function(b,d){var e={type:"POST",url:"https://api.wordpress.org/themes/info/1.1/",jsonp:"callback",dataType:"jsonp",data:{action:"query_themes",request:_.extend({per_page:c.data.settings.postsPerPage,fields:{description:!0,sections:!1,tested:!0,requires:!0,downloaded:!0,downloadlink:!0,last_updated:!0,homepage:!0,theme_url:!0,parent:!0,tags:!0,rating:!0,ratings:!0,num_ratings:!0,extended_author:!0,photon_screenshots:!0}},b)},beforeSend:function(){d||a("body").addClass("loading-content").removeClass("no-results")}};return a.Deferred(function(b){a.ajax(e).done(function(a){b.resolveWith(this,[a])}).fail(function(){b.rejectWith(this,arguments)})}).promise()}}),c.view.Theme=wp.Backbone.View.extend({className:"theme",state:"grid",html:wp.themes.template("theme"),events:{click:"expand",keydown:"expand",touchend:"expand",keyup:"addFocus",touchmove:"preventExpand"},touchDrag:!1,render:function(){var a=this.model.toJSON();a.permalink=c.data.settings.path+c.router.baseUrl(a.slug),a.path=c.data.settings.path,this.$el.html(this.html(a)).attr({tabindex:0,"aria-describedby":a.id+"-action "+a.id+"-name"})},addFocus:function(){var b=a(":focus").hasClass("theme")?a(":focus"):a(":focus").parents(".theme");a(".theme.focus").removeClass("focus"),b.addClass("focus")},expand:function(b){var d=this;return b=b||window.event,!0===b.metaKey&&"click"===b.type||"keydown"===b.type&&13!==b.which&&32!==b.which?void 0:this.touchDrag===!0?this.touchDrag=!1:void(a(b.target).is(".theme-actions a")||(c.focusedTheme=this.$el,this.trigger("theme:expand",d.model.cid),b.preventDefault()))},preventExpand:function(){this.touchDrag=!0}}),c.view.Details=wp.Backbone.View.extend({className:"theme-overlay",events:{click:"collapse","click .left":"previousTheme","click .right":"nextTheme","click .theme-actions .button-secondary":"preview","keydown .theme-actions .button-secondary":"preview","touchend .theme-actions .button-secondary":"preview"},html:c.template("theme-single"),render:function(){var a=this.model.toJSON(),b=new Date;b.setUTCFullYear(a.last_updated.substring(0,4),a.last_updated.substring(5,7)-1,a.last_updated.substring(8,10)),a.last_updated=b.toLocaleDateString(!1,{day:"numeric",month:"long",year:"numeric"}),a.is_outdated=b.setYear(b.getYear()+1902).valueOf()<(new Date).valueOf(),a.tags=_.map(a.tags,function(a,b){return'<a href="'+c.data.settings.path+c.router.baseUrl("tags/"+b)+'">'+a+"</a>"}).join(", "),a.path=c.data.settings.path,this.$el.html(this.html(a)),this.navigation(),this.screenshotCheck(this.$el),this.containFocus(this.$el),this.renderDownloadsGraph()},preview:function(b){var d,e,f=this;return this.touchDrag===!0?this.touchDrag=!1:void(a(b.target).hasClass("button-primary")||("keydown"!==b.type||13===b.which||32===b.which)&&("keydown"===b.type&&13!==b.which&&a(":focus").hasClass("button")||(b=b||window.event,b.preventDefault(),c.focusedTheme=this.$el,e=new c.view.Preview({model:this.model}),e.render(),this.setNavButtonsState(),e.$el.addClass(c.data.settings.isMobile?"wp-full-overlay collapsed":"wp-full-overlay expanded"),a(".theme-install-overlay").append(e.el),this.listenTo(e,"theme:next",function(){return this.trigger("theme:next"),d=f.model,_.isUndefined(f.current)||(d=f.current),f.current=f.model.collection.at(f.model.collection.indexOf(d)+1),_.isUndefined(f.current)?(f.options.parent.parent.trigger("theme:end"),f.current=d):(e.model=f.current,e.render(),this.setNavButtonsState(),void a(".next-theme").focus())}).listenTo(e,"theme:previous",function(){this.trigger("theme:previous"),d=f.model,0!==f.model.collection.indexOf(f.current)&&(_.isUndefined(f.current)||(d=f.current),f.current=f.model.collection.at(f.model.collection.indexOf(d)-1),_.isUndefined(f.current)||(e.model=f.current,e.render(),this.setNavButtonsState(),a(".previous-theme").focus()))}),this.listenTo(e,"preview:close",function(){f.current=f.model}))))},setNavButtonsState:function(){var b=a(".theme-install-overlay"),c=_.isUndefined(this.current)?this.model:this.current;0===this.model.collection.indexOf(c)&&b.find(".previous-theme").addClass("disabled"),_.isUndefined(this.model.collection.at(this.model.collection.indexOf(c)+1))&&b.find(".next-theme").addClass("disabled")},containFocus:function(b){var c,d=window.event;("undefined"==typeof d||1===a(d.target).closest(".theme").length)&&_.delay(function(){a(".theme-wrap a.button-primary:visible").focus()},500),b.on("keydown.wp-themes",function(d){9===d.which&&(c=a(d.target),c.is("button.close")&&d.shiftKey?(b.find(".theme-tags a:last-child").focus(),d.preventDefault()):c.is(".theme-tags a:last-child")&&(b.find("button.close").focus(),d.preventDefault()))})},collapse:function(b){var d,e,f,g,h,i=this,j={};1!==c.data.themes.length&&(b=b||window.event,(a(b.target).is(".close")||27===b.keyCode)&&(a("body").addClass("closing-overlay"),this.$el.fadeOut(1,function(){a("body").removeClass("closing-overlay"),i.closeOverlay(),d=document.body.scrollTop,(e=c.Collection.prototype.currentQuery.request.author)?(c.router.navigate(c.router.baseUrl("author/"+e)),c.utils.title(e)):(f=c.Collection.prototype.currentQuery.request.search)?(c.router.navigate(c.router.baseUrl(c.router.searchPath+f)),c.utils.title(f)):(g=c.view.Installer.prototype.filtersChecked())?(c.router.navigate(c.router.baseUrl("tags/"+g.join("+"))),c.utils.title(_.each(g,function(b,c){g[c]=a('label[for="filter-id-'+b+'"]').text()}).join(", "))):(h=a(".filter-links .current"))&&(h.length||(h=a('.filter-links [data-sort="featured"]'),j={trigger:!0}),c.router.navigate(c.router.baseUrl(c.router.browsePath+h.data("sort")),j),c.utils.title(h.text())),document.body.scrollTop=d,c.focusedTheme&&c.focusedTheme.focus()})))},renderDownloadsGraph:function(){var b=this;a.getJSON("https://api.wordpress.org/stats/themes/1.0/downloads.php?slug="+b.model.get("id")+"&limit=260&callback=?",function(c){var d=new google.visualization.DataTable,e=0;d.addColumn("string",_wpThemeSettings.l10n.date),d.addColumn("number",_wpThemeSettings.l10n.downloads),a.each(c,function(a,b){d.addRow(),d.setValue(e,0,new Date(a).toLocaleDateString()),d.setValue(e,1,Number(b)),e++}),new google.visualization.ColumnChart(document.getElementById("theme-download-stats-"+b.model.get("id"))).draw(d,{colors:["#253578"],legend:{position:"none"},titlePosition:"in",axisTitlesPosition:"in",chartArea:{height:280,left:35,width:"98%"},hAxis:{textStyle:{color:"black",fontSize:9}},vAxis:{format:"###,###",textPosition:"out",viewWindowMode:"explicit",viewWindow:{min:0}},bar:{groupWidth:d.getNumberOfRows()>100?"100%":null},height:350})})},navigation:function(){this.model.cid===this.model.collection.at(0).cid&&this.$el.find(".left").addClass("disabled"),this.model.cid===this.model.collection.at(this.model.collection.length-1).cid&&this.$el.find(".right").addClass("disabled")},closeOverlay:function(){a("body").removeClass("modal-open"),this.remove(),this.unbind(),this.trigger("theme:collapse")},nextTheme:function(){var a=this;return a.trigger("theme:next",a.model.cid),!1},previousTheme:function(){var a=this;return a.trigger("theme:previous",a.model.cid),!1},screenshotCheck:function(a){var b=new Image;b.src=a.find(".screenshot img").attr("src")}}),c.view.Preview=c.view.Details.extend({className:"wp-full-overlay expanded",el:".theme-install-overlay",events:{"click .close-full-overlay":"close","click .collapse-sidebar":"collapse","click .previous-theme":"previousTheme","click .next-theme":"nextTheme",keyup:"keyEvent"},html:c.template("theme-preview"),render:function(){var b=this.model.toJSON();this.$el.html(this.html(b)),c.router.navigate(c.router.baseUrl(c.router.themePath+this.model.get("id"))),this.$el.fadeIn(200,function(){a("body").addClass("theme-installer-active full-overlay-active"),a(".close-full-overlay").focus()})},close:function(){return this.$el.fadeOut(200,function(){a("body").removeClass("theme-installer-active full-overlay-active"),c.focusedTheme&&c.focusedTheme.focus()}),this.trigger("preview:close"),this.undelegateEvents(),this.unbind(),c.router.navigate(c.router.baseUrl(c.router.themePath+this.model.get("id"))),!1},collapse:function(){return this.$el.toggleClass("collapsed").toggleClass("expanded"),!1},keyEvent:function(){return 27===event.keyCode&&(this.undelegateEvents(),this.close()),39===event.keyCode&&_.once(this.nextTheme()),37===event.keyCode&&this.previousTheme(),!1}}),c.view.Themes=wp.Backbone.View.extend({className:"themes",$overlay:a("div.theme-overlay"),index:0,count:a(".wp-filter .theme-count"),initialize:function(b){var c=this;this.parent=b.parent,this.setView("grid"),this.listenTo(c.collection,"update",function(){c.parent.page=0,c.render(this)}),this.listenTo(c.collection,"query:success",function(a){c.count.text(_.isNumber(a)?a:c.collection.length)}),this.listenTo(c.collection,"query:empty",function(){a("body").addClass("no-results")}),this.listenTo(this.parent,"theme:scroll",function(){c.renderThemes(c.parent.page)}),this.listenTo(this.parent,"theme:close",function(){c.overlay&&c.overlay.closeOverlay()}),a("body").on("keyup",function(a){c.overlay&&(39===a.keyCode&&c.overlay.nextTheme(),37===a.keyCode&&c.overlay.previousTheme(),27===a.keyCode&&c.overlay.collapse(a))})},render:function(){this.$el.empty(),1===c.data.themes.length&&(this.singleTheme=new c.view.Details({model:this.collection.models[0]}),this.singleTheme.render(),this.$el.addClass("single-theme"),this.$el.append(this.singleTheme.el)),this.options.collection.size()>0&&this.renderThemes(this.parent.page),this.count.text(this.collection.count?this.collection.count:this.collection.length)},renderThemes:function(b){var d=this;return d.instance=d.collection.paginate(b),0===d.instance.size()?void this.parent.trigger("theme:end"):(b>=1&&a(".add-new-theme").remove(),d.instance.each(function(a){d.theme=new c.view.Theme({model:a,parent:d}),d.theme.render(),d.$el.append(d.theme.el),d.listenTo(d.theme,"theme:expand",d.expand,d)}),void this.parent.page++)},setView:function(a){return a},expand:function(b){var d=this;this.model=d.collection.get(b),c.router.navigate(c.router.baseUrl(c.router.themePath+this.model.id)),c.utils.title(this.model.attributes.name),this.setView("detail"),a("body").addClass("modal-open"),this.overlay=new c.view.Details({model:d.model}),this.overlay.render(),this.$overlay.html(this.overlay.el),this.listenTo(this.overlay,"theme:next",function(){d.next([d.model.cid]),a(".theme-header").find(".right").focus()}).listenTo(this.overlay,"theme:previous",function(){d.previous([d.model.cid]),a(".theme-header").find(".left").focus()})},next:function(a){var b,c,d=this;b=d.collection.get(a[0]),c=d.collection.at(d.collection.indexOf(b)+1),void 0!==c&&d.theme.trigger("theme:expand",c.cid)},previous:function(a){var b,c,d=this;b=d.collection.get(a[0]),c=d.collection.at(d.collection.indexOf(b)-1),void 0!==c&&d.theme.trigger("theme:expand",c.cid)}}),c.view.Search=wp.Backbone.View.extend({tagName:"input",className:"wp-filter-search",id:"wp-filter-search-input",searching:!1,attributes:{placeholder:b.searchPlaceholder,type:"search"},events:{keyup:"search",search:"search"},initialize:function(a){this.parent=a.parent,this.listenTo(this.parent,"theme:close",function(){this.searching=!1})},search:function(a){("keyup"!==a.type||9!==a.which&&16!==a.which)&&(this.collection=this.options.parent.view.collection,"keyup"===a.type&&27===a.which&&(a.target.value=""),_.debounce(_.bind(this.doSearch,this),300)(a.target.value))},doSearch:_.debounce(function(b){var d={};c.view.Installer.prototype.clearFilters(jQuery.Event("click")),d.search=b,"author:"===b.substring(0,7)&&(d.search="",d.author=b.slice(7)),"tag:"===b.substring(0,4)&&(d.search="",d.tag=[b.slice(4)]),a(".filter-links li > a.current").removeClass("current"),a("body").removeClass("show-filters filters-applied"),b?(c.utils.title(b),c.router.navigate(c.router.baseUrl(c.router.searchPath+b),{replace:!0})):(delete d.search,d.browse="featured",c.utils.title(a('.filter-links [data-sort="featured"]').text()),c.router.navigate(c.router.baseUrl(c.router.browsePath+"featured"),{replace:!0})),this.collection.query(d)},300)}),c.view.Installer=c.view.Appearance.extend({el:"#themes",events:{"click .filter-links li > a":"onSort","click .theme-filter":"onFilter","click .drawer-toggle":"moreFilters","click .filter-drawer .apply-filters":"applyFilters",'click .filter-group [type="checkbox"]':"addFilter","click .filter-drawer .clear-filters":"clearFilters","click .filtered-by":"backToFilters"},activeClass:"current",searchContainer:a(".wp-filter .search-form"),render:function(){var d=this;this.search(),this.collection=new c.Collection,this.listenTo(this,"theme:end",function(){d.collection.loadingThemes||(d.collection.loadingThemes=!0,d.collection.currentQuery.page++,_.extend(d.collection.currentQuery.request,{page:d.collection.currentQuery.page}),d.collection.query(d.collection.currentQuery.request))}),this.listenTo(this.collection,"query:success",function(){a("body").removeClass("loading-content"),a(".theme-browser").find("div.error").remove()}),this.listenTo(this.collection,"query:fail",function(){a("body").removeClass("loading-content"),a(".theme-browser").find("div.error").remove(),a(".theme-browser").find("div.themes").before('<div class="error"><p>'+b.error+"</p></div>")}),this.view&&this.view.remove(),this.view=new c.view.Themes({collection:this.collection,parent:this}),this.page=0,this.$el.find(".themes").remove(),this.view.render(),this.$el.find(".theme-browser").append(this.view.el).addClass("rendered")},browse:function(a){this.collection.query({browse:a})},onSort:function(b){var d=a(b.target),e=d.data("sort");b.preventDefault(),a("body").removeClass("filters-applied show-filters"),d.hasClass(this.activeClass)||(this.sort(e),c.router.navigate(c.router.baseUrl(c.router.browsePath+e)))},sort:function(b){var d=a('.filter-links [data-sort="'+b+'"]'),e=this;e.clearSearch(),_.each(a(".filter-group").find(":checkbox").filter(":checked"),function(b){return a(b).prop("checked",!1),e.filtersChecked()}),a(".filter-links li > a, .theme-filter").removeClass(this.activeClass),d.addClass(this.activeClass),c.utils.title(d.text()),this.browse(b)},onFilter:function(b){var c,d=a(b.target),e=d.data("filter");d.hasClass(this.activeClass)||(a(".filter-links li > a, .theme-section").removeClass(this.activeClass),d.addClass(this.activeClass),e&&(e=_.union(e,this.filtersChecked()),c={tag:[e]},this.collection.query(c)))},addFilter:function(){this.filtersChecked()},applyFilters:function(b){var d,e=[],f=this.filtersChecked(),g={tag:f},h=a(".filtered-by .tags");b&&b.preventDefault(),a("body").addClass("filters-applied"),a(".filter-links li > a.current").removeClass("current"),h.empty(),_.each(f,function(b){d=a('label[for="filter-id-'+b+'"]').text(),e.push(d),h.append('<span class="tag">'+d+"</span>")}),c.router.navigate(c.router.baseUrl("tags/"+f.join("+"))),c.utils.title(e.join(", ")),this.collection.query(g)},filtersChecked:function(){var b=a(".filter-group").find(":checkbox").filter(":checked"),c=a(".filter-drawer"),d=[];return _.each(b,function(b){d.push(a(b).prop("value"))}),0===d.length?(c.find(".apply-filters").prop("disabled",!0).find("span").text(""),c.find(".clear-filters").hide(),a("body").removeClass("filters-applied"),!1):(c.find(".apply-filters").prop("disabled",!1).find("span").text(d.length),c.find(".clear-filters").css("display","inline-block"),d)},moreFilters:function(b){return b.preventDefault(),a("body").hasClass("filters-applied")?this.backToFilters():a("body").hasClass("show-filters")&&this.filtersChecked()?this.addFilter():(this.clearSearch(),void a("body").toggleClass("show-filters"))},clearFilters:function(b){var c=a(".filter-group").find(":checkbox"),d=this;b.preventDefault(),_.each(c.filter(":checked"),function(b){return a(b).prop("checked",!1),d.filtersChecked()})},backToFilters:function(b){b&&b.preventDefault(),a("body").removeClass("filters-applied")},clearSearch:function(){a("#wp-filter-search-input").val("")}}),c.Router=Backbone.Router.extend({routes:{"browse/:sort(/)":"sort","tags/:tag(/)":"tag","search/:query(/)":"search","author/:author(/)":"author",":slug(/)":"preview","":"sort"},baseUrl:function(a){return 0!==a.length&&(a+="/"),a},themePath:"",browsePath:"browse/",searchPath:"search/",search:function(b){a(".wp-filter-search").val(b)},navigate:function(){Backbone.history._hasPushState&&Backbone.Router.prototype.navigate.apply(this,arguments),"object"==typeof _gaq&&_gaq.push(["_trackPageview",c.data.settings.path+arguments[0]])}}),c.Run={init:function(){this.view=new c.view.Installer({section:"featured",SearchView:c.view.Search}),this.render()},render:function(){this.view.render(),this.routes(),Backbone.history.start({root:c.data.settings.path,pushState:!0,hashChange:!1})},routes:function(){var b=this,d={};c.router=new c.Router,c.router.on("route:preview",function(a){b.view.collection.queries.push(c.data.query),d.theme=a,b.view.collection.query(d),b.view.view.expand(a)}),c.router.on("route:sort",function(a){b.view.collection.queries.push(c.data.query),a||(a="featured"),b.view.sort(a),b.view.trigger("theme:close")}),c.router.on("route:search",function(){b.view.collection.queries.push(c.data.query),a(".wp-filter-search").focus().trigger("keyup"),b.view.trigger("theme:close")}),c.router.on("route:tag",function(d){b.view.collection.queries.push(c.data.query),_.each(d.split("+"),function(b){a("#filter-id-"+b).prop("checked",!0)}),a("body").removeClass("show-filters").addClass("show-filters"),b.view.applyFilters(),b.view.trigger("theme:close")}),c.router.on("route:author",function(a){b.view.collection.queries.push(c.data.query),d.author=a,b.view.collection.query(d),c.utils.title(a),b.view.trigger("theme:close")})}},a(function(){c.Run.init()})}(jQuery),function(a){a.load("visualization","1",{packages:["corechart"]})}(google);
  • sites/trunk/wordpress.org/public_html/wp-content/themes/pub/wporg-themes/style.css

    r1451 r1489  
    15531553    font-size: 18px;
    15541554    overflow: hidden;
    1555 }
    1556 
    1557 .posts-navigation .nav-previous {
    1558     float: right;
    1559 }
    1560 
    1561 .posts-navigation .nav-next {
    1562     float: left;
     1555    text-align: center;
    15631556}
    15641557
     
    15661559    padding: 8px 10px;
    15671560    display: inline-block;
    1568 }
    1569 
    1570 .posts-navigation .nav-previous a:after {
    1571     content: '\2192';
    1572     margin: 0 -10px 0 5px;
    1573 }
    1574 
    1575 .posts-navigation .nav-next a:before {
    1576     content: '\2190';
    1577     margin: 0 5px 0 -10px;
    1578     vertical-align: middle;
    15791561}
    15801562
  • sites/trunk/wordpress.org/public_html/wp-content/themes/pub/wporg-themes/theme-single.php

    r1483 r1489  
    1 <script id="tmpl-theme-single" type="text/template">
     1<div>
    22    <div class="theme-navigation">
    3         <button class="close"><?php _e( 'Return to Themes List', 'wporg-themes' ); ?></button>
     3        <a class="close" href="<?php echo home_url('/'); ?>"><?php _e( 'Return to Themes List', 'wporg-themes' ); ?></a>
    44        <div class="navigation post-navigation">
    5             <button class="left dashicons dashicons-no"><span class="screen-reader-text"><?php _e( 'Show previous theme', 'wporg-themes' ); ?></span></button>
    6             <button class="right dashicons dashicons-no"><span class="screen-reader-text"><?php _e( 'Show next theme', 'wporg-themes' ); ?></span></button>
     5            <button class="left dashicons dashicons-no disabled"><span class="screen-reader-text"><?php _e( 'Show previous theme', 'wporg-themes' ); ?></span></button>
     6            <button class="right dashicons dashicons-no disabled"><span class="screen-reader-text"><?php _e( 'Show next theme', 'wporg-themes' ); ?></span></button>
    77        </div>
    88    </div>
    99    <div class="theme-wrap">
    1010        <div class="theme-about hentry" itemscope itemtype="http://schema.org/CreativeWork">
    11             <# if ( data.is_outdated ) { #>
     11            <?php if ( time() - strtotime( $theme->last_updated ) > 2 * YEAR_IN_SECONDS ) { ?>
    1212            <div class="theme-notice notice notice-warning">
    1313                <p><?php _e( 'This theme <strong>hasn&#146;t been updated in over 2 years</strong>. It may no longer be maintained or supported and may have compatibility issues when used with more recent versions of WordPress.', 'wporg-themes' ); ?></p>
    1414            </div><!-- .theme-notice -->
    15             <# } #>
     15            <?php } ?>
    1616
    1717            <div>
    18                 <h3 class="theme-name entry-title" itemprop="name">{{{ data.name }}}</h3>
    19                 <h4 class="theme-author"><?php printf( _x( 'By %s', 'theme author', 'wporg-themes' ), '<a href="https://wordpress.org/themes/author/{{ data.author.user_nicename }}/"><span class="author" itemprop="author">{{{ data.author.display_name }}}</span></a>' ); ?></h4>
     18                <h3 class="theme-name entry-title" itemprop="name"><?php echo esc_html( $theme->name ); ?></h3>
     19                <h4 class="theme-author"><?php printf( _x( 'By %s', 'theme author', 'wporg-themes' ), '<a href="https://wordpress.org/themes/author/' . $theme->author->user_nicename . '/"><span class="author" itemprop="author">' . esc_html( $theme->author->display_name ) . '</span></a>' ); ?></h4>
    2020            </div>
    2121
    2222            <div class="theme-head">
    2323                <div class="theme-actions clear">
    24                     <a href="{{{ data.preview_url }}}" class="button button-secondary alignleft"><?php _e( 'Preview', 'wporg-themes' ); ?></a>
    25                     <a href="//downloads.wordpress.org/theme/{{ data.slug }}.{{ data.version }}.zip" class="button button-primary alignright"><?php _e( 'Download', 'wporg-themes' ); ?></a>
     24                    <a href="<?php echo esc_url( $theme->preview_url ); ?>" class="button button-secondary alignleft"><?php _e( 'Preview', 'wporg-themes' ); ?></a>
     25                    <a href="<?php echo esc_url( $theme->download_link); ?>" class="button button-primary alignright"><?php _e( 'Download', 'wporg-themes' ); ?></a>
    2626                </div>
    2727
    28                 <# if ( data.parent ) { #>
     28                <?php if ( !empty( $theme->parent ) ) { ?>
    2929                <div class="theme-notice notice notice-info">
    30                     <p class="parent"><?php printf( __( 'This is a child theme of %s.', 'wporg-themes' ), sprintf( '<a href="/themes/%1$s/">%2$s</a>', '{{{ data.parent.slug }}}', '{{{ data.parent.name }}}' ) ); ?></p>
     30                    <p class="parent"><?php printf( __( 'This is a child theme of %s.', 'wporg-themes' ), sprintf( '<a href="%1$s">%2$s</a>', home_url( $theme->parent['slug'] . '/' ), esc_html( $theme->parent['name'] ) ) ); ?></p>
    3131                </div>
    32                 <# } #>
     32                <?php } ?>
    3333
    3434                <div class="theme-meta-info">
    35                     <p class="updated"><?php printf( __( 'Last updated: %s', 'wporg-themes' ), '<strong>{{ data.last_updated }}</strong>' ); ?></p>
    36                     <# if ( data.theme_url ) { #>
    37                     <a href="{{ data.theme_url }}"><?php _e( 'Theme Homepage', 'wporg-themes' ); ?></a>
    38                     <# } #>
     35                    <p class="updated"><?php printf( __( 'Last updated: %s', 'wporg-themes' ), '<strong>' . date_i18n( 'F j, Y', strtotime( $theme->last_updated ) ) . '</strong>' ); ?></p>
     36                    <?php if ( $theme->theme_url ) { ?>
     37                    <a href="<?php echo esc_url( $theme->theme_url ); ?>"><?php _e( 'Theme Homepage', 'wporg-themes' ); ?></a>
     38                    <?php } ?>
    3939                </div>
    4040            </div><!-- .theme-head -->
    4141
    4242            <div class="theme-info">
    43                 <# if ( data.screenshot_url ) { #>
    44                 <div class="screenshot"><img src="{{ data.screenshot_url }}?w=1142&strip=all" alt=""/></div>
    45                 <# } else { #>
    46                 <div class="screenshot blank"></div>
    47                 <# } #>
     43                <?php if ( $theme->screenshot_url ) { ?>
     44                    <div class="screenshot"><img src="<?php echo esc_url( $theme->screenshot_url ); ?>?w=1142&strip=all" alt=""/></div>
     45                <?php } else { ?>
     46                    <div class="screenshot blank"></div>
     47                <?php } ?>
    4848
    49                 <div class="theme-description entry-summary" itemprop="description"><p>{{{ data.description }}}</p></div>
     49                <div class="theme-description entry-summary" itemprop="description"><p><?php echo esc_html( $theme->description ); ?></p></div>
    5050
    51                 <# if ( data.tags ) { #>
     51                <?php if ( $theme->tags ) { ?>
    5252                <div class="theme-tags">
    5353                    <h4><?php _e( 'Tags:', 'wporg-themes' ); ?></h4>
    54                     {{{ data.tags }}}
     54                    <?php
     55                    $tag_links = array();
     56                    foreach ( $theme->tags as $slug => $tagname ) {
     57                        $tag_links[] = sprintf(
     58                            "<a href='%s'>%s</a>",
     59                            esc_url( home_url( "/tags/$slug/" ) ),
     60                            esc_html( $tagname )
     61                        );
     62                    }
     63                    echo implode( ', ', $tag_links );                       
     64                    ?>
    5565                </div><!-- .theme-tags -->
    56                 <# } #>
     66                <?php } ?>
    5767
    5868                <div class="theme-downloads">
    59                     <h4><?php _e( 'Downloads Per Day', 'wporg-themes' ); ?></h4>
    60                     <div id="theme-download-stats-{{data.id}}" class="chart"></div>
    61                     <p class="total-downloads"><?php printf( __( 'Total downloads: %s', 'wporg-themes' ), '<strong>{{ data.downloaded }}</strong>' ); ?></p>
     69                    <p class="total-downloads"><?php printf( __( 'Total downloads: %s', 'wporg-themes' ), '<strong>' . number_format_i18n( $theme->downloaded ) . '</strong>' ); ?></p>
    6270                </div><!-- .theme-downloads -->
    6371            </div>
     
    6573            <div class="theme-meta">
    6674                <div class="theme-ratings" itemprop="aggregateRating" itemscope itemtype="http://schema.org/AggregateRating">
    67                     <meta itemprop="ratingCount" content="{{ data.num_ratings }}"/>
     75                    <meta itemprop="ratingCount" content="<?php echo $theme->num_ratings; ?>"/>
    6876                    <h4><?php _e( 'Ratings', 'wporg-themes' ); ?></h4>
    6977
    70                     <# if ( data.rating ) { #>
    71                     <div class="rating rating-{{ Math.round( data.rating / 10 ) * 10 }}">
     78                    <?php if ( $theme->rating ) { ?>
     79                    <div class="rating rating-<?php echo round( $theme->rating / 10 ) * 10; ?>">
    7280                        <span class="one"></span>
    7381                        <span class="two"></span>
     
    7583                        <span class="four"></span>
    7684                        <span class="five"></span>
    77                         <p class="description"><?php printf( __( '%s out of 5 stars.', 'wporg-themes' ), '<span itemprop="ratingValue">{{ Math.round( data.rating / 20 / 0.5 )*0.5 }}</span>' ); ?></p>
     85                        <p class="description"><?php printf( __( '%s out of 5 stars.', 'wporg-themes' ), '<span itemprop="ratingValue">' . round( $theme->rating / 20 / 0.5 )*0.5 . '</span>' ); ?></p>
    7886                    </div>
    79                     <# } else { #>
     87                    <?php } else { ?>
    8088                    <div class="rating">
    8189                        <div class="ratings"><?php _e( 'This theme has not been rated yet.', 'wporg-themes' ); ?></div>
    8290                    </div>
    83                     <# } #>
     91                    <?php } ?>
    8492
    85                     <# if ( data.ratings ) { #>
     93                    <?php if ( $theme->ratings ) { ?>
    8694                    <ul>
    87                         <?php foreach ( range( 5, 1 ) as $stars ) : ?>
     95                        <?php foreach ( range( 5, 1 ) as $stars ) :
     96                            $rating_bar_width = $theme->num_ratings ? 100 * $theme->ratings[$stars] / $theme->num_ratings : 0;
     97                        ?>
    8898                        <li class="counter-container">
    89                             <a href="//wordpress.org/support/view/theme-reviews/{{ data.id }}?filter=<?php echo $stars; ?>" title="<?php echo esc_attr( sprintf( _n( 'Click to see reviews that provided a rating of %d star', 'Click to see reviews that provided a rating of %d stars', $stars, 'wporg-themes' ), $stars ) ); ?>">
     99                            <a href="//wordpress.org/support/view/theme-reviews/<?php echo $theme->slug; ?>?filter=<?php echo $stars; ?>" title="<?php echo esc_attr( sprintf( _n( 'Click to see reviews that provided a rating of %d star', 'Click to see reviews that provided a rating of %d stars', $stars, 'wporg-themes' ), $stars ) ); ?>">
    90100                                <span class="counter-label"><?php printf( _n( '%d star', '%d stars', $stars, 'wporg-themes' ), $stars ); ?></span>
    91101                                <span class="counter-back">
    92                                     <span class="counter-bar" style="width: {{ 100 * data.ratings[<?php echo $stars; ?>] / data.num_ratings }}%;"></span>
     102                                    <span class="counter-bar" style="width: <?php echo $rating_bar_width; ?>%;"></span>
    93103                                </span>
    94                                 <span class="counter-count">{{ data.ratings[<?php echo $stars; ?>] }}</span>
     104                                <span class="counter-count"><?php echo $theme->ratings[$stars]; ?></span>
    95105                            </a>
    96106                        </li>
    97107                        <?php endforeach; ?>
    98108                    </ul>
    99                     <# } #>
     109                    <?php } ?>
    100110
    101                     <a class="button button-secondary" href="https://wordpress.org/support/view/theme-reviews/{{ data.id }}#postform"><?php _e( 'Add your review', 'wporg-themes' ); ?></a>
     111                    <a class="button button-secondary" href="https://wordpress.org/support/view/theme-reviews/<?php echo $theme->slug; ?>#postform"><?php _e( 'Add your review', 'wporg-themes' ); ?></a>
    102112                </div><!-- .theme-rating -->
    103113
     
    105115                    <h4><?php _e( 'Support', 'wporg-themes' ); ?></h4>
    106116                    <p><?php _e( 'Got something to say? Need help?', 'wporg-themes' ); ?></p>
    107                     <a href="//wordpress.org/support/theme/{{ data.slug }}" class="button button-secondary"><?php _e( 'View support forum', 'wporg-themes' ); ?></a>
     117                    <a href="//wordpress.org/support/theme/<?php echo $theme->slug; ?>" class="button button-secondary"><?php _e( 'View support forum', 'wporg-themes' ); ?></a>
    108118                </div><!-- .theme-support -->
    109119
     
    113123                    <ul class="unmarked-list">
    114124                        <li>
    115                             <a href="//themes.trac.wordpress.org/log/{{data.id}}?limit=100&mode=stop_on_copy&format=rss">
     125                            <a href="//themes.trac.wordpress.org/log/<?php echo $theme->slug; ?>?limit=100&amp;mode=stop_on_copy&amp;format=rss">
    116126                                <img src="//s.w.org/style/images/feedicon.png" />
    117127                                <?php _e( 'Development Log', 'wporg-themes' ); ?>
     
    122132                    <h5><?php _e( 'Browse the Code', 'wporg-themes' ); ?></h5>
    123133                    <ul class="unmarked-list">
    124                         <li><a href="//themes.trac.wordpress.org/log/{{data.id}}/" rel="nofollow"><?php _e( 'Development Log', 'wporg-themes' ); ?></a></li>
    125                         <li><a href="//themes.svn.wordpress.org/{{data.id}}/" rel="nofollow"><?php _e( 'Subversion Repository', 'wporg-themes' ); ?></a></li>
    126                         <li><a href="//themes.trac.wordpress.org/browser/{{data.id}}/" rel="nofollow"><?php _e( 'Browse in Trac', 'wporg-themes' ); ?></a></li>
     134                        <li><a href="//themes.trac.wordpress.org/log/<?php echo $theme->slug; ?>/" rel="nofollow"><?php _e( 'Development Log', 'wporg-themes' ); ?></a></li>
     135                        <li><a href="//themes.svn.wordpress.org/<?php echo $theme->slug; ?>/" rel="nofollow"><?php _e( 'Subversion Repository', 'wporg-themes' ); ?></a></li>
     136                        <li><a href="//themes.trac.wordpress.org/browser/<?php echo $theme->slug; ?>/" rel="nofollow"><?php _e( 'Browse in Trac', 'wporg-themes' ); ?></a></li>
    127137                    </ul>
    128138                </div><!-- .theme-devs -->
     
    130140        </div>
    131141    </div>
    132 </script>
     142</div>
  • sites/trunk/wordpress.org/public_html/wp-content/themes/pub/wporg-themes/theme.php

    r1483 r1489  
    1 <script id="tmpl-theme" type="text/template">
    2     <a class="url" href="{{{ data.permalink }}}" rel="bookmark" tabindex="-1">
    3         <# if ( data.screenshot_url ) { #>
     1<article id="post-<?php echo esc_attr( $theme->slug ); ?>" class="theme hentry">
     2    <a class="url" href="<?php echo home_url( $theme->slug . '/' ); ?>" rel="bookmark" tabindex="-1">
     3        <?php if ( $theme->screenshot_url ) { ?>
    44        <div class="theme-screenshot">
    5             <img src="{{ data.screenshot_url }}?w=572&strip=all" alt="" />
     5            <img src="<?php echo esc_url( $theme->screenshot_url ); ?>?w=572&amp;strip=all" alt="" />
    66        </div>
    7         <# } else { #>
     7        <?php } else { ?>
    88        <div class="theme-screenshot blank"></div>
    9         <# } #>
     9        <?php } ?>
    1010        <span class="more-details"><?php _ex( 'More Info', 'theme', 'wporg-themes' ); ?></span>
    11         <div class="theme-author"><?php printf( _x( 'By %s', 'theme author', 'wporg-themes' ), '<span class="author">{{ data.author.display_name }}</span>' ); ?></div>
    12         <h3 class="theme-name entry-title">{{{ data.name }}}</h3>
     11        <div class="theme-author"><?php printf( _x( 'By %s', 'theme author', 'wporg-themes' ), '<span class="author">' . esc_html( $theme->author->display_name ) . '</span>' ); ?></div>
     12        <h3 class="theme-name entry-title"><?php echo esc_html( $theme->name ); ?></h3>
    1313    </a>
    1414    <div class="theme-actions">
    15         <a class="button button-primary preview install-theme-preview" href="//downloads.wordpress.org/theme/{{ data.slug }}.{{ data.version }}.zip"><?php esc_html_e( 'Download', 'wporg-themes' ); ?></a>
     15        <a class="button button-primary preview install-theme-preview" href="<?php echo esc_url( $theme->download_link ); ?>"><?php esc_html_e( 'Download', 'wporg-themes' ); ?></a>
    1616    </div>
    17 </script>
     17</article>
  • sites/trunk/wordpress.org/public_html/wp-content/themes/pub/wporg-themes/view-templates/theme-single.php

    r1481 r1489  
    1717            <div>
    1818                <h3 class="theme-name entry-title" itemprop="name">{{{ data.name }}}</h3>
    19                 <h4 class="theme-author"><?php printf( _x( 'By %s', 'theme author', 'wporg-themes' ), '<a href="https://wordpress.org/themes/author/{{ data.author.user_nicename }}/"><span class="author" itemprop="author">{{{ data.author.display_name }}}</span></a>' ); ?></h4>
     19                <h4 class="theme-author"><?php printf( _x( 'By %s', 'theme author', 'wporg-themes' ), '<a href="{{{ data.path }}}author/{{ data.author.user_nicename }}/"><span class="author" itemprop="author">{{{ data.author.display_name }}}</span></a>' ); ?></h4>
    2020            </div>
    2121
     
    2323                <div class="theme-actions clear">
    2424                    <a href="{{{ data.preview_url }}}" class="button button-secondary alignleft"><?php _e( 'Preview', 'wporg-themes' ); ?></a>
    25                     <a href="//downloads.wordpress.org/theme/{{ data.slug }}.{{ data.version }}.zip" class="button button-primary alignright"><?php _e( 'Download', 'wporg-themes' ); ?></a>
     25                    <a href="{{ data.download_link }}" class="button button-primary alignright"><?php _e( 'Download', 'wporg-themes' ); ?></a>
    2626                </div>
    2727
    2828                <# if ( data.parent ) { #>
    2929                <div class="theme-notice notice notice-info">
    30                     <p class="parent"><?php printf( __( 'This is a child theme of %s.', 'wporg-themes' ), sprintf( '<a href="/themes/%1$s/">%2$s</a>', '{{{ data.parent.slug }}}', '{{{ data.parent.name }}}' ) ); ?></p>
     30                    <p class="parent"><?php printf( __( 'This is a child theme of %s.', 'wporg-themes' ), sprintf( '<a href="%1$s">%2$s</a>', '{{{ data.path }}}{{{ data.parent.slug }}}/', '{{{ data.parent.name }}}' ) ); ?></p>
    3131                </div>
    3232                <# } #>
  • sites/trunk/wordpress.org/public_html/wp-content/themes/pub/wporg-themes/view-templates/theme.php

    r1481 r1489  
    1313    </a>
    1414    <div class="theme-actions">
    15         <a class="button button-primary preview install-theme-preview" href="//downloads.wordpress.org/theme/{{ data.slug }}.{{ data.version }}.zip"><?php esc_html_e( 'Download', 'wporg-themes' ); ?></a>
     15        <a class="button button-primary preview install-theme-preview" href="{{ data.download_link }}"><?php esc_html_e( 'Download', 'wporg-themes' ); ?></a>
    1616    </div>
    1717</script>
Note: See TracChangeset for help on using the changeset viewer.