1// Copyright (C) 2016 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
4#ifndef QCSSPARSER_P_H
5#define QCSSPARSER_P_H
6
7//
8// W A R N I N G
9// -------------
10//
11// This file is not part of the Qt API. It exists purely as an
12// implementation detail. This header file may change from version to
13// version without notice, or even be removed.
14//
15// We mean it.
16//
17
18#include <QtGui/private/qtguiglobal_p.h>
19#include <QtCore/QStringList>
20#include <QtCore/QList>
21#include <QtCore/QVariant>
22#include <QtCore/QSize>
23#include <QtCore/QMultiHash>
24#include <QtGui/QFont>
25#include <QtGui/QPalette>
26#include <QtCore/QSharedData>
27
28QT_BEGIN_NAMESPACE
29class QIcon;
30QT_END_NAMESPACE
31
32#ifndef QT_NO_CSSPARSER
33
34// VxWorks defines NONE as (-1) "for times when NULL won't do"
35#if defined(Q_OS_VXWORKS) && defined(NONE)
36# undef NONE
37#endif
38#if defined(Q_OS_INTEGRITY)
39# undef Value
40#endif
41// Hurd has #define TILDE 0x00080000 from <sys/ioctl.h>
42#if defined(TILDE)
43# undef TILDE
44#endif
45
46#define QT_CSS_DECLARE_TYPEINFO(Class, Type) \
47 } /* namespace QCss */ \
48 Q_DECLARE_TYPEINFO(QCss:: Class, Type); \
49 namespace QCss {
50
51QT_BEGIN_NAMESPACE
52
53namespace QCss
54{
55
56enum Property {
57 UnknownProperty,
58 BackgroundColor,
59 Color,
60 Float,
61 Font,
62 FontFamily,
63 FontSize,
64 FontStyle,
65 FontWeight,
66 Margin,
67 MarginBottom,
68 MarginLeft,
69 MarginRight,
70 MarginTop,
71 QtBlockIndent,
72 QtListIndent,
73 QtParagraphType,
74 QtTableType,
75 QtUserState,
76 TextDecoration,
77 TextIndent,
78 TextUnderlineStyle,
79 VerticalAlignment,
80 Whitespace,
81 QtSelectionForeground,
82 QtSelectionBackground,
83 Border,
84 BorderLeft,
85 BorderRight,
86 BorderTop,
87 BorderBottom,
88 BorderCollapse,
89 Padding,
90 PaddingLeft,
91 PaddingRight,
92 PaddingTop,
93 PaddingBottom,
94 PageBreakBefore,
95 PageBreakAfter,
96 QtAlternateBackground,
97 BorderLeftStyle,
98 BorderRightStyle,
99 BorderTopStyle,
100 BorderBottomStyle,
101 BorderStyles,
102 BorderLeftColor,
103 BorderRightColor,
104 BorderTopColor,
105 BorderBottomColor,
106 BorderColor,
107 BorderLeftWidth,
108 BorderRightWidth,
109 BorderTopWidth,
110 BorderBottomWidth,
111 BorderWidth,
112 BorderTopLeftRadius,
113 BorderTopRightRadius,
114 BorderBottomLeftRadius,
115 BorderBottomRightRadius,
116 BorderRadius,
117 Background,
118 BackgroundOrigin,
119 BackgroundClip,
120 BackgroundRepeat,
121 BackgroundPosition,
122 BackgroundAttachment,
123 BackgroundImage,
124 BorderImage,
125 QtSpacing,
126 Width,
127 Height,
128 MinimumWidth,
129 MinimumHeight,
130 MaximumWidth,
131 MaximumHeight,
132 QtImage,
133 Left,
134 Right,
135 Top,
136 Bottom,
137 QtOrigin,
138 QtPosition,
139 Position,
140 QtStyleFeatures,
141 QtBackgroundRole,
142 ListStyleType,
143 ListStyle,
144 QtImageAlignment,
145 TextAlignment,
146 Outline,
147 OutlineOffset,
148 OutlineWidth,
149 OutlineColor,
150 OutlineStyle,
151 OutlineRadius,
152 OutlineTopLeftRadius,
153 OutlineTopRightRadius,
154 OutlineBottomLeftRadius,
155 OutlineBottomRightRadius,
156 FontVariant,
157 TextTransform,
158 QtListNumberPrefix,
159 QtListNumberSuffix,
160 LineHeight,
161 QtLineHeightType,
162 FontKerning,
163 QtForegroundTextureCacheKey,
164 QtIcon,
165 LetterSpacing,
166 WordSpacing,
167 TextDecorationColor,
168 QtPlaceHolderTextColor,
169 QtAccent,
170 QtStrokeWidth,
171 QtStrokeColor,
172 QtStrokeLineCap,
173 QtStrokeLineJoin,
174 QtStrokeMiterLimit,
175 QtStrokeDashArray,
176 QtStrokeDashOffset,
177 QtForeground,
178 NumProperties
179};
180
181enum KnownValue {
182 UnknownValue,
183 Value_Normal,
184 Value_Pre,
185 Value_NoWrap,
186 Value_PreLine,
187 Value_PreWrap,
188 Value_Small,
189 Value_Medium,
190 Value_Large,
191 Value_XLarge,
192 Value_XXLarge,
193 Value_Italic,
194 Value_Oblique,
195 Value_Bold,
196 Value_Underline,
197 Value_Overline,
198 Value_LineThrough,
199 Value_Sub,
200 Value_Super,
201 Value_Left,
202 Value_Right,
203 Value_Top,
204 Value_Bottom,
205 Value_Center,
206 Value_Native,
207 Value_Solid,
208 Value_Dotted,
209 Value_Dashed,
210 Value_DotDash,
211 Value_DotDotDash,
212 Value_Double,
213 Value_Groove,
214 Value_Ridge,
215 Value_Inset,
216 Value_Outset,
217 Value_Wave,
218 Value_Middle,
219 Value_Auto,
220 Value_Always,
221 Value_None,
222 Value_Transparent,
223 Value_Disc,
224 Value_Circle,
225 Value_Square,
226 Value_Decimal,
227 Value_LowerAlpha,
228 Value_UpperAlpha,
229 Value_LowerRoman,
230 Value_UpperRoman,
231 Value_SmallCaps,
232 Value_Uppercase,
233 Value_Lowercase,
234 Value_SquareCap,
235 Value_FlatCap,
236 Value_RoundCap,
237 Value_MiterJoin,
238 Value_BevelJoin,
239 Value_RoundJoin,
240 Value_SvgMiterJoin,
241
242 /* keep these in same order as QPalette::ColorRole */
243 Value_FirstColorRole,
244 Value_WindowText = Value_FirstColorRole,
245 Value_Button,
246 Value_Light,
247 Value_Midlight,
248 Value_Dark,
249 Value_Mid,
250 Value_Text,
251 Value_BrightText,
252 Value_ButtonText,
253 Value_Base,
254 Value_Window,
255 Value_Shadow,
256 Value_Highlight,
257 Value_HighlightedText,
258 Value_Link,
259 Value_LinkVisited,
260 Value_AlternateBase,
261 Value_LastColorRole = Value_AlternateBase,
262
263 Value_Disabled,
264 Value_Active,
265 Value_Selected,
266 Value_On,
267 Value_Off,
268
269 NumKnownValues
270};
271
272enum BorderStyle {
273 BorderStyle_Unknown,
274 BorderStyle_None,
275 BorderStyle_Dotted,
276 BorderStyle_Dashed,
277 BorderStyle_Solid,
278 BorderStyle_Double,
279 BorderStyle_DotDash,
280 BorderStyle_DotDotDash,
281 BorderStyle_Groove,
282 BorderStyle_Ridge,
283 BorderStyle_Inset,
284 BorderStyle_Outset,
285 BorderStyle_Native,
286 NumKnownBorderStyles
287};
288
289enum Edge {
290 TopEdge,
291 RightEdge,
292 BottomEdge,
293 LeftEdge,
294 NumEdges
295};
296
297enum Corner {
298 TopLeftCorner,
299 TopRightCorner,
300 BottomLeftCorner,
301 BottomRightCorner
302};
303
304enum TileMode {
305 TileMode_Unknown,
306 TileMode_Round,
307 TileMode_Stretch,
308 TileMode_Repeat,
309 NumKnownTileModes
310};
311
312enum Repeat {
313 Repeat_Unknown,
314 Repeat_None,
315 Repeat_X,
316 Repeat_Y,
317 Repeat_XY,
318 NumKnownRepeats
319};
320
321enum Origin {
322 Origin_Unknown,
323 Origin_Padding,
324 Origin_Border,
325 Origin_Content,
326 Origin_Margin,
327 NumKnownOrigins
328};
329
330enum PositionMode {
331 PositionMode_Unknown,
332 PositionMode_Static,
333 PositionMode_Relative,
334 PositionMode_Absolute,
335 PositionMode_Fixed,
336 NumKnownPositionModes
337};
338
339enum Attachment {
340 Attachment_Unknown,
341 Attachment_Fixed,
342 Attachment_Scroll,
343 NumKnownAttachments
344};
345
346enum StyleFeature {
347 StyleFeature_None = 0,
348 StyleFeature_BackgroundColor = 1,
349 StyleFeature_BackgroundGradient = 2,
350 NumKnownStyleFeatures = 4
351};
352
353struct Value
354{
355 enum Type {
356 Unknown,
357 Number,
358 Percentage,
359 Length,
360 String,
361 Identifier,
362 KnownIdentifier,
363 Uri,
364 Color,
365 Function,
366 TermOperatorSlash,
367 TermOperatorComma
368 };
369 inline Value() : type(Unknown) { }
370 Type type;
371 QVariant variant;
372
373 Q_GUI_EXPORT QString toString() const;
374};
375QT_CSS_DECLARE_TYPEINFO(Value, Q_RELOCATABLE_TYPE)
376
377struct ColorData {
378 ColorData() : role(QPalette::NoRole), type(Invalid) {}
379 ColorData(const QColor &col) : color(col), role(QPalette::NoRole), type(Color) {}
380 ColorData(QPalette::ColorRole r) : role(r), type(Role) {}
381 QColor color;
382 QPalette::ColorRole role;
383 enum { Invalid, Color, Role} type;
384};
385QT_CSS_DECLARE_TYPEINFO(ColorData, Q_RELOCATABLE_TYPE)
386
387struct BrushData {
388 BrushData() : role(QPalette::NoRole), type(Invalid) {}
389 BrushData(const QBrush &br) : brush(br), role(QPalette::NoRole), type(Brush) {}
390 BrushData(QPalette::ColorRole r) : role(r), type(Role) {}
391 QBrush brush;
392 QPalette::ColorRole role;
393 enum { Invalid, Brush, Role, DependsOnThePalette } type;
394};
395QT_CSS_DECLARE_TYPEINFO(BrushData, Q_RELOCATABLE_TYPE)
396
397struct BackgroundData {
398 BrushData brush;
399 QString image;
400 Repeat repeat;
401 Qt::Alignment alignment;
402};
403QT_CSS_DECLARE_TYPEINFO(BackgroundData, Q_RELOCATABLE_TYPE)
404
405struct LengthData {
406 qreal number;
407 enum { None, Px, Ex, Em, Percent } unit;
408};
409QT_CSS_DECLARE_TYPEINFO(LengthData, Q_PRIMITIVE_TYPE)
410
411struct BorderData {
412 LengthData width;
413 BorderStyle style;
414 BrushData color;
415};
416QT_CSS_DECLARE_TYPEINFO(BorderData, Q_RELOCATABLE_TYPE)
417
418// 1. StyleRule - x:hover, y:clicked > z:checked { prop1: value1; prop2: value2; }
419// 2. QList<Selector> - x:hover, y:clicked z:checked
420// 3. QList<BasicSelector> - y:clicked z:checked
421// 4. QList<Declaration> - { prop1: value1; prop2: value2; }
422// 5. Declaration - prop1: value1;
423
424struct Q_GUI_EXPORT Declaration
425{
426 struct DeclarationData : public QSharedData
427 {
428 inline DeclarationData() : propertyId(UnknownProperty), important(false), inheritable(false) {}
429 QString property;
430 Property propertyId;
431 QList<Value> values;
432 QVariant parsed;
433 bool important:1;
434 bool inheritable:1;
435 };
436 QExplicitlySharedDataPointer<DeclarationData> d;
437 inline Declaration() : d(new DeclarationData()) {}
438 inline bool isEmpty() const { return d->property.isEmpty() && d->propertyId == UnknownProperty; }
439
440 // helper functions
441 QColor colorValue(const QPalette & = QPalette()) const;
442 void colorValues(QColor *c, const QPalette & = QPalette()) const;
443 QBrush brushValue(const QPalette & = QPalette()) const;
444 void brushValues(QBrush *c, const QPalette & = QPalette()) const;
445
446 BorderStyle styleValue() const;
447 void styleValues(BorderStyle *s) const;
448
449 Origin originValue() const;
450 Repeat repeatValue() const;
451 Qt::Alignment alignmentValue() const;
452 PositionMode positionValue() const;
453 Attachment attachmentValue() const;
454 int styleFeaturesValue() const;
455
456 bool intValue(int *i, const char *unit = nullptr) const;
457 bool realValue(qreal *r, const char *unit = nullptr) const;
458
459 QSize sizeValue() const;
460 QRect rectValue() const;
461 QString uriValue() const;
462 QIcon iconValue() const;
463
464 void borderImageValue(QString *image, int *cuts, TileMode *h, TileMode *v) const;
465 bool borderCollapseValue() const;
466
467 QList<qreal> dashArray() const;
468};
469QT_CSS_DECLARE_TYPEINFO(Declaration, Q_RELOCATABLE_TYPE)
470
471const quint64 PseudoClass_Unknown = Q_UINT64_C(0x0000000000000000);
472const quint64 PseudoClass_Enabled = Q_UINT64_C(0x0000000000000001);
473const quint64 PseudoClass_Disabled = Q_UINT64_C(0x0000000000000002);
474const quint64 PseudoClass_Pressed = Q_UINT64_C(0x0000000000000004);
475const quint64 PseudoClass_Focus = Q_UINT64_C(0x0000000000000008);
476const quint64 PseudoClass_Hover = Q_UINT64_C(0x0000000000000010);
477const quint64 PseudoClass_Checked = Q_UINT64_C(0x0000000000000020);
478const quint64 PseudoClass_Unchecked = Q_UINT64_C(0x0000000000000040);
479const quint64 PseudoClass_Indeterminate = Q_UINT64_C(0x0000000000000080);
480const quint64 PseudoClass_Unspecified = Q_UINT64_C(0x0000000000000100);
481const quint64 PseudoClass_Selected = Q_UINT64_C(0x0000000000000200);
482const quint64 PseudoClass_Horizontal = Q_UINT64_C(0x0000000000000400);
483const quint64 PseudoClass_Vertical = Q_UINT64_C(0x0000000000000800);
484const quint64 PseudoClass_Window = Q_UINT64_C(0x0000000000001000);
485const quint64 PseudoClass_Children = Q_UINT64_C(0x0000000000002000);
486const quint64 PseudoClass_Sibling = Q_UINT64_C(0x0000000000004000);
487const quint64 PseudoClass_Default = Q_UINT64_C(0x0000000000008000);
488const quint64 PseudoClass_First = Q_UINT64_C(0x0000000000010000);
489const quint64 PseudoClass_Last = Q_UINT64_C(0x0000000000020000);
490const quint64 PseudoClass_Middle = Q_UINT64_C(0x0000000000040000);
491const quint64 PseudoClass_OnlyOne = Q_UINT64_C(0x0000000000080000);
492const quint64 PseudoClass_PreviousSelected = Q_UINT64_C(0x0000000000100000);
493const quint64 PseudoClass_NextSelected = Q_UINT64_C(0x0000000000200000);
494const quint64 PseudoClass_Flat = Q_UINT64_C(0x0000000000400000);
495const quint64 PseudoClass_Left = Q_UINT64_C(0x0000000000800000);
496const quint64 PseudoClass_Right = Q_UINT64_C(0x0000000001000000);
497const quint64 PseudoClass_Top = Q_UINT64_C(0x0000000002000000);
498const quint64 PseudoClass_Bottom = Q_UINT64_C(0x0000000004000000);
499const quint64 PseudoClass_Exclusive = Q_UINT64_C(0x0000000008000000);
500const quint64 PseudoClass_NonExclusive = Q_UINT64_C(0x0000000010000000);
501const quint64 PseudoClass_Frameless = Q_UINT64_C(0x0000000020000000);
502const quint64 PseudoClass_ReadOnly = Q_UINT64_C(0x0000000040000000);
503const quint64 PseudoClass_Active = Q_UINT64_C(0x0000000080000000);
504const quint64 PseudoClass_Closable = Q_UINT64_C(0x0000000100000000);
505const quint64 PseudoClass_Movable = Q_UINT64_C(0x0000000200000000);
506const quint64 PseudoClass_Floatable = Q_UINT64_C(0x0000000400000000);
507const quint64 PseudoClass_Minimized = Q_UINT64_C(0x0000000800000000);
508const quint64 PseudoClass_Maximized = Q_UINT64_C(0x0000001000000000);
509const quint64 PseudoClass_On = Q_UINT64_C(0x0000002000000000);
510const quint64 PseudoClass_Off = Q_UINT64_C(0x0000004000000000);
511const quint64 PseudoClass_Editable = Q_UINT64_C(0x0000008000000000);
512const quint64 PseudoClass_Item = Q_UINT64_C(0x0000010000000000);
513const quint64 PseudoClass_Closed = Q_UINT64_C(0x0000020000000000);
514const quint64 PseudoClass_Open = Q_UINT64_C(0x0000040000000000);
515const quint64 PseudoClass_EditFocus = Q_UINT64_C(0x0000080000000000);
516const quint64 PseudoClass_Alternate = Q_UINT64_C(0x0000100000000000);
517// The Any specifier is never generated, but can be used as a wildcard in searches.
518const quint64 PseudoClass_Any = Q_UINT64_C(0x0000ffffffffffff);
519const int NumPseudos = 45;
520
521struct Pseudo
522{
523 Pseudo() : type(0), negated(false) { }
524 quint64 type;
525 QString name;
526 QString function;
527 bool negated;
528};
529QT_CSS_DECLARE_TYPEINFO(Pseudo, Q_RELOCATABLE_TYPE)
530
531struct AttributeSelector
532{
533 enum ValueMatchType {
534 NoMatch,
535 MatchEqual,
536 MatchIncludes,
537 MatchDashMatch,
538 MatchBeginsWith,
539 MatchEndsWith,
540 MatchContains
541 };
542
543 QString name;
544 QString value;
545 ValueMatchType valueMatchCriterium = NoMatch;
546};
547QT_CSS_DECLARE_TYPEINFO(AttributeSelector, Q_RELOCATABLE_TYPE)
548
549struct BasicSelector
550{
551 inline BasicSelector() : relationToNext(NoRelation) {}
552
553 enum Relation {
554 NoRelation,
555 MatchNextSelectorIfAncestor,
556 MatchNextSelectorIfParent,
557 MatchNextSelectorIfDirectAdjecent,
558 MatchNextSelectorIfIndirectAdjecent,
559 };
560
561 QString elementName;
562
563 QStringList ids;
564 QList<Pseudo> pseudos;
565 QList<AttributeSelector> attributeSelectors;
566
567 Relation relationToNext;
568};
569QT_CSS_DECLARE_TYPEINFO(BasicSelector, Q_RELOCATABLE_TYPE)
570
571struct Q_GUI_EXPORT Selector
572{
573 QList<BasicSelector> basicSelectors;
574 int specificity() const;
575 quint64 pseudoClass(quint64 *negated = nullptr) const;
576 QString pseudoElement() const;
577};
578QT_CSS_DECLARE_TYPEINFO(Selector, Q_RELOCATABLE_TYPE)
579
580struct StyleRule
581{
582 StyleRule() : order(0) { }
583 QList<Selector> selectors;
584 QList<Declaration> declarations;
585 int order;
586};
587QT_CSS_DECLARE_TYPEINFO(StyleRule, Q_RELOCATABLE_TYPE)
588
589struct MediaRule
590{
591 QStringList media;
592 QList<StyleRule> styleRules;
593};
594QT_CSS_DECLARE_TYPEINFO(MediaRule, Q_RELOCATABLE_TYPE)
595
596struct PageRule
597{
598 QString selector;
599 QList<Declaration> declarations;
600};
601QT_CSS_DECLARE_TYPEINFO(PageRule, Q_RELOCATABLE_TYPE)
602
603struct ImportRule
604{
605 QString href;
606 QStringList media;
607};
608QT_CSS_DECLARE_TYPEINFO(ImportRule, Q_RELOCATABLE_TYPE)
609
610enum StyleSheetOrigin {
611 StyleSheetOrigin_Unspecified,
612 StyleSheetOrigin_UserAgent,
613 StyleSheetOrigin_User,
614 StyleSheetOrigin_Author,
615 StyleSheetOrigin_Inline
616};
617
618struct StyleSheet
619{
620 StyleSheet() : origin(StyleSheetOrigin_Unspecified), depth(0) { }
621 QList<StyleRule> styleRules; // only contains rules that are not indexed
622 QList<MediaRule> mediaRules;
623 QList<PageRule> pageRules;
624 QList<ImportRule> importRules;
625 StyleSheetOrigin origin;
626 int depth; // applicable only for inline style sheets
627 QMultiHash<QString, StyleRule> nameIndex;
628 QMultiHash<QString, StyleRule> idIndex;
629
630 Q_GUI_EXPORT void buildIndexes(Qt::CaseSensitivity nameCaseSensitivity = Qt::CaseSensitive);
631};
632QT_CSS_DECLARE_TYPEINFO(StyleSheet, Q_RELOCATABLE_TYPE)
633
634
635class Q_GUI_EXPORT StyleSelector
636{
637public:
638 StyleSelector() : nameCaseSensitivity(Qt::CaseSensitive) {}
639 virtual ~StyleSelector();
640
641 union NodePtr {
642 void *ptr;
643 int id;
644 };
645
646 QList<StyleRule> styleRulesForNode(NodePtr node);
647 QList<Declaration> declarationsForNode(NodePtr node, const char *extraPseudo = nullptr);
648
649 virtual bool nodeNameEquals(NodePtr node, const QString& nodeName) const;
650 virtual QString attributeValue(NodePtr node, const QCss::AttributeSelector &aSelector) const = 0;
651 virtual bool hasAttributes(NodePtr node) const = 0;
652 virtual QStringList nodeIds(NodePtr node) const;
653 virtual QStringList nodeNames(NodePtr node) const = 0;
654 virtual bool isNullNode(NodePtr node) const = 0;
655 virtual NodePtr parentNode(NodePtr node) const = 0;
656 virtual NodePtr previousSiblingNode(NodePtr node) const = 0;
657 virtual NodePtr duplicateNode(NodePtr node) const = 0;
658 virtual void freeNode(NodePtr node) const = 0;
659
660 QList<StyleSheet> styleSheets;
661 QString medium;
662 Qt::CaseSensitivity nameCaseSensitivity;
663private:
664 void matchRule(NodePtr node, const StyleRule &rules, StyleSheetOrigin origin,
665 int depth, QMultiMap<uint, StyleRule> *weightedRules);
666 bool selectorMatches(const Selector &rule, NodePtr node);
667 bool basicSelectorMatches(const BasicSelector &rule, NodePtr node);
668};
669
670enum TokenType {
671 NONE,
672
673 S,
674
675 CDO,
676 CDC,
677 INCLUDES,
678 DASHMATCH,
679 BEGINSWITH,
680 ENDSWITH,
681 CONTAINS,
682
683 LBRACE,
684 PLUS,
685 GREATER,
686 COMMA,
687 TILDE,
688
689 STRING,
690 INVALID,
691
692 IDENT,
693
694 HASH,
695
696 ATKEYWORD_SYM,
697
698 EXCLAMATION_SYM,
699
700 LENGTH,
701
702 PERCENTAGE,
703 NUMBER,
704
705 FUNCTION,
706
707 COLON,
708 SEMICOLON,
709 RBRACE,
710 SLASH,
711 MINUS,
712 DOT,
713 STAR,
714 LBRACKET,
715 RBRACKET,
716 EQUAL,
717 LPAREN,
718 RPAREN,
719 OR
720};
721
722struct Symbol
723{
724 inline Symbol() : token(NONE), start(0), len(-1) {}
725 TokenType token;
726 QString text;
727 int start, len;
728 Q_GUI_EXPORT QString lexem() const;
729};
730QT_CSS_DECLARE_TYPEINFO(Symbol, Q_RELOCATABLE_TYPE)
731
732class Q_GUI_EXPORT Scanner
733{
734public:
735 static QString preprocess(const QString &input, bool *hasEscapeSequences = nullptr);
736 static void scan(const QString &preprocessedInput, QList<Symbol> *symbols);
737};
738
739class Q_GUI_EXPORT Parser
740{
741public:
742 Parser();
743 explicit Parser(const QString &css, bool file = false);
744
745 void init(const QString &css, bool file = false);
746 bool parse(StyleSheet *styleSheet, Qt::CaseSensitivity nameCaseSensitivity = Qt::CaseSensitive);
747 Symbol errorSymbol();
748
749 bool parseImport(ImportRule *importRule);
750 bool parseMedia(MediaRule *mediaRule);
751 bool parseMedium(QStringList *media);
752 bool parsePage(PageRule *pageRule);
753 bool parsePseudoPage(QString *selector);
754 bool parseNextOperator(Value *value);
755 bool parseCombinator(BasicSelector::Relation *relation);
756 bool parseProperty(Declaration *decl);
757 bool parseRuleset(StyleRule *styleRule);
758 bool parseSelector(Selector *sel);
759 bool parseSimpleSelector(BasicSelector *basicSel);
760 bool parseClass(QString *name);
761 bool parseElementName(QString *name);
762 bool parseAttrib(AttributeSelector *attr);
763 bool parsePseudo(Pseudo *pseudo);
764 bool parseNextDeclaration(Declaration *declaration);
765 bool parsePrio(Declaration *declaration);
766 bool parseExpr(QList<Value> *values);
767 bool parseTerm(Value *value);
768 bool parseFunction(QString *name, QString *args);
769 bool parseHexColor(QColor *col);
770 bool testAndParseUri(QString *uri);
771
772 inline bool testRuleset() { return testSelector(); }
773 inline bool testSelector() { return testSimpleSelector(); }
774 inline bool parseNextSelector(Selector *sel) { if (!testSelector()) return recordError(); return parseSelector(sel); }
775 bool testSimpleSelector();
776 inline bool parseNextSimpleSelector(BasicSelector *basicSel) { if (!testSimpleSelector()) return recordError(); return parseSimpleSelector(basicSel); }
777 inline bool testElementName() { return test(t: IDENT) || test(t: STAR); }
778 inline bool testClass() { return test(t: DOT); }
779 inline bool testAttrib() { return test(t: LBRACKET); }
780 inline bool testPseudo() { return test(t: COLON); }
781 inline bool testMedium() { return test(t: IDENT); }
782 inline bool parseNextMedium(QStringList *media) { if (!testMedium()) return recordError(); return parseMedium(media); }
783 inline bool testPseudoPage() { return test(t: COLON); }
784 inline bool testImport() { return testTokenAndEndsWith(t: ATKEYWORD_SYM, str: QLatin1StringView("import")); }
785 inline bool testMedia() { return testTokenAndEndsWith(t: ATKEYWORD_SYM, str: QLatin1StringView("media")); }
786 inline bool testPage() { return testTokenAndEndsWith(t: ATKEYWORD_SYM, str: QLatin1StringView("page")); }
787 inline bool testCombinator() { return test(t: PLUS) || test(t: GREATER) || test(t: TILDE) || test(t: S); }
788 inline bool testProperty() { return test(t: IDENT); }
789 bool testTerm();
790 inline bool testExpr() { return testTerm(); }
791 inline bool parseNextExpr(QList<Value> *values)
792 {
793 if (!testExpr())
794 return recordError();
795 return parseExpr(values);
796 }
797 bool testPrio();
798 inline bool testHexColor() { return test(t: HASH); }
799 inline bool testFunction() { return test(t: FUNCTION); }
800 inline bool parseNextFunction(QString *name, QString *args) { if (!testFunction()) return recordError(); return parseFunction(name, args); }
801
802 inline bool lookupElementName() const { return lookup() == IDENT || lookup() == STAR; }
803
804 inline void skipSpace() { while (test(t: S)) {}; }
805
806 inline bool hasNext() const { return index < symbols.size(); }
807 inline TokenType next() { return symbols.at(i: index++).token; }
808 bool next(TokenType t);
809 bool test(TokenType t);
810 inline void prev() { index--; }
811 inline const Symbol &symbol() const { return symbols.at(i: index - 1); }
812 inline QString lexem() const { return symbol().lexem(); }
813 QString unquotedLexem() const;
814 QString lexemUntil(TokenType t);
815 bool until(TokenType target, TokenType target2 = NONE);
816 inline TokenType lookup() const {
817 return (index - 1) < symbols.size() ? symbols.at(i: index - 1).token : NONE;
818 }
819
820 bool testTokenAndEndsWith(TokenType t, QLatin1StringView str);
821
822 inline bool recordError() { errorIndex = index; return false; }
823
824 QList<Symbol> symbols;
825 int index;
826 int errorIndex;
827 bool hasEscapeSequences;
828 QString sourcePath;
829};
830
831struct Q_GUI_EXPORT ValueExtractor
832{
833 ValueExtractor(const QList<Declaration> &declarations, const QPalette & = QPalette());
834
835 bool extractFont(QFont *font, int *fontSizeAdjustment);
836 bool extractBackground(QBrush *, QString *, Repeat *, Qt::Alignment *, QCss::Origin *, QCss::Attachment *,
837 QCss::Origin *);
838 bool extractGeometry(int *w, int *h, int *minw, int *minh, int *maxw, int *maxh);
839 bool extractPosition(int *l, int *t, int *r, int *b, QCss::Origin *, Qt::Alignment *,
840 QCss::PositionMode *, Qt::Alignment *);
841 bool extractBox(int *margins, int *paddings, int *spacing = nullptr);
842 bool extractBorder(int *borders, QBrush *colors, BorderStyle *Styles, QSize *radii);
843 bool extractOutline(int *borders, QBrush *colors, BorderStyle *Styles, QSize *radii, int *offsets);
844 bool extractPalette(QBrush *foreground, QBrush *selectedForeground, QBrush *selectedBackground,
845 QBrush *alternateBackground, QBrush *placeHolderTextForeground,
846 QBrush *accent);
847 int extractStyleFeatures();
848 bool extractImage(QIcon *icon, Qt::Alignment *a, QSize *size);
849 bool extractIcon(QIcon *icon, QSize *size);
850
851 void lengthValues(const Declaration &decl, int *m);
852 QTextLength textLength(const Declaration &decl);
853
854private:
855 void extractFont();
856 void borderValue(const Declaration &decl, int *width, QCss::BorderStyle *style, QBrush *color);
857 LengthData lengthValue(const Value& v);
858 int lengthValue(const Declaration &decl);
859 QSize sizeValue(const Declaration &decl);
860 void sizeValues(const Declaration &decl, QSize *radii);
861
862 QList<Declaration> declarations;
863 QFont f;
864 int adjustment;
865 int fontExtracted;
866 QPalette pal;
867};
868
869} // namespace QCss
870
871QT_END_NAMESPACE
872
873QT_DECL_METATYPE_EXTERN_TAGGED(QCss::BackgroundData, QCss__BackgroundData, Q_GUI_EXPORT)
874QT_DECL_METATYPE_EXTERN_TAGGED(QCss::LengthData, QCss__LengthData, Q_GUI_EXPORT)
875QT_DECL_METATYPE_EXTERN_TAGGED(QCss::BorderData, QCss__BorderData, Q_GUI_EXPORT)
876
877#undef QT_CSS_DECLARE_TYPEINFO
878
879#endif // QT_NO_CSSPARSER
880
881#endif
882

Provided by KDAB

Privacy Policy
Start learning QML with our Intro Training
Find out more

source code of qtbase/src/gui/text/qcssparser_p.h