bool LVCssSelector::parse( const char * &str, lxmlDocBase * doc ) { if (!str || !*str) return false; for (;;) { skip_spaces( str ); if ( *str == '*' ) // universal selector { str++; skip_spaces( str ); _id = 0; } else if ( *str == '.' ) // classname follows { _id = 0; } else if ( css_is_alpha( *str ) ) { // ident char ident[64]; if (!parse_ident( str, ident )) return false; _id = doc->getElementNameIndex( lString16(ident).c_str() ); skip_spaces( str ); } else { return false; } if ( *str == ',' || *str == '{' ) return true; // one or more attribute rules bool attr_rule = false; while ( *str == '[' || *str=='.' || *str=='#' ) { LVCssSelectorRule * rule = parse_attr( str, doc ); if (!rule) return false; insertRuleStart( rule ); //insertRuleAfterStart //insertRuleAfterStart( rule ); //insertRuleAfterStart /* if ( _id!=0 ) { LVCssSelectorRule * rule = new LVCssSelectorRule(cssrt_parent); rule->setId(_id); insertRuleStart( rule ); _id=0; } */ skip_spaces( str ); attr_rule = true; //continue; } // element relation if (*str == '>') { str++; LVCssSelectorRule * rule = new LVCssSelectorRule(cssrt_parent); rule->setId(_id); insertRuleStart( rule ); _id=0; continue; } else if (*str == '+') { str++; LVCssSelectorRule * rule = new LVCssSelectorRule(cssrt_predecessor); rule->setId(_id); insertRuleStart( rule ); _id=0; continue; } else if (css_is_alpha( *str )) { LVCssSelectorRule * rule = new LVCssSelectorRule(cssrt_ancessor); rule->setId(_id); insertRuleStart( rule ); _id=0; continue; } if ( !attr_rule ) return false; else if ( *str == ',' || *str == '{' ) return true; } }