AutorÃa | Ultima modificación | Ver Log |
<?php/*** Defines common attribute collections that modules reference*/class HTMLPurifier_AttrCollections{/*** Associative array of attribute collections, indexed by name.* @type array*/public $info = array();/*** Performs all expansions on internal data for use by other inclusions* It also collects all attribute collection extensions from* modules* @param HTMLPurifier_AttrTypes $attr_types HTMLPurifier_AttrTypes instance* @param HTMLPurifier_HTMLModule[] $modules Hash array of HTMLPurifier_HTMLModule members*/public function __construct($attr_types, $modules){$this->doConstruct($attr_types, $modules);}public function doConstruct($attr_types, $modules){// load extensions from the modulesforeach ($modules as $module) {foreach ($module->attr_collections as $coll_i => $coll) {if (!isset($this->info[$coll_i])) {$this->info[$coll_i] = array();}foreach ($coll as $attr_i => $attr) {if ($attr_i === 0 && isset($this->info[$coll_i][$attr_i])) {// merge in includes$this->info[$coll_i][$attr_i] = array_merge($this->info[$coll_i][$attr_i],$attr);continue;}$this->info[$coll_i][$attr_i] = $attr;}}}// perform internal expansions and inclusionsforeach ($this->info as $name => $attr) {// merge attribute collections that include others$this->performInclusions($this->info[$name]);// replace string identifiers with actual attribute objects$this->expandIdentifiers($this->info[$name], $attr_types);}}/*** Takes a reference to an attribute associative array and performs* all inclusions specified by the zero index.* @param array &$attr Reference to attribute array*/public function performInclusions(&$attr){if (!isset($attr[0])) {return;}$merge = $attr[0];$seen = array(); // recursion guard// loop through all the inclusionsfor ($i = 0; isset($merge[$i]); $i++) {if (isset($seen[$merge[$i]])) {continue;}$seen[$merge[$i]] = true;// foreach attribute of the inclusion, copy it overif (!isset($this->info[$merge[$i]])) {continue;}foreach ($this->info[$merge[$i]] as $key => $value) {if (isset($attr[$key])) {continue;} // also catches more inclusions$attr[$key] = $value;}if (isset($this->info[$merge[$i]][0])) {// recursion$merge = array_merge($merge, $this->info[$merge[$i]][0]);}}unset($attr[0]);}/*** Expands all string identifiers in an attribute array by replacing* them with the appropriate values inside HTMLPurifier_AttrTypes* @param array &$attr Reference to attribute array* @param HTMLPurifier_AttrTypes $attr_types HTMLPurifier_AttrTypes instance*/public function expandIdentifiers(&$attr, $attr_types){// because foreach will process new elements we add, make sure we// skip duplicates$processed = array();foreach ($attr as $def_i => $def) {// skip inclusionsif ($def_i === 0) {continue;}if (isset($processed[$def_i])) {continue;}// determine whether or not attribute is requiredif ($required = (strpos($def_i, '*') !== false)) {// rename the definitionunset($attr[$def_i]);$def_i = trim($def_i, '*');$attr[$def_i] = $def;}$processed[$def_i] = true;// if we've already got a literal object, move onif (is_object($def)) {// preserve previous required$attr[$def_i]->required = ($required || $attr[$def_i]->required);continue;}if ($def === false) {unset($attr[$def_i]);continue;}if ($t = $attr_types->get($def)) {$attr[$def_i] = $t;$attr[$def_i]->required = $required;} else {unset($attr[$def_i]);}}}}// vim: et sw=4 sts=4