4 * Defines common attribute collections that modules reference
7 class HTMLPurifier_AttrCollections
11 * Associative array of attribute collections, indexed by name
13 public $info = array();
16 * Performs all expansions on internal data for use by other inclusions
17 * It also collects all attribute collection extensions from
19 * @param $attr_types HTMLPurifier_AttrTypes instance
20 * @param $modules Hash array of HTMLPurifier_HTMLModule members
22 public function __construct($attr_types, $modules) {
23 // load extensions from the modules
24 foreach ($modules as $module) {
25 foreach ($module->attr_collections
as $coll_i => $coll) {
26 if (!isset($this->info
[$coll_i])) {
27 $this->info
[$coll_i] = array();
29 foreach ($coll as $attr_i => $attr) {
30 if ($attr_i === 0 && isset($this->info
[$coll_i][$attr_i])) {
32 $this->info
[$coll_i][$attr_i] = array_merge(
33 $this->info
[$coll_i][$attr_i], $attr);
36 $this->info
[$coll_i][$attr_i] = $attr;
40 // perform internal expansions and inclusions
41 foreach ($this->info
as $name => $attr) {
42 // merge attribute collections that include others
43 $this->performInclusions($this->info
[$name]);
44 // replace string identifiers with actual attribute objects
45 $this->expandIdentifiers($this->info
[$name], $attr_types);
50 * Takes a reference to an attribute associative array and performs
51 * all inclusions specified by the zero index.
52 * @param &$attr Reference to attribute array
54 public function performInclusions(&$attr) {
55 if (!isset($attr[0])) return;
57 $seen = array(); // recursion guard
58 // loop through all the inclusions
59 for ($i = 0; isset($merge[$i]); $i++
) {
60 if (isset($seen[$merge[$i]])) continue;
61 $seen[$merge[$i]] = true;
62 // foreach attribute of the inclusion, copy it over
63 if (!isset($this->info
[$merge[$i]])) continue;
64 foreach ($this->info
[$merge[$i]] as $key => $value) {
65 if (isset($attr[$key])) continue; // also catches more inclusions
68 if (isset($this->info
[$merge[$i]][0])) {
70 $merge = array_merge($merge, $this->info
[$merge[$i]][0]);
77 * Expands all string identifiers in an attribute array by replacing
78 * them with the appropriate values inside HTMLPurifier_AttrTypes
79 * @param &$attr Reference to attribute array
80 * @param $attr_types HTMLPurifier_AttrTypes instance
82 public function expandIdentifiers(&$attr, $attr_types) {
84 // because foreach will process new elements we add, make sure we
88 foreach ($attr as $def_i => $def) {
90 if ($def_i === 0) continue;
92 if (isset($processed[$def_i])) continue;
94 // determine whether or not attribute is required
95 if ($required = (strpos($def_i, '*') !== false)) {
96 // rename the definition
98 $def_i = trim($def_i, '*');
102 $processed[$def_i] = true;
104 // if we've already got a literal object, move on
105 if (is_object($def)) {
106 // preserve previous required
107 $attr[$def_i]->required
= ($required ||
$attr[$def_i]->required
);
111 if ($def === false) {
112 unset($attr[$def_i]);
116 if ($t = $attr_types->get($def)) {
118 $attr[$def_i]->required
= $required;
120 unset($attr[$def_i]);
128 // vim: et sw=4 sts=4