_defaultState)) {
$this->_defaultState = array();
$handlers = $this->getHandlers();
foreach ($handlers as $property => $handler) {
$this->_defaultState[$property] = $handler->default_value();
};
};
return $this->_defaultState;
}
function _getDefaultStateFlags() {
if (!isset($this->_defaultStateFlags)) {
$this->_defaultStateFlags = array();
$handlers = $this->getHandlers();
foreach ($handlers as $property => $handler) {
$this->_defaultStateFlags[$property] = true;
};
};
return $this->_defaultStateFlags;
}
function getHandlers() {
return $this->_handlers;
}
function getInheritableTextHandlers() {
if (!isset($this->_handlersInheritableText)) {
$this->_handlersInheritabletext = array();
foreach ($this->_handlers as $property => $handler) {
if ($handler->isInheritableText()) {
$this->_handlersInheritableText[$property] =& $this->_handlers[$property];
};
}
}
return $this->_handlersInheritableText;
}
function getInheritableHandlers() {
if (!isset($this->_handlersInheritable)) {
$this->_handlersInheritable = array();
foreach ($this->_handlers as $property => $handler) {
if ($handler->isInheritable()) {
$this->_handlersInheritable[$property] =& $this->_handlers[$property];
};
}
}
return $this->_handlersInheritable;
}
function &get() {
global $__g_css_handler_set;
if (!isset($__g_css_handler_set)) {
$__g_css_handler_set = new CSS();
};
return $__g_css_handler_set;
}
function CSS() {
$this->_handlers = array();
$this->_mapping = array();
}
function getDefaultValue($property) {
$css =& CSS::get();
$handler =& $css->_get_handler($property);
$value = $handler->default_value();
if (is_object($value)) {
return $value->copy();
} else {
return $value;
};
}
function &get_handler($property) {
$css =& CSS::get();
$handler =& $css->_get_handler($property);
return $handler;
}
function &_get_handler($property) {
if (isset($this->_handlers[$property])) {
return $this->_handlers[$property];
} else {
$dumb = null;
return $dumb;
};
}
function _name2code($key) {
if (!isset($this->_mapping[$key])) {
return null;
};
return $this->_mapping[$key];
}
function name2code($key) {
$css =& CSS::get();
return $css->_name2code($key);
}
function register_css_property(&$handler) {
$property = $handler->get_property_code();
$name = $handler->get_property_name();
$css =& CSS::get();
$css->_handlers[$property] =& $handler;
$css->_mapping[$name] = $property;
}
/**
* Refer to CSS 2.1 G.2 Lexical scanner
* h [0-9a-f]
* nonascii [\200-\377]
* unicode \\{h}{1,6}(\r\n|[ \t\r\n\f])?
* escape {unicode}|\\[^\r\n\f0-9a-f]
* nmstart [_a-z]|{nonascii}|{escape}
* nmchar [_a-z0-9-]|{nonascii}|{escape}
* ident -?{nmstart}{nmchar}*
*/
function get_identifier_regexp() {
return '-?(?:[_a-z]|[\200-\377]|\\[0-9a-f]{1,6}(?:\r\n|[ \t\r\n\f])?|\\[^\r\n\f0-9a-f])(?:[_a-z0-9-]|[\200-\377]|\\[0-9a-f]{1,6}(?:\r\n|[ \t\r\n\f])?|\\[^\r\n\f0-9a-f])*';
}
function is_identifier($string) {
return preg_match(sprintf('/%s/',
CSS::get_identifier_regexp()),
$string);
}
function parse_string($string) {
if (preg_match(sprintf('/^(%s)\s*(.*)$/s', CSS_STRING1_REGEXP), $string, $matches)) {
$value = $matches[1];
$rest = $matches[2];
$value = CSS::remove_backslash_at_newline($value);
return array($value, $rest);
};
if (preg_match(sprintf('/^(%s)\s*(.*)$/s', CSS_STRING2_REGEXP), $string, $matches)) {
$value = $matches[1];
$rest = $matches[2];
$value = CSS::remove_backslash_at_newline($value);
return array($value, $rest);
};
return array(null, $string);
}
function remove_backslash_at_newline($value) {
return preg_replace("/\\\\\n/", '', $value);
}
}
?>