Esempio n. 1
0
		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);
		}
Esempio n. 2
0
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 );
}