Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qtexthtmlparser_p.h
Go to the documentation of this file.
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 QTEXTHTMLPARSER_P_H
5#define QTEXTHTMLPARSER_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 "QtGui/qbrush.h"
20#include "QtGui/qcolor.h"
21#include "QtGui/qfont.h"
22#include "QtGui/qtextdocument.h"
23#include "QtGui/qtextcursor.h"
24
25#include "QtCore/qlist.h"
26
27#include "private/qtextformat_p.h"
28#include "private/qtextdocument_p.h"
29#if QT_CONFIG(cssparser)
30#include "private/qcssparser_p.h"
31#endif
32
33#ifndef QT_NO_TEXTHTMLPARSER
34
36
114
121
122class QTextHtmlParser;
123
133
141 QTextCharFormat charFormat;
142 QTextBlockFormat blockFormat;
143 uint cssFloat : 2;
149 uint isTextFrame : 1;
150 uint isRootFrame : 1;
151 uint displayMode : 3; // QTextHtmlElement::DisplayMode
152 uint hasHref : 1;
154 int listStart = 1;
161 QTextLength width;
162 QTextLength height;
175
177
179
180 inline bool isListStart() const
181 { return id == Html_ol || id == Html_ul; }
182 inline bool isTableCell() const
183 { return id == Html_td || id == Html_th; }
184 inline bool isBlock() const
186
187 inline bool isNotSelfNesting() const
188 { return id == Html_p || id == Html_li; }
189
190 inline bool allowedInContext(int parentId) const
191 {
192 switch (id) {
193 case Html_dd:
194 case Html_dt: return (parentId == Html_dl);
195 case Html_tr: return (parentId == Html_table
196 || parentId == Html_thead
197 || parentId == Html_tbody
198 || parentId == Html_tfoot
199 );
200 case Html_th:
201 case Html_td: return (parentId == Html_tr);
202 case Html_thead:
203 case Html_tbody:
204 case Html_tfoot: return (parentId == Html_table);
205 case Html_caption: return (parentId == Html_table);
206 case Html_body: return parentId != Html_head;
207 default: break;
208 }
209 return true;
210 }
211
212 inline bool mayNotHaveChildren() const
213 { return id == Html_img || id == Html_hr || id == Html_br || id == Html_meta; }
214
215 void initializeProperties(const QTextHtmlParserNode *parent, const QTextHtmlParser *parser);
216
217 inline int uncollapsedMargin(int mar) const { return margin[mar]; }
218
219 bool isNestedList(const QTextHtmlParser *parser) const;
220
221 void parseStyleAttribute(const QString &value, const QTextDocument *resourceProvider);
222
223#if QT_CONFIG(cssparser)
226
227 void setListStyle(const QList<QCss::Value> &cssValues);
228# endif
229
230 void applyForegroundImage(qint64 cacheKey, const QTextDocument *resourceProvider);
231 void applyBackgroundImage(const QString &url, const QTextDocument *resourceProvider);
232
233 bool hasOnlyWhitespace() const;
234
235 int margin[4];
236 int padding[4];
237
238 friend class QTextHtmlParser;
239};
241
242
244{
245public:
253 {
254 qDeleteAll(nodes);
255 }
256
257 inline const QTextHtmlParserNode &at(int i) const { return *nodes.at(i); }
258 inline QTextHtmlParserNode &operator[](int i) { return *nodes[i]; }
259 inline int count() const { return nodes.size(); }
260 inline int last() const { return nodes.size()-1; }
261 int depth(int i) const;
262 int topMargin(int i) const;
263 int bottomMargin(int i) const;
264 inline int leftMargin(int i) const { return margin(i, MarginLeft); }
265 inline int rightMargin(int i) const { return margin(i, MarginRight); }
266
267 inline int topPadding(int i) const { return at(i).padding[MarginTop]; }
268 inline int bottomPadding(int i) const { return at(i).padding[MarginBottom]; }
269 inline int leftPadding(int i) const { return at(i).padding[MarginLeft]; }
270 inline int rightPadding(int i) const { return at(i).padding[MarginRight]; }
271
272 inline qreal tableCellBorder(int i, int edge) const { return at(i).tableCellBorder[edge]; }
273 inline QTextFrameFormat::BorderStyle tableCellBorderStyle(int i, int edge) const { return at(i).tableCellBorderStyle[edge]; }
274 inline QBrush tableCellBorderBrush(int i, int edge) const { return at(i).tableCellBorderBrush[edge]; }
275
276 void dumpHtml();
277
278 void parse(const QString &text, const QTextDocument *resourceProvider);
279
280 static int lookupElement(QStringView element);
281
282 Q_GUI_EXPORT static QString parseEntity(QStringView entity);
283
284protected:
285 QTextHtmlParserNode *newNode(int parent);
288 int pos, len;
289
291
292 void parse();
293 void parseTag();
294 void parseCloseTag();
295 void parseExclamationTag();
299 void resolveNode();
301 void applyAttributes(const QStringList &attributes);
302 void eatSpace();
303 inline bool hasPrefix(QChar c, int lookahead = 0) const
304 {
305 return pos + lookahead < len && txt.at(pos + lookahead) == c;
306 }
307 int margin(int i, int mar) const;
308
309 bool nodeIsChildOf(int i, QTextHTMLElements id) const;
310
311
312#if QT_CONFIG(cssparser)
315 void importStyleSheet(const QString &href);
316
317 struct ExternalStyleSheet
318 {
319 inline ExternalStyleSheet() {}
320 inline ExternalStyleSheet(const QString &_url, const QCss::StyleSheet &_sheet)
321 : url(_url), sheet(_sheet) {}
322 QString url;
324 };
325 friend class QTypeInfo<ExternalStyleSheet>;
328# endif
329
330 const QTextDocument *resourceProvider;
331};
332#if QT_CONFIG(cssparser)
333Q_DECLARE_TYPEINFO(QTextHtmlParser::ExternalStyleSheet, Q_RELOCATABLE_TYPE);
334#endif
335
336QT_END_NAMESPACE
337
338#endif // QT_NO_TEXTHTMLPARSER
339
340#endif // QTEXTHTMLPARSER_P_H
friend class QPainter
bool end()
Ends painting.
\macro QT_RESTRICTED_CAST_FROM_ASCII
Definition qstring.h:177
\inmodule QtGui
QString toHtml(ExportMode mode=ExportEntireDocument)
Returns the document in HTML format.
QTextHtmlExporter(const QTextDocument *_doc)
QTextFrameFormat::BorderStyle tableCellBorderStyle(int i, int edge) const
bool hasPrefix(QChar c, int lookahead=0) const
bool nodeIsChildOf(int i, QTextHTMLElements id) const
QList< QTextHtmlParserNode * > nodes
QTextHtmlParserNode * resolveParent()
QBrush tableCellBorderBrush(int i, int edge) const
qreal tableCellBorder(int i, int edge) const
void applyAttributes(const QStringList &attributes)
int margin(int i, int mar) const
static int lookupElement(QStringView element)
int topMargin(int i) const
int topPadding(int i) const
int leftMargin(int i) const
const QTextHtmlParserNode & at(int i) const
void parse(const QString &text, const QTextDocument *resourceProvider)
int rightMargin(int i) const
int depth(int i) const
int bottomPadding(int i) const
int leftPadding(int i) const
QStringList parseAttributes()
QTextHtmlParserNode & operator[](int i)
int bottomMargin(int i) const
const QTextDocument * resourceProvider
int rightPadding(int i) const
QTextHtmlParserNode * newNode(int parent)
Combined button and popup list for selecting options.
Definition qcompare.h:110
Q_GUI_EXPORT bool mightBeRichText(QAnyStringView)
Returns true if the string text is likely to be rich text; otherwise returns false.
Q_CORE_EXPORT Q_DECL_CONST_FUNCTION unsigned int qt_int_sqrt(unsigned int n)
\inmodule QtCore \title Global Qt Declarations
Definition qglobal.cpp:99
#define qCDebug(category,...)
static QString colorValue(QColor color)
static bool isOrderedList(int style)
static QLatin1StringView richtextBorderStyleToHtmlBorderStyle(QTextFrameFormat::BorderStyle style)
static QStringList resolvedFontFamilies(const QTextCharFormat &format)
static void printPage(int index, QPainter *painter, const QTextDocument *doc, const QRectF &body, const QPointF &pageNumberPos)
static bool mightBeRichTextImpl(T text)
static bool mightBeRichTextImpl(QUtf8StringView text)
static bool findInBlock(const QTextBlock &block, const QString &expression, int offset, QTextDocument::FindFlags options, QTextCursor *cursor)
static QTextFormat formatDifference(const QTextFormat &from, const QTextFormat &to)
bool qHasPixmapTexture(const QBrush &brush)
Definition qbrush.cpp:206
#define QTextBeginningOfFrame
#define QTextEndOfFrame
QTextHTMLElements
@ Html_h2
@ Html_dl
@ Html_meta
@ Html_samp
@ Html_em
@ Html_code
@ Html_th
@ Html_dd
@ Html_tr
@ Html_NumElements
@ Html_tbody
@ Html_nobr
@ Html_tfoot
@ Html_b
@ Html_h4
@ Html_a
@ Html_caption
@ Html_h5
@ Html_big
@ Html_title
@ Html_table
@ Html_qt
@ Html_address
@ Html_div
@ Html_var
@ Html_i
@ Html_u
@ Html_tt
@ Html_font
@ Html_p
@ Html_ol
@ Html_blockquote
@ Html_head
@ Html_ul
@ Html_span
@ Html_br
@ Html_script
@ Html_thead
@ Html_kbd
@ Html_pre
@ Html_body
@ Html_cite
@ Html_link
@ Html_s
@ Html_unknown
@ Html_dfn
@ Html_sub
@ Html_td
@ Html_hr
@ Html_li
@ Html_img
@ Html_html
@ Html_h6
@ Html_h1
@ Html_small
@ Html_sup
@ Html_del
@ Html_h3
@ Html_dt
@ Html_center
@ Html_strong
@ Html_style
Q_DECLARE_TYPEINFO(QTextHtmlParserNode, Q_RELOCATABLE_TYPE)
const char name[11]
QTextHTMLElements id
bool isNotSelfNesting() const
void initializeProperties(const QTextHtmlParserNode *parent, const QTextHtmlParser *parser)
void parseStyleAttribute(const QString &value, const QTextDocument *resourceProvider)
QTextListFormat::Style listStyle
QTextFrameFormat::BorderStyle borderStyle
QTextCharFormat charFormat
QTextHTMLElements id
bool isNestedList(const QTextHtmlParser *parser) const
bool allowedInContext(int parentId) const
void applyBackgroundImage(const QString &url, const QTextDocument *resourceProvider)
int uncollapsedMargin(int mar) const
void applyForegroundImage(qint64 cacheKey, const QTextDocument *resourceProvider)
QTextFrameFormat::BorderStyle tableCellBorderStyle[4]
QTextBlockFormat blockFormat
bool mayNotHaveChildren() const