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 P::parse( Lexer* lexer ) { Lexer::Token tok( parseAttributes( lexer ) ); while( tok != Lexer::END && !( tok == Lexer::TAG && lexer->tagId() == Lexer::EUSERDOC ) ) { //may contain inline, not block if( parseInline( lexer, tok ) ) break; } return tok; }
Lexer::Token Xmp::parse( Lexer* lexer ) { Lexer::Token tok( parseAttributes( lexer ) ); while( tok != Lexer::END && !( tok == Lexer::TAG && lexer->tagId() == Lexer::EUSERDOC)) { if( parseInline( lexer, tok ) ) { if( lexer->tagId() == Lexer::EXMP ) break; else parseCleanup( lexer, tok ); } } return tok; }
Lexer::Token Fn::parse( Lexer* lexer ) { Lexer::Token tok( parseAttributes( lexer ) ); // bool done( false ); while( tok != Lexer::END && !( tok == Lexer::TAG && lexer->tagId() == Lexer::EUSERDOC)) { if( lexer->tagId() == Lexer::EFN ) { tok = Tag::parseAttributes( lexer ); break; } else if( parseInline( lexer, tok ) ) { if( parseBlock( lexer, tok ) ) { if( parseListBlock( lexer, tok ) ) parseCleanup( lexer, tok ); } } } return tok; }
Lexer::Token SlLi::parse( Lexer* lexer ) { Lexer::Token tok( parseAttributes( lexer ) ); while( tok != Lexer::END && !( tok == Lexer::TAG && lexer->tagId() == Lexer::EUSERDOC ) ) { if( parseInline( lexer, tok ) ) { if( lexer->tagId() == Lexer::LI ) break; else if( lexer->tagId() == Lexer::LP ) { Element* elt( new P( document, this, document->dataName(), document->dataLine(), document->dataCol() ) ); appendChild( elt ); tok = elt->parse( lexer ); } else if( parseBlock( lexer, tok ) ) break; } } return tok; }
Lexer::Token Sl::parse( Lexer* lexer ) { Lexer::Token tok( parseAttributes( lexer ) ); unsigned int itemCount( 0 ); while( tok != Lexer::END && !( tok == Lexer::TAG && lexer->tagId() == Lexer::EUSERDOC ) ) { if( parseInline( lexer, tok ) ) { switch( lexer->tagId() ) { case Lexer::DL: { Element* elt( new Dl( document, this, document->dataName(), document->dataLine(), document->dataCol(), nestLevel + 1, indent == 1 ? 4 : indent + 4 ) ); appendChild( elt ); tok = elt->parse( lexer ); } break; case Lexer::OL: { Element* elt( new Ol( document, this, document->dataName(), document->dataLine(), document->dataCol(), nestLevel + 1, indent == 1 ? 4 : indent + 4 ) ); appendChild( elt ); tok = elt->parse( lexer ); } break; case Lexer::LI: { Element* elt( new SlLi( document, this, document->dataName(), document->dataLine(), document->dataCol(), itemCount++, nestLevel, indent, compact ) ); appendChild( elt ); tok = elt->parse( lexer ); } break; case Lexer::LP: { Element* elt( new Lp( document, this, document->dataName(), document->dataLine(), document->dataCol(), indent ) ); appendChild( elt ); tok = elt->parse( lexer ); } break; case Lexer::PARML: { Element* elt( new Parml( document, this, document->dataName(), document->dataLine(), document->dataCol(), nestLevel + 1, indent == 1 ? 4 : indent + 4 ) ); appendChild( elt ); tok = elt->parse( lexer ); } break; case Lexer::SL: { Element* elt( new Sl( document, this, document->dataName(), document->dataLine(), document->dataCol(), nestLevel + 1, indent == 1 ? 4 : indent + 4 ) ); appendChild( elt ); tok = elt->parse( lexer ); } break; case Lexer::ESL: { Element* elt( new ESl( document, this, document->dataName(), document->dataLine(), document->dataCol() ) ); appendChild( elt ); tok = elt->parse( lexer ); if( !nestLevel ) appendChild( new BrCmd( document, this, document->dataName(), document->dataLine(), document->dataCol() ) ); return tok; } case Lexer::UL: { Element* elt( new Ul( document, this, document->dataName(), document->dataLine(), document->dataCol(), nestLevel + 1, indent == 1 ? 4 : indent + 4 ) ); appendChild( elt ); tok = elt->parse( lexer ); } break; default: document->printError( ERR1_NOENDLIST ); return tok; } } } return tok; }
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; }