LVCssSelectorRule * parse_attr( const char * &str, lxmlDocBase * doc ) { char attrname[512]; char attrvalue[512]; LVCssSelectorRuleType st = cssrt_universal; if (*str=='.') { // E.class str++; skip_spaces( str ); if (!parse_ident( str, attrvalue )) return NULL; skip_spaces( str ); LVCssSelectorRule * rule = new LVCssSelectorRule(cssrt_class); lString16 s( attrvalue ); s.lowercase(); rule->setAttr(attr_class, s); return rule; } else if ( *str=='#' ) { // E#id str++; skip_spaces( str ); if (!parse_ident( str, attrvalue )) return NULL; skip_spaces( str ); LVCssSelectorRule * rule = new LVCssSelectorRule(cssrt_id); lString16 s( attrvalue ); rule->setAttr(attr_id, s); return rule; } else if (*str != '[') return NULL; str++; skip_spaces( str ); if (!parse_ident( str, attrname )) return NULL; skip_spaces( str ); attrvalue[0] = 0; if (*str==']') { st = cssrt_attrset; str++; } else if (*str=='=') { str++; if (!parse_attr_value( str, attrvalue)) return NULL; st = cssrt_attreq; } else if (*str=='~' && str[1]=='=') { str+=2; if (!parse_attr_value( str, attrvalue)) return NULL; st = cssrt_attrhas; } else if (*str=='|' && str[1]=='=') { str+=2; if (!parse_attr_value( str, attrvalue)) return NULL; st = cssrt_attrstarts; } else { return NULL; } LVCssSelectorRule * rule = new LVCssSelectorRule(st); lString16 s( attrvalue ); lUInt16 id = doc->getAttrNameIndex( lString16(attrname).c_str() ); rule->setAttr(id, s); return rule; }