ILIAS  release_5-1 Revision 5.0.0-5477-g43f3e3fab5f
InterchangeBuilder.php
Go to the documentation of this file.
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 );
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
print $file
Exceptions related to configuration schema.
Definition: Exception.php:7
build($interchange, $hash)
Builds an interchange object based on a hash.
evalArray($contents)
Evaluates an array PHP code string without array() wrapper.
id($id)
Convenience function that creates an HTMLPurifier_ConfigSchema_Interchange_Id object based on a strin...
lookup($array)
Converts an array list into a lookup array.
_findUnused($hash)
Triggers errors for any unused keys passed in the hash; such keys may indicate typos,...
$varParser
Used for processing DEFAULT, nothing else.
Interchange component class describing configuration directives.
Definition: Directive.php:7
Generic schema interchange format that can be converted to a runtime representation (HTMLPurifier_Con...
Definition: Interchange.php:9
Parses string hash files.
This is in almost every respect equivalent to an array except that it keeps track of which keys were ...
Definition: StringHash.php:12
Exception type for HTMLPurifier_VarParser.
This variable parser uses PHP's internal code engine.
Definition: Native.php:9
$info
Definition: example_052.php:80
$builder
Definition: parser.php:5