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