X-Git-Url: https://scripts.mit.edu/gitweb/autoinstalls/wordpress.git/blobdiff_plain/449d082fcc4873c1f7d363a0d9f7409be7f6e77d..8a4706fdeb1ae30268e510df6ccf3c39b3028059:/wp-includes/class.wp-dependencies.php diff --git a/wp-includes/class.wp-dependencies.php b/wp-includes/class.wp-dependencies.php index e4c9c450..eb075c85 100644 --- a/wp-includes/class.wp-dependencies.php +++ b/wp-includes/class.wp-dependencies.php @@ -22,37 +22,37 @@ class WP_Dependencies { 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() {} + var $groups = array(); + var $group = 0; /** * Do the dependencies * - * Process the items passed to it or the queue. Processes all 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 + * @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. + function do_items( $handles = false, $group = 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 ); + foreach( $this->to_do as $key => $handle ) { + if ( !in_array($handle, $this->done, true) && isset($this->registered[$handle]) ) { + + if ( ! $this->registered[$handle]->src ) { // Defines a group. + $this->done[] = $handle; + continue; } - $this->done[] = $handle; + + if ( $this->do_item( $handle, $group ) ) + $this->done[] = $handle; + + unset( $this->to_do[$key] ); } } - $this->to_do = array(); return $this->done; } @@ -63,45 +63,53 @@ class WP_Dependencies { /** * Determines dependencies * - * Recursively builds array of items to process taking dependencies into account. Does NOT catch infinite loops. + * 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 + * + * @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 ) { + function all_deps( $handles, $recursion = false, $group = 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]; + $handle_parts = explode('?', $handle); + $handle = $handle_parts[0]; + $queued = in_array($handle, $this->to_do, true); + + if ( in_array($handle, $this->done, true) ) // Already done + continue; - if ( isset($this->to_do[$handle]) ) // Already grobbed it and its deps + $moved = $this->set_group( $handle, $recursion, $group ); + + if ( $queued && !$moved ) // already queued and in the right group 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 (not a necessary check. efficiency?) + elseif ( $this->registered[$handle]->deps && !$this->all_deps( $this->registered[$handle]->deps, true, $group ) ) $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. + continue; // We're at the top level. Move on to the next one. } - $this->to_do[$handle] = true; + if ( $queued ) // Already grobbed it and its deps + continue; + + if ( isset($handle_parts[1]) ) + $this->args[$handle] = $handle_parts[1]; + + $this->to_do[] = $handle; } - if ( !$recursion ) // at the end - $this->to_do = array_keys( $this->to_do ); return true; } @@ -110,10 +118,10 @@ class WP_Dependencies { * * 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) + * @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 ) { @@ -126,17 +134,39 @@ class WP_Dependencies { /** * Adds extra data * - * Adds data only if script has already been added + * 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 + * @param string $handle Script name + * @param string $key + * @param mixed $value * @return bool success */ - function add_data( $handle, $data_name, $data ) { - if ( !isset($this->registered[$handle]) ) + function add_data( $handle, $key, $value ) { + if ( !isset( $this->registered[$handle] ) ) + return false; + + return $this->registered[$handle]->add_data( $key, $value ); + } + + /** + * Get extra data + * + * Gets data associated with a certain handle. + * + * @since WP 3.3 + * + * @param string $handle Script name + * @param string $key + * @return mixed + */ + function get_data( $handle, $key ) { + if ( !isset( $this->registered[$handle] ) ) + return false; + + if ( !isset( $this->registered[$handle]->extra[$key] ) ) return false; - return $this->registered[$handle]->add_data( $data_name, $data ); + + return $this->registered[$handle]->extra[$key]; } function remove( $handles ) { @@ -156,31 +186,55 @@ class WP_Dependencies { } function dequeue( $handles ) { - foreach ( (array) $handles as $handle ) - unset( $this->queue[$handle] ); + foreach ( (array) $handles as $handle ) { + $handle = explode('?', $handle); + $key = array_search($handle[0], $this->queue); + if ( false !== $key ) { + unset($this->queue[$key]); + unset($this->args[$handle[0]]); + } + } } - 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; + + function query( $handle, $list = 'registered' ) { + switch ( $list ) { + case 'registered' : + case 'scripts': // back compat + if ( isset( $this->registered[ $handle ] ) ) + return $this->registered[ $handle ]; + return false; + + case 'enqueued' : + case 'queue' : + return in_array( $handle, $this->queue ); + + case 'to_do' : + case 'to_print': // back compat + return in_array( $handle, $this->to_do ); + + case 'done' : + case 'printed': // back compat + return in_array( $handle, $this->done ); + } return false; } + function set_group( $handle, $recursion, $group ) { + $group = (int) $group; + + if ( $recursion ) + $group = min($this->group, $group); + else + $this->group = $group; + + if ( isset($this->groups[$handle]) && $this->groups[$handle] <= $group ) + return false; + + $this->groups[$handle] = $group; + return true; + } + } class _WP_Dependency { @@ -192,12 +246,10 @@ class _WP_Dependency { 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) ) + function __construct() { + @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 ) {