1<?php
2
3class HTMLPurifier_HTMLModule_Tidy_XHTMLAndHTML4 extends HTMLPurifier_HTMLModule_Tidy
4{
5
6    /**
7     * @return array
8     */
9    public function makeFixes()
10    {
11        $r = array();
12
13        // == deprecated tag transforms ===================================
14
15        $r['font'] = new HTMLPurifier_TagTransform_Font();
16        $r['menu'] = new HTMLPurifier_TagTransform_Simple('ul');
17        $r['dir'] = new HTMLPurifier_TagTransform_Simple('ul');
18        $r['center'] = new HTMLPurifier_TagTransform_Simple('div', 'text-align:center;');
19        $r['u'] = new HTMLPurifier_TagTransform_Simple('span', 'text-decoration:underline;');
20        $r['s'] = new HTMLPurifier_TagTransform_Simple('span', 'text-decoration:line-through;');
21        $r['strike'] = new HTMLPurifier_TagTransform_Simple('span', 'text-decoration:line-through;');
22
23        // == deprecated attribute transforms =============================
24
25        $r['caption@align'] =
26            new HTMLPurifier_AttrTransform_EnumToCSS(
27                'align',
28                array(
29                    // we're following IE's behavior, not Firefox's, due
30                    // to the fact that no one supports caption-side:right,
31                    // W3C included (with CSS 2.1). This is a slightly
32                    // unreasonable attribute!
33                    'left' => 'text-align:left;',
34                    'right' => 'text-align:right;',
35                    'top' => 'caption-side:top;',
36                    'bottom' => 'caption-side:bottom;' // not supported by IE
37                )
38            );
39
40        // @align for img -------------------------------------------------
41        $r['img@align'] =
42            new HTMLPurifier_AttrTransform_EnumToCSS(
43                'align',
44                array(
45                    'left' => 'float:left;',
46                    'right' => 'float:right;',
47                    'top' => 'vertical-align:top;',
48                    'middle' => 'vertical-align:middle;',
49                    'bottom' => 'vertical-align:baseline;',
50                )
51            );
52
53        // @align for table -----------------------------------------------
54        $r['table@align'] =
55            new HTMLPurifier_AttrTransform_EnumToCSS(
56                'align',
57                array(
58                    'left' => 'float:left;',
59                    'center' => 'margin-left:auto;margin-right:auto;',
60                    'right' => 'float:right;'
61                )
62            );
63
64        // @align for hr -----------------------------------------------
65        $r['hr@align'] =
66            new HTMLPurifier_AttrTransform_EnumToCSS(
67                'align',
68                array(
69                    // we use both text-align and margin because these work
70                    // for different browsers (IE and Firefox, respectively)
71                    // and the melange makes for a pretty cross-compatible
72                    // solution
73                    'left' => 'margin-left:0;margin-right:auto;text-align:left;',
74                    'center' => 'margin-left:auto;margin-right:auto;text-align:center;',
75                    'right' => 'margin-left:auto;margin-right:0;text-align:right;'
76                )
77            );
78
79        // @align for h1, h2, h3, h4, h5, h6, p, div ----------------------
80        // {{{
81        $align_lookup = array();
82        $align_values = array('left', 'right', 'center', 'justify');
83        foreach ($align_values as $v) {
84            $align_lookup[$v] = "text-align:$v;";
85        }
86        // }}}
87        $r['h1@align'] =
88        $r['h2@align'] =
89        $r['h3@align'] =
90        $r['h4@align'] =
91        $r['h5@align'] =
92        $r['h6@align'] =
93        $r['p@align'] =
94        $r['div@align'] =
95            new HTMLPurifier_AttrTransform_EnumToCSS('align', $align_lookup);
96
97        // @bgcolor for table, tr, td, th ---------------------------------
98        $r['table@bgcolor'] =
99        $r['tr@bgcolor'] =
100        $r['td@bgcolor'] =
101        $r['th@bgcolor'] =
102            new HTMLPurifier_AttrTransform_BgColor();
103
104        // @border for img ------------------------------------------------
105        $r['img@border'] = new HTMLPurifier_AttrTransform_Border();
106
107        // @clear for br --------------------------------------------------
108        $r['br@clear'] =
109            new HTMLPurifier_AttrTransform_EnumToCSS(
110                'clear',
111                array(
112                    'left' => 'clear:left;',
113                    'right' => 'clear:right;',
114                    'all' => 'clear:both;',
115                    'none' => 'clear:none;',
116                )
117            );
118
119        // @height for td, th ---------------------------------------------
120        $r['td@height'] =
121        $r['th@height'] =
122            new HTMLPurifier_AttrTransform_Length('height');
123
124        // @hspace for img ------------------------------------------------
125        $r['img@hspace'] = new HTMLPurifier_AttrTransform_ImgSpace('hspace');
126
127        // @noshade for hr ------------------------------------------------
128        // this transformation is not precise but often good enough.
129        // different browsers use different styles to designate noshade
130        $r['hr@noshade'] =
131            new HTMLPurifier_AttrTransform_BoolToCSS(
132                'noshade',
133                'color:#808080;background-color:#808080;border:0;'
134            );
135
136        // @nowrap for td, th ---------------------------------------------
137        $r['td@nowrap'] =
138        $r['th@nowrap'] =
139            new HTMLPurifier_AttrTransform_BoolToCSS(
140                'nowrap',
141                'white-space:nowrap;'
142            );
143
144        // @size for hr  --------------------------------------------------
145        $r['hr@size'] = new HTMLPurifier_AttrTransform_Length('size', 'height');
146
147        // @type for li, ol, ul -------------------------------------------
148        // {{{
149        $ul_types = array(
150            'disc' => 'list-style-type:disc;',
151            'square' => 'list-style-type:square;',
152            'circle' => 'list-style-type:circle;'
153        );
154        $ol_types = array(
155            '1' => 'list-style-type:decimal;',
156            'i' => 'list-style-type:lower-roman;',
157            'I' => 'list-style-type:upper-roman;',
158            'a' => 'list-style-type:lower-alpha;',
159            'A' => 'list-style-type:upper-alpha;'
160        );
161        $li_types = $ul_types + $ol_types;
162        // }}}
163
164        $r['ul@type'] = new HTMLPurifier_AttrTransform_EnumToCSS('type', $ul_types);
165        $r['ol@type'] = new HTMLPurifier_AttrTransform_EnumToCSS('type', $ol_types, true);
166        $r['li@type'] = new HTMLPurifier_AttrTransform_EnumToCSS('type', $li_types, true);
167
168        // @vspace for img ------------------------------------------------
169        $r['img@vspace'] = new HTMLPurifier_AttrTransform_ImgSpace('vspace');
170
171        // @width for table, hr, td, th, col ------------------------------------------
172        $r['table@width'] =
173        $r['td@width'] =
174        $r['th@width'] =
175        $r['col@width'] =
176        $r['hr@width'] = new HTMLPurifier_AttrTransform_Length('width');
177
178        return $r;
179    }
180}
181
182// vim: et sw=4 sts=4
183