summaryrefslogtreecommitdiff
path: root/src/gui/text/qtexthtmlparser_p.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/gui/text/qtexthtmlparser_p.h')
-rw-r--r--src/gui/text/qtexthtmlparser_p.h342
1 files changed, 342 insertions, 0 deletions
diff --git a/src/gui/text/qtexthtmlparser_p.h b/src/gui/text/qtexthtmlparser_p.h
new file mode 100644
index 0000000000..a27b2f2ca1
--- /dev/null
+++ b/src/gui/text/qtexthtmlparser_p.h
@@ -0,0 +1,342 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the QtGui module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.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 the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#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"
+
+#ifndef QT_NO_TEXTHTMLPARSER
+
+QT_BEGIN_NAMESPACE
+
+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_script,
+
+ 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);
+ case Html_body: return parentId != Html_head;
+ default: break;
+ }
+ return true;
+ }
+
+ inline bool mayNotHaveChildren() const
+ { return id == Html_img || id == Html_hr || id == Html_br || id == Html_meta; }
+
+ 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);
+
+#ifndef QT_NO_CSSPARSER
+ void applyCssDeclarations(const QVector<QCss::Declaration> &declarations, const QTextDocument *resourceProvider);
+
+ void setListStyle(const QVector<QCss::Value> &cssValues);
+#endif
+
+ void applyBackgroundImage(const QString &url, const QTextDocument *resourceProvider);
+
+ bool hasOnlyWhitespace() const;
+
+ int margin[4];
+ int padding[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); }
+
+ inline int topPadding(int i) const { return at(i).padding[MarginTop]; }
+ inline int bottomPadding(int i) const { return at(i).padding[MarginBottom]; }
+ inline int leftPadding(int i) const { return at(i).padding[MarginLeft]; }
+ inline int rightPadding(int i) const { return at(i).padding[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;
+
+
+#ifndef QT_NO_CSSPARSER
+ 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;
+#endif
+
+ const QTextDocument *resourceProvider;
+};
+
+QT_END_NAMESPACE
+
+#endif // QT_NO_TEXTHTMLPARSER
+
+#endif // QTEXTHTMLPARSER_P_H