virtual void processFragment(Fragment const * fragment) { static std::regex const splitter(R"(^for\s+(\w[a-zA-Z0-9 _,]*) \s*in\s+(.+)$)"); std::smatch match; std::string cleaned = fragment->clean(); if (!std::regex_match(cleaned, match, splitter)) { throw TemplateSyntaxError(fragment->clean()); } std::string vars = match[1]; static std::regex const varNameExtractor(R"(\s*,\s*)"); std::sregex_token_iterator varNamesIter(vars.begin(), vars.end(), varNameExtractor, -1); std::vector< std::string > possibleVars; static std::sregex_token_iterator const end; std::copy(varNamesIter, end, std::back_inserter(possibleVars)); if (std::find(possibleVars.begin(), possibleVars.end(), "") != possibleVars.end()) { throw TemplateSyntaxError(vars); } m_vars = possibleVars; m_container = match[2]; } virtual void exitScope(std::string const & endTag) { if (endTag != "endfor") throw TemplateSyntaxError(endTag); }
void BlockNode::processFragment( Fragment const * fragment ) { static std::regex const blockSplitter( R"(^block\s+(\w+)$)" ); std::smatch match; std::string cleaned = fragment->clean(); if( ! std::regex_match( cleaned, match, blockSplitter ) ) { throw TemplateSyntaxError( fragment->clean() ); } m_blockName = match[ 1 ]; } void BlockNode::exitScope( std::string const & endTag ) { if( endTag != "endblock" ) throw TemplateSyntaxError( endTag ); }