| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157 | <?php/* W3C says:    [ // adjective and number must be in correct order, even if      // you could switch them without introducing ambiguity.      // some browsers support that syntax        [            <percentage> | <length> | left | center | right        ]        [            <percentage> | <length> | top | center | bottom        ]?    ] |    [ // this signifies that the vertical and horizontal adjectives      // can be arbitrarily ordered, however, there can only be two,      // one of each, or none at all        [            left | center | right        ] ||        [            top | center | bottom        ]    ]    top, left = 0%    center, (none) = 50%    bottom, right = 100%*//* QuirksMode says:    keyword + length/percentage must be ordered correctly, as per W3C    Internet Explorer and Opera, however, support arbitrary ordering. We    should fix it up.    Minor issue though, not strictly necessary.*/// control freaks may appreciate the ability to convert these to// percentages or something, but it's not necessary/** * Validates the value of background-position. */class HTMLPurifier_AttrDef_CSS_BackgroundPosition extends HTMLPurifier_AttrDef{    /**     * @type HTMLPurifier_AttrDef_CSS_Length     */    protected $length;    /**     * @type HTMLPurifier_AttrDef_CSS_Percentage     */    protected $percentage;    public function __construct()    {        $this->length = new HTMLPurifier_AttrDef_CSS_Length();        $this->percentage = new HTMLPurifier_AttrDef_CSS_Percentage();    }    /**     * @param string $string     * @param HTMLPurifier_Config $config     * @param HTMLPurifier_Context $context     * @return bool|string     */    public function validate($string, $config, $context)    {        $string = $this->parseCDATA($string);        $bits = explode(' ', $string);        $keywords = array();        $keywords['h'] = false; // left, right        $keywords['v'] = false; // top, bottom        $keywords['ch'] = false; // center (first word)        $keywords['cv'] = false; // center (second word)        $measures = array();        $i = 0;        $lookup = array(            'top' => 'v',            'bottom' => 'v',            'left' => 'h',            'right' => 'h',            'center' => 'c'        );        foreach ($bits as $bit) {            if ($bit === '') {                continue;            }            // test for keyword            $lbit = ctype_lower($bit) ? $bit : strtolower($bit);            if (isset($lookup[$lbit])) {                $status = $lookup[$lbit];                if ($status == 'c') {                    if ($i == 0) {                        $status = 'ch';                    } else {                        $status = 'cv';                    }                }                $keywords[$status] = $lbit;                $i++;            }            // test for length            $r = $this->length->validate($bit, $config, $context);            if ($r !== false) {                $measures[] = $r;                $i++;            }            // test for percentage            $r = $this->percentage->validate($bit, $config, $context);            if ($r !== false) {                $measures[] = $r;                $i++;            }        }        if (!$i) {            return false;        } // no valid values were caught        $ret = array();        // first keyword        if ($keywords['h']) {            $ret[] = $keywords['h'];        } elseif ($keywords['ch']) {            $ret[] = $keywords['ch'];            $keywords['cv'] = false; // prevent re-use: center = center center        } elseif (count($measures)) {            $ret[] = array_shift($measures);        }        if ($keywords['v']) {            $ret[] = $keywords['v'];        } elseif ($keywords['cv']) {            $ret[] = $keywords['cv'];        } elseif (count($measures)) {            $ret[] = array_shift($measures);        }        if (empty($ret)) {            return false;        }        return implode(' ', $ret);    }}// vim: et sw=4 sts=4
 |