Reviewed by Ken.
[WebKit-https.git] / WebCore / khtml / 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 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 // 0 all
33 // 1 domtree + rendertree + styleForElement, no layouting
34 // 2 domtree only
35 #define SPEED_DEBUG 0
36
37 #ifdef SPEED_DEBUG
38 #include <qdatetime.h>
39 #endif
40
41 #include "dom/dom_string.h"
42 #include "xml/dom_nodeimpl.h"
43 #include "html/html_documentimpl.h"
44 #include "misc/htmltags.h"
45
46 class KHTMLView;
47 class HTMLStackElem;
48
49 namespace DOM {
50     class HTMLDocumentImpl;
51     class DocumentPtr;
52     class HTMLElementImpl;
53     class NodeImpl;
54     class HTMLFormElementImpl;
55     class HTMLMapElementImpl;
56     class HTMLHeadElementImpl;
57     class DocumentFragmentImpl;
58 }
59
60 namespace khtml {
61     class Token;
62 };
63
64 class KHTMLParser;
65
66 /**
67  * The parser for html. It receives a stream of tokens from the HTMLTokenizer, and
68  * builds up the Document structure form it.
69  */
70 class KHTMLParser
71 {
72 public:
73     KHTMLParser(KHTMLView *w, DOM::DocumentPtr *i, bool includesComments=false);
74     KHTMLParser(DOM::DocumentFragmentImpl *frag, DOM::DocumentPtr *doc, bool includesComments=false);
75     virtual ~KHTMLParser();
76
77     /**
78      * parses one token delivered by the tokenizer
79      */
80     void parseToken(khtml::Token *_t);
81     
82     /**
83      * tokenizer says it's not going to be sending us any more tokens
84      */
85     void finished();
86
87     /**
88      * resets the parser
89      */
90     void reset();
91
92     bool skipMode() const { return (discard_until != 0); }
93     bool noSpaces() const { return !inBody; }
94     bool selectMode() const { return inSelect; }
95
96     DOM::HTMLDocumentImpl *doc() const { return static_cast<DOM::HTMLDocumentImpl *>(document->document()); }
97     DOM::DocumentPtr *docPtr() const { return document; }
98
99 protected:
100     void setCurrent(DOM::NodeImpl *newCurrent);
101
102     KHTMLView *HTMLWidget;
103     DOM::DocumentPtr *document;
104
105     /*
106      * generate an element from the token
107      */
108     DOM::NodeImpl *getElement(khtml::Token *);
109
110     void processCloseTag(khtml::Token *);
111
112     bool insertNode(DOM::NodeImpl *n, bool flat = false);
113
114     /*
115      * The currently active element (the one new elements will be added to)
116      */
117     DOM::NodeImpl *current;
118     bool currentIsReferenced;
119
120     HTMLStackElem *blockStack;
121
122     void pushBlock( int _id, int _level);
123
124     void popBlock( int _id );
125     void popOneBlock(bool delBlock = true);
126     void popInlineBlocks();
127
128     void freeBlock( void);
129
130     void createHead();
131
132     bool isResidualStyleTag(int _id);
133     bool isAffectedByResidualStyle(int _id);
134     void handleResidualStyleCloseTagAcrossBlocks(HTMLStackElem* elem);
135     void reopenResidualStyleTags(HTMLStackElem* elem, DOM::NodeImpl* malformedTableParent);
136
137     bool allowNestedRedundantTag(int _id);
138     
139     static bool isHeaderTag(int _id);
140     void popNestedHeaderTag();
141
142     /*
143      * currently active form
144      */
145     DOM::HTMLFormElementImpl *form;
146
147     /*
148      * current map
149      */
150     DOM::HTMLMapElementImpl *map;
151
152     /*
153      * the head element. Needed for crappy html which defines <base> after </head>
154      */
155     DOM::HTMLHeadElementImpl *head;
156
157     /*
158      * a possible <isindex> element in the head. Compatibility hack for
159      * html from the stone age
160      */
161     DOM::NodeImpl *isindex;
162     DOM::NodeImpl *handleIsindex( khtml::Token *t );
163
164     /*
165      * inserts the stupid isIndex element.
166      */
167     void startBody();
168
169     bool inBody;
170     bool haveContent;
171     bool haveFrameSet;
172     bool end;
173     bool inSelect;
174
175     /*
176      * tells the parser to discard all tags, until it reaches the one specified
177      */
178     int discard_until;
179
180     bool headLoaded;
181     int inStrayTableContent;
182
183     bool includesCommentsInDOM;
184     
185     ushort forbiddenTag[ID_LAST_TAG + 1];
186     
187 #if SPEED_DEBUG > 0
188     QTime qt;
189 #endif
190 };
191
192 #endif // HTMLPARSER_H