home *** CD-ROM | disk | FTP | other *** search
- <?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;
- }
- }
-