d392d200cbbac09f79adffb5693b316900c9aec4
[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) 2003 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
42 #include "dom/dom_string.h"
43 #include "xml/dom_nodeimpl.h"
44 #include "html/html_documentimpl.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     ushort *forbiddenTag;
143     
144     /*
145      * currently active form
146      */
147     DOM::HTMLFormElementImpl *form;
148
149     /*
150      * current map
151      */
152     DOM::HTMLMapElementImpl *map;
153
154     /*
155      * the head element. Needed for crappy html which defines <base> after </head>
156      */
157     DOM::HTMLHeadElementImpl *head;
158
159     /*
160      * a possible <isindex> element in the head. Compatibility hack for
161      * html from the stone age
162      */
163     DOM::NodeImpl *isindex;
164     DOM::NodeImpl *handleIsindex( khtml::Token *t );
165
166     /*
167      * inserts the stupid isIndex element.
168      */
169     void startBody();
170
171     bool inBody;
172     bool haveContent;
173     bool haveFrameSet;
174     bool end;
175     bool inSelect;
176
177     /*
178      * tells the parser to discard all tags, until it reaches the one specified
179      */
180     int discard_until;
181
182     bool headLoaded;
183     int inStrayTableContent;
184
185     bool includesCommentsInDOM;
186     
187 #if SPEED_DEBUG > 0
188     QTime qt;
189 #endif
190 };
191
192 #endif // HTMLPARSER_H
193