#ifndef HTMLTOKENIZER_H
#define HTMLTOKENIZER_H
class KCharsets;
class StringTokenizer;
class HTMLTokenizer;
#include <qstring.h>
#include <qobject.h>
#include <qptrqueue.h>
#include "misc/loader_client.h"
#include "misc/htmltags.h"
#include "misc/stringit.h"
#include "xml/dom_stringimpl.h"
#include "xml/xml_tokenizer.h"
#include "xml/dom_elementimpl.h"
#include "xml/dom_docimpl.h"
#if APPLE_CHANGES
#ifdef __OBJC__
#define id id_AVOID_KEYWORD
#endif
#endif
class KHTMLParser;
class KHTMLView;
namespace DOM {
class DocumentPtr;
class DocumentFragmentImpl;
}
namespace khtml {
class CachedScript;
class Token
{
public:
Token() {
id = 0;
attrs = 0;
text = 0;
flat = false;
}
~Token() {
if(attrs) attrs->deref();
if(text) text->deref();
}
void addAttribute(DOM::DocumentImpl* doc, QChar* buffer, const QString& attrName, const DOM::DOMString& v)
{
DOM::AttributeImpl* a = 0;
if(buffer->unicode())
a = new DOM::AttributeImpl(buffer->unicode(), v.implementation());
else if ( !attrName.isEmpty() && attrName != "/" )
a = new DOM::AttributeImpl(doc->attrId(0, DOM::DOMString(attrName).implementation(), false),
v.implementation());
if (a) {
if(!attrs) {
attrs = new DOM::NamedAttrMapImpl(0);
attrs->ref();
}
attrs->insertAttribute(a);
}
}
void reset()
{
if(attrs) {
attrs->deref();
attrs = 0;
}
id = 0;
if(text) {
text->deref();
text = 0;
}
flat = false;
}
DOM::NamedAttrMapImpl* attrs;
DOM::DOMStringImpl* text;
ushort id;
bool flat;
};
};
#define TAB_SIZE 8
class HTMLTokenizer : public Tokenizer, public khtml::CachedObjectClient
{
public:
HTMLTokenizer(DOM::DocumentPtr *, KHTMLView * = 0);
HTMLTokenizer(DOM::DocumentPtr *, DOM::DocumentFragmentImpl *frag);
virtual ~HTMLTokenizer();
void begin();
void write( const QString &str, bool appendData );
void end();
void finish();
virtual void setOnHold(bool _onHold);
protected:
void reset();
void addPending();
void processToken();
void processListing(khtml::DOMStringIt list);
void parseComment(khtml::DOMStringIt &str);
void parseServer(khtml::DOMStringIt &str);
void parseText(khtml::DOMStringIt &str);
void parseListing(khtml::DOMStringIt &str);
void parseSpecial(khtml::DOMStringIt &str);
void parseTag(khtml::DOMStringIt &str);
void parseEntity(khtml::DOMStringIt &str, QChar *&dest, bool start = false);
void parseProcessingInstruction(khtml::DOMStringIt &str);
void scriptHandler();
void scriptExecution(const QString& script, QString scriptURL = QString(),
int baseLine = 0);
void setSrc(const QString &source);
inline void checkBuffer(int len = 10)
{
if ( (dest - buffer) > size-len )
enlargeBuffer(len);
}
inline void checkScriptBuffer(int len = 10)
{
if ( scriptCodeSize + len >= scriptCodeMaxSize )
enlargeScriptBuffer(len);
}
void enlargeBuffer(int len);
void enlargeScriptBuffer(int len);
void notifyFinished(khtml::CachedObject *finishedObj);
protected:
QChar *buffer;
QChar *dest;
khtml::Token currToken;
int size;
enum
{
NoQuote = 0,
SingleQuote,
DoubleQuote
} tquote;
enum
{
NonePending = 0,
SpacePending,
LFPending,
TabPending
} pending;
enum
{
NoneDiscard = 0,
SpaceDiscard,
LFDiscard,
AllDiscard } discard;
bool skipLF;
bool startTag;
enum {
NoTag = 0,
TagName,
SearchAttribute,
AttributeName,
SearchEqual,
SearchValue,
QuotedValue,
Value,
SearchEnd
} tag;
enum {
NoEntity = 0,
SearchEntity,
NumericSearch,
Hexadecimal,
Decimal,
EntityName,
SearchSemicolon
} Entity;
unsigned EntityUnicodeValue;
bool script;
bool pre;
int prePos;
bool style;
bool select;
bool xmp;
bool title;
bool plaintext;
bool processingInstruction;
bool comment;
bool textarea;
bool escaped;
bool server;
bool brokenServer;
QString attrName;
bool attrNamePresent;
QChar *scriptCode;
int scriptCodeSize;
int scriptCodeMaxSize;
int scriptCodeResync;
QChar searchBuffer[ 10 ];
int searchCount;
const QChar *searchFor;
const char* searchStopper;
int searchStopperLen;
bool loadingExtScript;
bool noMoreData;
QString scriptSrc;
QString scriptSrcCharset;
bool javascript;
QString pendingSrc;
int m_executingScript;
QPtrQueue<khtml::CachedScript> cachedScript;
bool onHold;
bool brokenComments;
int lineno;
int scriptStartLineno;
int tagStartLineno;
#define CBUFLEN 14
char cBuffer[CBUFLEN+2];
unsigned int cBufferPos;
QString _src;
khtml::DOMStringIt src;
KCharsets *charsets;
KHTMLParser *parser;
KHTMLView *view;
#ifndef NDEBUG
bool inWrite;
#endif
};
#if APPLE_CHANGES
#undef id
#endif
#endif // HTMLTOKENIZER