📄 qtexthtmlparser_p.h
字号:
/******************************************************************************** Copyright (C) 1992-2007 Trolltech ASA. All rights reserved.**** This file is part of the QtGui module of the Qt Toolkit.**** This file may be used under the terms of the GNU General Public** License version 2.0 as published by the Free Software Foundation** and appearing in the file LICENSE.GPL included in the packaging of** this file. Please review the following information to ensure GNU** General Public Licensing requirements will be met:** http://trolltech.com/products/qt/licenses/licensing/opensource/**** If you are unsure which license is appropriate for your use, please** review the following information:** http://trolltech.com/products/qt/licenses/licensing/licensingoverview** or contact the sales department at sales@trolltech.com.**** In addition, as a special exception, Trolltech gives you certain** additional rights. These rights are described in the Trolltech GPL** Exception version 1.0, which can be found at** http://www.trolltech.com/products/qt/gplexception/ and in the file** GPL_EXCEPTION.txt in this package.**** In addition, as a special exception, Trolltech, as the sole copyright** holder for Qt Designer, grants users of the Qt/Eclipse Integration** plug-in the right for the Qt/Eclipse Integration to link to** functionality provided by Qt Designer and its related libraries.**** Trolltech reserves all rights not expressly granted herein.**** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.******************************************************************************/#ifndef QTEXTHTMLPARSER_P_H#define QTEXTHTMLPARSER_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 "QtCore/qvector.h"#include "QtGui/qbrush.h"#include "QtGui/qcolor.h"#include "QtGui/qfont.h"#include "QtGui/qtextdocument.h"#include "QtGui/qtextcursor.h"#include "private/qtextformat_p.h"#include "private/qtextdocument_p.h"#include "private/qcssparser_p.h"enum QTextHTMLElements { Html_unknown = -1, Html_qt = 0, Html_body, Html_a, Html_em, Html_i, Html_big, Html_small, Html_strong, Html_b, Html_cite, Html_address, Html_var, Html_dfn, Html_h1, Html_h2, Html_h3, Html_h4, Html_h5, Html_h6, Html_p, Html_center, Html_font, Html_ul, Html_ol, Html_li, Html_code, Html_tt, Html_kbd, Html_samp, Html_img, Html_br, Html_hr, Html_sub, Html_sup, Html_pre, Html_blockquote, Html_head, Html_div, Html_span, Html_dl, Html_dt, Html_dd, Html_u, Html_s, Html_nobr, // tables Html_table, Html_tr, Html_td, Html_th, Html_thead, Html_tbody, Html_tfoot, Html_caption, // misc... Html_html, Html_style, Html_title, Html_meta, Html_link, Html_NumElements};struct QTextHtmlElement{ const char *name; QTextHTMLElements id; enum DisplayMode { DisplayBlock, DisplayInline, DisplayTable, DisplayNone } displayMode;};class QTextHtmlParser;struct QTextHtmlParserNode { enum WhiteSpaceMode { WhiteSpaceNormal, WhiteSpacePre, WhiteSpaceNoWrap, WhiteSpacePreWrap, WhiteSpaceModeUndefined = -1 }; QTextHtmlParserNode(); QString tag; QString text; QStringList attributes; int parent; QVector<int> children; QTextHTMLElements id; QTextCharFormat charFormat; QTextBlockFormat blockFormat; uint cssFloat : 2; uint hasOwnListStyle : 1; uint hasCssListIndent : 1; uint isEmptyParagraph : 1; uint isTextFrame : 1; uint isRootFrame : 1; uint displayMode : 3; // QTextHtmlElement::DisplayMode uint hasHref : 1; QTextListFormat::Style listStyle; QString imageName; qreal imageWidth; qreal imageHeight; QTextLength width; QTextLength height; qreal tableBorder; int tableCellRowSpan; int tableCellColSpan; qreal tableCellSpacing; qreal tableCellPadding; QBrush borderBrush; QTextFrameFormat::BorderStyle borderStyle; int userState; int cssListIndent; WhiteSpaceMode wsm; inline bool isListStart() const { return id == Html_ol || id == Html_ul; } inline bool isTableCell() const { return id == Html_td || id == Html_th; } inline bool isBlock() const { return displayMode == QTextHtmlElement::DisplayBlock; } inline bool isNotSelfNesting() const { return id == Html_p || id == Html_li; } inline bool allowedInContext(int parentId) const { switch (id) { case Html_dd: case Html_dt: return (parentId == Html_dl); case Html_tr: return (parentId == Html_table || parentId == Html_thead || parentId == Html_tbody || parentId == Html_tfoot ); case Html_th: case Html_td: return (parentId == Html_tr); case Html_thead: case Html_tbody: case Html_tfoot: return (parentId == Html_table); case Html_caption: return (parentId == Html_table); default: break; } return true; } inline bool mayNotHaveChildren() const { return id == Html_img || id == Html_hr || id == Html_br; } void initializeProperties(const QTextHtmlParserNode *parent, const QTextHtmlParser *parser); inline int uncollapsedMargin(int mar) const { return margin[mar]; } bool isNestedList(const QTextHtmlParser *parser) const; void parseStyleAttribute(const QString &value, const QTextDocument *resourceProvider); void applyCssDeclarations(const QVector<QCss::Declaration> &declarations, const QTextDocument *resrouceProvider); void setListStyle(const QVector<QCss::Value> &cssValues); bool hasOnlyWhitespace() const; int margin[4]; friend class QTextHtmlParser;};Q_DECLARE_TYPEINFO(QTextHtmlParserNode, Q_MOVABLE_TYPE);class QTextHtmlParser{public: enum Margin { MarginTop, MarginRight, MarginBottom, MarginLeft }; inline const QTextHtmlParserNode &at(int i) const { return nodes.at(i); } inline QTextHtmlParserNode &operator[](int i) { return nodes[i]; } inline int count() const { return nodes.count(); } inline int last() const { return nodes.count()-1; } int depth(int i) const; int topMargin(int i) const; int bottomMargin(int i) const; inline int leftMargin(int i) const { return margin(i, MarginLeft); } inline int rightMargin(int i) const { return margin(i, MarginRight); } void dumpHtml(); void parse(const QString &text, const QTextDocument *resourceProvider); static int lookupElement(const QString &element);protected: QTextHtmlParserNode *newNode(int parent); QVector<QTextHtmlParserNode> nodes; QString txt; int pos, len; bool textEditMode; void parse(); void parseTag(); void parseCloseTag(); void parseExclamationTag(); QString parseEntity(); QString parseWord(); QTextHtmlParserNode *resolveParent(); void resolveNode(); QStringList parseAttributes(); void applyAttributes(const QStringList &attributes); void eatSpace(); inline bool hasPrefix(QChar c, int lookahead = 0) const {return pos + lookahead < len && txt.at(pos) == c; } int margin(int i, int mar) const; bool nodeIsChildOf(int i, QTextHTMLElements id) const; QVector<QCss::Declaration> declarationsForNode(int node) const; void resolveStyleSheetImports(const QCss::StyleSheet &sheet); void importStyleSheet(const QString &href); struct ExternalStyleSheet { inline ExternalStyleSheet() {} inline ExternalStyleSheet(const QString &_url, const QCss::StyleSheet &_sheet) : url(_url), sheet(_sheet) {} QString url; QCss::StyleSheet sheet; }; QVector<ExternalStyleSheet> externalStyleSheets; QVector<QCss::StyleSheet> inlineStyleSheets; const QTextDocument *resourceProvider;};#endif // QTEXTHTMLPARSER_P_H
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -