void Document::_processBlocksItems(TokenPtr inTokenContainer) { if (!inTokenContainer->isContainer()) return; token::Container *tokens=dynamic_cast<token::Container*>(inTokenContainer.get()); assert(tokens!=0); TokenGroup processed; for (TokenGroup::const_iterator ii=tokens->subTokens().begin(), iie=tokens->subTokens().end(); ii!=iie; ++ii) { if ((*ii)->text()) { optional<TokenPtr> subitem; if (!subitem) subitem=parseHeader(ii, iie); if (!subitem) subitem=parseHorizontalRule(ii, iie); if (!subitem) subitem=parseListBlock(ii, iie); if (!subitem) subitem=parseBlockQuote(ii, iie); if (!subitem) subitem=parseCodeBlock(ii, iie); if (subitem) { _processBlocksItems(*subitem); processed.push_back(*subitem); if (ii==iie) break; continue; } else processed.push_back(*ii); } else if ((*ii)->isContainer()) { _processBlocksItems(*ii); processed.push_back(*ii); } } tokens->swapSubtokens(processed); }
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 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; }