HTMLPurifier/ConfigSchema/InterchangeBuilder.php Quellcode

InterchangeBuilder.php
gehe zur Dokumentation dieser Datei
1 <?php
2 
4 {
5 
10  protected $varParser;
11 
15  public function __construct($varParser = null)
16  {
17  $this->varParser = $varParser ? $varParser : new HTMLPurifier_VarParser_Native();
18  }
19 
24  public static function buildFromDirectory($dir = null)
25  {
27  $interchange = new HTMLPurifier_ConfigSchema_Interchange();
28  return $builder->buildDir($interchange, $dir);
29  }
30 
36  public function buildDir($interchange, $dir = null)
37  {
38  if (!$dir) {
39  $dir = HTMLPURIFIER_PREFIX . '/HTMLPurifier/ConfigSchema/schema';
40  }
41  if (file_exists($dir . '/info.ini')) {
42  $info = parse_ini_file($dir . '/info.ini');
43  $interchange->name = $info['name'];
44  }
45 
46  $files = array();
47  $dh = opendir($dir);
48  while (false !== ($file = readdir($dh))) {
49  if (!$file || $file[0] == '.' || strrchr($file, '.') !== '.txt') {
50  continue;
51  }
52  $files[] = $file;
53  }
54  closedir($dh);
55 
56  sort($files);
57  foreach ($files as $file) {
58  $this->buildFile($interchange, $dir . '/' . $file);
59  }
60  return $interchange;
61  }
62 
67  public function buildFile($interchange, $file)
68  {
69  $parser = new HTMLPurifier_StringHashParser();
70  $this->build(
71  $interchange,
72  new HTMLPurifier_StringHash($parser->parseFile($file))
73  );
74  }
75 
82  public function build($interchange, $hash)
83  {
84  if (!$hash instanceof HTMLPurifier_StringHash) {
85  $hash = new HTMLPurifier_StringHash($hash);
86  }
87  if (!isset($hash['ID'])) {
88  throw new HTMLPurifier_ConfigSchema_Exception('Hash does not have any ID');
89  }
90  if (strpos($hash['ID'], '.') === false) {
91  if (count($hash) == 2 && isset($hash['DESCRIPTION'])) {
92  $hash->offsetGet('DESCRIPTION'); // prevent complaining
93  } else {
94  throw new HTMLPurifier_ConfigSchema_Exception('All directives must have a namespace');
95  }
96  } else {
97  $this->buildDirective($interchange, $hash);
98  }
99  $this->_findUnused($hash);
100  }
101 
107  public function buildDirective($interchange, $hash)
108  {
110 
111  // These are required elements:
112  $directive->id = $this->id($hash->offsetGet('ID'));
113  $id = $directive->id->toString(); // convenience
114 
115  if (isset($hash['TYPE'])) {
116  $type = explode('/', $hash->offsetGet('TYPE'));
117  if (isset($type[1])) {
118  $directive->typeAllowsNull = true;
119  }
120  $directive->type = $type[0];
121  } else {
122  throw new HTMLPurifier_ConfigSchema_Exception("TYPE in directive hash '$id' not defined");
123  }
124 
125  if (isset($hash['DEFAULT'])) {
126  try {
127  $directive->default = $this->varParser->parse(
128  $hash->offsetGet('DEFAULT'),
129  $directive->type,
130  $directive->typeAllowsNull
131  );
132  } catch (HTMLPurifier_VarParserException $e) {
133  throw new HTMLPurifier_ConfigSchema_Exception($e->getMessage() . " in DEFAULT in directive hash '$id'");
134  }
135  }
136 
137  if (isset($hash['DESCRIPTION'])) {
138  $directive->description = $hash->offsetGet('DESCRIPTION');
139  }
140 
141  if (isset($hash['ALLOWED'])) {
142  $directive->allowed = $this->lookup($this->evalArray($hash->offsetGet('ALLOWED')));
143  }
144 
145  if (isset($hash['VALUE-ALIASES'])) {
146  $directive->valueAliases = $this->evalArray($hash->offsetGet('VALUE-ALIASES'));
147  }
148 
149  if (isset($hash['ALIASES'])) {
150  $raw_aliases = trim($hash->offsetGet('ALIASES'));
151  $aliases = preg_split('/\s*,\s*/', $raw_aliases);
152  foreach ($aliases as $alias) {
153  $directive->aliases[] = $this->id($alias);
154  }
155  }
156 
157  if (isset($hash['VERSION'])) {
158  $directive->version = $hash->offsetGet('VERSION');
159  }
160 
161  if (isset($hash['DEPRECATED-USE'])) {
162  $directive->deprecatedUse = $this->id($hash->offsetGet('DEPRECATED-USE'));
163  }
164 
165  if (isset($hash['DEPRECATED-VERSION'])) {
166  $directive->deprecatedVersion = $hash->offsetGet('DEPRECATED-VERSION');
167  }
168 
169  if (isset($hash['EXTERNAL'])) {
170  $directive->external = preg_split('/\s*,\s*/', trim($hash->offsetGet('EXTERNAL')));
171  }
172 
173  $interchange->addDirective($directive);
174  }
175 
180  protected function evalArray($contents)
181  {
182  return eval('return array(' . $contents . ');');
183  }
184 
190  protected function lookup($array)
191  {
192  $ret = array();
193  foreach ($array as $val) {
194  $ret[$val] = true;
195  }
196  return $ret;
197  }
198 
205  protected function id($id)
206  {
208  }
209 
215  protected function _findUnused($hash)
216  {
217  $accessed = $hash->getAccessed();
218  foreach ($hash as $k => $v) {
219  if (!isset($accessed[$k])) {
220  trigger_error("String hash key '$k' not used by builder", E_USER_NOTICE);
221  }
222  }
223  }
224 }
225 
226 // 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.