diff --git a/wp-admin/css/colors-classic.css b/wp-admin/css/colors-classic.css index 65d0f38314..a3fcbe4021 100644 --- a/wp-admin/css/colors-classic.css +++ b/wp-admin/css/colors-classic.css @@ -33,7 +33,8 @@ input.disabled, textarea.disabled { #user_info a:hover, li.widget-list-control-item h4.widget-title a:hover, .submit a, #dashmenu a:hover, #footer a, #upload-menu li a.upload-tab-link, li.widget-list-control-item h4.widget-title a, #dragHelper li.widget-list-control-item h4.widget-title a, -#draghelper li.widget-list-control-item h4.widget-title a:visited, .login #backtoblog a:hover { +#draghelper li.widget-list-control-item h4.widget-title a:visited, .login #backtoblog a:hover, +#plugin-information .action-button a, #plugin-information .action-button a:hover, #plugin-information .action-button a:visited { color: #fff; } @@ -321,7 +322,7 @@ ul#widget-list li.widget-list-item h4.widget-title { color: #fff; } -#rightnow .reallynow { +#rightnow .reallynow, #plugin-information .action-button { background-color: #114973; color: #fff; } @@ -331,7 +332,7 @@ ul#widget-list li.widget-list-item h4.widget-title { background-color: #07273E; } -#adminmenu, div#media-upload-header { +#adminmenu, div#media-upload-header, div#plugin-information-header { background-color: #14568a; border-bottom-color: #07273e; } diff --git a/wp-admin/css/colors-fresh.css b/wp-admin/css/colors-fresh.css index 09e0c58226..fb43754c56 100644 --- a/wp-admin/css/colors-fresh.css +++ b/wp-admin/css/colors-fresh.css @@ -37,7 +37,8 @@ input.disabled, textarea.disabled { #user_info a:hover, li.widget-list-control-item h4.widget-title a:hover, .submit a, #dashmenu a:hover, #footer a, #upload-menu li a.upload-tab-link, li.widget-list-control-item h4.widget-title a, #dragHelper li.widget-list-control-item h4.widget-title a, -#draghelper li.widget-list-control-item h4.widget-title a:visited, .login #backtoblog a:hover { +#draghelper li.widget-list-control-item h4.widget-title a:visited, .login #backtoblog a:hover, +#plugin-information .action-button a, #plugin-information .action-button a:hover, #plugin-information .action-button a:visited { color: #fff; } @@ -295,7 +296,7 @@ ul#widget-list li.widget-list-item h4.widget-title { background-image: url(../images/comment-stalk-fresh.gif); } -#adminmenu li a #awaiting-mod span, #sidemenu li a #update-plugins span, #rightnow .reallynow { +#adminmenu li a #awaiting-mod span, #sidemenu li a #update-plugins span, #rightnow .reallynow, #plugin-information .action-button { background-color: #d54e21; color: #fff; } @@ -304,7 +305,7 @@ ul#widget-list li.widget-list-item h4.widget-title { background-color: #264761; } -#adminmenu, div#media-upload-header { +#adminmenu, div#media-upload-header, div#plugin-information-header { background-color: #e4f2fd; border-bottom-color: #c6d9e9; } diff --git a/wp-admin/css/plugin-install.css b/wp-admin/css/plugin-install.css new file mode 100644 index 0000000000..1bd75c79f0 --- /dev/null +++ b/wp-admin/css/plugin-install.css @@ -0,0 +1,122 @@ +/* NOTE: the following CSS rules(.star*) are taken more or less straight from the bbPress rating plugin. */ +div.star-holder { + position: relative; + height: 19px; + width: 100px; + font-size: 19px; +} +div.star { + height: 100%; + position: absolute; + top: 0px; + left: 0px; + background-color: transparent; + letter-spacing: 1ex; + border: none; +} +div.star.select:hover { background-color: #d00; } +.star1 { width: 20%; } +.star2 { width: 40%; } +.star3 { width: 60%; } +.star4 { width: 80%; } +.star5 { width: 100%; } +.star-average, .star.star-rating { background-color: #fc0; } /* TODO: Colour CSS file */ +.star img, div.star a, div.star a:hover, div.star a:visited { + display: block; + position: absolute; + right: 0px; + border: none; + text-decoration: none; +} +div.star img { + width: 19px; + height: 19px; + border-left: 1px solid #fff; + border-right: 1px solid #fff; +} + +/* Start custom CSS */ +/* TODO: Move remaining colours to Colours CSS */ +/* Header on thickbox */ +#plugin-information-header { + margin: 0; + padding: 0 5px; + font-weight: bold; + position: relative; + border-bottom-width: 1px; + border-bottom-style: solid; + height: 2.5em; +} +#plugin-information ul#sidemenu { + font-weight: normal; + margin: 0 5px; + position: absolute; + left: 0px; + bottom: -1px; +} + +/* Install sidemenu */ + +#plugin-information p.action-button { + width: 100%; + padding-bottom:0; + margin-bottom:0; + margin-top: 10px; +} + +#plugin-information .action-button a { + text-align: center; + font-weight: bold; + text-decoration: none; + display: block; + line-height: 2em; +} + +#plugin-information h2 { + clear: none !important; + margin-right: 200px; +} + +#plugin-information .fyi { + margin-left: 10px; + margin-bottom: 50px; + width: 210px; +} + +#plugin-information .fyi h2 { + font-size: 0.9em; + margin-bottom: 0px; + margin-right: 0px; +} + +#plugin-information .fyi h2.mainheader { + background-color: #cee1ef; /* TODO: Colour CSS file */ + padding: 5px; +} + +#plugin-information .fyi ul { + background-color: #eaf3fa; /* TODO: Colour CSS file */ + padding-top: 10px; + padding-bottom: 10px; + padding-left: 7px; + padding-right: 5px; + margin: 0px; + list-style: none; +} + +#plugin-information .fyi li { + margin-right: 0px; +} + +#plugin-information #section-holder { + padding: 10px; +} + +#plugin-information #section-screenshots li img { + vertical-align: text-top; +} +#plugin-information #section-screenshots li p { + font-style: italic; + padding-left: 20px; + padding-bottom: 2em; +} \ No newline at end of file diff --git a/wp-admin/images/star.gif b/wp-admin/images/star.gif new file mode 100644 index 0000000000..c96b94472c Binary files /dev/null and b/wp-admin/images/star.gif differ diff --git a/wp-admin/includes/class-wp-filesystem-ftpext.php b/wp-admin/includes/class-wp-filesystem-ftpext.php index 20699351d9..eb5e44a598 100644 --- a/wp-admin/includes/class-wp-filesystem-ftpext.php +++ b/wp-admin/includes/class-wp-filesystem-ftpext.php @@ -119,7 +119,7 @@ class WP_Filesystem_FTPext extends WP_Filesystem_Base{ return $ret; } function cwd() { - $cwd = ftp_pwd($this->link); + $cwd = @ftp_pwd($this->link); if( $cwd ) $cwd = trailingslashit($cwd); return $cwd; diff --git a/wp-admin/includes/dashboard.php b/wp-admin/includes/dashboard.php index 27839fcfd3..fe92c70f73 100644 --- a/wp-admin/includes/dashboard.php +++ b/wp-admin/includes/dashboard.php @@ -433,10 +433,16 @@ function wp_dashboard_plugins_output() { list($link, $frag) = explode( '#', $item['link'] ); $link = clean_url($link); - $dlink = rtrim($link, '/') . '/download/'; + if( preg_match('|/([^/]+?)/?$|', $link, $matches) ) + $slug = $matches[1]; + else + $slug = ''; + + $ilink = wp_nonce_url('plugin-install.php?tab=install-confirmation&plugin=' . $slug, 'install-plugin_' . $slug) . + '&TB_iframe=true&width=600&height=800'; echo "
$description
\n"; } } diff --git a/wp-admin/includes/file.php b/wp-admin/includes/file.php index 349feb2e6a..67b0483991 100644 --- a/wp-admin/includes/file.php +++ b/wp-admin/includes/file.php @@ -458,4 +458,78 @@ function get_filesystem_method() { return apply_filters('filesystem_method', $method); } -?> \ No newline at end of file +function request_filesystem_credentials($form_post, $type = '', $error = false) { + $req_cred = apply_filters('request_filesystem_credentials', '', $form_post, $type, $error); + if ( '' !== $req_cred ) + return $req_cred; + + if ( empty($type) ) + $type = get_filesystem_method(); + + if ( 'direct' == $type ) + return true; + + if( ! $credentials = get_option('ftp_credentials') ) + $credentials = array(); + // If defined, set it to that, Else, If POST'd, set it to that, If not, Set it to whatever it previously was(saved details in option) + $credentials['hostname'] = defined('FTP_HOST') ? FTP_HOST : (!empty($_POST['hostname']) ? $_POST['hostname'] : $credentials['hostname']); + $credentials['username'] = defined('FTP_USER') ? FTP_USER : (!empty($_POST['username']) ? $_POST['username'] : $credentials['username']); + $credentials['password'] = defined('FTP_PASS') ? FTP_PASS : (!empty($_POST['password']) ? $_POST['password'] : $credentials['password']); + $credentials['ssl'] = defined('FTP_SSL') ? FTP_SSL : ( isset($_POST['ssl']) ? $_POST['ssl'] : $credentials['ssl']); + + if ( ! $error && !empty($credentials['password']) && !empty($credentials['username']) && !empty($credentials['hostname']) ) { + $stored_credentials = $credentials; + unset($stored_credentials['password']); + update_option('ftp_credentials', $stored_credentials); + return $credentials; + } + $hostname = ''; + $username = ''; + $password = ''; + $ssl = ''; + if ( !empty($credentials) ) + extract($credentials, EXTR_OVERWRITE); + if( $error ) + echo '' . __('Error: There was an error connecting to the server, Please verify the settings are correct.') . '
$message
\n"; +} + ?> diff --git a/wp-admin/includes/plugin-install.php b/wp-admin/includes/plugin-install.php new file mode 100644 index 0000000000..d80d89b117 --- /dev/null +++ b/wp-admin/includes/plugin-install.php @@ -0,0 +1,532 @@ + $action, 'request' => serialize($args))) );//Note: http_build_query() can be removed once WP_HTTP accepts unencoded data. + $res = unserialize($request['body']); + if ( ! $res ) + wp_die($request['body']); + } + + return apply_filters('plugins_api_result', $res); +} + +function install_popular_tags( $args = array() ) { + if ( ! $cache = get_option('wporg_popular_tags') ) + add_option('wporg_popular_tags', array(), '', 'no');///No autoload. + + if ( $cache && $cache->timeout + 3 * 60 * 60 > time() ) + return $cache->cached; + + $tags = plugins_api('hot_tags'); + + update_option('wporg_popular_tags', (object) array('timeout' => time(), 'cached' => $tags)); + + return $tags; +} + +add_action('install_plugins_search', 'install_search', 10, 1); +function install_search($page) { + $type = isset($_REQUEST['type']) ? $_REQUEST['type'] : ''; + $term = isset($_REQUEST['s']) ? $_REQUEST['s'] : ''; + + if( ! empty($term) ){ + $args = array(); + + switch( $type ){ + case 'tag': + $args['tag'] = sanitize_title_with_dashes($term); + break; + case 'term': + $args['search'] = $term; + break; + case 'author': + $args['author'] = $term; + break; + } + + $args['page'] = $page; + + $api = plugins_api('query_plugins', $args); + + add_action('install_plugins_table_header', 'install_search_form'); + + display_plugins_table($api->plugins, $api->info['page'], $api->info['pages']); + + return; + } + ?> + +WordPress Plugin Directory via this page.') ?>
+ + + +
+ Term: Searches plugins names and descriptions for the specified term') ?>
+ Tag: Searches for plugins tagged as such') ?>
+ Author: Searches for plugins created by the Author, or which the Author contributed to.') ?>
Will utilise SwfUpload(if available) & unzip .zip plugin packages
'; +} + +function display_plugins_table($plugins, $page = 1, $totalpages = 1){ + global $tab; + + $type = isset($_REQUEST['type']) ? $_REQUEST['type'] : ''; + $term = isset($_REQUEST['s']) ? $_REQUEST['s'] : ''; + + $plugins_allowedtags = array('a' => array('href' => array(),'title' => array(), 'target' => array()),'abbr' => array('title' => array()),'acronym' => array('title' => array()),'code' => array(),'em' => array(),'strong' => array()); + +?> ++ | + | + | + | + | ', __('No plugins match your request.'), ' | '; + + foreach( (array) $plugins as $plugin ){ + if ( is_object($plugin) ) + $plugin = (array) $plugin; + + $title = wp_kses($plugin['name'], $plugins_allowedtags); + $description = wp_kses($plugin['description'], $plugins_allowedtags); + $version = wp_kses($plugin['version'], $plugins_allowedtags); + + $name = strip_tags($title . ' ' . $version); + + $author = $plugin['author']; + if( ! empty($plugin['author']) ) + $author = ' ' . sprintf( __('By %s'), $author ) . '.'; + + $author = wp_kses($author, $plugins_allowedtags); + + if( isset($plugin['homepage']) ) + $title = '' . $title . ''; + + $action_links = array(); + $action_links[] = '' . __('Install') . ''; + + $action_links = apply_filters('plugin_install_action_links', $action_links, $plugin); + ?> +
---|---|---|---|---|
+ | + |
+
+
+
+
+
+
+
+
+ |
+ + | + |
WordPress plugin directory.'); ?>
-%s directory. Once a plugin is uploaded, you may activate it here.'), WP_PLUGIN_DIR); ?>
+Plugin Browser/Installer functionality, Or by browsing the WordPress Plugin Directory directly and installing manually.'); ?>
+manually install a plugin you generally just need to upload the plugin file into your %s
directory.'), WP_PLUGIN_DIR); ?>
' . __('Error: There was an error connecting to the server, Please verify the settings are correct.') . '
$message
\n"; -} - function do_plugin_upgrade($plugin) { global $wp_filesystem; diff --git a/wp-includes/category-template.php b/wp-includes/category-template.php index 2c37e97738..5eb9a085b9 100644 --- a/wp-includes/category-template.php +++ b/wp-includes/category-template.php @@ -350,10 +350,16 @@ function wp_tag_cloud( $args = '' ) { if ( empty($tags) ) return; - $return = wp_generate_tag_cloud( $tags, $args ); // Here's where those top tags get sorted according to $args + foreach ( $tags as $key => $tag ) { + $link = get_tag_link( $tag->term_id ); + if ( is_wp_error( $link ) ) + return false; - if ( is_wp_error( $return ) ) - return false; + $tags[ $key ]->link = $link; + $tags[ $key ]->id = $tag->term_id; + } + + $return = wp_generate_tag_cloud( $tags, $args ); // Here's where those top tags get sorted according to $args $return = apply_filters( 'wp_tag_cloud', $return, $args ); @@ -363,28 +369,33 @@ function wp_tag_cloud( $args = '' ) { echo $return; } -// $tags = prefetched tag array ( get_tags() ) -// $args['format'] = 'flat' => whitespace separated, 'list' => UL, 'array' => array() -// $args['orderby'] = 'name', 'count' +/** + * Generates a tag cloud (heatmap) from provided data + * + * TODO: Complete + * + * @since 2.6 + * + * $tags = array of objects with the properties 'name', 'link', 'id', and 'count' + * $args['format'] = 'flat' => whitespace separated, 'list' => UL, 'array' => array() + * $args['orderby'] = 'name', 'count' +*/ function wp_generate_tag_cloud( $tags, $args = '' ) { global $wp_rewrite; $defaults = array( - 'smallest' => 8, 'largest' => 22, 'unit' => 'pt', 'number' => 45, - 'format' => 'flat', 'orderby' => 'name', 'order' => 'ASC' + 'smallest' => 8, 'largest' => 22, 'unit' => 'pt', + 'format' => 'flat', 'orderby' => 'name', 'order' => 'ASC', + 'single_text' => '%d topic', 'multiple_text' => '%d topics' ); $args = wp_parse_args( $args, $defaults ); extract($args); - if ( !$tags ) + if ( empty($tags) ) return; - $counts = $tag_links = array(); - foreach ( (array) $tags as $tag ) { - $counts[$tag->name] = $tag->count; - $tag_links[$tag->name] = get_tag_link( $tag->term_id ); - if ( is_wp_error( $tag_links[$tag->name] ) ) - return $tag_links[$tag->name]; - $tag_ids[$tag->name] = $tag->term_id; - } + + $counts = array(); + foreach ( (array) $tags as $tag ) + $counts[ $tag->name ] = $tag->count; $min_count = min($counts); $spread = max($counts) - $min_count; @@ -416,9 +427,10 @@ function wp_generate_tag_cloud( $tags, $args = '' ) { $rel = ( is_object($wp_rewrite) && $wp_rewrite->using_permalinks() ) ? ' rel="tag"' : ''; foreach ( $counts as $tag => $count ) { - $tag_id = $tag_ids[$tag]; - $tag_link = clean_url($tag_links[$tag]); - $a[] = "$tag"; } diff --git a/wp-includes/formatting.php b/wp-includes/formatting.php index 09863061f7..84ab78ea74 100644 --- a/wp-includes/formatting.php +++ b/wp-includes/formatting.php @@ -1420,4 +1420,85 @@ function wp_html_excerpt( $str, $count ) { return $str; } +/** + * Add a Base url to relative links in passed content. + * + * By default it supports the 'src' and 'href' attributes, + * However this may be changed via the 3rd param. + * + * @package WordPress + * @since 2.7 + * + * @param string $content String to search for links in + * @param string $base The base URL to prefix to links + * @param array $attrs The attributes which should be processed. + * @eaturn string The processed content. + */ +function links_add_base_url( $content, $base, $attrs = array('src', 'href') ) { + $attrs = implode('|', (array)$attrs); + return preg_replace_callback("!($attrs)=(['\"])(.+?)\\2!i", + create_function('$m', 'return _links_add_base($m, "' . $base . '");'), + $content); +} + +/** + * Callback to add a base url to relative links in passed content. + * + * + * @package WordPress + * @since 2.7 + * + * @internal + * @param string $m The matched link + * @param string $base The base URL to prefix to links + * @eaturn string The processed link + */ +function _links_add_base($m, $base) { + //1 = attribute name 2 = quotation mark 3 = URL + return $m[1] . '=' . $m[2] . + (strpos($m[3], 'http://') === false ? + path_join($base, $m[3]) : + $m[3]) + . $m[2]; +} + +/** + * Adds a Target attribute to all links in passed content. + * + * This function by default only applies to tags, + * however this can be modified by the 3rd param. + * NOTE: Any current target attributed will be striped and replaced. + * + * @package WordPress + * @since 2.7 + * + * @param string $content String to search for links in + * @param string $target The Target to add to the links + * @param array $tags An array of tags to apply to. + * @eaturn string The processed content. + */ +function links_add_target( $content, $target = '_blank', $tags = array('a') ) { + $tags = implode('|', (array)$tags); + return preg_replace_callback("!<($tags)(.+?)>!i", + create_function('$m', 'return _links_add_target($m, "' . $target . '");'), + $content); +} +/** + * Callback to add a target attribute to all links in passed content + * + * + * @package WordPress + * @since 2.7 + * + * @internal + * @param string $m The matched link + * @param string $target The Target to add to the links + * @eaturn string The processed link. + */ +function _links_add_target( $m, $target ) { + $tag = $m[1]; + $link = preg_replace('|(target=[\'"](.*?)[\'"])|i', '', $m[2]); + return '<' . $tag . $link . ' target="' . $target . '">'; +} + ?> diff --git a/wp-includes/script-loader.php b/wp-includes/script-loader.php index fd461619ba..4caec11e6c 100644 --- a/wp-includes/script-loader.php +++ b/wp-includes/script-loader.php @@ -201,6 +201,12 @@ function wp_default_scripts( &$scripts ) { )); $scripts->add( 'theme-preview', '/wp-admin/js/theme-preview.js', array( 'thickbox', 'jquery' ), '20080625' ); + + $scripts->add( 'plugin-install', '/wp-admin/js/plugin-install.js', array( 'thickbox', 'jquery' ), '20080803' ); + $scripts->localize( 'plugin-install', 'plugininstallL10n', array( + 'plugin_information' => __('Plugin Information:') + ) ); + } } @@ -234,6 +240,7 @@ function wp_default_styles( &$styles ) { $styles->add_data( 'press-this-ie', 'conditional', 'gte IE 6' ); $styles->add( 'thickbox', '/wp-includes/js/thickbox/thickbox.css', array(), '20080613' ); $styles->add( 'login', '/wp-admin/css/login.css' ); + $styles->add( 'plugin-install', '/wp-admin/css/plugin-install.css' ); foreach ( $rtl_styles as $rtl_style ) $styles->add_data( $rtl_style, 'rtl', true ); diff --git a/wp-includes/version.php b/wp-includes/version.php index 721f5d96a7..223c085a50 100644 --- a/wp-includes/version.php +++ b/wp-includes/version.php @@ -15,6 +15,6 @@ $wp_version = '2.7-bleeding'; * * @global int $wp_db_version */ -$wp_db_version = 8370; +$wp_db_version = 8539; ?>