You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
113 lines
3.2 KiB
113 lines
3.2 KiB
<?php |
|
|
|
/** |
|
* Validates shorthand CSS property background. |
|
* @warning Does not support url tokens that have internal spaces. |
|
*/ |
|
class HTMLPurifier_AttrDef_CSS_Background extends HTMLPurifier_AttrDef |
|
{ |
|
|
|
/** |
|
* Local copy of component validators. |
|
* @type HTMLPurifier_AttrDef[] |
|
* @note See HTMLPurifier_AttrDef_Font::$info for a similar impl. |
|
*/ |
|
protected $info; |
|
|
|
/** |
|
* @param HTMLPurifier_Config $config |
|
*/ |
|
public function __construct($config) |
|
{ |
|
$def = $config->getCSSDefinition(); |
|
$this->info['background-color'] = $def->info['background-color']; |
|
$this->info['background-image'] = $def->info['background-image']; |
|
$this->info['background-repeat'] = $def->info['background-repeat']; |
|
$this->info['background-attachment'] = $def->info['background-attachment']; |
|
$this->info['background-position'] = $def->info['background-position']; |
|
$this->info['background-size'] = $def->info['background-size']; |
|
} |
|
|
|
/** |
|
* @param string $string |
|
* @param HTMLPurifier_Config $config |
|
* @param HTMLPurifier_Context $context |
|
* @return bool|string |
|
*/ |
|
public function validate($string, $config, $context) |
|
{ |
|
// regular pre-processing |
|
$string = $this->parseCDATA($string); |
|
if ($string === '') { |
|
return false; |
|
} |
|
|
|
// munge rgb() decl if necessary |
|
$string = $this->mungeRgb($string); |
|
|
|
// assumes URI doesn't have spaces in it |
|
$bits = explode(' ', $string); // bits to process |
|
|
|
$caught = array(); |
|
$caught['color'] = false; |
|
$caught['image'] = false; |
|
$caught['repeat'] = false; |
|
$caught['attachment'] = false; |
|
$caught['position'] = false; |
|
$caught['size'] = false; |
|
|
|
$i = 0; // number of catches |
|
|
|
foreach ($bits as $bit) { |
|
if ($bit === '') { |
|
continue; |
|
} |
|
foreach ($caught as $key => $status) { |
|
if ($key != 'position') { |
|
if ($status !== false) { |
|
continue; |
|
} |
|
$r = $this->info['background-' . $key]->validate($bit, $config, $context); |
|
} else { |
|
$r = $bit; |
|
} |
|
if ($r === false) { |
|
continue; |
|
} |
|
if ($key == 'position') { |
|
if ($caught[$key] === false) { |
|
$caught[$key] = ''; |
|
} |
|
$caught[$key] .= $r . ' '; |
|
} else { |
|
$caught[$key] = $r; |
|
} |
|
$i++; |
|
break; |
|
} |
|
} |
|
|
|
if (!$i) { |
|
return false; |
|
} |
|
if ($caught['position'] !== false) { |
|
$caught['position'] = $this->info['background-position']-> |
|
validate($caught['position'], $config, $context); |
|
} |
|
|
|
$ret = array(); |
|
foreach ($caught as $value) { |
|
if ($value === false) { |
|
continue; |
|
} |
|
$ret[] = $value; |
|
} |
|
|
|
if (empty($ret)) { |
|
return false; |
|
} |
|
return implode(' ', $ret); |
|
} |
|
} |
|
|
|
// vim: et sw=4 sts=4
|
|
|