Skip to content

Commit

Permalink
Style loader from mdawaffe. see #7011
Browse files Browse the repository at this point in the history
git-svn-id: http://svn.automattic.com/wordpress/trunk@7970 1a063a9b-81f0-0310-95a4-ce76da25c4cd
  • Loading branch information
ryan committed May 21, 2008
1 parent d0e696c commit e9aa24c
Show file tree
Hide file tree
Showing 8 changed files with 660 additions and 481 deletions.
23 changes: 13 additions & 10 deletions wp-admin/admin-header.php
Original file line number Diff line number Diff line change
Expand Up @@ -45,21 +45,24 @@ function add_minwidth($c) {
<?php if ( ($parent_file != 'link-manager.php') && ($parent_file != 'options-general.php') && $ie6_no_scrollbar ) : ?>
<style type="text/css">* html { overflow-x: hidden; }</style>
<?php endif;
if ( isset($page_hook) )
do_action('admin_print_scripts-' . $page_hook);
else if ( isset($plugin_page) )
do_action('admin_print_scripts-' . $plugin_page);
else if ( isset($pagenow) )
do_action('admin_print_scripts-' . $pagenow);
do_action('admin_print_scripts');

if ( isset($page_hook) )
if ( isset($page_hook) ) {
do_action('admin_print_scripts-' . $page_hook);
do_action('admin_print_styles-' . $page_hook);
do_action('admin_head-' . $page_hook);
else if ( isset($plugin_page) )
} else if ( isset($plugin_page) ) {
do_action('admin_print_scripts-' . $plugin_page);
do_action('admin_print_styles-' . $plugin_page);
do_action('admin_head-' . $plugin_page);
else if ( isset($pagenow) )
} else if ( isset($pagenow) ) {
do_action('admin_print_scripts-' . $pagenow);
do_action('admin_print_styles-' . $pagenow);
do_action('admin_head-' . $pagenow);
}
do_action('admin_print_scripts');
do_action('admin_print_styles');
do_action('admin_head');

?>
</head>
<body class="wp-admin <?php echo apply_filters( 'admin_body_class', '' ); ?>">
Expand Down
193 changes: 193 additions & 0 deletions wp-includes/class.wp-dependencies.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,193 @@
<?php

class WP_Dependencies {
var $registered = array();
var $queue = array();
var $to_do = array();
var $done = array();
var $args = array();

function WP_Dependencies() {
$args = func_get_args();
call_user_func_array( array(&$this, '__construct'), $args );
}

function __construct() {}

/**
* Do the dependencies
*
* Process the items passed to it or the queue. Processes all dependencies.
*
* @param mixed handles (optional) items to be processed. (void) processes queue, (string) process that item, (array of strings) process those items
* @return array Items that have been processed
*/
function do_items( $handles = false ) {
// Print the queue if nothing is passed. If a string is passed, print that script. If an array is passed, print those scripts.
$handles = false === $handles ? $this->queue : (array) $handles;
$this->all_deps( $handles );

foreach( $this->to_do as $handle ) {
if ( !in_array($handle, $this->done) && isset($this->registered[$handle]) ) {
if ( $this->registered[$handle]->src ) { // Else it defines a group.
$this->do_item( $handle );
}
$this->done[] = $handle;
}
}

$this->to_do = array();
return $this->done;
}

function do_item( $handle ) {
return isset($this->registered[$handle]);
}

/**
* Determines dependencies
*
* Recursively builds array of items to process taking dependencies into account. Does NOT catch infinite loops.
*
* @param mixed handles Accepts (string) dep name or (array of strings) dep names
* @param bool recursion Used internally when function calls itself
*/
function all_deps( $handles, $recursion = false ) {
if ( !$handles = (array) $handles )
return false;

foreach ( $handles as $handle ) {
$handle = explode('?', $handle);
if ( isset($handle[1]) )
$this->args[$handle[0]] = $handle[1];
$handle = $handle[0];

if ( isset($this->to_do[$handle]) ) // Already grobbed it and its deps
continue;

$keep_going = true;
if ( !isset($this->registered[$handle]) )
$keep_going = false; // Script doesn't exist
elseif ( $this->registered[$handle]->deps && array_diff($this->registered[$handle]->deps, array_keys($this->registered)) )
$keep_going = false; // Script requires deps which don't exist (not a necessary check. efficiency?)
elseif ( $this->registered[$handle]->deps && !$this->all_deps( $this->registered[$handle]->deps, true ) )
$keep_going = false; // Script requires deps which don't exist

if ( !$keep_going ) { // Either script or its deps don't exist.
if ( $recursion )
return false; // Abort this branch.
else
continue; // We're at the top level. Move on to the next one.
}

$this->to_do[$handle] = true;
}

if ( !$recursion ) // at the end
$this->to_do = array_keys( $this->to_do );
return true;
}

/**
* Adds item
*
* Adds the item only if no item of that name already exists
*
* @param string handle Script name
* @param string src Script url
* @param array deps (optional) Array of script names on which this script depends
* @param string ver (optional) Script version (used for cache busting)
* @return array Hierarchical array of dependencies
*/
function add( $handle, $src, $deps = array(), $ver = false, $args = null ) {
if ( isset($this->registered[$handle]) )
return false;
$this->registered[$handle] = new _WP_Dependency( $handle, $src, $deps, $ver, $args );
return true;
}

/**
* Adds extra data
*
* Adds data only if script has already been added
*
* @param string handle Script name
* @param string data_name Name of object in which to store extra data
* @param array data Array of extra data
* @return bool success
*/
function add_data( $handle, $data_name, $data ) {
if ( !isset($this->registered[$handle]) )
return false;
return $this->registered[$handle]->add_data( $data_name, $data );
}

function remove( $handles ) {
foreach ( (array) $handles as $handle )
unset($this->registered[$handle]);
}

function enqueue( $handles ) {
foreach ( (array) $handles as $handle ) {
$handle = explode('?', $handle);
if ( !in_array($handle[0], $this->queue) && isset($this->registered[$handle[0]]) ) {
$this->queue[] = $handle[0];
if ( isset($handle[1]) )
$this->args[$handle[0]] = $handle[1];
}
}
}

function dequeue( $handles ) {
foreach ( (array) $handles as $handle )
unset( $this->queue[$handle] );
}

function query( $handle, $list = 'registered' ) { // registered, queue, done, to_do
switch ( $list ) :
case 'registered':
case 'scripts': // back compat
if ( isset($this->registered[$handle]) )
return $this->registered[$handle];
break;
case 'to_print': // back compat
case 'printed': // back compat
if ( 'to_print' == $list )
$list = 'to_do';
else
$list = 'printed';
default:
if ( in_array($handle, $this->$list) )
return true;
break;
endswitch;
return false;
}

}

class _WP_Dependency {
var $handle;
var $src;
var $deps = array();
var $ver = false;
var $args = null;

var $extra = array();

function _WP_Dependency() {
@list($this->handle, $this->src, $this->deps, $this->ver, $this->args) = func_get_args();
if ( !is_array($this->deps) )
$this->deps = array();
if ( !$this->ver )
$this->ver = false;
}

function add_data( $name, $data ) {
if ( !is_scalar($name) )
return false;
$this->extra[$name] = $data;
return true;
}
}
89 changes: 89 additions & 0 deletions wp-includes/class.wp-scripts.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
<?php

class WP_Scripts extends WP_Dependencies {
var $base_url; // Full URL with trailing slash
var $default_version;

function __construct() {
do_action_ref_array( 'wp_default_scripts', array(&$this) );
}

/**
* Prints scripts
*
* Prints the scripts passed to it or the print queue. Also prints all necessary dependencies.
*
* @param mixed handles (optional) Scripts to be printed. (void) prints queue, (string) prints that script, (array of strings) prints those scripts.
* @return array Scripts that have been printed
*/
function print_scripts( $handles = false ) {
return $this->do_items( $handles );
}

function print_scripts_l10n( $handle ) {
if ( empty($this->registered[$handle]->extra['l10n']) || empty($this->registered[$handle]->extra['l10n'][0]) || !is_array($this->registered[$handle]->extra['l10n'][1]) )
return false;

$object_name = $this->registered[$handle]->extra['l10n'][0];

echo "<script type='text/javascript'>\n";
echo "/* <![CDATA[ */\n";
echo "\t$object_name = {\n";
$eol = '';
foreach ( $this->registered[$handle]->extra['l10n'][1] as $var => $val ) {
echo "$eol\t\t$var: \"" . js_escape( $val ) . '"';
$eol = ",\n";
}
echo "\n\t}\n";
echo "/* ]]> */\n";
echo "</script>\n";

return true;
}

function do_item( $handle ) {
if ( !parent::do_item($handle) )
return false;

$ver = $this->registered[$handle]->ver ? $this->registered[$handle]->ver : $this->default_version;
if ( isset($this->args[$handle]) )
$ver .= '&amp;' . $this->args[$handle];

$src = $this->registered[$handle]->src;
if ( !preg_match('|^https?://|', $src) ) {
$src = $this->base_url . $src;
}

$src = add_query_arg('ver', $ver, $src);
$src = clean_url(apply_filters( 'script_loader_src', $src ));

$this->print_scripts_l10n( $handle );

echo "<script type='text/javascript' src='$src'></script>\n";

return true;
}

/**
* Localizes a script
*
* Localizes only if script has already been added
*
* @param string handle Script name
* @param string object_name Name of JS object to hold l10n info
* @param array l10n Array of JS var name => localized string
* @return bool Successful localization
*/
function localize( $handle, $object_name, $l10n ) {
if ( !$object_name || !$l10n )
return false;
return $this->add_data( $handle, 'l10n', array( $object_name, $l10n ) );
}

function all_deps( $handles, $recursion = false ) {
$r = parent::all_deps( $handles, $recursion );
if ( !$recursion )
$this->to_do = apply_filters( 'print_scripts_array', $this->to_do );
return $r;
}
}
49 changes: 49 additions & 0 deletions wp-includes/class.wp-styles.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
<?php

class WP_Styles extends WP_Dependencies {
var $base_url;
var $default_version;

function __construct() {
do_action_ref_array( 'wp_default_styles', array(&$this) );
}

function do_item( $handle ) {
if ( !parent::do_item($handle) )
return false;

$ver = $this->registered[$handle]->ver ? $this->registered[$handle]->ver : $this->default_version;
if ( isset($this->args[$handle]) )
$ver .= '&amp;' . $this->args[$handle];

if ( isset($this->registered[$handle]->args) )
$media = attribute_escape( $this->registered[$handle]->args );
else
$media = 'all';

$src = $this->registered[$handle]->src;
if ( !preg_match('|^https?://|', $src) ) {
$src = $this->base_url . $src;
}

$src = add_query_arg('ver', $ver, $src);
$src = clean_url(apply_filters( 'style_loader_src', $src ));

echo "<link rel='stylesheet' href='$src' type='text/css' media='$media' />\n";

// Could do something with $this->registered[$handle]->extra here to print out extra CSS rules
// echo "<style type='text/css'>\n";
// echo "/* <![CDATA[ */\n";
// echo "/* ]]> */\n";
// echo "</style>\n";

return true;
}

function all_deps( $handles, $recursion = false ) {
$r = parent::all_deps( $handles, $recursion );
if ( !$recursion )
$this->to_do = apply_filters( 'print_styles_array', $this->to_do );
return $r;
}
}
1 change: 1 addition & 0 deletions wp-includes/default-filters.php
Original file line number Diff line number Diff line change
Expand Up @@ -175,6 +175,7 @@
add_action('do_robots', 'do_robots');
add_action('sanitize_comment_cookies', 'sanitize_comment_cookies');
add_action('admin_print_scripts', 'wp_print_scripts', 20);
add_action('admin_print_styles', 'wp_print_styles', 20);
add_action('init', 'smilies_init', 5);
add_action( 'plugins_loaded', 'wp_maybe_load_widgets', 0 );
add_action( 'shutdown', 'wp_ob_end_flush_all', 1);
Expand Down
Loading

0 comments on commit e9aa24c

Please sign in to comment.