/** * parse regular CSS blocks * * _parse_properties() creates a new Style object based on the provided * CSS rules. * * @param string $str CSS rules * @return Style */ private function _parse_properties($str) { $properties = preg_split("/;(?=(?:[^\\(]*\\([^\\)]*\\))*(?![^\\)]*\\)))/", $str); if (DEBUGCSS) { print '[_parse_properties'; } // Create the style $style = new Style($this); foreach ($properties as $prop) { // If the $prop contains an url, the regex may be wrong // @todo: fix the regex so that it works everytime /*if (strpos($prop, "url(") === false) { if (preg_match("/([a-z-]+)\s*:\s*[^:]+$/i", $prop, $m)) $prop = $m[0]; }*/ //A css property can have " ! important" appended (whitespace optional) //strip this off to decode core of the property correctly. //Pass on in the style to allow proper handling: //!important properties can only be overridden by other !important ones. //$style->$prop_name = is a shortcut of $style->__set($prop_name,$value);. //If no specific set function available, set _props["prop_name"] //style is always copied completely, or $_props handled separately //Therefore set a _important_props["prop_name"]=true to indicate the modifier /* Instead of short code, prefer the typical case with fast code $important = preg_match("/(.*?)!\s*important/",$prop,$match); if ( $important ) { $prop = $match[1]; } $prop = trim($prop); */ if (DEBUGCSS) { print '('; } $important = false; $prop = trim($prop); if (substr($prop, -9) === 'important') { $prop_tmp = rtrim(substr($prop, 0, -9)); if (substr($prop_tmp, -1) === '!') { $prop = rtrim(substr($prop_tmp, 0, -1)); $important = true; } } if ($prop == "") { if (DEBUGCSS) { print 'empty)'; } continue; } $i = mb_strpos($prop, ":"); if ($i === false) { if (DEBUGCSS) { print 'novalue' . $prop . ')'; } continue; } $prop_name = rtrim(mb_strtolower(mb_substr($prop, 0, $i))); $value = ltrim(mb_substr($prop, $i + 1)); if (DEBUGCSS) { print $prop_name . ':=' . $value . ($important ? '!IMPORTANT' : '') . ')'; } //New style, anyway empty //if ($important || !$style->important_get($prop_name) ) { //$style->$prop_name = array($value,$important); //assignment might be replaced by overloading through __set, //and overloaded functions might check _important_props, //therefore set _important_props first. if ($important) { $style->important_set($prop_name); } //For easier debugging, don't use overloading of assignments with __set $style->{$prop_name} = $value; //$style->props_set($prop_name, $value); } if (DEBUGCSS) { print '_parse_properties]'; } return $style; }
private function _parse_properties($str) { $properties = preg_split("/;(?=(?:[^\\(]*\\([^\\)]*\\))*(?![^\\)]*\\)))/", $str); if (DEBUGCSS) { print '[_parse_properties'; } $style = new Style($this); foreach ($properties as $prop) { if (DEBUGCSS) { print '('; } $important = false; $prop = trim($prop); if (substr($prop, -9) === 'important') { $prop_tmp = rtrim(substr($prop, 0, -9)); if (substr($prop_tmp, -1) === '!') { $prop = rtrim(substr($prop_tmp, 0, -1)); $important = true; } } if ($prop === "") { if (DEBUGCSS) { print 'empty)'; } continue; } $i = mb_strpos($prop, ":"); if ($i === false) { if (DEBUGCSS) { print 'novalue' . $prop . ')'; } continue; } $prop_name = rtrim(mb_strtolower(m_mb_substr($prop, 0, $i))); $value = ltrim(m_mb_substr($prop, $i + 1)); if (DEBUGCSS) { print $prop_name . ':=' . $value . ($important ? '!IMPORTANT' : '') . ')'; } if ($important) { $style->important_set($prop_name); } $style->{$prop_name} = $value; } if (DEBUGCSS) { print '_parse_properties]'; } return $style; }