| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113 | <?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
 |