HTMLPurifier/Injector.php Quellcode

Injector.php
gehe zur Dokumentation dieser Datei
1 <?php
2 
16 abstract class HTMLPurifier_Injector
17 {
18 
23  public $name;
24 
28  protected $htmlDefinition;
29 
35  protected $currentNesting;
36 
41  protected $currentToken;
42 
47  protected $inputZipper;
48 
55  public $needed = array();
56 
61  protected $rewindOffset = false;
62 
72  public function rewindOffset($offset)
73  {
74  $this->rewindOffset = $offset;
75  }
76 
81  public function getRewindOffset()
82  {
84  $this->rewindOffset = false;
85  return $r;
86  }
87 
97  public function prepare($config, $context)
98  {
99  $this->htmlDefinition = $config->getHTMLDefinition();
100  // Even though this might fail, some unit tests ignore this and
101  // still test checkNeeded, so be careful. Maybe get rid of that
102  // dependency.
103  $result = $this->checkNeeded($config);
104  if ($result !== false) {
105  return $result;
106  }
107  $this->currentNesting =& $context->get('CurrentNesting');
108  $this->currentToken =& $context->get('CurrentToken');
109  $this->inputZipper =& $context->get('InputZipper');
110  return false;
111  }
112 
120  public function checkNeeded($config)
121  {
122  $def = $config->getHTMLDefinition();
123  foreach ($this->needed as $element => $attributes) {
124  if (is_int($element)) {
125  $element = $attributes;
126  }
127  if (!isset($def->info[$element])) {
128  return $element;
129  }
130  if (!is_array($attributes)) {
131  continue;
132  }
133  foreach ($attributes as $name) {
134  if (!isset($def->info[$element]->attr[$name])) {
135  return "$element.$name";
136  }
137  }
138  }
139  return false;
140  }
141 
147  public function allowsElement($name)
148  {
149  if (!empty($this->currentNesting)) {
150  $parent_token = array_pop($this->currentNesting);
151  $this->currentNesting[] = $parent_token;
152  $parent = $this->htmlDefinition->info[$parent_token->name];
153  } else {
154  $parent = $this->htmlDefinition->info_parent_def;
155  }
156  if (!isset($parent->child->elements[$name]) || isset($parent->excludes[$name])) {
157  return false;
158  }
159  // check for exclusion
160  for ($i = count($this->currentNesting) - 2; $i >= 0; $i--) {
161  $node = $this->currentNesting[$i];
162  $def = $this->htmlDefinition->info[$node->name];
163  if (isset($def->excludes[$name])) {
164  return false;
165  }
166  }
167  return true;
168  }
169 
180  protected function forward(&$i, &$current)
181  {
182  if ($i === null) {
183  $i = count($this->inputZipper->back) - 1;
184  } else {
185  $i--;
186  }
187  if ($i < 0) {
188  return false;
189  }
190  $current = $this->inputZipper->back[$i];
191  return true;
192  }
193 
204  protected function forwardUntilEndToken(&$i, &$current, &$nesting)
205  {
206  $result = $this->forward($i, $current);
207  if (!$result) {
208  return false;
209  }
210  if ($nesting === null) {
211  $nesting = 0;
212  }
213  if ($current instanceof HTMLPurifier_Token_Start) {
214  $nesting++;
215  } elseif ($current instanceof HTMLPurifier_Token_End) {
216  if ($nesting <= 0) {
217  return false;
218  }
219  $nesting--;
220  }
221  return true;
222  }
223 
234  protected function backward(&$i, &$current)
235  {
236  if ($i === null) {
237  $i = count($this->inputZipper->front) - 1;
238  } else {
239  $i--;
240  }
241  if ($i < 0) {
242  return false;
243  }
244  $current = $this->inputZipper->front[$i];
245  return true;
246  }
247 
251  public function handleText(&$token)
252  {
253  }
254 
258  public function handleElement(&$token)
259  {
260  }
261 
265  public function handleEnd(&$token)
266  {
267  $this->notifyEnd($token);
268  }
269 
276  public function notifyEnd($token)
277  {
278  }
279 }
280 
281 // 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.