Proyectos de Subversion Moodle

Rev

| Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
1 efrain 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