forked from WordPress/WordPress
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Style loader from mdawaffe. see #7011
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
Showing
8 changed files
with
660 additions
and
481 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 .= '&' . $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; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 .= '&' . $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; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.