123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902 | // Copyright (C) 2016 The Qt Company Ltd.// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only#ifndef QCSSPARSER_P_H#define QCSSPARSER_P_H//// W A R N I N G// -------------//// This file is not part of the Qt API. It exists purely as an// implementation detail. This header file may change from version to// version without notice, or even be removed.//// We mean it.//#include <QtGui/private/qtguiglobal_p.h>#include <QtCore/QStringList>#include <QtCore/QList>#include <QtCore/QVariant>#include <QtCore/QSize>#include <QtCore/QMultiHash>#include <QtGui/QFont>#include <QtGui/QPalette>#include <QtCore/QSharedData> QT_BEGIN_NAMESPACE class QIcon; QT_END_NAMESPACE #ifndef QT_NO_CSSPARSER// VxWorks defines NONE as (-1) "for times when NULL won't do"#if defined(Q_OS_VXWORKS) && defined(NONE)# undef NONE#endif#if defined(Q_OS_INTEGRITY)# undef Value#endif// Hurd has #define TILDE 0x00080000 from <sys/ioctl.h>#if defined(TILDE)# undef TILDE#endif#define QT_CSS_DECLARE_TYPEINFO(Class, Type) \ }/* namespace QCss */ \ Q_DECLARE_TYPEINFO(QCss:: Class, Type); \ namespace QCss { QT_BEGIN_NAMESPACE namespace QCss {enum Property { UnknownProperty, BackgroundColor, Color, Float, Font, FontFamily, FontSize, FontStyle, FontWeight, Margin, MarginBottom, MarginLeft, MarginRight, MarginTop, QtBlockIndent, QtListIndent, QtParagraphType, QtTableType, QtUserState, TextDecoration, TextIndent, TextUnderlineStyle, VerticalAlignment, Whitespace, QtSelectionForeground, QtSelectionBackground, Border, BorderLeft, BorderRight, BorderTop, BorderBottom, BorderCollapse, Padding, PaddingLeft, PaddingRight, PaddingTop, PaddingBottom, PageBreakBefore, PageBreakAfter, QtAlternateBackground, BorderLeftStyle, BorderRightStyle, BorderTopStyle, BorderBottomStyle, BorderStyles, BorderLeftColor, BorderRightColor, BorderTopColor, BorderBottomColor, BorderColor, BorderLeftWidth, BorderRightWidth, BorderTopWidth, BorderBottomWidth, BorderWidth, BorderTopLeftRadius, BorderTopRightRadius, BorderBottomLeftRadius, BorderBottomRightRadius, BorderRadius, Background, BackgroundOrigin, BackgroundClip, BackgroundRepeat, BackgroundPosition, BackgroundAttachment, BackgroundImage, BorderImage, QtSpacing, Width, Height, MinimumWidth, MinimumHeight, MaximumWidth, MaximumHeight, QtImage, Left, Right, Top, Bottom, QtOrigin, QtPosition, Position, QtStyleFeatures, QtBackgroundRole, ListStyleType, ListStyle, QtImageAlignment, TextAlignment, Outline, OutlineOffset, OutlineWidth, OutlineColor, OutlineStyle, OutlineRadius, OutlineTopLeftRadius, OutlineTopRightRadius, OutlineBottomLeftRadius, OutlineBottomRightRadius, FontVariant, TextTransform, QtListNumberPrefix, QtListNumberSuffix, LineHeight, QtLineHeightType, FontKerning, QtForegroundTextureCacheKey, QtIcon, LetterSpacing, WordSpacing, TextDecorationColor, QtPlaceHolderTextColor, QtAccent, QtStrokeWidth, QtStrokeColor, QtStrokeLineCap, QtStrokeLineJoin, QtStrokeMiterLimit, QtStrokeDashArray, QtStrokeDashOffset, QtForeground, NumProperties };enum KnownValue { UnknownValue, Value_Normal, Value_Pre, Value_NoWrap, Value_PreLine, Value_PreWrap, Value_Small, Value_Medium, Value_Large, Value_XLarge, Value_XXLarge, Value_Italic, Value_Oblique, Value_Bold, Value_Underline, Value_Overline, Value_LineThrough, Value_Sub, Value_Super, Value_Left, Value_Right, Value_Top, Value_Bottom, Value_Center, Value_Native, Value_Solid, Value_Dotted, Value_Dashed, Value_DotDash, Value_DotDotDash, Value_Double, Value_Groove, Value_Ridge, Value_Inset, Value_Outset, Value_Wave, Value_Middle, Value_Auto, Value_Always, Value_None, Value_Transparent, Value_Disc, Value_Circle, Value_Square, Value_Decimal, Value_LowerAlpha, Value_UpperAlpha, Value_LowerRoman, Value_UpperRoman, Value_SmallCaps, Value_Uppercase, Value_Lowercase, Value_SquareCap, Value_FlatCap, Value_RoundCap, Value_MiterJoin, Value_BevelJoin, Value_RoundJoin, Value_SvgMiterJoin,/* keep these in same order as QPalette::ColorRole */ Value_FirstColorRole, Value_WindowText = Value_FirstColorRole, Value_Button, Value_Light, Value_Midlight, Value_Dark, Value_Mid, Value_Text, Value_BrightText, Value_ButtonText, Value_Base, Value_Window, Value_Shadow, Value_Highlight, Value_HighlightedText, Value_Link, Value_LinkVisited, Value_AlternateBase, Value_NoRole, Value_ToolTipBase, Value_ToolTipText, Value_PlaceholderText, Value_Accent, Value_LastColorRole = Value_Accent, Value_Disabled, Value_Active, Value_Selected, Value_On, Value_Off, NumKnownValues };enum BorderStyle { BorderStyle_Unknown, BorderStyle_None, BorderStyle_Dotted, BorderStyle_Dashed, BorderStyle_Solid, BorderStyle_Double, BorderStyle_DotDash, BorderStyle_DotDotDash, BorderStyle_Groove, BorderStyle_Ridge, BorderStyle_Inset, BorderStyle_Outset, BorderStyle_Native, NumKnownBorderStyles };enum Edge { TopEdge, RightEdge, BottomEdge, LeftEdge, NumEdges };enum Corner { TopLeftCorner, TopRightCorner, BottomLeftCorner, BottomRightCorner };enum TileMode { TileMode_Unknown, TileMode_Round, TileMode_Stretch, TileMode_Repeat, NumKnownTileModes };enum Repeat { Repeat_Unknown, Repeat_None, Repeat_X, Repeat_Y, Repeat_XY, NumKnownRepeats };enum Origin { Origin_Unknown, Origin_Padding, Origin_Border, Origin_Content, Origin_Margin, NumKnownOrigins };enum PositionMode { PositionMode_Unknown, PositionMode_Static, PositionMode_Relative, PositionMode_Absolute, PositionMode_Fixed, NumKnownPositionModes };enum Attachment { Attachment_Unknown, Attachment_Fixed, Attachment_Scroll, NumKnownAttachments };enum StyleFeature { StyleFeature_None =0, StyleFeature_BackgroundColor =1, StyleFeature_BackgroundGradient =2, NumKnownStyleFeatures =4};struct Value {enum Type { Unknown, Number, Percentage, Length, String, Identifier, KnownIdentifier, Uri, Color, Function, TermOperatorSlash, TermOperatorComma };inlineValue() :type(Unknown) { } Type type; QVariant variant; Q_GUI_EXPORT QString toString()const;};QT_CSS_DECLARE_TYPEINFO(Value, Q_RELOCATABLE_TYPE)struct ColorData {ColorData() :role(QPalette::NoRole),type(Invalid) {}ColorData(const QColor &col) :color(col),role(QPalette::NoRole),type(Color) {}ColorData(QPalette::ColorRole r) :role(r),type(Role) {} QColor color;QPalette::ColorRole role;enum{ Invalid, Color, Role} type;};QT_CSS_DECLARE_TYPEINFO(ColorData, Q_RELOCATABLE_TYPE)struct BrushData {BrushData() :role(QPalette::NoRole),type(Invalid) {}BrushData(const QBrush &br) :brush(br),role(QPalette::NoRole),type(Brush) {}BrushData(QPalette::ColorRole r) :role(r),type(Role) {} QBrush brush;QPalette::ColorRole role;enum{ Invalid, Brush, Role, DependsOnThePalette } type;};QT_CSS_DECLARE_TYPEINFO(BrushData, Q_RELOCATABLE_TYPE)struct BackgroundData { BrushData brush; QString image; Repeat repeat;Qt::Alignment alignment;};QT_CSS_DECLARE_TYPEINFO(BackgroundData, Q_RELOCATABLE_TYPE)struct LengthData { qreal number;enum{ None, Px, Ex, Em, Percent } unit;};QT_CSS_DECLARE_TYPEINFO(LengthData, Q_PRIMITIVE_TYPE)struct BorderData { LengthData width; BorderStyle style; BrushData color;};QT_CSS_DECLARE_TYPEINFO(BorderData, Q_RELOCATABLE_TYPE)// 1. StyleRule - x:hover, y:clicked > z:checked { prop1: value1; prop2: value2; }// 2. QList<Selector> - x:hover, y:clicked z:checked// 3. QList<BasicSelector> - y:clicked z:checked// 4. QList<Declaration> - { prop1: value1; prop2: value2; }// 5. Declaration - prop1: value1;struct Q_GUI_EXPORT Declaration {struct DeclarationData :public QSharedData {inlineDeclarationData() :propertyId(UnknownProperty),important(false),inheritable(false) {} QString property; Property propertyId; QList<Value> values; QVariant parsed;bool important:1;bool inheritable:1;}; QExplicitlySharedDataPointer<DeclarationData> d;inlineDeclaration() :d(newDeclarationData()) {}inlineboolisEmpty()const{return d->property.isEmpty() && d->propertyId == UnknownProperty; }// helper functions QColor colorValue(const QPalette & =QPalette())const;voidcolorValues(QColor *c,const QPalette & =QPalette())const; QBrush brushValue(const QPalette & =QPalette())const;voidbrushValues(QBrush *c,const QPalette & =QPalette())const; BorderStyle styleValue()const;voidstyleValues(BorderStyle *s)const; Origin originValue()const; Repeat repeatValue()const;Qt::Alignment alignmentValue()const; PositionMode positionValue()const; Attachment attachmentValue()const;intstyleFeaturesValue()const;boolintValue(int*i,const char*unit =nullptr)const;boolrealValue(qreal *r,const char*unit =nullptr)const; QSize sizeValue()const; QRect rectValue()const; QString uriValue()const; QIcon iconValue()const;voidborderImageValue(QString *image,int*cuts, TileMode *h, TileMode *v)const;boolborderCollapseValue()const; QList<qreal>dashArray()const;};QT_CSS_DECLARE_TYPEINFO(Declaration, Q_RELOCATABLE_TYPE)const quint64 PseudoClass_Unknown =Q_UINT64_C(0x0000000000000000);const quint64 PseudoClass_Enabled =Q_UINT64_C(0x0000000000000001);const quint64 PseudoClass_Disabled =Q_UINT64_C(0x0000000000000002);const quint64 PseudoClass_Pressed =Q_UINT64_C(0x0000000000000004);const quint64 PseudoClass_Focus =Q_UINT64_C(0x0000000000000008);const quint64 PseudoClass_Hover =Q_UINT64_C(0x0000000000000010);const quint64 PseudoClass_Checked =Q_UINT64_C(0x0000000000000020);const quint64 PseudoClass_Unchecked =Q_UINT64_C(0x0000000000000040);const quint64 PseudoClass_Indeterminate =Q_UINT64_C(0x0000000000000080);const quint64 PseudoClass_Unspecified =Q_UINT64_C(0x0000000000000100);const quint64 PseudoClass_Selected =Q_UINT64_C(0x0000000000000200);const quint64 PseudoClass_Horizontal =Q_UINT64_C(0x0000000000000400);const quint64 PseudoClass_Vertical =Q_UINT64_C(0x0000000000000800);const quint64 PseudoClass_Window =Q_UINT64_C(0x0000000000001000);const quint64 PseudoClass_Children =Q_UINT64_C(0x0000000000002000);const quint64 PseudoClass_Sibling =Q_UINT64_C(0x0000000000004000);const quint64 PseudoClass_Default =Q_UINT64_C(0x0000000000008000);const quint64 PseudoClass_First =Q_UINT64_C(0x0000000000010000);const quint64 PseudoClass_Last =Q_UINT64_C(0x0000000000020000);const quint64 PseudoClass_Middle =Q_UINT64_C(0x0000000000040000);const quint64 PseudoClass_OnlyOne =Q_UINT64_C(0x0000000000080000);const quint64 PseudoClass_PreviousSelected =Q_UINT64_C(0x0000000000100000);const quint64 PseudoClass_NextSelected =Q_UINT64_C(0x0000000000200000);const quint64 PseudoClass_Flat =Q_UINT64_C(0x0000000000400000);const quint64 PseudoClass_Left =Q_UINT64_C(0x0000000000800000);const quint64 PseudoClass_Right =Q_UINT64_C(0x0000000001000000);const quint64 PseudoClass_Top =Q_UINT64_C(0x0000000002000000);const quint64 PseudoClass_Bottom =Q_UINT64_C(0x0000000004000000);const quint64 PseudoClass_Exclusive =Q_UINT64_C(0x0000000008000000);const quint64 PseudoClass_NonExclusive =Q_UINT64_C(0x0000000010000000);const quint64 PseudoClass_Frameless =Q_UINT64_C(0x0000000020000000);const quint64 PseudoClass_ReadOnly =Q_UINT64_C(0x0000000040000000);const quint64 PseudoClass_Active =Q_UINT64_C(0x0000000080000000);const quint64 PseudoClass_Closable =Q_UINT64_C(0x0000000100000000);const quint64 PseudoClass_Movable =Q_UINT64_C(0x0000000200000000);const quint64 PseudoClass_Floatable =Q_UINT64_C(0x0000000400000000);const quint64 PseudoClass_Minimized =Q_UINT64_C(0x0000000800000000);const quint64 PseudoClass_Maximized =Q_UINT64_C(0x0000001000000000);const quint64 PseudoClass_On =Q_UINT64_C(0x0000002000000000);const quint64 PseudoClass_Off =Q_UINT64_C(0x0000004000000000);const quint64 PseudoClass_Editable =Q_UINT64_C(0x0000008000000000);const quint64 PseudoClass_Item =Q_UINT64_C(0x0000010000000000);const quint64 PseudoClass_Closed =Q_UINT64_C(0x0000020000000000);const quint64 PseudoClass_Open =Q_UINT64_C(0x0000040000000000);const quint64 PseudoClass_EditFocus =Q_UINT64_C(0x0000080000000000);const quint64 PseudoClass_Alternate =Q_UINT64_C(0x0000100000000000);// The Any specifier is never generated, but can be used as a wildcard in searches.const quint64 PseudoClass_Any =Q_UINT64_C(0x0000ffffffffffff);const int NumPseudos =45;struct Pseudo {Pseudo() :type(0),negated(false) { } quint64 type; QString name; QString function;bool negated;};QT_CSS_DECLARE_TYPEINFO(Pseudo, Q_RELOCATABLE_TYPE)struct AttributeSelector {enum ValueMatchType { NoMatch, MatchEqual, MatchIncludes, MatchDashMatch, MatchBeginsWith, MatchEndsWith, MatchContains }; QString name; QString value; ValueMatchType valueMatchCriterium = NoMatch;};QT_CSS_DECLARE_TYPEINFO(AttributeSelector, Q_RELOCATABLE_TYPE)struct BasicSelector {inlineBasicSelector() :relationToNext(NoRelation) {}enum Relation { NoRelation, MatchNextSelectorIfAncestor, MatchNextSelectorIfParent, MatchNextSelectorIfDirectAdjecent, MatchNextSelectorIfIndirectAdjecent,}; QString elementName; QStringList ids; QList<Pseudo> pseudos; QList<AttributeSelector> attributeSelectors; Relation relationToNext;};QT_CSS_DECLARE_TYPEINFO(BasicSelector, Q_RELOCATABLE_TYPE)struct Q_GUI_EXPORT Selector { QList<BasicSelector> basicSelectors;intspecificity()const; quint64 pseudoClass(quint64 *negated =nullptr)const; QString pseudoElement()const;};QT_CSS_DECLARE_TYPEINFO(Selector, Q_RELOCATABLE_TYPE)struct StyleRule {StyleRule() :order(0) { } QList<Selector> selectors; QList<Declaration> declarations;int order;};QT_CSS_DECLARE_TYPEINFO(StyleRule, Q_RELOCATABLE_TYPE)struct MediaRule { QStringList media; QList<StyleRule> styleRules;};QT_CSS_DECLARE_TYPEINFO(MediaRule, Q_RELOCATABLE_TYPE)struct PageRule { QString selector; QList<Declaration> declarations;};QT_CSS_DECLARE_TYPEINFO(PageRule, Q_RELOCATABLE_TYPE)struct AnimationRule {struct AnimationRuleSet {float keyFrame; QList<Declaration> declarations;}; QString animName; QList<AnimationRuleSet> ruleSets;};QT_CSS_DECLARE_TYPEINFO(AnimationRule, Q_RELOCATABLE_TYPE)struct ImportRule { QString href; QStringList media;};QT_CSS_DECLARE_TYPEINFO(ImportRule, Q_RELOCATABLE_TYPE)enum StyleSheetOrigin { StyleSheetOrigin_Unspecified, StyleSheetOrigin_UserAgent, StyleSheetOrigin_User, StyleSheetOrigin_Author, StyleSheetOrigin_Inline };struct StyleSheet {StyleSheet() :origin(StyleSheetOrigin_Unspecified),depth(0) { } QList<StyleRule> styleRules;// only contains rules that are not indexed QList<MediaRule> mediaRules; QList<PageRule> pageRules; QList<AnimationRule> animationRules; QList<ImportRule> importRules; StyleSheetOrigin origin;int depth;// applicable only for inline style sheets QMultiHash<QString, StyleRule> nameIndex; QMultiHash<QString, StyleRule> idIndex; Q_GUI_EXPORT voidbuildIndexes(Qt::CaseSensitivity nameCaseSensitivity =Qt::CaseSensitive);};QT_CSS_DECLARE_TYPEINFO(StyleSheet, Q_RELOCATABLE_TYPE)class Q_GUI_EXPORT StyleSelector {public:StyleSelector() :nameCaseSensitivity(Qt::CaseSensitive) {}virtual~StyleSelector();union NodePtr {void*ptr;int id;}; QList<StyleRule>styleRulesForNode(NodePtr node); QList<Declaration>declarationsForNode(NodePtr node,const char*extraPseudo =nullptr);virtualboolnodeNameEquals(NodePtr node,const QString& nodeName)const;virtual QString attributeValue(NodePtr node,constQCss::AttributeSelector &aSelector)const=0;virtualboolhasAttributes(NodePtr node)const=0;virtual QStringList nodeIds(NodePtr node)const;virtual QStringList nodeNames(NodePtr node)const=0;virtualboolisNullNode(NodePtr node)const=0;virtual NodePtr parentNode(NodePtr node)const=0;virtual NodePtr previousSiblingNode(NodePtr node)const=0;virtual NodePtr duplicateNode(NodePtr node)const=0;virtualvoidfreeNode(NodePtr node)const=0; QList<StyleSheet> styleSheets; QString medium;Qt::CaseSensitivity nameCaseSensitivity;private:voidmatchRule(NodePtr node,const StyleRule &rules, StyleSheetOrigin origin,int depth, QMultiMap<uint, StyleRule> *weightedRules);boolselectorMatches(const Selector &rule, NodePtr node);boolbasicSelectorMatches(const BasicSelector &rule, NodePtr node);};enum TokenType { NONE, S, CDO, CDC, INCLUDES, DASHMATCH, BEGINSWITH, ENDSWITH, CONTAINS, LBRACE, PLUS, GREATER, COMMA, TILDE, STRING, INVALID, IDENT, HASH, ATKEYWORD_SYM, EXCLAMATION_SYM, LENGTH, PERCENTAGE, NUMBER, FUNCTION, COLON, SEMICOLON, RBRACE, SLASH, MINUS, DOT, STAR, LBRACKET, RBRACKET, EQUAL, LPAREN, RPAREN, OR };struct Symbol {inlineSymbol() :token(NONE),start(0),len(-1) {} TokenType token; QString text;int start, len; Q_GUI_EXPORT QString lexem()const;};QT_CSS_DECLARE_TYPEINFO(Symbol, Q_RELOCATABLE_TYPE)class Q_GUI_EXPORT Scanner {public:static QString preprocess(const QString &input,bool*hasEscapeSequences =nullptr);static voidscan(const QString &preprocessedInput, QList<Symbol> *symbols);};class Q_GUI_EXPORT Parser {public:Parser();explicitParser(const QString &css,bool file =false);voidinit(const QString &css,bool file =false);boolparse(StyleSheet *styleSheet,Qt::CaseSensitivity nameCaseSensitivity =Qt::CaseSensitive); Symbol errorSymbol();boolparseImport(ImportRule *importRule);boolparseMedia(MediaRule *mediaRule);boolparseMedium(QStringList *media);boolparsePage(PageRule *pageRule);boolparsePseudoPage(QString *selector);boolparseNextOperator(Value *value);boolparseAnimation(AnimationRule *animationRule);boolparseCombinator(BasicSelector::Relation *relation);boolparseProperty(Declaration *decl);boolparseRuleset(StyleRule *styleRule);boolparseSelector(Selector *sel);boolparseSimpleSelector(BasicSelector *basicSel);boolparseClass(QString *name);boolparseElementName(QString *name);boolparseAttrib(AttributeSelector *attr);boolparsePseudo(Pseudo *pseudo);boolparseNextDeclaration(Declaration *declaration);boolparsePrio(Declaration *declaration);boolparseExpr(QList<Value> *values);boolparseTerm(Value *value);boolparseFunction(QString *name, QString *args);boolparseHexColor(QColor *col);booltestAndParseUri(QString *uri);inlinebooltestRuleset() {returntestSelector(); }inlinebooltestSelector() {returntestSimpleSelector(); }inlineboolparseNextSelector(Selector *sel) {if(!testSelector())returnrecordError();returnparseSelector(sel); }booltestSimpleSelector();inlineboolparseNextSimpleSelector(BasicSelector *basicSel) {if(!testSimpleSelector())returnrecordError();returnparseSimpleSelector(basicSel); }inlinebooltestElementName() {returntest(IDENT) ||test(STAR); }inlinebooltestClass() {returntest(DOT); }inlinebooltestAttrib() {returntest(LBRACKET); }inlinebooltestPseudo() {returntest(COLON); }inlinebooltestMedium() {returntest(IDENT); }inlineboolparseNextMedium(QStringList *media) {if(!testMedium())returnrecordError();returnparseMedium(media); }inlinebooltestPseudoPage() {returntest(COLON); }inlinebooltestImport() {returntestTokenAndEndsWith(ATKEYWORD_SYM,QLatin1StringView("import")); }inlinebooltestMedia() {returntestTokenAndEndsWith(ATKEYWORD_SYM,QLatin1StringView("media")); }inlinebooltestPage() {returntestTokenAndEndsWith(ATKEYWORD_SYM,QLatin1StringView("page")); }inlinebooltestAnimation() {returntestTokenAndEndsWith(ATKEYWORD_SYM,QLatin1StringView("keyframes")); }inlinebooltestCombinator() {returntest(PLUS) ||test(GREATER) ||test(TILDE) ||test(S); }inlinebooltestProperty() {returntest(IDENT); }booltestTerm();inlinebooltestExpr() {returntestTerm(); }inlineboolparseNextExpr(QList<Value> *values){if(!testExpr())returnrecordError();returnparseExpr(values);}booltestPrio();inlinebooltestHexColor() {returntest(HASH); }inlinebooltestFunction() {returntest(FUNCTION); }inlineboolparseNextFunction(QString *name, QString *args) {if(!testFunction())returnrecordError();returnparseFunction(name, args); }inlineboollookupElementName()const{returnlookup() == IDENT ||lookup() == STAR; }inlinevoidskipSpace() {while(test(S)) {}; }inlineboolhasNext()const{return index < symbols.size(); }inline TokenType next() {return symbols.at(index++).token; }boolnext(TokenType t);booltest(TokenType t);inlinevoidprev() { index--; }inlineconst Symbol &symbol()const{return symbols.at(index -1); }inline QString lexem()const{returnsymbol().lexem(); } QString unquotedLexem()const; QString lexemUntil(TokenType t);booluntil(TokenType target, TokenType target2 = NONE);inline TokenType lookup()const{return(index -1) < symbols.size() ? symbols.at(index -1).token : NONE;}booltestTokenAndEndsWith(TokenType t, QLatin1StringView str);inlineboolrecordError() { errorIndex = index;return false; } QList<Symbol> symbols;int index;int errorIndex;bool hasEscapeSequences; QString sourcePath;};struct Q_GUI_EXPORT ValueExtractor {ValueExtractor(const QList<Declaration> &declarations,const QPalette & =QPalette());boolextractFont(QFont *font,int*fontSizeAdjustment);boolextractBackground(QBrush *, QString *, Repeat *,Qt::Alignment *,QCss::Origin *,QCss::Attachment *,QCss::Origin *);boolextractGeometry(int*w,int*h,int*minw,int*minh,int*maxw,int*maxh);boolextractPosition(int*l,int*t,int*r,int*b,QCss::Origin *,Qt::Alignment *,QCss::PositionMode *,Qt::Alignment *);boolextractBox(int*margins,int*paddings,int*spacing =nullptr);boolextractBorder(int*borders, QBrush *colors, BorderStyle *Styles, QSize *radii);boolextractOutline(int*borders, QBrush *colors, BorderStyle *Styles, QSize *radii,int*offsets);boolextractPalette(QBrush *foreground, QBrush *selectedForeground, QBrush *selectedBackground, QBrush *alternateBackground, QBrush *placeHolderTextForeground, QBrush *accent);intextractStyleFeatures();boolextractImage(QIcon *icon,Qt::Alignment *a, QSize *size);boolextractIcon(QIcon *icon, QSize *size);voidlengthValues(const Declaration &decl,int*m); QTextLength textLength(const Declaration &decl);private:voidextractFont();voidborderValue(const Declaration &decl,int*width,QCss::BorderStyle *style, QBrush *color); LengthData lengthValue(const Value& v);intlengthValue(const Declaration &decl); QSize sizeValue(const Declaration &decl);voidsizeValues(const Declaration &decl, QSize *radii); QList<Declaration> declarations; QFont f;int adjustment;int fontExtracted; QPalette pal;};}// namespace QCss QT_END_NAMESPACE QT_DECL_METATYPE_EXTERN_TAGGED(QCss::BackgroundData, QCss__BackgroundData, Q_GUI_EXPORT)QT_DECL_METATYPE_EXTERN_TAGGED(QCss::LengthData, QCss__LengthData, Q_GUI_EXPORT)QT_DECL_METATYPE_EXTERN_TAGGED(QCss::BorderData, QCss__BorderData, Q_GUI_EXPORT)#undef QT_CSS_DECLARE_TYPEINFO#endif// QT_NO_CSSPARSER#endif
|