public static bool HasNthPairArg(CssPseudoClass aType) { return(aType == CssPseudoClass.NthChild || aType == CssPseudoClass.NthLastChild || aType == CssPseudoClass.NthOfType || aType == CssPseudoClass.NthLastOfType); }
public static bool HasNthPairArg(CssPseudoClass aType) { return aType == CssPseudoClass.NthChild || aType == CssPseudoClass.NthLastChild || aType == CssPseudoClass.NthOfType || aType == CssPseudoClass.NthLastOfType; }
public static bool HasStringArg(CssPseudoClass aType) { return aType == CssPseudoClass.Lang || aType == CssPseudoClass.MozEmptyExceptChildrenWithLocalname || aType == CssPseudoClass.MozSystemMetric || aType == CssPseudoClass.MozLocaleDir || aType == CssPseudoClass.Dir; }
public static bool HasStringArg(CssPseudoClass aType) { return(aType == CssPseudoClass.Lang || aType == CssPseudoClass.MozEmptyExceptChildrenWithLocalname || aType == CssPseudoClass.MozSystemMetric || aType == CssPseudoClass.MozLocaleDir || aType == CssPseudoClass.Dir); }
// // Parse the argument of a pseudo-class that has a selector list argument. // Such selector lists cannot contain combinators, but can contain // anything that goes between a pair of combinators. // internal nsSelectorParsingStatus ParsePseudoClassWithSelectorListArg(nsCSSSelector aSelector, nsCSSPseudoClass aType) { var slist = new nsCSSSelectorList(); if (! ParseSelectorList(ref slist, ')')) { return nsSelectorParsingStatus.Error; // our caller calls SkipUntil(')') } // Check that none of the selectors in the list have combinators or // pseudo-elements. for (nsCSSSelectorList l = slist; l != null; l = l.mNext) { nsCSSSelector s = l.mSelectors; if (s.mNext != null || s.IsPseudoElement()) { return nsSelectorParsingStatus.Error; // our caller calls SkipUntil(')') } } // Add the pseudo with the selector list parameter aSelector.AddPseudoClass(aType, slist); // close the parenthesis if (!ExpectSymbol(')', true)) { { if (!mSuppressErrors) mReporter.ReportUnexpected("PEPseudoClassNoClose", mToken); }; return nsSelectorParsingStatus.Error; // our caller calls SkipUntil(')') } return nsSelectorParsingStatus.Continue; }
internal nsSelectorParsingStatus ParsePseudoClassWithNthPairArg(nsCSSSelector aSelector, nsCSSPseudoClass aType) { int32_t[] numbers = { 0, 0 }; bool lookForB = true; // Follow the whitespace rules as proposed in // http://lists.w3.org/Archives/Public/www-style/2008Mar/0121.html if (! GetToken(true)) { { if (!mSuppressErrors) mReporter.ReportUnexpected("PEPseudoClassArgEOF"); }; return nsSelectorParsingStatus.Error; } if (nsCSSTokenType.Ident == mToken.mType || nsCSSTokenType.Dimension == mToken.mType) { // The CSS tokenization doesn't handle :nth-child() containing - well: // 2n-1 is a dimension // n-1 is an identifier // The easiest way to deal with that is to push everything from the // minus on back onto the scanner's pushback buffer. uint32_t truncAt = 0; if (StringBeginsWith(mToken.mIdentStr, "n-")) { truncAt = 1; } else if (StringBeginsWith(mToken.mIdentStr, "-n-")) { truncAt = 2; } if (truncAt != 0) { mScanner.Backup(mToken.mIdentStr.Length() - truncAt); mToken.mIdentStr = mToken.mIdentStr.Substring(0, truncAt); } } if (nsCSSTokenType.Ident == mToken.mType) { if (mToken.mIdentStr.LowerCaseEqualsLiteral("odd")) { numbers[0] = 2; numbers[1] = 1; lookForB = false; } else if (mToken.mIdentStr.LowerCaseEqualsLiteral("even")) { numbers[0] = 2; numbers[1] = 0; lookForB = false; } else if (mToken.mIdentStr.LowerCaseEqualsLiteral("n")) { numbers[0] = 1; } else if (mToken.mIdentStr.LowerCaseEqualsLiteral("-n")) { numbers[0] = -1; } else { { if (!mSuppressErrors) mReporter.ReportUnexpected("PEPseudoClassArgNotNth", mToken); }; return nsSelectorParsingStatus.Error; // our caller calls SkipUntil(')') } } else if (nsCSSTokenType.Number == mToken.mType) { if (!mToken.mIntegerValid) { { if (!mSuppressErrors) mReporter.ReportUnexpected("PEPseudoClassArgNotNth", mToken); }; return nsSelectorParsingStatus.Error; // our caller calls SkipUntil(')') } numbers[1] = mToken.mInteger; lookForB = false; } else if (nsCSSTokenType.Dimension == mToken.mType) { if (!mToken.mIntegerValid || !mToken.mIdentStr.LowerCaseEqualsLiteral("n")) { { if (!mSuppressErrors) mReporter.ReportUnexpected("PEPseudoClassArgNotNth", mToken); }; return nsSelectorParsingStatus.Error; // our caller calls SkipUntil(')') } numbers[0] = mToken.mInteger; } // XXX If it's a ')', is that valid? (as 0n+0) else { { if (!mSuppressErrors) mReporter.ReportUnexpected("PEPseudoClassArgNotNth", mToken); }; UngetToken(); return nsSelectorParsingStatus.Error; // our caller calls SkipUntil(')') } if (! GetToken(true)) { { if (!mSuppressErrors) mReporter.ReportUnexpected("PEPseudoClassArgEOF"); }; return nsSelectorParsingStatus.Error; } if (lookForB && !mToken.IsSymbol(')')) { // The '+' or '-' sign can optionally be separated by whitespace. // If it is separated by whitespace from what follows it, it appears // as a separate token rather than part of the number token. bool haveSign = false; int32_t sign = 1; if (mToken.IsSymbol('+') || mToken.IsSymbol('-')) { haveSign = true; if (mToken.IsSymbol('-')) { sign = -1; } if (! GetToken(true)) { { if (!mSuppressErrors) mReporter.ReportUnexpected("PEPseudoClassArgEOF"); }; return nsSelectorParsingStatus.Error; } } if (nsCSSTokenType.Number != mToken.mType || !mToken.mIntegerValid || mToken.mHasSign == haveSign) { { if (!mSuppressErrors) mReporter.ReportUnexpected("PEPseudoClassArgNotNth", mToken); }; return nsSelectorParsingStatus.Error; // our caller calls SkipUntil(')') } numbers[1] = mToken.mInteger * sign; if (! GetToken(true)) { { if (!mSuppressErrors) mReporter.ReportUnexpected("PEPseudoClassArgEOF"); }; return nsSelectorParsingStatus.Error; } } if (!mToken.IsSymbol(')')) { { if (!mSuppressErrors) mReporter.ReportUnexpected("PEPseudoClassNoClose", mToken); }; return nsSelectorParsingStatus.Error; // our caller calls SkipUntil(')') } aSelector.AddPseudoClass(aType, numbers); return nsSelectorParsingStatus.Continue; }
// // Parse the argument of a pseudo-class that has an ident arg // internal nsSelectorParsingStatus ParsePseudoClassWithIdentArg(nsCSSSelector aSelector, nsCSSPseudoClass aType) { if (! GetToken(true)) { // premature eof { if (!mSuppressErrors) mReporter.ReportUnexpected("PEPseudoClassArgEOF"); }; return nsSelectorParsingStatus.Error; } // We expect an identifier with a language abbreviation if (nsCSSTokenType.Ident != mToken.mType) { { if (!mSuppressErrors) mReporter.ReportUnexpected("PEPseudoClassArgNotIdent", mToken); }; UngetToken(); return nsSelectorParsingStatus.Error; // our caller calls SkipUntil(')') } // -moz-locale-dir and -moz-dir can only have values of 'ltr' or 'rtl'. if (aType == nsCSSPseudoClass.MozLocaleDir || aType == nsCSSPseudoClass.Dir) { mToken.mIdentStr = mToken.mIdentStr.ToLower(); // case insensitive if (!mToken.mIdentStr.EqualsLiteral("ltr") && !mToken.mIdentStr.EqualsLiteral("rtl")) { { if (!mSuppressErrors) mReporter.ReportUnexpected("PEBadDirValue", mToken); }; return nsSelectorParsingStatus.Error; // our caller calls SkipUntil(')') } } // Add the pseudo with the language parameter aSelector.AddPseudoClass(aType, mToken.mIdentStr); // close the parenthesis if (!ExpectSymbol(')', true)) { { if (!mSuppressErrors) mReporter.ReportUnexpected("PEPseudoClassNoClose", mToken); }; return nsSelectorParsingStatus.Error; // our caller calls SkipUntil(')') } return nsSelectorParsingStatus.Continue; }
internal CssPseudoClassSelector(CssPseudoClass aType) { mType = aType; mData = null; }
public static bool HasSelectorListArg(CssPseudoClass aType) { return aType == CssPseudoClass.Any; }
internal CssPseudoClassSelector(CssPseudoClass aType, CssSelectorGroup aSelectors) { mType = aType; mSelectors = aSelectors; }
internal void AddPseudoClass(CssPseudoClass aType, string aString) { AddPseudoClassInternal(new CssPseudoClassSelector(aType, aString)); }
internal void AddPseudoClass(CssPseudoClass aType, CssSelectorGroup aSelectorList) { AddPseudoClassInternal(new CssPseudoClassSelector(aType, aSelectorList)); }
public static bool HasSelectorListArg(CssPseudoClass aType) { return(aType == CssPseudoClass.Any); }
internal void AddPseudoClass(CssPseudoClass aType) { AddPseudoClassInternal(new CssPseudoClassSelector(aType)); }
internal void AddPseudoClass(CssPseudoClass aType, int[] aIntPair) { AddPseudoClassInternal(new CssPseudoClassSelector(aType, aIntPair)); }
internal CssPseudoClassSelector(CssPseudoClass aType, string aString) { mType = aType; mString = aString; }
internal CssPseudoClassSelector(CssPseudoClass aType, int[] aNumbers) { mType = aType; mNumbers = aNumbers; }