Yaffs site version 1.1
[yaffs-website] / vendor / ezyang / htmlpurifier / library / HTMLPurifier / DoctypeRegistry.php
1 <?php
2
3 class HTMLPurifier_DoctypeRegistry
4 {
5
6     /**
7      * Hash of doctype names to doctype objects.
8      * @type array
9      */
10     protected $doctypes;
11
12     /**
13      * Lookup table of aliases to real doctype names.
14      * @type array
15      */
16     protected $aliases;
17
18     /**
19      * Registers a doctype to the registry
20      * @note Accepts a fully-formed doctype object, or the
21      *       parameters for constructing a doctype object
22      * @param string $doctype Name of doctype or literal doctype object
23      * @param bool $xml
24      * @param array $modules Modules doctype will load
25      * @param array $tidy_modules Modules doctype will load for certain modes
26      * @param array $aliases Alias names for doctype
27      * @param string $dtd_public
28      * @param string $dtd_system
29      * @return HTMLPurifier_Doctype Editable registered doctype
30      */
31     public function register(
32         $doctype,
33         $xml = true,
34         $modules = array(),
35         $tidy_modules = array(),
36         $aliases = array(),
37         $dtd_public = null,
38         $dtd_system = null
39     ) {
40         if (!is_array($modules)) {
41             $modules = array($modules);
42         }
43         if (!is_array($tidy_modules)) {
44             $tidy_modules = array($tidy_modules);
45         }
46         if (!is_array($aliases)) {
47             $aliases = array($aliases);
48         }
49         if (!is_object($doctype)) {
50             $doctype = new HTMLPurifier_Doctype(
51                 $doctype,
52                 $xml,
53                 $modules,
54                 $tidy_modules,
55                 $aliases,
56                 $dtd_public,
57                 $dtd_system
58             );
59         }
60         $this->doctypes[$doctype->name] = $doctype;
61         $name = $doctype->name;
62         // hookup aliases
63         foreach ($doctype->aliases as $alias) {
64             if (isset($this->doctypes[$alias])) {
65                 continue;
66             }
67             $this->aliases[$alias] = $name;
68         }
69         // remove old aliases
70         if (isset($this->aliases[$name])) {
71             unset($this->aliases[$name]);
72         }
73         return $doctype;
74     }
75
76     /**
77      * Retrieves reference to a doctype of a certain name
78      * @note This function resolves aliases
79      * @note When possible, use the more fully-featured make()
80      * @param string $doctype Name of doctype
81      * @return HTMLPurifier_Doctype Editable doctype object
82      */
83     public function get($doctype)
84     {
85         if (isset($this->aliases[$doctype])) {
86             $doctype = $this->aliases[$doctype];
87         }
88         if (!isset($this->doctypes[$doctype])) {
89             trigger_error('Doctype ' . htmlspecialchars($doctype) . ' does not exist', E_USER_ERROR);
90             $anon = new HTMLPurifier_Doctype($doctype);
91             return $anon;
92         }
93         return $this->doctypes[$doctype];
94     }
95
96     /**
97      * Creates a doctype based on a configuration object,
98      * will perform initialization on the doctype
99      * @note Use this function to get a copy of doctype that config
100      *       can hold on to (this is necessary in order to tell
101      *       Generator whether or not the current document is XML
102      *       based or not).
103      * @param HTMLPurifier_Config $config
104      * @return HTMLPurifier_Doctype
105      */
106     public function make($config)
107     {
108         return clone $this->get($this->getDoctypeFromConfig($config));
109     }
110
111     /**
112      * Retrieves the doctype from the configuration object
113      * @param HTMLPurifier_Config $config
114      * @return string
115      */
116     public function getDoctypeFromConfig($config)
117     {
118         // recommended test
119         $doctype = $config->get('HTML.Doctype');
120         if (!empty($doctype)) {
121             return $doctype;
122         }
123         $doctype = $config->get('HTML.CustomDoctype');
124         if (!empty($doctype)) {
125             return $doctype;
126         }
127         // backwards-compatibility
128         if ($config->get('HTML.XHTML')) {
129             $doctype = 'XHTML 1.0';
130         } else {
131             $doctype = 'HTML 4.01';
132         }
133         if ($config->get('HTML.Strict')) {
134             $doctype .= ' Strict';
135         } else {
136             $doctype .= ' Transitional';
137         }
138         return $doctype;
139     }
140 }
141
142 // vim: et sw=4 sts=4