Lexer::Token Hdref::parse( Lexer* lexer ) { std::wstring refid; std::wstring res; Lexer::Token tok( document->getNextToken() ); while( tok != Lexer::TAGEND ) { //parse attributes if( tok == Lexer::ATTRIBUTE ) { std::wstring key; std::wstring value; splitAttribute( lexer->text(), key, value ); if( key == L"res" ) res = value; else if( key == L"refid" ) refid = value; else document->printError( ERR1_ATTRNOTDEF ); } else if( tok == Lexer::FLAG ) document->printError( ERR1_ATTRNOTDEF ); else if( tok == Lexer::ERROR_TAG ) throw FatalError( ERR_SYNTAX ); else if( tok == Lexer::END ) throw FatalError( ERR_EOF ); else document->printError( ERR1_TAGSYNTAX ); tok = document->getNextToken(); } std::wstring temp( L":link reftype=hd" ); if( !refid.empty() ) { temp += L" refid="; temp += refid; } if( !res.empty() ) { temp += L" res="; temp += res; } temp += L'.'; temp += document->reference(); temp += L":elink."; if( !refid.empty() || !res.empty() ) { std::wstring* fname( new std::wstring() ); prepBufferName( fname, *( document->dataName() ) ); fname = document->addFileName( fname ); document->pushInput( new IpfBuffer( fname, document->dataLine(), document->dataCol(), temp ) ); bool oldBlockParsing( document->blockParsing() ); document->setBlockParsing( true ); tok = document->getNextToken(); //first token from buffer while( tok != Lexer::END ) { if( parseInline( lexer, tok ) ) parseCleanup( lexer, tok ); } document->setBlockParsing( oldBlockParsing ); document->popInput(); } return document->getNextToken(); //next token from stream }
Lexer::Token Caution::parse( Lexer* lexer ) { std::wstring temp; std::wstring* fname( new std::wstring() ); prepBufferName( fname, *( document->dataName() ) ); fname = document->addFileName( fname ); Lexer::Token tok( document->getNextToken() ); while( tok != Lexer::TAGEND ) { if( tok == Lexer::ATTRIBUTE ) { std::wstring key; std::wstring value; splitAttribute( lexer->text(), key, value ); if( key == L"text" ) { temp = L":hp2."; temp += value; temp += L":ehp2.\n"; } else document->printError( ERR1_ATTRNOTDEF ); } else if( tok == Lexer::FLAG ) document->printError( ERR1_ATTRNOTDEF ); else if( tok == Lexer::ERROR_TAG ) throw FatalError( ERR_SYNTAX ); else if( tok == Lexer::END ) throw FatalError( ERR_EOF ); else document->printError( ERR1_TAGSYNTAX ); tok = document->getNextToken(); } if( temp.empty() ) { temp = L":hp2."; temp += document->caution(); temp += L":ehp2.\n"; } document->pushInput( new IpfBuffer( fname, document->dataLine(), document->dataCol(), temp ) ); bool oldBlockParsing( document->blockParsing() ); document->setBlockParsing( true ); whiteSpace = Tag::LITERAL; appendChild( new P( document, this, document->dataName(), document->lexerLine(), document->lexerCol() ) ); tok = document->getNextToken(); //first token from buffer while( tok != Lexer::END ) { if( parseInline( lexer, tok ) ) parseCleanup( lexer, tok ); } whiteSpace = Tag::NONE; document->setBlockParsing( oldBlockParsing ); document->popInput(); tok = document->getNextToken(); //next token from main stream while( tok != Lexer::END && !( tok == Lexer::TAG && lexer->tagId() == Lexer::EUSERDOC)) { if( parseInline( lexer, tok ) ) { if( lexer->tagId() == Lexer::ECAUTION ) break; else if( lexer->tagId() == Lexer::H1 || lexer->tagId() == Lexer::H2 || lexer->tagId() == Lexer::H3 || lexer->tagId() == Lexer::H4 || lexer->tagId() == Lexer::H5 || lexer->tagId() == Lexer::H6 || lexer->tagId() == Lexer::ACVIEWPORT || lexer->tagId() == Lexer::FN ) parseCleanup( lexer, tok ); else if( parseBlock( lexer, tok ) ) { if( parseListBlock( lexer, tok ) ) parseCleanup( lexer, tok ); } } } return tok; }