534 lines
		
	
	
		
			19 KiB
		
	
	
	
		
			PHP
		
	
	
		
		
			
		
	
	
			534 lines
		
	
	
		
			19 KiB
		
	
	
	
		
			PHP
		
	
	
|  | <?php | ||
|  | 
 | ||
|  | /** | ||
|  |  * Defines allowed CSS attributes and what their values are. | ||
|  |  * @see HTMLPurifier_HTMLDefinition | ||
|  |  */ | ||
|  | class HTMLPurifier_CSSDefinition extends HTMLPurifier_Definition | ||
|  | { | ||
|  | 
 | ||
|  |     public $type = 'CSS'; | ||
|  | 
 | ||
|  |     /** | ||
|  |      * Assoc array of attribute name to definition object. | ||
|  |      * @type HTMLPurifier_AttrDef[] | ||
|  |      */ | ||
|  |     public $info = array(); | ||
|  | 
 | ||
|  |     /** | ||
|  |      * Constructs the info array.  The meat of this class. | ||
|  |      * @param HTMLPurifier_Config $config | ||
|  |      */ | ||
|  |     protected function doSetup($config) | ||
|  |     { | ||
|  |         $this->info['text-align'] = new HTMLPurifier_AttrDef_Enum( | ||
|  |             array('left', 'right', 'center', 'justify'), | ||
|  |             false | ||
|  |         ); | ||
|  | 
 | ||
|  |         $border_style = | ||
|  |             $this->info['border-bottom-style'] = | ||
|  |             $this->info['border-right-style'] = | ||
|  |             $this->info['border-left-style'] = | ||
|  |             $this->info['border-top-style'] = new HTMLPurifier_AttrDef_Enum( | ||
|  |                 array( | ||
|  |                     'none', | ||
|  |                     'hidden', | ||
|  |                     'dotted', | ||
|  |                     'dashed', | ||
|  |                     'solid', | ||
|  |                     'double', | ||
|  |                     'groove', | ||
|  |                     'ridge', | ||
|  |                     'inset', | ||
|  |                     'outset' | ||
|  |                 ), | ||
|  |                 false | ||
|  |             ); | ||
|  | 
 | ||
|  |         $this->info['border-style'] = new HTMLPurifier_AttrDef_CSS_Multiple($border_style); | ||
|  | 
 | ||
|  |         $this->info['clear'] = new HTMLPurifier_AttrDef_Enum( | ||
|  |             array('none', 'left', 'right', 'both'), | ||
|  |             false | ||
|  |         ); | ||
|  |         $this->info['float'] = new HTMLPurifier_AttrDef_Enum( | ||
|  |             array('none', 'left', 'right'), | ||
|  |             false | ||
|  |         ); | ||
|  |         $this->info['font-style'] = new HTMLPurifier_AttrDef_Enum( | ||
|  |             array('normal', 'italic', 'oblique'), | ||
|  |             false | ||
|  |         ); | ||
|  |         $this->info['font-variant'] = new HTMLPurifier_AttrDef_Enum( | ||
|  |             array('normal', 'small-caps'), | ||
|  |             false | ||
|  |         ); | ||
|  | 
 | ||
|  |         $uri_or_none = new HTMLPurifier_AttrDef_CSS_Composite( | ||
|  |             array( | ||
|  |                 new HTMLPurifier_AttrDef_Enum(array('none')), | ||
|  |                 new HTMLPurifier_AttrDef_CSS_URI() | ||
|  |             ) | ||
|  |         ); | ||
|  | 
 | ||
|  |         $this->info['list-style-position'] = new HTMLPurifier_AttrDef_Enum( | ||
|  |             array('inside', 'outside'), | ||
|  |             false | ||
|  |         ); | ||
|  |         $this->info['list-style-type'] = new HTMLPurifier_AttrDef_Enum( | ||
|  |             array( | ||
|  |                 'disc', | ||
|  |                 'circle', | ||
|  |                 'square', | ||
|  |                 'decimal', | ||
|  |                 'lower-roman', | ||
|  |                 'upper-roman', | ||
|  |                 'lower-alpha', | ||
|  |                 'upper-alpha', | ||
|  |                 'none' | ||
|  |             ), | ||
|  |             false | ||
|  |         ); | ||
|  |         $this->info['list-style-image'] = $uri_or_none; | ||
|  | 
 | ||
|  |         $this->info['list-style'] = new HTMLPurifier_AttrDef_CSS_ListStyle($config); | ||
|  | 
 | ||
|  |         $this->info['text-transform'] = new HTMLPurifier_AttrDef_Enum( | ||
|  |             array('capitalize', 'uppercase', 'lowercase', 'none'), | ||
|  |             false | ||
|  |         ); | ||
|  |         $this->info['color'] = new HTMLPurifier_AttrDef_CSS_Color(); | ||
|  | 
 | ||
|  |         $this->info['background-image'] = $uri_or_none; | ||
|  |         $this->info['background-repeat'] = new HTMLPurifier_AttrDef_Enum( | ||
|  |             array('repeat', 'repeat-x', 'repeat-y', 'no-repeat') | ||
|  |         ); | ||
|  |         $this->info['background-attachment'] = new HTMLPurifier_AttrDef_Enum( | ||
|  |             array('scroll', 'fixed') | ||
|  |         ); | ||
|  |         $this->info['background-position'] = new HTMLPurifier_AttrDef_CSS_BackgroundPosition(); | ||
|  | 
 | ||
|  |         $border_color = | ||
|  |             $this->info['border-top-color'] = | ||
|  |             $this->info['border-bottom-color'] = | ||
|  |             $this->info['border-left-color'] = | ||
|  |             $this->info['border-right-color'] = | ||
|  |             $this->info['background-color'] = new HTMLPurifier_AttrDef_CSS_Composite( | ||
|  |                 array( | ||
|  |                     new HTMLPurifier_AttrDef_Enum(array('transparent')), | ||
|  |                     new HTMLPurifier_AttrDef_CSS_Color() | ||
|  |                 ) | ||
|  |             ); | ||
|  | 
 | ||
|  |         $this->info['background'] = new HTMLPurifier_AttrDef_CSS_Background($config); | ||
|  | 
 | ||
|  |         $this->info['border-color'] = new HTMLPurifier_AttrDef_CSS_Multiple($border_color); | ||
|  | 
 | ||
|  |         $border_width = | ||
|  |             $this->info['border-top-width'] = | ||
|  |             $this->info['border-bottom-width'] = | ||
|  |             $this->info['border-left-width'] = | ||
|  |             $this->info['border-right-width'] = new HTMLPurifier_AttrDef_CSS_Composite( | ||
|  |                 array( | ||
|  |                     new HTMLPurifier_AttrDef_Enum(array('thin', 'medium', 'thick')), | ||
|  |                     new HTMLPurifier_AttrDef_CSS_Length('0') //disallow negative
 | ||
|  |                 ) | ||
|  |             ); | ||
|  | 
 | ||
|  |         $this->info['border-width'] = new HTMLPurifier_AttrDef_CSS_Multiple($border_width); | ||
|  | 
 | ||
|  |         $this->info['letter-spacing'] = new HTMLPurifier_AttrDef_CSS_Composite( | ||
|  |             array( | ||
|  |                 new HTMLPurifier_AttrDef_Enum(array('normal')), | ||
|  |                 new HTMLPurifier_AttrDef_CSS_Length() | ||
|  |             ) | ||
|  |         ); | ||
|  | 
 | ||
|  |         $this->info['word-spacing'] = new HTMLPurifier_AttrDef_CSS_Composite( | ||
|  |             array( | ||
|  |                 new HTMLPurifier_AttrDef_Enum(array('normal')), | ||
|  |                 new HTMLPurifier_AttrDef_CSS_Length() | ||
|  |             ) | ||
|  |         ); | ||
|  | 
 | ||
|  |         $this->info['font-size'] = new HTMLPurifier_AttrDef_CSS_Composite( | ||
|  |             array( | ||
|  |                 new HTMLPurifier_AttrDef_Enum( | ||
|  |                     array( | ||
|  |                         'xx-small', | ||
|  |                         'x-small', | ||
|  |                         'small', | ||
|  |                         'medium', | ||
|  |                         'large', | ||
|  |                         'x-large', | ||
|  |                         'xx-large', | ||
|  |                         'larger', | ||
|  |                         'smaller' | ||
|  |                     ) | ||
|  |                 ), | ||
|  |                 new HTMLPurifier_AttrDef_CSS_Percentage(), | ||
|  |                 new HTMLPurifier_AttrDef_CSS_Length() | ||
|  |             ) | ||
|  |         ); | ||
|  | 
 | ||
|  |         $this->info['line-height'] = new HTMLPurifier_AttrDef_CSS_Composite( | ||
|  |             array( | ||
|  |                 new HTMLPurifier_AttrDef_Enum(array('normal')), | ||
|  |                 new HTMLPurifier_AttrDef_CSS_Number(true), // no negatives
 | ||
|  |                 new HTMLPurifier_AttrDef_CSS_Length('0'), | ||
|  |                 new HTMLPurifier_AttrDef_CSS_Percentage(true) | ||
|  |             ) | ||
|  |         ); | ||
|  | 
 | ||
|  |         $margin = | ||
|  |             $this->info['margin-top'] = | ||
|  |             $this->info['margin-bottom'] = | ||
|  |             $this->info['margin-left'] = | ||
|  |             $this->info['margin-right'] = new HTMLPurifier_AttrDef_CSS_Composite( | ||
|  |                 array( | ||
|  |                     new HTMLPurifier_AttrDef_CSS_Length(), | ||
|  |                     new HTMLPurifier_AttrDef_CSS_Percentage(), | ||
|  |                     new HTMLPurifier_AttrDef_Enum(array('auto')) | ||
|  |                 ) | ||
|  |             ); | ||
|  | 
 | ||
|  |         $this->info['margin'] = new HTMLPurifier_AttrDef_CSS_Multiple($margin); | ||
|  | 
 | ||
|  |         // non-negative
 | ||
|  |         $padding = | ||
|  |             $this->info['padding-top'] = | ||
|  |             $this->info['padding-bottom'] = | ||
|  |             $this->info['padding-left'] = | ||
|  |             $this->info['padding-right'] = new HTMLPurifier_AttrDef_CSS_Composite( | ||
|  |                 array( | ||
|  |                     new HTMLPurifier_AttrDef_CSS_Length('0'), | ||
|  |                     new HTMLPurifier_AttrDef_CSS_Percentage(true) | ||
|  |                 ) | ||
|  |             ); | ||
|  | 
 | ||
|  |         $this->info['padding'] = new HTMLPurifier_AttrDef_CSS_Multiple($padding); | ||
|  | 
 | ||
|  |         $this->info['text-indent'] = new HTMLPurifier_AttrDef_CSS_Composite( | ||
|  |             array( | ||
|  |                 new HTMLPurifier_AttrDef_CSS_Length(), | ||
|  |                 new HTMLPurifier_AttrDef_CSS_Percentage() | ||
|  |             ) | ||
|  |         ); | ||
|  | 
 | ||
|  |         $trusted_wh = new HTMLPurifier_AttrDef_CSS_Composite( | ||
|  |             array( | ||
|  |                 new HTMLPurifier_AttrDef_CSS_Length('0'), | ||
|  |                 new HTMLPurifier_AttrDef_CSS_Percentage(true), | ||
|  |                 new HTMLPurifier_AttrDef_Enum(array('auto', 'initial', 'inherit')) | ||
|  |             ) | ||
|  |         ); | ||
|  |         $trusted_min_wh = new HTMLPurifier_AttrDef_CSS_Composite( | ||
|  |             array( | ||
|  |                 new HTMLPurifier_AttrDef_CSS_Length('0'), | ||
|  |                 new HTMLPurifier_AttrDef_CSS_Percentage(true), | ||
|  |                 new HTMLPurifier_AttrDef_Enum(array('initial', 'inherit')) | ||
|  |             ) | ||
|  |         ); | ||
|  |         $trusted_max_wh = new HTMLPurifier_AttrDef_CSS_Composite( | ||
|  |             array( | ||
|  |                 new HTMLPurifier_AttrDef_CSS_Length('0'), | ||
|  |                 new HTMLPurifier_AttrDef_CSS_Percentage(true), | ||
|  |                 new HTMLPurifier_AttrDef_Enum(array('none', 'initial', 'inherit')) | ||
|  |             ) | ||
|  |         ); | ||
|  |         $max = $config->get('CSS.MaxImgLength'); | ||
|  | 
 | ||
|  |         $this->info['width'] = | ||
|  |         $this->info['height'] = | ||
|  |             $max === null ? | ||
|  |                 $trusted_wh : | ||
|  |                 new HTMLPurifier_AttrDef_Switch( | ||
|  |                     'img', | ||
|  |                     // For img tags:
 | ||
|  |                     new HTMLPurifier_AttrDef_CSS_Composite( | ||
|  |                         array( | ||
|  |                             new HTMLPurifier_AttrDef_CSS_Length('0', $max), | ||
|  |                             new HTMLPurifier_AttrDef_Enum(array('auto')) | ||
|  |                         ) | ||
|  |                     ), | ||
|  |                     // For everyone else:
 | ||
|  |                     $trusted_wh | ||
|  |                 ); | ||
|  |         $this->info['min-width'] = | ||
|  |         $this->info['min-height'] = | ||
|  |             $max === null ? | ||
|  |                 $trusted_min_wh : | ||
|  |                 new HTMLPurifier_AttrDef_Switch( | ||
|  |                     'img', | ||
|  |                     // For img tags:
 | ||
|  |                     new HTMLPurifier_AttrDef_CSS_Composite( | ||
|  |                         array( | ||
|  |                             new HTMLPurifier_AttrDef_CSS_Length('0', $max), | ||
|  |                             new HTMLPurifier_AttrDef_Enum(array('initial', 'inherit')) | ||
|  |                         ) | ||
|  |                     ), | ||
|  |                     // For everyone else:
 | ||
|  |                     $trusted_min_wh | ||
|  |                 ); | ||
|  |         $this->info['max-width'] = | ||
|  |         $this->info['max-height'] = | ||
|  |             $max === null ? | ||
|  |                 $trusted_max_wh : | ||
|  |                 new HTMLPurifier_AttrDef_Switch( | ||
|  |                     'img', | ||
|  |                     // For img tags:
 | ||
|  |                     new HTMLPurifier_AttrDef_CSS_Composite( | ||
|  |                         array( | ||
|  |                             new HTMLPurifier_AttrDef_CSS_Length('0', $max), | ||
|  |                             new HTMLPurifier_AttrDef_Enum(array('none', 'initial', 'inherit')) | ||
|  |                         ) | ||
|  |                     ), | ||
|  |                     // For everyone else:
 | ||
|  |                     $trusted_max_wh | ||
|  |                 ); | ||
|  | 
 | ||
|  |         $this->info['text-decoration'] = new HTMLPurifier_AttrDef_CSS_TextDecoration(); | ||
|  | 
 | ||
|  |         $this->info['font-family'] = new HTMLPurifier_AttrDef_CSS_FontFamily(); | ||
|  | 
 | ||
|  |         // this could use specialized code
 | ||
|  |         $this->info['font-weight'] = new HTMLPurifier_AttrDef_Enum( | ||
|  |             array( | ||
|  |                 'normal', | ||
|  |                 'bold', | ||
|  |                 'bolder', | ||
|  |                 'lighter', | ||
|  |                 '100', | ||
|  |                 '200', | ||
|  |                 '300', | ||
|  |                 '400', | ||
|  |                 '500', | ||
|  |                 '600', | ||
|  |                 '700', | ||
|  |                 '800', | ||
|  |                 '900' | ||
|  |             ), | ||
|  |             false | ||
|  |         ); | ||
|  | 
 | ||
|  |         // MUST be called after other font properties, as it references
 | ||
|  |         // a CSSDefinition object
 | ||
|  |         $this->info['font'] = new HTMLPurifier_AttrDef_CSS_Font($config); | ||
|  | 
 | ||
|  |         // same here
 | ||
|  |         $this->info['border'] = | ||
|  |         $this->info['border-bottom'] = | ||
|  |         $this->info['border-top'] = | ||
|  |         $this->info['border-left'] = | ||
|  |         $this->info['border-right'] = new HTMLPurifier_AttrDef_CSS_Border($config); | ||
|  | 
 | ||
|  |         $this->info['border-collapse'] = new HTMLPurifier_AttrDef_Enum( | ||
|  |             array('collapse', 'separate') | ||
|  |         ); | ||
|  | 
 | ||
|  |         $this->info['caption-side'] = new HTMLPurifier_AttrDef_Enum( | ||
|  |             array('top', 'bottom') | ||
|  |         ); | ||
|  | 
 | ||
|  |         $this->info['table-layout'] = new HTMLPurifier_AttrDef_Enum( | ||
|  |             array('auto', 'fixed') | ||
|  |         ); | ||
|  | 
 | ||
|  |         $this->info['vertical-align'] = new HTMLPurifier_AttrDef_CSS_Composite( | ||
|  |             array( | ||
|  |                 new HTMLPurifier_AttrDef_Enum( | ||
|  |                     array( | ||
|  |                         'baseline', | ||
|  |                         'sub', | ||
|  |                         'super', | ||
|  |                         'top', | ||
|  |                         'text-top', | ||
|  |                         'middle', | ||
|  |                         'bottom', | ||
|  |                         'text-bottom' | ||
|  |                     ) | ||
|  |                 ), | ||
|  |                 new HTMLPurifier_AttrDef_CSS_Length(), | ||
|  |                 new HTMLPurifier_AttrDef_CSS_Percentage() | ||
|  |             ) | ||
|  |         ); | ||
|  | 
 | ||
|  |         $this->info['border-spacing'] = new HTMLPurifier_AttrDef_CSS_Multiple(new HTMLPurifier_AttrDef_CSS_Length(), 2); | ||
|  | 
 | ||
|  |         // These CSS properties don't work on many browsers, but we live
 | ||
|  |         // in THE FUTURE!
 | ||
|  |         $this->info['white-space'] = new HTMLPurifier_AttrDef_Enum( | ||
|  |             array('nowrap', 'normal', 'pre', 'pre-wrap', 'pre-line') | ||
|  |         ); | ||
|  | 
 | ||
|  |         if ($config->get('CSS.Proprietary')) { | ||
|  |             $this->doSetupProprietary($config); | ||
|  |         } | ||
|  | 
 | ||
|  |         if ($config->get('CSS.AllowTricky')) { | ||
|  |             $this->doSetupTricky($config); | ||
|  |         } | ||
|  | 
 | ||
|  |         if ($config->get('CSS.Trusted')) { | ||
|  |             $this->doSetupTrusted($config); | ||
|  |         } | ||
|  | 
 | ||
|  |         $allow_important = $config->get('CSS.AllowImportant'); | ||
|  |         // wrap all attr-defs with decorator that handles !important
 | ||
|  |         foreach ($this->info as $k => $v) { | ||
|  |             $this->info[$k] = new HTMLPurifier_AttrDef_CSS_ImportantDecorator($v, $allow_important); | ||
|  |         } | ||
|  | 
 | ||
|  |         $this->setupConfigStuff($config); | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * @param HTMLPurifier_Config $config | ||
|  |      */ | ||
|  |     protected function doSetupProprietary($config) | ||
|  |     { | ||
|  |         // Internet Explorer only scrollbar colors
 | ||
|  |         $this->info['scrollbar-arrow-color'] = new HTMLPurifier_AttrDef_CSS_Color(); | ||
|  |         $this->info['scrollbar-base-color'] = new HTMLPurifier_AttrDef_CSS_Color(); | ||
|  |         $this->info['scrollbar-darkshadow-color'] = new HTMLPurifier_AttrDef_CSS_Color(); | ||
|  |         $this->info['scrollbar-face-color'] = new HTMLPurifier_AttrDef_CSS_Color(); | ||
|  |         $this->info['scrollbar-highlight-color'] = new HTMLPurifier_AttrDef_CSS_Color(); | ||
|  |         $this->info['scrollbar-shadow-color'] = new HTMLPurifier_AttrDef_CSS_Color(); | ||
|  | 
 | ||
|  |         // vendor specific prefixes of opacity
 | ||
|  |         $this->info['-moz-opacity'] = new HTMLPurifier_AttrDef_CSS_AlphaValue(); | ||
|  |         $this->info['-khtml-opacity'] = new HTMLPurifier_AttrDef_CSS_AlphaValue(); | ||
|  | 
 | ||
|  |         // only opacity, for now
 | ||
|  |         $this->info['filter'] = new HTMLPurifier_AttrDef_CSS_Filter(); | ||
|  | 
 | ||
|  |         // more CSS3
 | ||
|  |         $this->info['page-break-after'] = | ||
|  |         $this->info['page-break-before'] = new HTMLPurifier_AttrDef_Enum( | ||
|  |             array( | ||
|  |                 'auto', | ||
|  |                 'always', | ||
|  |                 'avoid', | ||
|  |                 'left', | ||
|  |                 'right' | ||
|  |             ) | ||
|  |         ); | ||
|  |         $this->info['page-break-inside'] = new HTMLPurifier_AttrDef_Enum(array('auto', 'avoid')); | ||
|  | 
 | ||
|  |         $border_radius = new HTMLPurifier_AttrDef_CSS_Composite( | ||
|  |             array( | ||
|  |                 new HTMLPurifier_AttrDef_CSS_Percentage(true), // disallow negative
 | ||
|  |                 new HTMLPurifier_AttrDef_CSS_Length('0') // disallow negative
 | ||
|  |             )); | ||
|  | 
 | ||
|  |         $this->info['border-top-left-radius'] = | ||
|  |         $this->info['border-top-right-radius'] = | ||
|  |         $this->info['border-bottom-right-radius'] = | ||
|  |         $this->info['border-bottom-left-radius'] = new HTMLPurifier_AttrDef_CSS_Multiple($border_radius, 2); | ||
|  |         // TODO: support SLASH syntax
 | ||
|  |         $this->info['border-radius'] = new HTMLPurifier_AttrDef_CSS_Multiple($border_radius, 4); | ||
|  | 
 | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * @param HTMLPurifier_Config $config | ||
|  |      */ | ||
|  |     protected function doSetupTricky($config) | ||
|  |     { | ||
|  |         $this->info['display'] = new HTMLPurifier_AttrDef_Enum( | ||
|  |             array( | ||
|  |                 'inline', | ||
|  |                 'block', | ||
|  |                 'list-item', | ||
|  |                 'run-in', | ||
|  |                 'compact', | ||
|  |                 'marker', | ||
|  |                 'table', | ||
|  |                 'inline-block', | ||
|  |                 'inline-table', | ||
|  |                 'table-row-group', | ||
|  |                 'table-header-group', | ||
|  |                 'table-footer-group', | ||
|  |                 'table-row', | ||
|  |                 'table-column-group', | ||
|  |                 'table-column', | ||
|  |                 'table-cell', | ||
|  |                 'table-caption', | ||
|  |                 'none' | ||
|  |             ) | ||
|  |         ); | ||
|  |         $this->info['visibility'] = new HTMLPurifier_AttrDef_Enum( | ||
|  |             array('visible', 'hidden', 'collapse') | ||
|  |         ); | ||
|  |         $this->info['overflow'] = new HTMLPurifier_AttrDef_Enum(array('visible', 'hidden', 'auto', 'scroll')); | ||
|  |         $this->info['opacity'] = new HTMLPurifier_AttrDef_CSS_AlphaValue(); | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * @param HTMLPurifier_Config $config | ||
|  |      */ | ||
|  |     protected function doSetupTrusted($config) | ||
|  |     { | ||
|  |         $this->info['position'] = new HTMLPurifier_AttrDef_Enum( | ||
|  |             array('static', 'relative', 'absolute', 'fixed') | ||
|  |         ); | ||
|  |         $this->info['top'] = | ||
|  |         $this->info['left'] = | ||
|  |         $this->info['right'] = | ||
|  |         $this->info['bottom'] = new HTMLPurifier_AttrDef_CSS_Composite( | ||
|  |             array( | ||
|  |                 new HTMLPurifier_AttrDef_CSS_Length(), | ||
|  |                 new HTMLPurifier_AttrDef_CSS_Percentage(), | ||
|  |                 new HTMLPurifier_AttrDef_Enum(array('auto')), | ||
|  |             ) | ||
|  |         ); | ||
|  |         $this->info['z-index'] = new HTMLPurifier_AttrDef_CSS_Composite( | ||
|  |             array( | ||
|  |                 new HTMLPurifier_AttrDef_Integer(), | ||
|  |                 new HTMLPurifier_AttrDef_Enum(array('auto')), | ||
|  |             ) | ||
|  |         ); | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * Performs extra config-based processing. Based off of | ||
|  |      * HTMLPurifier_HTMLDefinition. | ||
|  |      * @param HTMLPurifier_Config $config | ||
|  |      * @todo Refactor duplicate elements into common class (probably using | ||
|  |      *       composition, not inheritance). | ||
|  |      */ | ||
|  |     protected function setupConfigStuff($config) | ||
|  |     { | ||
|  |         // setup allowed elements
 | ||
|  |         $support = "(for information on implementing this, see the " . | ||
|  |             "support forums) "; | ||
|  |         $allowed_properties = $config->get('CSS.AllowedProperties'); | ||
|  |         if ($allowed_properties !== null) { | ||
|  |             foreach ($this->info as $name => $d) { | ||
|  |                 if (!isset($allowed_properties[$name])) { | ||
|  |                     unset($this->info[$name]); | ||
|  |                 } | ||
|  |                 unset($allowed_properties[$name]); | ||
|  |             } | ||
|  |             // emit errors
 | ||
|  |             foreach ($allowed_properties as $name => $d) { | ||
|  |                 // :TODO: Is this htmlspecialchars() call really necessary?
 | ||
|  |                 $name = htmlspecialchars($name); | ||
|  |                 trigger_error("Style attribute '$name' is not supported $support", E_USER_WARNING); | ||
|  |             } | ||
|  |         } | ||
|  | 
 | ||
|  |         $forbidden_properties = $config->get('CSS.ForbiddenProperties'); | ||
|  |         if ($forbidden_properties !== null) { | ||
|  |             foreach ($this->info as $name => $d) { | ||
|  |                 if (isset($forbidden_properties[$name])) { | ||
|  |                     unset($this->info[$name]); | ||
|  |                 } | ||
|  |             } | ||
|  |         } | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | // vim: et sw=4 sts=4
 |