1<?php
2
3/**
4 * Provides lookup array of attribute types to HTMLPurifier_AttrDef objects
5 */
6class HTMLPurifier_AttrTypes
7{
8    /**
9     * Lookup array of attribute string identifiers to concrete implementations.
10     * @type HTMLPurifier_AttrDef[]
11     */
12    protected $info = array();
13
14    /**
15     * Constructs the info array, supplying default implementations for attribute
16     * types.
17     */
18    public function __construct()
19    {
20        // XXX This is kind of poor, since we don't actually /clone/
21        // instances; instead, we use the supplied make() attribute. So,
22        // the underlying class must know how to deal with arguments.
23        // With the old implementation of Enum, that ignored its
24        // arguments when handling a make dispatch, the IAlign
25        // definition wouldn't work.
26
27        // pseudo-types, must be instantiated via shorthand
28        $this->info['Enum']    = new HTMLPurifier_AttrDef_Enum();
29        $this->info['Bool']    = new HTMLPurifier_AttrDef_HTML_Bool();
30
31        $this->info['CDATA']    = new HTMLPurifier_AttrDef_Text();
32        $this->info['ID']       = new HTMLPurifier_AttrDef_HTML_ID();
33        $this->info['Length']   = new HTMLPurifier_AttrDef_HTML_Length();
34        $this->info['MultiLength'] = new HTMLPurifier_AttrDef_HTML_MultiLength();
35        $this->info['NMTOKENS'] = new HTMLPurifier_AttrDef_HTML_Nmtokens();
36        $this->info['Pixels']   = new HTMLPurifier_AttrDef_HTML_Pixels();
37        $this->info['Text']     = new HTMLPurifier_AttrDef_Text();
38        $this->info['URI']      = new HTMLPurifier_AttrDef_URI();
39        $this->info['LanguageCode'] = new HTMLPurifier_AttrDef_Lang();
40        $this->info['Color']    = new HTMLPurifier_AttrDef_HTML_Color();
41        $this->info['IAlign']   = self::makeEnum('top,middle,bottom,left,right');
42        $this->info['LAlign']   = self::makeEnum('top,bottom,left,right');
43        $this->info['FrameTarget'] = new HTMLPurifier_AttrDef_HTML_FrameTarget();
44        $this->info['ContentEditable'] = new HTMLPurifier_AttrDef_HTML_ContentEditable();
45
46        // unimplemented aliases
47        $this->info['ContentType'] = new HTMLPurifier_AttrDef_Text();
48        $this->info['ContentTypes'] = new HTMLPurifier_AttrDef_Text();
49        $this->info['Charsets'] = new HTMLPurifier_AttrDef_Text();
50        $this->info['Character'] = new HTMLPurifier_AttrDef_Text();
51
52        // "proprietary" types
53        $this->info['Class'] = new HTMLPurifier_AttrDef_HTML_Class();
54
55        // number is really a positive integer (one or more digits)
56        // FIXME: ^^ not always, see start and value of list items
57        $this->info['Number']   = new HTMLPurifier_AttrDef_Integer(false, false, true);
58    }
59
60    private static function makeEnum($in)
61    {
62        return new HTMLPurifier_AttrDef_Clone(new HTMLPurifier_AttrDef_Enum(explode(',', $in)));
63    }
64
65    /**
66     * Retrieves a type
67     * @param string $type String type name
68     * @return HTMLPurifier_AttrDef Object AttrDef for type
69     */
70    public function get($type)
71    {
72        // determine if there is any extra info tacked on
73        if (strpos($type, '#') !== false) {
74            list($type, $string) = explode('#', $type, 2);
75        } else {
76            $string = '';
77        }
78
79        if (!isset($this->info[$type])) {
80            trigger_error('Cannot retrieve undefined attribute type ' . $type, E_USER_ERROR);
81            return;
82        }
83        return $this->info[$type]->make($string);
84    }
85
86    /**
87     * Sets a new implementation for a type
88     * @param string $type String type name
89     * @param HTMLPurifier_AttrDef $impl Object AttrDef for type
90     */
91    public function set($type, $impl)
92    {
93        $this->info[$type] = $impl;
94    }
95}
96
97// vim: et sw=4 sts=4
98