HTMLPurifier/AttrCollections.php Quellcode

AttrCollections.php
gehe zur Dokumentation dieser Datei
1 <?php
2 
8 {
9 
14  public $info = array();
15 
23  public function __construct($attr_types, $modules)
24  {
25  // load extensions from the modules
26  foreach ($modules as $module) {
27  foreach ($module->attr_collections as $coll_i => $coll) {
28  if (!isset($this->info[$coll_i])) {
29  $this->info[$coll_i] = array();
30  }
31  foreach ($coll as $attr_i => $attr) {
32  if ($attr_i === 0 && isset($this->info[$coll_i][$attr_i])) {
33  // merge in includes
34  $this->info[$coll_i][$attr_i] = array_merge(
35  $this->info[$coll_i][$attr_i],
36  $attr
37  );
38  continue;
39  }
40  $this->info[$coll_i][$attr_i] = $attr;
41  }
42  }
43  }
44  // perform internal expansions and inclusions
45  foreach ($this->info as $name => $attr) {
46  // merge attribute collections that include others
47  $this->performInclusions($this->info[$name]);
48  // replace string identifiers with actual attribute objects
49  $this->expandIdentifiers($this->info[$name], $attr_types);
50  }
51  }
52 
58  public function performInclusions(&$attr)
59  {
60  if (!isset($attr[0])) {
61  return;
62  }
63  $merge = $attr[0];
64  $seen = array(); // recursion guard
65  // loop through all the inclusions
66  for ($i = 0; isset($merge[$i]); $i++) {
67  if (isset($seen[$merge[$i]])) {
68  continue;
69  }
70  $seen[$merge[$i]] = true;
71  // foreach attribute of the inclusion, copy it over
72  if (!isset($this->info[$merge[$i]])) {
73  continue;
74  }
75  foreach ($this->info[$merge[$i]] as $key => $value) {
76  if (isset($attr[$key])) {
77  continue;
78  } // also catches more inclusions
79  $attr[$key] = $value;
80  }
81  if (isset($this->info[$merge[$i]][0])) {
82  // recursion
83  $merge = array_merge($merge, $this->info[$merge[$i]][0]);
84  }
85  }
86  unset($attr[0]);
87  }
88 
95  public function expandIdentifiers(&$attr, $attr_types)
96  {
97  // because foreach will process new elements we add, make sure we
98  // skip duplicates
99  $processed = array();
100 
101  foreach ($attr as $def_i => $def) {
102  // skip inclusions
103  if ($def_i === 0) {
104  continue;
105  }
106 
107  if (isset($processed[$def_i])) {
108  continue;
109  }
110 
111  // determine whether or not attribute is required
112  if ($required = (strpos($def_i, '*') !== false)) {
113  // rename the definition
114  unset($attr[$def_i]);
115  $def_i = trim($def_i, '*');
116  $attr[$def_i] = $def;
117  }
118 
119  $processed[$def_i] = true;
120 
121  // if we've already got a literal object, move on
122  if (is_object($def)) {
123  // preserve previous required
124  $attr[$def_i]->required = ($required || $attr[$def_i]->required);
125  continue;
126  }
127 
128  if ($def === false) {
129  unset($attr[$def_i]);
130  continue;
131  }
132 
133  if ($t = $attr_types->get($def)) {
134  $attr[$def_i] = $t;
135  $attr[$def_i]->required = $required;
136  } else {
137  unset($attr[$def_i]);
138  }
139  }
140  }
141 }
142 
143 // vim: et sw=4 sts=4




Korrekturen, Hinweise und Ergänzungen

Bitte scheuen Sie sich nicht und melden Sie, was auf dieser Seite sachlich falsch oder irreführend ist, was ergänzt werden sollte, was fehlt usw. Dazu bitte oben aus dem Menü Seite den Eintrag Support Forum wählen. Es ist eine kostenlose Anmeldung erforderlich, um Anmerkungen zu posten. Unpassende Postings, Spam usw. werden kommentarlos entfernt.