diff options
author | Nicolas Lœuillet <nicolas@loeuillet.org> | 2014-02-21 15:57:10 +0100 |
---|---|---|
committer | Nicolas Lœuillet <nicolas@loeuillet.org> | 2014-02-21 15:57:10 +0100 |
commit | 99679d06884120c57f43b44e55e03595f1f87bed (patch) | |
tree | a3f2a1aa1afdaeca1386d0c6e8a75344fd2241fb /inc/3rdparty/htmlpurifier/HTMLPurifier/ConfigSchema/InterchangeBuilder.php | |
parent | 655214ab30ee84884dc408488b85586f36263fcb (diff) | |
parent | d3b47e94705e17b3ba3529cbb1dc6efe69c5d2b7 (diff) | |
download | wallabag-1.5.2.tar.gz wallabag-1.5.2.tar.zst wallabag-1.5.2.zip |
Merge pull request #481 from wallabag/dev1.5.2
1.5.2
Diffstat (limited to 'inc/3rdparty/htmlpurifier/HTMLPurifier/ConfigSchema/InterchangeBuilder.php')
-rw-r--r-- | inc/3rdparty/htmlpurifier/HTMLPurifier/ConfigSchema/InterchangeBuilder.php | 226 |
1 files changed, 226 insertions, 0 deletions
diff --git a/inc/3rdparty/htmlpurifier/HTMLPurifier/ConfigSchema/InterchangeBuilder.php b/inc/3rdparty/htmlpurifier/HTMLPurifier/ConfigSchema/InterchangeBuilder.php new file mode 100644 index 00000000..fe9b3268 --- /dev/null +++ b/inc/3rdparty/htmlpurifier/HTMLPurifier/ConfigSchema/InterchangeBuilder.php | |||
@@ -0,0 +1,226 @@ | |||
1 | <?php | ||
2 | |||
3 | class HTMLPurifier_ConfigSchema_InterchangeBuilder | ||
4 | { | ||
5 | |||
6 | /** | ||
7 | * Used for processing DEFAULT, nothing else. | ||
8 | * @type HTMLPurifier_VarParser | ||
9 | */ | ||
10 | protected $varParser; | ||
11 | |||
12 | /** | ||
13 | * @param HTMLPurifier_VarParser $varParser | ||
14 | */ | ||
15 | public function __construct($varParser = null) | ||
16 | { | ||
17 | $this->varParser = $varParser ? $varParser : new HTMLPurifier_VarParser_Native(); | ||
18 | } | ||
19 | |||
20 | /** | ||
21 | * @param string $dir | ||
22 | * @return HTMLPurifier_ConfigSchema_Interchange | ||
23 | */ | ||
24 | public static function buildFromDirectory($dir = null) | ||
25 | { | ||
26 | $builder = new HTMLPurifier_ConfigSchema_InterchangeBuilder(); | ||
27 | $interchange = new HTMLPurifier_ConfigSchema_Interchange(); | ||
28 | return $builder->buildDir($interchange, $dir); | ||
29 | } | ||
30 | |||
31 | /** | ||
32 | * @param HTMLPurifier_ConfigSchema_Interchange $interchange | ||
33 | * @param string $dir | ||
34 | * @return HTMLPurifier_ConfigSchema_Interchange | ||
35 | */ | ||
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 | |||
63 | /** | ||
64 | * @param HTMLPurifier_ConfigSchema_Interchange $interchange | ||
65 | * @param string $file | ||
66 | */ | ||
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 | |||
76 | /** | ||
77 | * Builds an interchange object based on a hash. | ||
78 | * @param HTMLPurifier_ConfigSchema_Interchange $interchange HTMLPurifier_ConfigSchema_Interchange object to build | ||
79 | * @param HTMLPurifier_StringHash $hash source data | ||
80 | * @throws HTMLPurifier_ConfigSchema_Exception | ||
81 | */ | ||
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 | |||
102 | /** | ||
103 | * @param HTMLPurifier_ConfigSchema_Interchange $interchange | ||
104 | * @param HTMLPurifier_StringHash $hash | ||
105 | * @throws HTMLPurifier_ConfigSchema_Exception | ||
106 | */ | ||
107 | public function buildDirective($interchange, $hash) | ||
108 | { | ||
109 | $directive = new HTMLPurifier_ConfigSchema_Interchange_Directive(); | ||
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 | |||
176 | /** | ||
177 | * Evaluates an array PHP code string without array() wrapper | ||
178 | * @param string $contents | ||
179 | */ | ||
180 | protected function evalArray($contents) | ||
181 | { | ||
182 | return eval('return array(' . $contents . ');'); | ||
183 | } | ||
184 | |||
185 | /** | ||
186 | * Converts an array list into a lookup array. | ||
187 | * @param array $array | ||
188 | * @return array | ||
189 | */ | ||
190 | protected function lookup($array) | ||
191 | { | ||
192 | $ret = array(); | ||
193 | foreach ($array as $val) { | ||
194 | $ret[$val] = true; | ||
195 | } | ||
196 | return $ret; | ||
197 | } | ||
198 | |||
199 | /** | ||
200 | * Convenience function that creates an HTMLPurifier_ConfigSchema_Interchange_Id | ||
201 | * object based on a string Id. | ||
202 | * @param string $id | ||
203 | * @return HTMLPurifier_ConfigSchema_Interchange_Id | ||
204 | */ | ||
205 | protected function id($id) | ||
206 | { | ||
207 | return HTMLPurifier_ConfigSchema_Interchange_Id::make($id); | ||
208 | } | ||
209 | |||
210 | /** | ||
211 | * Triggers errors for any unused keys passed in the hash; such keys | ||
212 | * may indicate typos, missing values, etc. | ||
213 | * @param HTMLPurifier_StringHash $hash Hash to check. | ||
214 | */ | ||
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 | ||