Ariadne-CMS /
ariadne
This project does not seem to handle request data directly as such no vulnerable execution paths were found.
include, or for example
via PHP's auto-loading mechanism.
These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more
| 1 | <?php |
||
| 2 | ar_pinp::allow( 'ar_css' ); |
||
| 3 | ar_pinp::allow( 'ar_cssStyleSheet' ); |
||
| 4 | ar_pinp::allow( 'ar_cssSearch' ); |
||
| 5 | ar::load('html'); |
||
| 6 | |||
| 7 | class ar_css extends arBase { |
||
| 8 | |||
| 9 | public static function stylesheet() { |
||
| 10 | return new ar_cssStyleSheet( ); |
||
| 11 | } |
||
| 12 | |||
| 13 | } |
||
| 14 | |||
| 15 | class ar_cssStyleSheet extends ar_htmlElement { |
||
| 16 | // FIXME: make the css content available as nodeValue of a child ar_htmlNode (or a list of nodes?) |
||
| 17 | // create a ar_cssRule which implements or extends ar_htmlNode? |
||
| 18 | private $cssText = ''; |
||
| 19 | private $variables = array(); |
||
| 20 | public $rules = null; |
||
| 21 | |||
| 22 | public function __construct($tagName = 'style', $attributes = array(), $childNodes = null, $parentNode = null) { |
||
| 23 | $this->rules = new ar_cssRules( $this ); |
||
| 24 | if ( !$attributes ) { |
||
|
0 ignored issues
–
show
|
|||
| 25 | $attributes = array(); |
||
| 26 | } |
||
| 27 | if ( !$attributes['type'] ) { |
||
| 28 | $attributes['type'] = 'text/css'; |
||
| 29 | } |
||
| 30 | parent::__construct( $tagName, $attributes, null, $parentNode ); |
||
| 31 | } |
||
| 32 | |||
| 33 | public function rule( $selector, $styles ) { |
||
| 34 | $this->rules[$selector] = new ar_cssStyles( $this->rules, $styles ); |
||
| 35 | return $this; |
||
| 36 | } |
||
| 37 | |||
| 38 | public function find( $search ) { |
||
| 39 | $found = new ar_cssRules( $this ); |
||
| 40 | foreach ( $this->rules as $rule => $styles ) { |
||
| 41 | if ( preg_match( $search, $rule ) ) { |
||
| 42 | $found[$rule] = $styles; |
||
| 43 | } |
||
| 44 | } |
||
| 45 | return new ar_cssSearch( $this, $search, $found ); |
||
| 46 | } |
||
| 47 | |||
| 48 | public function add( $selector, $styles ) { |
||
| 49 | $this->rules[$selector] = new ar_cssStyles( |
||
| 50 | $this->rules, |
||
| 51 | array_merge( |
||
| 52 | (array) $this->rules[$selector], |
||
| 53 | (array) $styles |
||
| 54 | ) |
||
| 55 | ); |
||
| 56 | return $this; |
||
| 57 | } |
||
| 58 | |||
| 59 | public function delete( $selector, $styles = null ) { |
||
| 60 | if ( isset($styles) ) { |
||
| 61 | foreach( $styles as $style ) { |
||
| 62 | unset( $this->rules[$selector][$style] ); |
||
| 63 | } |
||
| 64 | } else { |
||
| 65 | unset( $this->rules[$selector] ); |
||
| 66 | } |
||
| 67 | return $this; |
||
| 68 | } |
||
| 69 | |||
| 70 | public function copy( $selector, $newselector ) { |
||
| 71 | $this->add( $newselector, $this->rules[$selector] ); |
||
| 72 | } |
||
| 73 | |||
| 74 | public function import( $cssText ) { |
||
| 75 | // ignore comments /* */ but keep them in |
||
| 76 | $ruleRE = '/([^{]*)\{(.*)\}/isU'; |
||
| 77 | $styleRE = '/([^:]+)\:(.+)(;|$)/isU'; |
||
| 78 | while ( preg_match( $ruleRE, $cssText, $matches ) ) { |
||
| 79 | $rule = $matches[1]; |
||
| 80 | $stylesText = $matches[2]; |
||
| 81 | $styles = array(); |
||
| 82 | while ( preg_match( $styleRE, $stylesText, $styleMatches ) ) { |
||
| 83 | $styles[ $styleMatches[1] ] = $styleMatches[2]; |
||
| 84 | $stylesText = str_replace( $styleMatches[0], '', $stylesText ); |
||
| 85 | } |
||
| 86 | $this->add( $rule, $styles ); |
||
| 87 | $cssText = str_replace( $matches[0], '', $cssText); |
||
| 88 | } |
||
| 89 | $this->cssText = $cssText; |
||
| 90 | return $this; |
||
| 91 | } |
||
| 92 | |||
| 93 | public function rename( $selector, $newselector ) { |
||
| 94 | $this->rules[$newselector] = $this->rules[$selector]; |
||
| 95 | unset( $this->rules[$selector] ); |
||
| 96 | } |
||
| 97 | |||
| 98 | public function getVariable( $name ) { |
||
| 99 | return $this->variables[$name] ? $this->variables[$name] : null; |
||
| 100 | } |
||
| 101 | |||
| 102 | public function bind( $variable, $value = null, $dummy = 'string' ) { |
||
| 103 | if ( is_array($variable) ) { |
||
| 104 | $this->variables = $variable + $this->variables; |
||
| 105 | } else { |
||
| 106 | $this->variables[$variable] = $value; |
||
| 107 | } |
||
| 108 | return $this; |
||
| 109 | } |
||
| 110 | |||
| 111 | public function __toString() { |
||
| 112 | return (string) ar_html::tag( 'style', $this->attributes, (string) $this->rules ); |
||
| 113 | } |
||
| 114 | } |
||
| 115 | |||
| 116 | class ar_cssSearch extends arBase { |
||
| 117 | private $styleSheet = null; |
||
| 118 | private $search = null; |
||
| 119 | private $rules = null; |
||
| 120 | |||
| 121 | public function __construct( $styleSheet, $search, $rules ) { |
||
| 122 | $this->styleSheet = $styleSheet; |
||
| 123 | $this->search = $search; |
||
| 124 | $this->rules = new ar_cssRules($styleSheet, $rules); |
||
| 125 | } |
||
| 126 | |||
| 127 | public function __toString() { |
||
| 128 | $this->apply(); |
||
| 129 | return $this->styleSheet->__toString(); |
||
| 130 | } |
||
| 131 | |||
| 132 | public function rule( $newstyles ) { |
||
| 133 | foreach ( $this->rules as $rule => $styles ) { |
||
| 134 | $this->rules[$rule] = new ar_cssStyles( $this->rules, $newstyles); |
||
| 135 | } |
||
| 136 | return $this; |
||
| 137 | } |
||
| 138 | |||
| 139 | public function delete( $oldstyles = null ) { |
||
| 140 | foreach ( $this->rules as $rule => $styles ) { |
||
| 141 | if (isset($oldstyles)) { |
||
| 142 | foreach ( $oldstyles as $style ) { |
||
| 143 | $this->rules[$rule][$style] = null; |
||
| 144 | } |
||
| 145 | } else { |
||
| 146 | $this->rules[$rule] = null; |
||
| 147 | } |
||
| 148 | } |
||
| 149 | return $this; |
||
| 150 | } |
||
| 151 | |||
| 152 | public function add( $newstyles ) { |
||
| 153 | foreach ( $this->rules as $rule => $styles ) { |
||
| 154 | $this->rules[$rule] = new ar_cssStyles( $this->rules, array_merge( (array) $styles, (array) $newstyles ) ); |
||
| 155 | } |
||
| 156 | return $this; |
||
| 157 | } |
||
| 158 | |||
| 159 | public function rename( $newselector ) { |
||
| 160 | foreach ( $this->rules as $rule => $styles ) { |
||
| 161 | $newrule = preg_replace( $rule, $this->search, $newselector ); |
||
| 162 | $this->rules[$newrule] = $styles; |
||
| 163 | $this->rules[$rule] = null; |
||
| 164 | } |
||
| 165 | return $this; |
||
| 166 | } |
||
| 167 | |||
| 168 | public function apply() { |
||
| 169 | foreach ( $this->rules as $rule => $styles ) { |
||
| 170 | if ( isset($styles) ) { |
||
| 171 | $this->styleSheet->rule( $rule, $styles ); |
||
| 172 | } else { |
||
| 173 | $this->styleSheet->delete( $rule ); |
||
| 174 | } |
||
| 175 | } |
||
| 176 | return $this->styleSheet; |
||
| 177 | } |
||
| 178 | } |
||
| 179 | |||
| 180 | interface ar_cssRulesInterface { |
||
| 181 | } |
||
| 182 | |||
| 183 | class ar_cssRules extends ArrayObject implements ar_cssRulesInterface { |
||
| 184 | private $styleSheet = null; |
||
| 185 | |||
| 186 | public function __construct( $styleSheet, $rules = array() ) { |
||
| 187 | $this->styleSheet = $styleSheet; |
||
| 188 | parent::__construct( (array) $rules ); |
||
| 189 | } |
||
| 190 | |||
| 191 | public function __toString() { |
||
| 192 | $result = ''; |
||
| 193 | foreach( $this as $rule => $style ) { |
||
| 194 | $result .= "\n" . trim($rule) . " {\n" . $style . "}\n"; |
||
| 195 | } |
||
| 196 | return $result; |
||
| 197 | } |
||
| 198 | |||
| 199 | public function getVariable( $name ) { |
||
| 200 | return $this->styleSheet->getVariable( $name ); |
||
| 201 | } |
||
| 202 | } |
||
| 203 | |||
| 204 | interface ar_cssStylesInterface { |
||
| 205 | } |
||
| 206 | |||
| 207 | class ar_cssStyles extends ArrayObject implements ar_cssStylesInterface { |
||
| 208 | |||
| 209 | private $rules = null; |
||
| 210 | |||
| 211 | public function __construct( $rules, $styles = array() ) { |
||
| 212 | $this->rules = $rules; |
||
| 213 | parent::__construct( (array) $styles ); |
||
| 214 | } |
||
| 215 | |||
| 216 | public function __toString() { |
||
| 217 | $result = ''; |
||
| 218 | foreach ($this as $style => $value ) { |
||
| 219 | if ( $value ) { |
||
| 220 | while ( preg_match('/\b(var\((.*)\))/', $value, $matches) ) { |
||
| 221 | $var = $this->getVariable( $matches[2] ); |
||
| 222 | if ( isset($var) ) { |
||
| 223 | $value = str_replace( $matches[1], $var, $value ); |
||
| 224 | } |
||
| 225 | } |
||
| 226 | $result .= "\t" . trim($style) . ": " . trim($value) . ";\n"; |
||
| 227 | } |
||
| 228 | } |
||
| 229 | return $result; |
||
| 230 | } |
||
| 231 | |||
| 232 | protected function getVariable( $name ) { |
||
| 233 | return $this->rules->getVariable( $name ); |
||
| 234 | } |
||
| 235 | } |
||
| 236 |
This check marks implicit conversions of arrays to boolean values in a comparison. While in PHP an empty array is considered to be equal (but not identical) to false, this is not always apparent.
Consider making the comparison explicit by using
empty(..)or! empty(...)instead.