]> git.mxchange.org Git - friendica.git/blob - library/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Multiple.php
Merge remote-tracking branch 'upstream/develop' into 1601-api-statuses-lookup
[friendica.git] / library / ezyang / htmlpurifier / library / HTMLPurifier / AttrDef / CSS / Multiple.php
1 <?php
2
3 /**
4  * Framework class for strings that involve multiple values.
5  *
6  * Certain CSS properties such as border-width and margin allow multiple
7  * lengths to be specified.  This class can take a vanilla border-width
8  * definition and multiply it, usually into a max of four.
9  *
10  * @note Even though the CSS specification isn't clear about it, inherit
11  *       can only be used alone: it will never manifest as part of a multi
12  *       shorthand declaration.  Thus, this class does not allow inherit.
13  */
14 class HTMLPurifier_AttrDef_CSS_Multiple extends HTMLPurifier_AttrDef
15 {
16     /**
17      * Instance of component definition to defer validation to.
18      * @type HTMLPurifier_AttrDef
19      * @todo Make protected
20      */
21     public $single;
22
23     /**
24      * Max number of values allowed.
25      * @todo Make protected
26      */
27     public $max;
28
29     /**
30      * @param HTMLPurifier_AttrDef $single HTMLPurifier_AttrDef to multiply
31      * @param int $max Max number of values allowed (usually four)
32      */
33     public function __construct($single, $max = 4)
34     {
35         $this->single = $single;
36         $this->max = $max;
37     }
38
39     /**
40      * @param string $string
41      * @param HTMLPurifier_Config $config
42      * @param HTMLPurifier_Context $context
43      * @return bool|string
44      */
45     public function validate($string, $config, $context)
46     {
47         $string = $this->mungeRgb($this->parseCDATA($string));
48         if ($string === '') {
49             return false;
50         }
51         $parts = explode(' ', $string); // parseCDATA replaced \r, \t and \n
52         $length = count($parts);
53         $final = '';
54         for ($i = 0, $num = 0; $i < $length && $num < $this->max; $i++) {
55             if (ctype_space($parts[$i])) {
56                 continue;
57             }
58             $result = $this->single->validate($parts[$i], $config, $context);
59             if ($result !== false) {
60                 $final .= $result . ' ';
61                 $num++;
62             }
63         }
64         if ($final === '') {
65             return false;
66         }
67         return rtrim($final);
68     }
69 }
70
71 // vim: et sw=4 sts=4