2c83ed1c6e7f0ecfad9b046d26be8def249b348d
[WebKit-https.git] / WebCore / html / HTMLParser.h
1 /*
2     This file is part of the KDE libraries
3
4     Copyright (C) 1997 Martin Jones (mjones@kde.org)
5               (C) 1997 Torben Weis (weis@kde.org)
6               (C) 1998 Waldo Bastian (bastian@kde.org)
7               (C) 1999 Lars Knoll (knoll@kde.org)
8     Copyright (C) 2004, 2005, 2006 Apple Computer, Inc.
9
10     This library is free software; you can redistribute it and/or
11     modify it under the terms of the GNU Library General Public
12     License as published by the Free Software Foundation; either
13     version 2 of the License, or (at your option) any later version.
14
15     This library is distributed in the hope that it will be useful,
16     but WITHOUT ANY WARRANTY; without even the implied warranty of
17     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
18     Library General Public License for more details.
19
20     You should have received a copy of the GNU Library General Public License
21     along with this library; see the file COPYING.LIB.  If not, write to
22     the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
23     Boston, MA 02111-1307, USA.
24 */
25 //----------------------------------------------------------------------------
26 //
27 // KDE HTML Widget -- HTML Parser
28
29 #ifndef HTMLPARSER_H
30 #define HTMLPARSER_H
31
32 #include "HTMLDocument.h"
33
34 namespace WebCore {
35
36 class DocumentFragment;
37 class FrameView;
38 class HTMLElement;
39 class HTMLFormElement;
40 class HTMLHeadElement;
41 class HTMLMapElement;
42 class HTMLStackElem;
43 class Token;
44
45 /**
46  * The parser for html. It receives a stream of tokens from the HTMLTokenizer, and
47  * builds up the Document structure form it.
48  */
49 class HTMLParser
50 {
51 public:
52     HTMLParser(Document*);
53     HTMLParser(DocumentFragment*);
54     virtual ~HTMLParser();
55
56     /**
57      * parses one token delivered by the tokenizer
58      */
59     PassRefPtr<Node> parseToken(Token*);
60     
61     /**
62      * tokenizer says it's not going to be sending us any more tokens
63      */
64     void finished();
65
66     /**
67      * resets the parser
68      */
69     void reset();
70
71     bool skipMode() const { return !discard_until.isNull(); }
72     bool noSpaces() const { return !inBody; }
73     bool selectMode() const { return inSelect; }
74
75     HTMLDocument *doc() const { return static_cast<HTMLDocument *>(document); }
76
77 private:
78     void setCurrent(Node* newCurrent);
79     void setSkipMode(const QualifiedName& qName) { discard_until = qName.localName(); }
80
81     Document* document;
82
83     PassRefPtr<Node> getNode(Token*);
84     bool bodyCreateErrorCheck(Token*, RefPtr<Node>&);
85     bool canvasCreateErrorCheck(Token*, RefPtr<Node>&);
86     bool commentCreateErrorCheck(Token*, RefPtr<Node>&);
87     bool ddCreateErrorCheck(Token*, RefPtr<Node>&);
88     bool dtCreateErrorCheck(Token*, RefPtr<Node>&);
89     bool formCreateErrorCheck(Token*, RefPtr<Node>&);
90     bool framesetCreateErrorCheck(Token*, RefPtr<Node>&);
91     bool headCreateErrorCheck(Token*, RefPtr<Node>&);
92     bool iframeCreateErrorCheck(Token*, RefPtr<Node>&);
93     bool isindexCreateErrorCheck(Token*, RefPtr<Node>&);
94     bool mapCreateErrorCheck(Token*, RefPtr<Node>&);
95     bool nestedCreateErrorCheck(Token*, RefPtr<Node>&);
96     bool nestedStyleCreateErrorCheck(Token*, RefPtr<Node>&);
97     bool noembedCreateErrorCheck(Token*, RefPtr<Node>&);
98     bool noframesCreateErrorCheck(Token*, RefPtr<Node>&);
99     bool nolayerCreateErrorCheck(Token*, RefPtr<Node>&);
100     bool noscriptCreateErrorCheck(Token*, RefPtr<Node>&);
101     bool selectCreateErrorCheck(Token*, RefPtr<Node>&);
102     bool tableCellCreateErrorCheck(Token*, RefPtr<Node>&);
103     bool tableSectionCreateErrorCheck(Token*, RefPtr<Node>&);
104     bool textCreateErrorCheck(Token*, RefPtr<Node>&);
105
106     void processCloseTag(Token *);
107
108     bool insertNode(Node *n, bool flat = false);
109     bool handleError(Node* n, bool flat, const AtomicString& localName, int tagPriority);
110     
111     // The currently active element (the one new elements will be added to).  Can be a DocumentFragment, a Document or an Element.
112     Node* current;
113
114     bool currentIsReferenced;
115
116     HTMLStackElem *blockStack;
117
118     void pushBlock(const AtomicString& tagName, int _level);
119     void popBlock(const AtomicString& tagName);
120     void popBlock(const QualifiedName& qName) { return popBlock(qName.localName()); } // Convenience function for readability.
121     void popOneBlock(bool delBlock = true);
122     void popInlineBlocks();
123
124     void freeBlock();
125
126     void createHead();
127
128     bool isResidualStyleTag(const AtomicString& tagName);
129     bool isAffectedByResidualStyle(const AtomicString& tagName);
130     void handleResidualStyleCloseTagAcrossBlocks(HTMLStackElem* elem);
131     void reopenResidualStyleTags(HTMLStackElem* elem, Node* malformedTableParent);
132
133     bool allowNestedRedundantTag(const AtomicString& tagName);
134     
135     static bool isHeaderTag(const AtomicString& tagName);
136     void popNestedHeaderTag();
137
138     bool isInline(Node* node) const;
139     
140     /*
141      * currently active form
142      */
143     HTMLFormElement *form;
144
145     /*
146      * current map
147      */
148     HTMLMapElement *map;
149
150     /*
151      * the head element. Needed for crappy html which defines <base> after </head>
152      */
153     HTMLHeadElement *head;
154
155     /*
156      * a possible <isindex> element in the head. Compatibility hack for
157      * html from the stone age
158      */
159     RefPtr<Node> isindex;
160     Node* handleIsindex(Token*);
161
162     /*
163      * inserts the stupid isIndex element.
164      */
165     void startBody();
166
167     bool inBody;
168     bool haveContent;
169     bool haveFrameSet;
170     bool end;
171     bool inSelect;
172
173     /*
174      * tells the parser to discard all tags, until it reaches the one specified
175      */
176     AtomicString discard_until;
177
178     bool headLoaded;
179     bool m_fragment;
180     int inStrayTableContent;
181 };
182
183 }
184     
185 #endif // HTMLPARSER_H