Source Code (Use browser search to find items of interest.)

Class Index

kword'KRTFHeaderParser (./koffice/kword/filters/rtf/KRTFHeaderParser.h:12)

class KRTFHeaderParser : public KRTFParser
{
public:
    KRTFHeaderParser( KRTFTokenizer* tokenizer ) {
	_tokenizer = tokenizer;
    }

    bool parse();
    
private:
};

kword'KRTFHeaderParser::parse() (./koffice/kword/filters/rtf/KRTFHeaderParser.cpp:9)

bool KRTFHeaderParser::parse()
{
    // Syntax for <header> is:
    // \rtf <charset> \deff? <fonttbl> <filetbl>? <colortbl>? <stylesheet>? <listtables>? <revtbl>?

    // First keyword must be \rtf
    KRTFToken* token = _tokenizer->nextToken();
    KRTFToken* token2;
    if( token->_type != ControlWord &&
	token->_text != "rtf" ) {
	warning( "File does not start with \rtf" );
	return false;
    }
    if( token->_param.left( 1 ) != "1" ) {
	warning( "Wrong version of RTF file, this reader can only read RTF 1.x files" );
	return false;
    }
    
    // PENDING(kalle): Understand the keywords that are possible here, like \ansi

    // skip over unknown keywords until we find the fonttbl group
    token = _tokenizer->nextToken();
    while( token->_type == ControlWord ) {
	token = _tokenizer->nextToken();
    }

    
    // If there are group here, check whether it is one that we know of
    bool done = false;
    token2 = token;
    while( token->_type == OpenGroup && !done ) {
	token = _tokenizer->nextToken();
	if( token->_text == "fonttbl" ) {
	    // PENDING(kalle) parse fonttbl here instead
	    skipGroup();
	    token = _tokenizer->nextToken();
	}
	else if( token->_text == "filetbl" ) {
	    // PENDING(kalle) parse filetbl here instead
	    skipGroup();
	    token = _tokenizer->nextToken();
	} else if( token->_text == "colortbl" ) {
	    // PENDING(kalle) parse colortbl here instead
	    skipGroup();
	    token = _tokenizer->nextToken();
	} else if( token->_text == "stylesheet" ) {
	    // PENDING(kalle) parse stylesheet here instead
	    skipGroup();
	    token = _tokenizer->nextToken();
	} else if( token->_text == "listtables" ) {
	    // PENDING(kalle) parse listtables here instead
	    skipGroup();
	    token = _tokenizer->nextToken();
	} else if( token->_text == "revtables" ) {
	    // PENDING(kalle) parse revtables here instead
	    skipGroup();
	    token = _tokenizer->nextToken();
	} else
	    // no group that we know of, next must be the document
	    done = true;
    }

    // Return the last token that was unrightfully taken from somewhere else
    _tokenizer->pushBack( token );
    _tokenizer->pushBack( token2 );

    // the currently read token should already be the end of the header,
    // no need to overread anything

    return true;
}