1: <?php
2:
3: // constants are slow, so we use as few as possible
4: if (!defined('HTMLPURIFIER_PREFIX')) {
5: define('HTMLPURIFIER_PREFIX', realpath(dirname(__FILE__) . '/..'));
6: }
7:
8: // accomodations for versions earlier than 5.0.2
9: // borrowed from PHP_Compat, LGPL licensed, by Aidan Lister <aidan@php.net>
10: if (!defined('PHP_EOL')) {
11: switch (strtoupper(substr(PHP_OS, 0, 3))) {
12: case 'WIN':
13: define('PHP_EOL', "\r\n");
14: break;
15: case 'DAR':
16: define('PHP_EOL', "\r");
17: break;
18: default:
19: define('PHP_EOL', "\n");
20: }
21: }
22:
23: /**
24: * Bootstrap class that contains meta-functionality for HTML Purifier such as
25: * the autoload function.
26: *
27: * @note
28: * This class may be used without any other files from HTML Purifier.
29: */
30: class HTMLPurifier_Bootstrap
31: {
32:
33: /**
34: * Autoload function for HTML Purifier
35: * @param string $class Class to load
36: * @return bool
37: */
38: public static function autoload($class)
39: {
40: $file = HTMLPurifier_Bootstrap::getPath($class);
41: if (!$file) {
42: return false;
43: }
44: // Technically speaking, it should be ok and more efficient to
45: // just do 'require', but Antonio Parraga reports that with
46: // Zend extensions such as Zend debugger and APC, this invariant
47: // may be broken. Since we have efficient alternatives, pay
48: // the cost here and avoid the bug.
49: require_once HTMLPURIFIER_PREFIX . '/' . $file;
50: return true;
51: }
52:
53: /**
54: * Returns the path for a specific class.
55: * @param string $class Class path to get
56: * @return string
57: */
58: public static function getPath($class)
59: {
60: if (strncmp('HTMLPurifier', $class, 12) !== 0) {
61: return false;
62: }
63: // Custom implementations
64: if (strncmp('HTMLPurifier_Language_', $class, 22) === 0) {
65: $code = str_replace('_', '-', substr($class, 22));
66: $file = 'HTMLPurifier/Language/classes/' . $code . '.php';
67: } else {
68: $file = str_replace('_', '/', $class) . '.php';
69: }
70: if (!file_exists(HTMLPURIFIER_PREFIX . '/' . $file)) {
71: return false;
72: }
73: return $file;
74: }
75:
76: /**
77: * "Pre-registers" our autoloader on the SPL stack.
78: */
79: public static function registerAutoload()
80: {
81: $autoload = array('HTMLPurifier_Bootstrap', 'autoload');
82: if (($funcs = spl_autoload_functions()) === false) {
83: spl_autoload_register($autoload);
84: } elseif (function_exists('spl_autoload_unregister')) {
85: if (version_compare(PHP_VERSION, '5.3.0', '>=')) {
86: // prepend flag exists, no need for shenanigans
87: spl_autoload_register($autoload, true, true);
88: } else {
89: $buggy = version_compare(PHP_VERSION, '5.2.11', '<');
90: $compat = version_compare(PHP_VERSION, '5.1.2', '<=') &&
91: version_compare(PHP_VERSION, '5.1.0', '>=');
92: foreach ($funcs as $func) {
93: if ($buggy && is_array($func)) {
94: // :TRICKY: There are some compatibility issues and some
95: // places where we need to error out
96: $reflector = new ReflectionMethod($func[0], $func[1]);
97: if (!$reflector->isStatic()) {
98: throw new Exception(
99: 'HTML Purifier autoloader registrar is not compatible
100: with non-static object methods due to PHP Bug #44144;
101: Please do not use HTMLPurifier.autoload.php (or any
102: file that includes this file); instead, place the code:
103: spl_autoload_register(array(\'HTMLPurifier_Bootstrap\', \'autoload\'))
104: after your own autoloaders.'
105: );
106: }
107: // Suprisingly, spl_autoload_register supports the
108: // Class::staticMethod callback format, although call_user_func doesn't
109: if ($compat) {
110: $func = implode('::', $func);
111: }
112: }
113: spl_autoload_unregister($func);
114: }
115: spl_autoload_register($autoload);
116: foreach ($funcs as $func) {
117: spl_autoload_register($func);
118: }
119: }
120: }
121: }
122: }
123:
124: // vim: et sw=4 sts=4
125: