diff options
-rw-r--r-- | src/gui/text/qcssparser.cpp | 21 | ||||
-rw-r--r-- | src/gui/text/qcssparser_p.h | 6 | ||||
-rw-r--r-- | src/gui/text/qcssscanner.cpp | 734 | ||||
-rw-r--r-- | tests/auto/gui/text/qcssparser/tst_qcssparser.cpp | 50 | ||||
-rw-r--r-- | util/lexgen/css3-simplified.lexgen (renamed from util/lexgen/css2-simplified.lexgen) | 1 |
5 files changed, 433 insertions, 379 deletions
diff --git a/src/gui/text/qcssparser.cpp b/src/gui/text/qcssparser.cpp index 5138f7e94c..72c5d5ff33 100644 --- a/src/gui/text/qcssparser.cpp +++ b/src/gui/text/qcssparser.cpp @@ -1867,12 +1867,15 @@ bool StyleSelector::selectorMatches(const Selector &selector, NodePtr node) do { match = basicSelectorMatches(sel, node); if (!match) { - if (sel.relationToNext == BasicSelector::MatchNextSelectorIfParent - || i == selector.basicSelectors.count() - 1) // first element must always match! + if (i == selector.basicSelectors.count() - 1) // first element must always match! + break; + if (sel.relationToNext != BasicSelector::MatchNextSelectorIfAncestor && + sel.relationToNext != BasicSelector::MatchNextSelectorIfIndirectAdjecent) break; } - if (match || sel.relationToNext != BasicSelector::MatchNextSelectorIfAncestor) + if (match || (sel.relationToNext != BasicSelector::MatchNextSelectorIfAncestor && + sel.relationToNext != BasicSelector::MatchNextSelectorIfIndirectAdjecent)) --i; if (i < 0) @@ -1885,16 +1888,18 @@ bool StyleSelector::selectorMatches(const Selector &selector, NodePtr node) NodePtr nextParent = parentNode(node); freeNode(node); node = nextParent; - } else if (sel.relationToNext == BasicSelector::MatchNextSelectorIfPreceeds) { + } else if (sel.relationToNext == BasicSelector::MatchNextSelectorIfDirectAdjecent + || sel.relationToNext == BasicSelector::MatchNextSelectorIfIndirectAdjecent) { NodePtr previousSibling = previousSiblingNode(node); freeNode(node); node = previousSibling; - } + } if (isNullNode(node)) { match = false; break; } - } while (i >= 0 && (match || sel.relationToNext == BasicSelector::MatchNextSelectorIfAncestor)); + } while (i >= 0 && (match || sel.relationToNext == BasicSelector::MatchNextSelectorIfAncestor + || sel.relationToNext == BasicSelector::MatchNextSelectorIfIndirectAdjecent)); freeNode(node); @@ -2356,9 +2361,11 @@ bool Parser::parseCombinator(BasicSelector::Relation *relation) prev(); } if (test(PLUS)) { - *relation = BasicSelector::MatchNextSelectorIfPreceeds; + *relation = BasicSelector::MatchNextSelectorIfDirectAdjecent; } else if (test(GREATER)) { *relation = BasicSelector::MatchNextSelectorIfParent; + } else if (test(TILDE)) { + *relation = BasicSelector::MatchNextSelectorIfIndirectAdjecent; } skipSpace(); return true; diff --git a/src/gui/text/qcssparser_p.h b/src/gui/text/qcssparser_p.h index c40cb508fa..f5cd5395b2 100644 --- a/src/gui/text/qcssparser_p.h +++ b/src/gui/text/qcssparser_p.h @@ -561,7 +561,8 @@ struct BasicSelector NoRelation, MatchNextSelectorIfAncestor, MatchNextSelectorIfParent, - MatchNextSelectorIfPreceeds + MatchNextSelectorIfDirectAdjecent, + MatchNextSelectorIfIndirectAdjecent, }; QString elementName; @@ -690,6 +691,7 @@ enum TokenType { PLUS, GREATER, COMMA, + TILDE, STRING, INVALID, @@ -789,7 +791,7 @@ public: inline bool testImport() { return testTokenAndEndsWith(ATKEYWORD_SYM, QLatin1String("import")); } inline bool testMedia() { return testTokenAndEndsWith(ATKEYWORD_SYM, QLatin1String("media")); } inline bool testPage() { return testTokenAndEndsWith(ATKEYWORD_SYM, QLatin1String("page")); } - inline bool testCombinator() { return test(PLUS) || test(GREATER) || test(S); } + inline bool testCombinator() { return test(PLUS) || test(GREATER) || test(TILDE) || test(S); } inline bool testProperty() { return test(IDENT); } bool testTerm(); inline bool testExpr() { return testTerm(); } diff --git a/src/gui/text/qcssscanner.cpp b/src/gui/text/qcssscanner.cpp index 9ee075e492..33dc01c8bc 100644 --- a/src/gui/text/qcssscanner.cpp +++ b/src/gui/text/qcssscanner.cpp @@ -177,42 +177,44 @@ int QCssScanner_Generated::lex() goto state_20; if (ch.unicode() == 123) goto state_27; + if (ch.unicode() == 126) + goto state_32; goto out; state_3: lastAcceptingPos = pos; token = QCss::INVALID; ch = next(); if (ch.unicode() >= 1 && ch.unicode() <= 9) - goto state_32; + goto state_33; if (ch.unicode() == 11) - goto state_32; + goto state_33; if (ch.unicode() >= 14 && ch.unicode() <= 33) - goto state_32; - if (ch.unicode() == 34) goto state_33; + if (ch.unicode() == 34) + goto state_34; if (ch.unicode() >= 35 && ch.unicode() <= 91) - goto state_32; + goto state_33; if (ch.unicode() == 92) - goto state_34; + goto state_35; if (ch.unicode() >= 93 && ch.unicode() <= 96) - goto state_32; + goto state_33; if ((ch.unicode() >= 'a' && ch.unicode() <= 'z') || (ch.unicode() >= 'A' && ch.unicode() <= 'Z') || ch.unicode() >= 256) - goto state_32; + goto state_33; if (ch.unicode() >= 123) - goto state_32; + goto state_33; goto out; state_4: ch = next(); if (ch.unicode() == 45) - goto state_35; + goto state_36; if (ch.unicode() >= 48 && ch.unicode() <= 57) - goto state_35; - if (ch.unicode() == 92) goto state_36; + if (ch.unicode() == 92) + goto state_37; if (ch.unicode() == 95) - goto state_35; + goto state_36; if ((ch.unicode() >= 'a' && ch.unicode() <= 'z') || (ch.unicode() >= 'A' && ch.unicode() <= 'Z') || ch.unicode() >= 256) - goto state_35; + goto state_36; goto out; state_5: ch = next(); @@ -226,23 +228,23 @@ int QCssScanner_Generated::lex() token = QCss::INVALID; ch = next(); if (ch.unicode() >= 1 && ch.unicode() <= 9) - goto state_38; + goto state_39; if (ch.unicode() == 11) - goto state_38; + goto state_39; if (ch.unicode() >= 14 && ch.unicode() <= 38) - goto state_38; - if (ch.unicode() == 39) goto state_39; + if (ch.unicode() == 39) + goto state_40; if (ch.unicode() >= 40 && ch.unicode() <= 91) - goto state_38; + goto state_39; if (ch.unicode() == 92) - goto state_40; + goto state_41; if (ch.unicode() >= 93 && ch.unicode() <= 96) - goto state_38; + goto state_39; if ((ch.unicode() >= 'a' && ch.unicode() <= 'z') || (ch.unicode() >= 'A' && ch.unicode() <= 'Z') || ch.unicode() >= 256) - goto state_38; + goto state_39; if (ch.unicode() >= 123) - goto state_38; + goto state_39; goto out; state_9: lastAcceptingPos = pos; @@ -266,7 +268,7 @@ int QCssScanner_Generated::lex() token = QCss::MINUS; ch = next(); if (ch.unicode() == 45) - goto state_42; + goto state_43; if (ch.unicode() == 92) goto state_23; if (ch.unicode() == 95) @@ -279,7 +281,7 @@ int QCssScanner_Generated::lex() token = QCss::DOT; ch = next(); if (ch.unicode() >= 48 && ch.unicode() <= 57) - goto state_43; + goto state_44; goto out; state_14: lastAcceptingPos = pos; @@ -295,24 +297,24 @@ int QCssScanner_Generated::lex() token = QCss::NUMBER; ch = next(); if (ch.unicode() == 37) - goto state_45; - if (ch.unicode() == 45) goto state_46; - if (ch.unicode() == 46) + if (ch.unicode() == 45) goto state_47; - if (ch.unicode() >= 48 && ch.unicode() <= 57) + if (ch.unicode() == 46) goto state_48; - if (ch.unicode() == 92) + if (ch.unicode() >= 48 && ch.unicode() <= 57) goto state_49; - if (ch.unicode() == 95) + if (ch.unicode() == 92) goto state_50; + if (ch.unicode() == 95) + goto state_51; if ((ch.unicode() >= 'a' && ch.unicode() <= 'z') || (ch.unicode() >= 'A' && ch.unicode() <= 'Z') || ch.unicode() >= 256) - goto state_50; + goto state_51; goto out; state_18: ch = next(); if (ch.unicode() == 33) - goto state_51; + goto state_52; goto out; state_20: lastAcceptingPos = pos; @@ -321,26 +323,26 @@ int QCssScanner_Generated::lex() state_21: ch = next(); if (ch.unicode() == 45) - goto state_52; - if (ch.unicode() == 92) goto state_53; - if (ch.unicode() == 95) + if (ch.unicode() == 92) goto state_54; + if (ch.unicode() == 95) + goto state_55; if ((ch.unicode() >= 'a' && ch.unicode() <= 'z') || (ch.unicode() >= 'A' && ch.unicode() <= 'Z') || ch.unicode() >= 256) - goto state_54; + goto state_55; goto out; state_23: ch = next(); if (ch.unicode() >= 1 && ch.unicode() <= 9) - goto state_55; + goto state_56; if (ch.unicode() == 11) - goto state_55; + goto state_56; if (ch.unicode() >= 14 && ch.unicode() <= 47) - goto state_55; + goto state_56; if (ch.unicode() >= 58 && ch.unicode() <= 96) - goto state_55; + goto state_56; if (ch.unicode() >= 103) - goto state_55; + goto state_56; goto out; state_25: ch = next(); @@ -354,17 +356,17 @@ int QCssScanner_Generated::lex() token = QCss::IDENT; ch = next(); if (ch.unicode() == 40) - goto state_57; - if (ch.unicode() == 45) goto state_58; + if (ch.unicode() == 45) + goto state_59; if (ch.unicode() >= 48 && ch.unicode() <= 57) - goto state_58; - if (ch.unicode() == 92) goto state_59; + if (ch.unicode() == 92) + goto state_60; if (ch.unicode() == 95) - goto state_58; + goto state_59; if ((ch.unicode() >= 'a' && ch.unicode() <= 'z') || (ch.unicode() >= 'A' && ch.unicode() <= 'Z') || ch.unicode() >= 256) - goto state_58; + goto state_59; goto out; state_27: lastAcceptingPos = pos; @@ -380,6 +382,8 @@ int QCssScanner_Generated::lex() } goto out; state_30: + lastAcceptingPos = pos; + token = QCss::TILDE; ch = next(); if (ch.unicode() == 61) { token = QCss::INCLUDES; @@ -404,757 +408,763 @@ int QCssScanner_Generated::lex() goto state_20; if (ch.unicode() == 123) goto state_27; + if (ch.unicode() == 126) + goto state_32; goto out; state_32: lastAcceptingPos = pos; + token = QCss::TILDE; + goto out; + state_33: + lastAcceptingPos = pos; token = QCss::INVALID; ch = next(); if (ch.unicode() >= 1 && ch.unicode() <= 9) - goto state_32; + goto state_33; if (ch.unicode() == 11) - goto state_32; + goto state_33; if (ch.unicode() >= 14 && ch.unicode() <= 33) - goto state_32; - if (ch.unicode() == 34) goto state_33; + if (ch.unicode() == 34) + goto state_34; if (ch.unicode() >= 35 && ch.unicode() <= 91) - goto state_32; + goto state_33; if (ch.unicode() == 92) - goto state_34; + goto state_35; if (ch.unicode() >= 93 && ch.unicode() <= 96) - goto state_32; + goto state_33; if ((ch.unicode() >= 'a' && ch.unicode() <= 'z') || (ch.unicode() >= 'A' && ch.unicode() <= 'Z') || ch.unicode() >= 256) - goto state_32; + goto state_33; if (ch.unicode() >= 123) - goto state_32; + goto state_33; goto out; - state_33: + state_34: lastAcceptingPos = pos; token = QCss::STRING; goto out; - state_34: + state_35: ch = next(); if (ch.unicode() >= 1 && ch.unicode() <= 9) - goto state_62; - if (ch.unicode() == 10) goto state_63; + if (ch.unicode() == 10) + goto state_64; if (ch.unicode() == 11) - goto state_62; + goto state_63; if (ch.unicode() == 12) - goto state_64; - if (ch.unicode() == 13) goto state_65; + if (ch.unicode() == 13) + goto state_66; if (ch.unicode() >= 14 && ch.unicode() <= 47) - goto state_62; + goto state_63; if (ch.unicode() >= 58 && ch.unicode() <= 96) - goto state_62; + goto state_63; if (ch.unicode() >= 103) - goto state_62; + goto state_63; goto out; - state_35: + state_36: lastAcceptingPos = pos; token = QCss::HASH; ch = next(); if (ch.unicode() == 45) - goto state_66; + goto state_67; if (ch.unicode() >= 48 && ch.unicode() <= 57) - goto state_66; - if (ch.unicode() == 92) goto state_67; + if (ch.unicode() == 92) + goto state_68; if (ch.unicode() == 95) - goto state_66; + goto state_67; if ((ch.unicode() >= 'a' && ch.unicode() <= 'z') || (ch.unicode() >= 'A' && ch.unicode() <= 'Z') || ch.unicode() >= 256) - goto state_66; + goto state_67; goto out; - state_36: + state_37: ch = next(); if (ch.unicode() >= 1 && ch.unicode() <= 9) - goto state_68; + goto state_69; if (ch.unicode() == 11) - goto state_68; + goto state_69; if (ch.unicode() >= 14 && ch.unicode() <= 47) - goto state_68; + goto state_69; if (ch.unicode() >= 58 && ch.unicode() <= 96) - goto state_68; + goto state_69; if (ch.unicode() >= 103) - goto state_68; + goto state_69; goto out; - state_38: + state_39: lastAcceptingPos = pos; token = QCss::INVALID; ch = next(); if (ch.unicode() >= 1 && ch.unicode() <= 9) - goto state_38; + goto state_39; if (ch.unicode() == 11) - goto state_38; + goto state_39; if (ch.unicode() >= 14 && ch.unicode() <= 38) - goto state_38; - if (ch.unicode() == 39) goto state_39; + if (ch.unicode() == 39) + goto state_40; if (ch.unicode() >= 40 && ch.unicode() <= 91) - goto state_38; + goto state_39; if (ch.unicode() == 92) - goto state_40; + goto state_41; if (ch.unicode() >= 93 && ch.unicode() <= 96) - goto state_38; + goto state_39; if ((ch.unicode() >= 'a' && ch.unicode() <= 'z') || (ch.unicode() >= 'A' && ch.unicode() <= 'Z') || ch.unicode() >= 256) - goto state_38; + goto state_39; if (ch.unicode() >= 123) - goto state_38; + goto state_39; goto out; - state_39: + state_40: lastAcceptingPos = pos; token = QCss::STRING; goto out; - state_40: + state_41: ch = next(); if (ch.unicode() >= 1 && ch.unicode() <= 9) - goto state_69; - if (ch.unicode() == 10) goto state_70; + if (ch.unicode() == 10) + goto state_71; if (ch.unicode() == 11) - goto state_69; + goto state_70; if (ch.unicode() == 12) - goto state_71; - if (ch.unicode() == 13) goto state_72; + if (ch.unicode() == 13) + goto state_73; if (ch.unicode() >= 14 && ch.unicode() <= 47) - goto state_69; + goto state_70; if (ch.unicode() >= 58 && ch.unicode() <= 96) - goto state_69; + goto state_70; if (ch.unicode() >= 103) - goto state_69; + goto state_70; goto out; - state_42: + state_43: ch = next(); if (ch.unicode() == 62) { token = QCss::CDC; goto found; } goto out; - state_43: + state_44: lastAcceptingPos = pos; token = QCss::NUMBER; ch = next(); if (ch.unicode() == 37) - goto state_45; - if (ch.unicode() == 45) goto state_46; + if (ch.unicode() == 45) + goto state_47; if (ch.unicode() >= 48 && ch.unicode() <= 57) - goto state_74; + goto state_75; if (ch.unicode() == 92) - goto state_49; - if (ch.unicode() == 95) goto state_50; + if (ch.unicode() == 95) + goto state_51; if ((ch.unicode() >= 'a' && ch.unicode() <= 'z') || (ch.unicode() >= 'A' && ch.unicode() <= 'Z') || ch.unicode() >= 256) - goto state_50; + goto state_51; goto out; - state_45: + state_46: lastAcceptingPos = pos; token = QCss::PERCENTAGE; goto out; - state_46: + state_47: ch = next(); if (ch.unicode() == 92) - goto state_49; - if (ch.unicode() == 95) goto state_50; + if (ch.unicode() == 95) + goto state_51; if ((ch.unicode() >= 'a' && ch.unicode() <= 'z') || (ch.unicode() >= 'A' && ch.unicode() <= 'Z') || ch.unicode() >= 256) - goto state_50; + goto state_51; goto out; - state_47: + state_48: ch = next(); if (ch.unicode() >= 48 && ch.unicode() <= 57) - goto state_43; + goto state_44; goto out; - state_48: + state_49: lastAcceptingPos = pos; token = QCss::NUMBER; ch = next(); if (ch.unicode() == 37) - goto state_45; - if (ch.unicode() == 45) goto state_46; - if (ch.unicode() == 46) + if (ch.unicode() == 45) goto state_47; - if (ch.unicode() >= 48 && ch.unicode() <= 57) + if (ch.unicode() == 46) goto state_48; - if (ch.unicode() == 92) + if (ch.unicode() >= 48 && ch.unicode() <= 57) goto state_49; - if (ch.unicode() == 95) + if (ch.unicode() == 92) goto state_50; + if (ch.unicode() == 95) + goto state_51; if ((ch.unicode() >= 'a' && ch.unicode() <= 'z') || (ch.unicode() >= 'A' && ch.unicode() <= 'Z') || ch.unicode() >= 256) - goto state_50; + goto state_51; goto out; - state_49: + state_50: ch = next(); if (ch.unicode() >= 1 && ch.unicode() <= 9) - goto state_75; + goto state_76; if (ch.unicode() == 11) - goto state_75; + goto state_76; if (ch.unicode() >= 14 && ch.unicode() <= 47) - goto state_75; + goto state_76; if (ch.unicode() >= 58 && ch.unicode() <= 96) - goto state_75; + goto state_76; if (ch.unicode() >= 103) - goto state_75; + goto state_76; goto out; - state_50: + state_51: lastAcceptingPos = pos; token = QCss::LENGTH; ch = next(); if (ch.unicode() == 45) - goto state_76; + goto state_77; if (ch.unicode() >= 48 && ch.unicode() <= 57) - goto state_76; - if (ch.unicode() == 92) goto state_77; + if (ch.unicode() == 92) + goto state_78; if (ch.unicode() == 95) - goto state_76; + goto state_77; if ((ch.unicode() >= 'a' && ch.unicode() <= 'z') || (ch.unicode() >= 'A' && ch.unicode() <= 'Z') || ch.unicode() >= 256) - goto state_76; + goto state_77; goto out; - state_51: + state_52: ch = next(); if (ch.unicode() == 45) - goto state_78; + goto state_79; goto out; - state_52: + state_53: ch = next(); if (ch.unicode() == 92) - goto state_53; - if (ch.unicode() == 95) goto state_54; + if (ch.unicode() == 95) + goto state_55; if ((ch.unicode() >= 'a' && ch.unicode() <= 'z') || (ch.unicode() >= 'A' && ch.unicode() <= 'Z') || ch.unicode() >= 256) - goto state_54; + goto state_55; goto out; - state_53: + state_54: ch = next(); if (ch.unicode() >= 1 && ch.unicode() <= 9) - goto state_79; + goto state_80; if (ch.unicode() == 11) - goto state_79; + goto state_80; if (ch.unicode() >= 14 && ch.unicode() <= 47) - goto state_79; + goto state_80; if (ch.unicode() >= 58 && ch.unicode() <= 96) - goto state_79; + goto state_80; if (ch.unicode() >= 103) - goto state_79; + goto state_80; goto out; - state_54: + state_55: lastAcceptingPos = pos; token = QCss::ATKEYWORD_SYM; ch = next(); if (ch.unicode() == 45) - goto state_80; + goto state_81; if (ch.unicode() >= 48 && ch.unicode() <= 57) - goto state_80; - if (ch.unicode() == 92) goto state_81; + if (ch.unicode() == 92) + goto state_82; if (ch.unicode() == 95) - goto state_80; + goto state_81; if ((ch.unicode() >= 'a' && ch.unicode() <= 'z') || (ch.unicode() >= 'A' && ch.unicode() <= 'Z') || ch.unicode() >= 256) - goto state_80; + goto state_81; goto out; - state_55: + state_56: lastAcceptingPos = pos; token = QCss::IDENT; ch = next(); if (ch.unicode() == 40) - goto state_57; - if (ch.unicode() == 45) goto state_58; + if (ch.unicode() == 45) + goto state_59; if (ch.unicode() >= 48 && ch.unicode() <= 57) - goto state_58; - if (ch.unicode() == 92) goto state_59; + if (ch.unicode() == 92) + goto state_60; if (ch.unicode() == 95) - goto state_58; + goto state_59; if ((ch.unicode() >= 'a' && ch.unicode() <= 'z') || (ch.unicode() >= 'A' && ch.unicode() <= 'Z') || ch.unicode() >= 256) - goto state_58; + goto state_59; goto out; - state_57: + state_58: lastAcceptingPos = pos; token = QCss::FUNCTION; goto out; - state_58: + state_59: lastAcceptingPos = pos; token = QCss::IDENT; ch = next(); if (ch.unicode() == 40) - goto state_57; - if (ch.unicode() == 45) goto state_58; + if (ch.unicode() == 45) + goto state_59; if (ch.unicode() >= 48 && ch.unicode() <= 57) - goto state_58; - if (ch.unicode() == 92) goto state_59; + if (ch.unicode() == 92) + goto state_60; if (ch.unicode() == 95) - goto state_58; + goto state_59; if ((ch.unicode() >= 'a' && ch.unicode() <= 'z') || (ch.unicode() >= 'A' && ch.unicode() <= 'Z') || ch.unicode() >= 256) - goto state_58; + goto state_59; goto out; - state_59: + state_60: ch = next(); if (ch.unicode() >= 1 && ch.unicode() <= 9) - goto state_82; + goto state_83; if (ch.unicode() == 11) - goto state_82; + goto state_83; if (ch.unicode() >= 14 && ch.unicode() <= 47) - goto state_82; + goto state_83; if (ch.unicode() >= 58 && ch.unicode() <= 96) - goto state_82; + goto state_83; if (ch.unicode() >= 103) - goto state_82; + goto state_83; goto out; - state_62: + state_63: lastAcceptingPos = pos; token = QCss::INVALID; ch = next(); if (ch.unicode() >= 1 && ch.unicode() <= 9) - goto state_32; + goto state_33; if (ch.unicode() == 11) - goto state_32; + goto state_33; if (ch.unicode() >= 14 && ch.unicode() <= 33) - goto state_32; - if (ch.unicode() == 34) goto state_33; + if (ch.unicode() == 34) + goto state_34; if (ch.unicode() >= 35 && ch.unicode() <= 91) - goto state_32; + goto state_33; if (ch.unicode() == 92) - goto state_34; + goto state_35; if (ch.unicode() >= 93 && ch.unicode() <= 96) - goto state_32; + goto state_33; if ((ch.unicode() >= 'a' && ch.unicode() <= 'z') || (ch.unicode() >= 'A' && ch.unicode() <= 'Z') || ch.unicode() >= 256) - goto state_32; + goto state_33; if (ch.unicode() >= 123) - goto state_32; + goto state_33; goto out; - state_63: + state_64: lastAcceptingPos = pos; token = QCss::INVALID; ch = next(); if (ch.unicode() >= 1 && ch.unicode() <= 9) - goto state_32; + goto state_33; if (ch.unicode() == 11) - goto state_32; + goto state_33; if (ch.unicode() >= 14 && ch.unicode() <= 33) - goto state_32; - if (ch.unicode() == 34) goto state_33; + if (ch.unicode() == 34) + goto state_34; if (ch.unicode() >= 35 && ch.unicode() <= 91) - goto state_32; + goto state_33; if (ch.unicode() == 92) - goto state_34; + goto state_35; if (ch.unicode() >= 93 && ch.unicode() <= 96) - goto state_32; + goto state_33; if ((ch.unicode() >= 'a' && ch.unicode() <= 'z') || (ch.unicode() >= 'A' && ch.unicode() <= 'Z') || ch.unicode() >= 256) - goto state_32; + goto state_33; if (ch.unicode() >= 123) - goto state_32; + goto state_33; goto out; - state_64: + state_65: lastAcceptingPos = pos; token = QCss::INVALID; ch = next(); if (ch.unicode() >= 1 && ch.unicode() <= 9) - goto state_32; + goto state_33; if (ch.unicode() == 11) - goto state_32; + goto state_33; if (ch.unicode() >= 14 && ch.unicode() <= 33) - goto state_32; - if (ch.unicode() == 34) goto state_33; + if (ch.unicode() == 34) + goto state_34; if (ch.unicode() >= 35 && ch.unicode() <= 91) - goto state_32; + goto state_33; if (ch.unicode() == 92) - goto state_34; + goto state_35; if (ch.unicode() >= 93 && ch.unicode() <= 96) - goto state_32; + goto state_33; if ((ch.unicode() >= 'a' && ch.unicode() <= 'z') || (ch.unicode() >= 'A' && ch.unicode() <= 'Z') || ch.unicode() >= 256) - goto state_32; + goto state_33; if (ch.unicode() >= 123) - goto state_32; + goto state_33; goto out; - state_65: + state_66: lastAcceptingPos = pos; token = QCss::INVALID; ch = next(); if (ch.unicode() >= 1 && ch.unicode() <= 9) - goto state_32; + goto state_33; if (ch.unicode() == 10) - goto state_83; + goto state_84; if (ch.unicode() == 11) - goto state_32; + goto state_33; if (ch.unicode() >= 14 && ch.unicode() <= 33) - goto state_32; - if (ch.unicode() == 34) goto state_33; + if (ch.unicode() == 34) + goto state_34; if (ch.unicode() >= 35 && ch.unicode() <= 91) - goto state_32; + goto state_33; if (ch.unicode() == 92) - goto state_34; + goto state_35; if (ch.unicode() >= 93 && ch.unicode() <= 96) - goto state_32; + goto state_33; if ((ch.unicode() >= 'a' && ch.unicode() <= 'z') || (ch.unicode() >= 'A' && ch.unicode() <= 'Z') || ch.unicode() >= 256) - goto state_32; + goto state_33; if (ch.unicode() >= 123) - goto state_32; + goto state_33; goto out; - state_66: + state_67: lastAcceptingPos = pos; token = QCss::HASH; ch = next(); if (ch.unicode() == 45) - goto state_66; + goto state_67; if (ch.unicode() >= 48 && ch.unicode() <= 57) - goto state_66; - if (ch.unicode() == 92) goto state_67; + if (ch.unicode() == 92) + goto state_68; if (ch.unicode() == 95) - goto state_66; + goto state_67; if ((ch.unicode() >= 'a' && ch.unicode() <= 'z') || (ch.unicode() >= 'A' && ch.unicode() <= 'Z') || ch.unicode() >= 256) - goto state_66; + goto state_67; goto out; - state_67: + state_68: ch = next(); if (ch.unicode() >= 1 && ch.unicode() <= 9) - goto state_84; + goto state_85; if (ch.unicode() == 11) - goto state_84; + goto state_85; if (ch.unicode() >= 14 && ch.unicode() <= 47) - goto state_84; + goto state_85; if (ch.unicode() >= 58 && ch.unicode() <= 96) - goto state_84; + goto state_85; if (ch.unicode() >= 103) - goto state_84; + goto state_85; goto out; - state_68: + state_69: lastAcceptingPos = pos; token = QCss::HASH; ch = next(); if (ch.unicode() == 45) - goto state_66; + goto state_67; if (ch.unicode() >= 48 && ch.unicode() <= 57) - goto state_66; - if (ch.unicode() == 92) goto state_67; + if (ch.unicode() == 92) + goto state_68; if (ch.unicode() == 95) - goto state_66; + goto state_67; if ((ch.unicode() >= 'a' && ch.unicode() <= 'z') || (ch.unicode() >= 'A' && ch.unicode() <= 'Z') || ch.unicode() >= 256) - goto state_66; + goto state_67; goto out; - state_69: + state_70: lastAcceptingPos = pos; token = QCss::INVALID; ch = next(); if (ch.unicode() >= 1 && ch.unicode() <= 9) - goto state_38; + goto state_39; if (ch.unicode() == 11) - goto state_38; + goto state_39; if (ch.unicode() >= 14 && ch.unicode() <= 38) - goto state_38; - if (ch.unicode() == 39) goto state_39; + if (ch.unicode() == 39) + goto state_40; if (ch.unicode() >= 40 && ch.unicode() <= 91) - goto state_38; + goto state_39; if (ch.unicode() == 92) - goto state_40; + goto state_41; if (ch.unicode() >= 93 && ch.unicode() <= 96) - goto state_38; + goto state_39; if ((ch.unicode() >= 'a' && ch.unicode() <= 'z') || (ch.unicode() >= 'A' && ch.unicode() <= 'Z') || ch.unicode() >= 256) - goto state_38; + goto state_39; if (ch.unicode() >= 123) - goto state_38; + goto state_39; goto out; - state_70: + state_71: lastAcceptingPos = pos; token = QCss::INVALID; ch = next(); if (ch.unicode() >= 1 && ch.unicode() <= 9) - goto state_38; + goto state_39; if (ch.unicode() == 11) - goto state_38; + goto state_39; if (ch.unicode() >= 14 && ch.unicode() <= 38) - goto state_38; - if (ch.unicode() == 39) goto state_39; + if (ch.unicode() == 39) + goto state_40; if (ch.unicode() >= 40 && ch.unicode() <= 91) - goto state_38; + goto state_39; if (ch.unicode() == 92) - goto state_40; + goto state_41; if (ch.unicode() >= 93 && ch.unicode() <= 96) - goto state_38; + goto state_39; if ((ch.unicode() >= 'a' && ch.unicode() <= 'z') || (ch.unicode() >= 'A' && ch.unicode() <= 'Z') || ch.unicode() >= 256) - goto state_38; + goto state_39; if (ch.unicode() >= 123) - goto state_38; + goto state_39; goto out; - state_71: + state_72: lastAcceptingPos = pos; token = QCss::INVALID; ch = next(); if (ch.unicode() >= 1 && ch.unicode() <= 9) - goto state_38; + goto state_39; if (ch.unicode() == 11) - goto state_38; + goto state_39; if (ch.unicode() >= 14 && ch.unicode() <= 38) - goto state_38; - if (ch.unicode() == 39) goto state_39; + if (ch.unicode() == 39) + goto state_40; if (ch.unicode() >= 40 && ch.unicode() <= 91) - goto state_38; + goto state_39; if (ch.unicode() == 92) - goto state_40; + goto state_41; if (ch.unicode() >= 93 && ch.unicode() <= 96) - goto state_38; + goto state_39; if ((ch.unicode() >= 'a' && ch.unicode() <= 'z') || (ch.unicode() >= 'A' && ch.unicode() <= 'Z') || ch.unicode() >= 256) - goto state_38; + goto state_39; if (ch.unicode() >= 123) - goto state_38; + goto state_39; goto out; - state_72: + state_73: lastAcceptingPos = pos; token = QCss::INVALID; ch = next(); if (ch.unicode() >= 1 && ch.unicode() <= 9) - goto state_38; + goto state_39; if (ch.unicode() == 10) - goto state_85; + goto state_86; if (ch.unicode() == 11) - goto state_38; + goto state_39; if (ch.unicode() >= 14 && ch.unicode() <= 38) - goto state_38; - if (ch.unicode() == 39) goto state_39; + if (ch.unicode() == 39) + goto state_40; if (ch.unicode() >= 40 && ch.unicode() <= 91) - goto state_38; + goto state_39; if (ch.unicode() == 92) - goto state_40; + goto state_41; if (ch.unicode() >= 93 && ch.unicode() <= 96) - goto state_38; + goto state_39; if ((ch.unicode() >= 'a' && ch.unicode() <= 'z') || (ch.unicode() >= 'A' && ch.unicode() <= 'Z') || ch.unicode() >= 256) - goto state_38; + goto state_39; if (ch.unicode() >= 123) - goto state_38; + goto state_39; goto out; - state_74: + state_75: lastAcceptingPos = pos; token = QCss::NUMBER; ch = next(); if (ch.unicode() == 37) - goto state_45; - if (ch.unicode() == 45) goto state_46; + if (ch.unicode() == 45) + goto state_47; if (ch.unicode() >= 48 && ch.unicode() <= 57) - goto state_74; + goto state_75; if (ch.unicode() == 92) - goto state_49; - if (ch.unicode() == 95) goto state_50; + if (ch.unicode() == 95) + goto state_51; if ((ch.unicode() >= 'a' && ch.unicode() <= 'z') || (ch.unicode() >= 'A' && ch.unicode() <= 'Z') || ch.unicode() >= 256) - goto state_50; + goto state_51; goto out; - state_75: + state_76: lastAcceptingPos = pos; token = QCss::LENGTH; ch = next(); if (ch.unicode() == 45) - goto state_76; + goto state_77; if (ch.unicode() >= 48 && ch.unicode() <= 57) - goto state_76; - if (ch.unicode() == 92) goto state_77; + if (ch.unicode() == 92) + goto state_78; if (ch.unicode() == 95) - goto state_76; + goto state_77; if ((ch.unicode() >= 'a' && ch.unicode() <= 'z') || (ch.unicode() >= 'A' && ch.unicode() <= 'Z') || ch.unicode() >= 256) - goto state_76; + goto state_77; goto out; - state_76: + state_77: lastAcceptingPos = pos; token = QCss::LENGTH; ch = next(); if (ch.unicode() == 45) - goto state_76; + goto state_77; if (ch.unicode() >= 48 && ch.unicode() <= 57) - goto state_76; - if (ch.unicode() == 92) goto state_77; + if (ch.unicode() == 92) + goto state_78; if (ch.unicode() == 95) - goto state_76; + goto state_77; if ((ch.unicode() >= 'a' && ch.unicode() <= 'z') || (ch.unicode() >= 'A' && ch.unicode() <= 'Z') || ch.unicode() >= 256) - goto state_76; + goto state_77; goto out; - state_77: + state_78: ch = next(); if (ch.unicode() >= 1 && ch.unicode() <= 9) - goto state_86; + goto state_87; if (ch.unicode() == 11) - goto state_86; + goto state_87; if (ch.unicode() >= 14 && ch.unicode() <= 47) - goto state_86; + goto state_87; if (ch.unicode() >= 58 && ch.unicode() <= 96) - goto state_86; + goto state_87; if (ch.unicode() >= 103) - goto state_86; + goto state_87; goto out; - state_78: + state_79: ch = next(); if (ch.unicode() == 45) { token = QCss::CDO; goto found; } goto out; - state_79: + state_80: lastAcceptingPos = pos; token = QCss::ATKEYWORD_SYM; ch = next(); if (ch.unicode() == 45) - goto state_80; + goto state_81; if (ch.unicode() >= 48 && ch.unicode() <= 57) - goto state_80; - if (ch.unicode() == 92) goto state_81; + if (ch.unicode() == 92) + goto state_82; if (ch.unicode() == 95) - goto state_80; + goto state_81; if ((ch.unicode() >= 'a' && ch.unicode() <= 'z') || (ch.unicode() >= 'A' && ch.unicode() <= 'Z') || ch.unicode() >= 256) - goto state_80; + goto state_81; goto out; - state_80: + state_81: lastAcceptingPos = pos; token = QCss::ATKEYWORD_SYM; ch = next(); if (ch.unicode() == 45) - goto state_80; + goto state_81; if (ch.unicode() >= 48 && ch.unicode() <= 57) - goto state_80; - if (ch.unicode() == 92) goto state_81; + if (ch.unicode() == 92) + goto state_82; if (ch.unicode() == 95) - goto state_80; + goto state_81; if ((ch.unicode() >= 'a' && ch.unicode() <= 'z') || (ch.unicode() >= 'A' && ch.unicode() <= 'Z') || ch.unicode() >= 256) - goto state_80; + goto state_81; goto out; - state_81: + state_82: ch = next(); if (ch.unicode() >= 1 && ch.unicode() <= 9) - goto state_88; + goto state_89; if (ch.unicode() == 11) - goto state_88; + goto state_89; if (ch.unicode() >= 14 && ch.unicode() <= 47) - goto state_88; + goto state_89; if (ch.unicode() >= 58 && ch.unicode() <= 96) - goto state_88; + goto state_89; if (ch.unicode() >= 103) - goto state_88; + goto state_89; goto out; - state_82: + state_83: lastAcceptingPos = pos; token = QCss::IDENT; ch = next(); if (ch.unicode() == 40) - goto state_57; - if (ch.unicode() == 45) goto state_58; + if (ch.unicode() == 45) + goto state_59; if (ch.unicode() >= 48 && ch.unicode() <= 57) - goto state_58; - if (ch.unicode() == 92) goto state_59; + if (ch.unicode() == 92) + goto state_60; if (ch.unicode() == 95) - goto state_58; + goto state_59; if ((ch.unicode() >= 'a' && ch.unicode() <= 'z') || (ch.unicode() >= 'A' && ch.unicode() <= 'Z') || ch.unicode() >= 256) - goto state_58; + goto state_59; goto out; - state_83: + state_84: lastAcceptingPos = pos; token = QCss::INVALID; ch = next(); if (ch.unicode() >= 1 && ch.unicode() <= 9) - goto state_32; + goto state_33; if (ch.unicode() == 11) - goto state_32; + goto state_33; if (ch.unicode() >= 14 && ch.unicode() <= 33) - goto state_32; - if (ch.unicode() == 34) goto state_33; + if (ch.unicode() == 34) + goto state_34; if (ch.unicode() >= 35 && ch.unicode() <= 91) - goto state_32; + goto state_33; if (ch.unicode() == 92) - goto state_34; + goto state_35; if (ch.unicode() >= 93 && ch.unicode() <= 96) - goto state_32; + goto state_33; if ((ch.unicode() >= 'a' && ch.unicode() <= 'z') || (ch.unicode() >= 'A' && ch.unicode() <= 'Z') || ch.unicode() >= 256) - goto state_32; + goto state_33; if (ch.unicode() >= 123) - goto state_32; + goto state_33; goto out; - state_84: + state_85: lastAcceptingPos = pos; token = QCss::HASH; ch = next(); if (ch.unicode() == 45) - goto state_66; + goto state_67; if (ch.unicode() >= 48 && ch.unicode() <= 57) - goto state_66; - if (ch.unicode() == 92) goto state_67; + if (ch.unicode() == 92) + goto state_68; if (ch.unicode() == 95) - goto state_66; + goto state_67; if ((ch.unicode() >= 'a' && ch.unicode() <= 'z') || (ch.unicode() >= 'A' && ch.unicode() <= 'Z') || ch.unicode() >= 256) - goto state_66; + goto state_67; goto out; - state_85: + state_86: lastAcceptingPos = pos; token = QCss::INVALID; ch = next(); if (ch.unicode() >= 1 && ch.unicode() <= 9) - goto state_38; + goto state_39; if (ch.unicode() == 11) - goto state_38; + goto state_39; if (ch.unicode() >= 14 && ch.unicode() <= 38) - goto state_38; - if (ch.unicode() == 39) goto state_39; + if (ch.unicode() == 39) + goto state_40; if (ch.unicode() >= 40 && ch.unicode() <= 91) - goto state_38; + goto state_39; if (ch.unicode() == 92) - goto state_40; + goto state_41; if (ch.unicode() >= 93 && ch.unicode() <= 96) - goto state_38; + goto state_39; if ((ch.unicode() >= 'a' && ch.unicode() <= 'z') || (ch.unicode() >= 'A' && ch.unicode() <= 'Z') || ch.unicode() >= 256) - goto state_38; + goto state_39; if (ch.unicode() >= 123) - goto state_38; + goto state_39; goto out; - state_86: + state_87: lastAcceptingPos = pos; token = QCss::LENGTH; ch = next(); if (ch.unicode() == 45) - goto state_76; + goto state_77; if (ch.unicode() >= 48 && ch.unicode() <= 57) - goto state_76; - if (ch.unicode() == 92) goto state_77; + if (ch.unicode() == 92) + goto state_78; if (ch.unicode() == 95) - goto state_76; + goto state_77; if ((ch.unicode() >= 'a' && ch.unicode() <= 'z') || (ch.unicode() >= 'A' && ch.unicode() <= 'Z') || ch.unicode() >= 256) - goto state_76; + goto state_77; goto out; - state_88: + state_89: lastAcceptingPos = pos; token = QCss::ATKEYWORD_SYM; ch = next(); if (ch.unicode() == 45) - goto state_80; + goto state_81; if (ch.unicode() >= 48 && ch.unicode() <= 57) - goto state_80; - if (ch.unicode() == 92) goto state_81; + if (ch.unicode() == 92) + goto state_82; if (ch.unicode() == 95) - goto state_80; + goto state_81; if ((ch.unicode() >= 'a' && ch.unicode() <= 'z') || (ch.unicode() >= 'A' && ch.unicode() <= 'Z') || ch.unicode() >= 256) - goto state_80; + goto state_81; goto out; found: lastAcceptingPos = pos; diff --git a/tests/auto/gui/text/qcssparser/tst_qcssparser.cpp b/tests/auto/gui/text/qcssparser/tst_qcssparser.cpp index 95d1557300..2301655909 100644 --- a/tests/auto/gui/text/qcssparser/tst_qcssparser.cpp +++ b/tests/auto/gui/text/qcssparser/tst_qcssparser.cpp @@ -120,6 +120,7 @@ static const char *tokenName(QCss::TokenType t) case QCss::PLUS: return "PLUS"; case QCss::GREATER: return "GREATER"; case QCss::COMMA: return "COMMA"; + case QCss::TILDE: return "TILDE"; case QCss::STRING: return "STRING"; case QCss::INVALID: return "INVALID"; case QCss::IDENT: return "IDENT"; @@ -480,7 +481,7 @@ void tst_QCssParser::selector_data() QCss::BasicSelector basic; basic.elementName = "p"; - basic.relationToNext = QCss::BasicSelector::MatchNextSelectorIfPreceeds; + basic.relationToNext = QCss::BasicSelector::MatchNextSelectorIfDirectAdjecent; sel.basicSelectors << basic; basic = QCss::BasicSelector(); @@ -572,14 +573,29 @@ void tst_QCssParser::selector_data() QCss::BasicSelector basic; basic.elementName = "e"; - basic.relationToNext = QCss::BasicSelector::MatchNextSelectorIfPreceeds; + basic.relationToNext = QCss::BasicSelector::MatchNextSelectorIfDirectAdjecent; sel.basicSelectors << basic; basic.elementName = "f"; basic.relationToNext = QCss::BasicSelector::NoRelation; sel.basicSelectors << basic; - QTest::newRow("precede") << QString("e + f") << sel; + QTest::newRow("lastsibling") << QString("e + f") << sel; + } + + { + QCss::Selector sel; + QCss::BasicSelector basic; + + basic.elementName = "e"; + basic.relationToNext = QCss::BasicSelector::MatchNextSelectorIfIndirectAdjecent; + sel.basicSelectors << basic; + + basic.elementName = "f"; + basic.relationToNext = QCss::BasicSelector::NoRelation; + sel.basicSelectors << basic; + + QTest::newRow("previoussibling") << QString("e ~ f") << sel; } { @@ -985,11 +1001,20 @@ void tst_QCssParser::styleSelector_data() QTest::newRow("attrmatch") << true << QString("[foo=bar]") << QString("<p foo=\"bar\" />") << QString(); QTest::newRow("noattrmatch") << false << QString("[foo=bar]") << QString("<p foo=\"xyz\" />") << QString(); - QTest::newRow("contains") << true << QString("[foo~=bar]") << QString("<p foo=\"baz bleh bar\" />") << QString(); - QTest::newRow("notcontains") << false << QString("[foo~=bar]") << QString("<p foo=\"test\" />") << QString(); + QTest::newRow("includes") << true << QString("[foo~=bar]") << QString("<p foo=\"baz bleh bar\" />") << QString(); + QTest::newRow("notincludes") << false << QString("[foo~=bar]") << QString("<p foo=\"bazblehbar\" />") << QString(); + + QTest::newRow("dashmatch") << true << QString("[foo|=bar]") << QString("<p foo=\"bar-bleh\" />") << QString(); + QTest::newRow("nodashmatch") << false << QString("[foo|=bar]") << QString("<p foo=\"barbleh\" />") << QString(); + + QTest::newRow("beginswith") << true << QString("[foo^=bar]") << QString("<p foo=\"barbleh\" />") << QString(); + QTest::newRow("nobeginswith") << false << QString("[foo^=bar]") << QString("<p foo=\"blehbleh\" />") << QString(); - QTest::newRow("beingswith") << true << QString("[foo|=bar]") << QString("<p foo=\"bar-bleh\" />") << QString(); - QTest::newRow("notbeingswith") << false << QString("[foo|=bar]") << QString("<p foo=\"bleh-bar\" />") << QString(); + QTest::newRow("endswith") << true << QString("[foo$=bar]") << QString("<p foo=\"barbar\" />") << QString(); + QTest::newRow("noendswith") << false << QString("[foo$=bar]") << QString("<p foo=\"blehbleh\" />") << QString(); + + QTest::newRow("contains") << true << QString("[foo*=bar]") << QString("<p foo=\"blehbarbleh\" />") << QString(); + QTest::newRow("nocontains") << false << QString("[foo*=bar]") << QString("<p foo=\"blehbleh\" />") << QString(); QTest::newRow("attr2") << true << QString("[bar=foo]") << QString("<p bleh=\"bar\" bar=\"foo\" />") << QString(); @@ -1070,10 +1095,19 @@ void tst_QCssParser::styleSelector_data() << QString("<p1 /><p2 />") << QString("p2"); - QTest::newRow("noprevioussibling") << false << QString("p2 + p1") + QTest::newRow("notprevioussibling") << false << QString("p2 + p1") << QString("<p1 /><p2 />") << QString("p2"); + QTest::newRow("anyprevioussibling") << true << QString("p1 ~ p3") + << QString("<p1 /><p2 /><p3 />") + << QString("p3"); + + QTest::newRow("noprevioussibling") << false << QString("p3 ~ p2") + << QString("<p1 /><p2 /><p3 />") + << QString("p3"); + + QTest::newRow("ancestry_firstmismatch") << false << QString("parent child[foo=bar]") << QString("<parent><child /></parent>") << QString("parent/child"); diff --git a/util/lexgen/css2-simplified.lexgen b/util/lexgen/css3-simplified.lexgen index 01052a1615..99463d524e 100644 --- a/util/lexgen/css2-simplified.lexgen +++ b/util/lexgen/css3-simplified.lexgen @@ -44,6 +44,7 @@ LBRACE = {w}"{" PLUS = {w}"+" GREATER = {w}">" COMMA = {w}"," +TILDE= {w}"~" STRING = {string} INVALID = {invalid} |