Source of file class.gb-dependencies.php
Size: 15,753 Bytes - Last Modified: 2017-07-17T16:46:02+00:00
/home/travis/build/Limych/GeniBase/src/gb/class.gb-dependencies.php
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560 | <?php /** * GeniBase Scripts enqueue * * Classes were refactored from the GB_Scripts and GeniBase script enqueue API. * * @since 2.0.0 * * @package GeniBase * @uses _GB_Dependency * @since 2.0.0 * * @copyright Copyright © WordPress Team */ // Direct execution forbidden for this script if (! defined('GB_VERSION') || count(get_included_files()) == 1) die('<b>ERROR:</b> Direct execution forbidden!'); class GB_Dependencies { /** * An array of registered handle objects. * * @access public * @since 2.0.0 * @var array */ public $registered = array(); /** * An array of queued _GB_Dependency handle objects. * * @access public * @since 2.0.0 * @var array */ public $queue = array(); /** * An array of _GB_Dependency handle objects to queue. * * @access public * @since 2.0.0 * @var array */ public $to_do = array(); /** * An array of _GB_Dependency handle objects already queued. * * @access public * @since 2.0.0 * @var array */ public $done = array(); /** * An array of additional arguments passed when a handle is registered. * * Arguments are appended to the item query string. * * @access public * @since 2.0.0 * @var array */ public $args = array(); /** * An array of handle groups to enqueue. * * @access public * @since 2.0.0 * @var array */ public $groups = array(); /** * A handle group to enqueue. * * @access public * @since 2.0.0 * @var int */ public $group = 0; /** * Process the items and dependencies. * * Processes the items passed to it or the queue, and their dependencies. * * @access public * @since 2.0.0 * * @param mixed $handles * Optional. Items to be processed: Process queue (false), process item (string), process items (array of strings). * @param mixed $group * Group level: level (int), no groups (false). * @return array Handles of items that have been processed. */ public function do_items($handles = false, $group = false) { /* * If nothing is passed, print the queue. If a string is passed, * print that item. If an array is passed, print those items. */ $handles = false === $handles ? $this->queue : (array) $handles; $this->all_deps($handles); foreach ($this->to_do as $key => $handle) { if (! in_array($handle, $this->done, true) && isset($this->registered[$handle])) { /* * A single item may alias a set of items, by having dependencies, * but no source. Queuing the item queues the dependencies. * * Example: The extending class GB_Scripts is used to register 'scriptaculous' as a set of registered handles: * <code>add( 'scriptaculous', false, array( 'scriptaculous-dragdrop', 'scriptaculous-slider', 'scriptaculous-controls' ) );</code> * * The src property is false. */ if (! $this->registered[$handle]->src) { $this->done[] = $handle; continue; } /* * Attempt to process the item. If successful, * add the handle to the done array. * * Unset the item from the to_do array. */ if ($this->do_item($handle, $group)) $this->done[] = $handle; unset($this->to_do[$key]); } } return $this->done; } /** * Process a dependency. * * @access public * @since 2.0.0 * * @param string $handle * Name of the item. Should be unique. * @return bool True on success, false if not set. */ public function do_item($handle) { return isset($this->registered[$handle]); } /** * Determine dependencies. * * Recursively builds an array of items to process taking * dependencies into account. Does NOT catch infinite loops. * * @access public * @since 2.0.0 * * @param mixed $handles * Item handle and argument (string) or item handles and arguments (array of strings). * @param bool $recursion * Internal flag that function is calling itself. * @param mixed $group * Group level: (int) level, (false) no groups. * @return bool True on success, false on failure. */ public function all_deps($handles, $recursion = false, $group = false) { if (! $handles = (array) $handles) return false; foreach ($handles as $handle) { $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; $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; // Item doesn't exist. elseif ($this->registered[$handle]->deps && array_diff($this->registered[$handle]->deps, array_keys($this->registered))) $keep_going = false; // Item requires dependencies that don't exist. elseif ($this->registered[$handle]->deps && ! $this->all_deps($this->registered[$handle]->deps, true, $group)) $keep_going = false; // Item requires dependencies that don't exist. if (! $keep_going) { // Either item or its dependencies don't exist. if ($recursion) return false; // Abort this branch. else continue; // We're at the top level. Move on to the next one. } if ($queued) // Already grabbed it and its dependencies. continue; if (isset($handle_parts[1])) $this->args[$handle] = $handle_parts[1]; $this->to_do[] = $handle; } return true; } /** * Register an item. * * Registers the item if no item of that name already exists. * * @access public * @since 2.0.0 * * @param string $handle * Unique item name. * @param string $src * The item url. * @param array $deps * Optional. An array of item handle strings on which this item depends. * @param string $ver * Optional. Version (used for cache busting). * @param mixed $args * Optional. Custom property of the item. NOT the class property $args. Examples: $media, $in_footer. * @return bool True on success, false on failure. */ public function add($handle, $src, $deps = array(), $ver = false, $args = null) { if (isset($this->registered[$handle])) return false; $this->registered[$handle] = new _GB_Dependency($handle, $src, $deps, $ver, $args); return true; } /** * Add extra item data. * * Adds data to a registered item. * * @access public * @since 2.0.0 * * @param string $handle * Name of the item. Should be unique. * @param string $key * The data key. * @param mixed $value * The data value. * @return bool True on success, false on failure. */ public function add_data($handle, $key, $value) { if (! isset($this->registered[$handle])) return false; return $this->registered[$handle]->add_data($key, $value); } /** * Get extra item data. * * Gets data associated with a registered item. * * @access public * @since 2.0.0 * * @param string $handle * Name of the item. Should be unique. * @param string $key * The data key. * @return mixed Extra item data (string), false otherwise. */ public 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]->extra[$key]; } /** * Un-register an item or items. * * @access public * @since 2.0.0 * * @param mixed $handles * Item handle and argument (string) or item handles and arguments (array of strings). * @return void */ public function remove($handles) { foreach ((array) $handles as $handle) unset($this->registered[$handle]); } /** * Queue an item or items. * * Decodes handles and arguments, then queues handles and stores * arguments in the class property $args. For example in extending * classes, $args is appended to the item url as a query string. * Note $args is NOT the $args property of items in the $registered array. * * @access public * @since 2.0.0 * * @param mixed $handles * Item handle and argument (string) or item handles and arguments (array of strings). */ public 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]; } } } /** * Dequeue an item or items. * * Decodes handles and arguments, then dequeues handles * and removes arguments from the class property $args. * * @access public * @since 2.0.0 * * @param mixed $handles * Item handle and argument (string) or item handles and arguments (array of strings). */ public function dequeue($handles) { 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]]); } } } /** * Recursively search the passed dependency tree for $handle * * @since 2.0.0 * * @param array $queue * An array of queued _GB_Dependency handle objects. * @param string $handle * Name of the item. Should be unique. * @return boolean Whether the handle is found after recursively searching the dependency tree. */ protected function recurse_deps($queue, $handle) { foreach ($queue as $queued) { if (! isset($this->registered[$queued])) { continue; } if (in_array($handle, $this->registered[$queued]->deps)) { return true; } elseif ($this->recurse_deps($this->registered[$queued]->deps, $handle)) { return true; } } return false; } /** * Query list for an item. * * @access public * @since 2.0.0 * * @param string $handle * Name of the item. Should be unique. * @param string $list * Property name of list array. * @return bool Found, or object Item data. */ public function query($handle, $list = 'registered') { switch ($list) { case 'registered': if (isset($this->registered[$handle])) return $this->registered[$handle]; return false; case 'enqueued': case 'queue': if (in_array($handle, $this->queue)) { return true; } return $this->recurse_deps($this->queue, $handle); case 'to_do': return in_array($handle, $this->to_do); case 'done': return in_array($handle, $this->done); } return false; } /** * Set item group, unless already in a lower group. * * @access public * @since 2.0.0 * * @param string $handle * Name of the item. Should be unique. * @param bool $recursion * Internal flag that calling function was called recursively. * @param mixed $group * Group level. * @return bool Not already in the group or a lower group */ public 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; } } // GB_Dependencies /** * Class _GB_Dependency * * Helper class to register a handle and associated data. * * @access private * @since 2.0.0 */ class _GB_Dependency { /** * The handle name. * * @access public * @since 2.0.0 * @var null */ public $handle; /** * The handle source. * * @access public * @since 2.0.0 * @var null */ public $src; /** * An array of handle dependencies. * * @access public * @since 2.0.0 * @var array */ public $deps = array(); /** * The handle version. * * Used for cache-busting. * * @access public * @since 2.0.0 * @var bool|string */ public $ver = false; /** * Additional arguments for the handle. * * @access public * @since 2.0.0 * @var null */ public $args = null; // Custom property, such as $in_footer or $media. /** * Extra data to supply to the handle. * * @access public * @since 2.0.0 * @var array */ public $extra = array(); /** * Setup dependencies. * * @since 2.0.0 */ public function __construct() { @list ($this->handle, $this->src, $this->deps, $this->ver, $this->args) = func_get_args(); if (! is_array($this->deps)) $this->deps = array(); } /** * Add handle data. * * @access public * @since 2.0.0 * * @param string $name * The data key to add. * @param mixed $data * The data value to add. * @return bool False if not scalar, true otherwise. */ public function add_data($name, $data) { if (! is_scalar($name)) return false; $this->extra[$name] = $data; return true; } } // _GB_Dependencies |