File indexing completed on 2024-12-22 05:36:18
0001 <?php 0002 0003 /** 0004 * Validates shorthand CSS property list-style. 0005 * @warning Does not support url tokens that have internal spaces. 0006 */ 0007 class HTMLPurifier_AttrDef_CSS_ListStyle extends HTMLPurifier_AttrDef 0008 { 0009 0010 /** 0011 * Local copy of validators. 0012 * @type HTMLPurifier_AttrDef[] 0013 * @note See HTMLPurifier_AttrDef_CSS_Font::$info for a similar impl. 0014 */ 0015 protected $info; 0016 0017 /** 0018 * @param HTMLPurifier_Config $config 0019 */ 0020 public function __construct($config) 0021 { 0022 $def = $config->getCSSDefinition(); 0023 $this->info['list-style-type'] = $def->info['list-style-type']; 0024 $this->info['list-style-position'] = $def->info['list-style-position']; 0025 $this->info['list-style-image'] = $def->info['list-style-image']; 0026 } 0027 0028 /** 0029 * @param string $string 0030 * @param HTMLPurifier_Config $config 0031 * @param HTMLPurifier_Context $context 0032 * @return bool|string 0033 */ 0034 public function validate($string, $config, $context) 0035 { 0036 // regular pre-processing 0037 $string = $this->parseCDATA($string); 0038 if ($string === '') { 0039 return false; 0040 } 0041 0042 // assumes URI doesn't have spaces in it 0043 $bits = explode(' ', strtolower($string)); // bits to process 0044 0045 $caught = array(); 0046 $caught['type'] = false; 0047 $caught['position'] = false; 0048 $caught['image'] = false; 0049 0050 $i = 0; // number of catches 0051 $none = false; 0052 0053 foreach ($bits as $bit) { 0054 if ($i >= 3) { 0055 return; 0056 } // optimization bit 0057 if ($bit === '') { 0058 continue; 0059 } 0060 foreach ($caught as $key => $status) { 0061 if ($status !== false) { 0062 continue; 0063 } 0064 $r = $this->info['list-style-' . $key]->validate($bit, $config, $context); 0065 if ($r === false) { 0066 continue; 0067 } 0068 if ($r === 'none') { 0069 if ($none) { 0070 continue; 0071 } else { 0072 $none = true; 0073 } 0074 if ($key == 'image') { 0075 continue; 0076 } 0077 } 0078 $caught[$key] = $r; 0079 $i++; 0080 break; 0081 } 0082 } 0083 0084 if (!$i) { 0085 return false; 0086 } 0087 0088 $ret = array(); 0089 0090 // construct type 0091 if ($caught['type']) { 0092 $ret[] = $caught['type']; 0093 } 0094 0095 // construct image 0096 if ($caught['image']) { 0097 $ret[] = $caught['image']; 0098 } 0099 0100 // construct position 0101 if ($caught['position']) { 0102 $ret[] = $caught['position']; 0103 } 0104 0105 if (empty($ret)) { 0106 return false; 0107 } 0108 return implode(' ', $ret); 0109 } 0110 } 0111 0112 // vim: et sw=4 sts=4