diff --git a/demofiles/demo.html.templ b/demofiles/demo.html.templ index 8f35b19..17c9528 100644 --- a/demofiles/demo.html.templ +++ b/demofiles/demo.html.templ @@ -10,7 +10,7 @@ </head> <body> {% for(size_t i = 0; i < no; i++) %} - {# render "greeting.templ", names[i] #}<br /> + {# render("greeting.templ", names[i]) #}<br /> {% end %} </body> </html> diff --git a/src/parser.y b/src/parser.y index 7701177..54fa1ca 100644 --- a/src/parser.y +++ b/src/parser.y @@ -42,12 +42,13 @@ extern struct template result; %type <nodeType> structureType %token <text> TEXT +%token <text> WHITESPACE %token SECTION COMMA END %token PARAMS_BEGIN PARAMS_END %token STATEMENT_BEGIN STATEMENT_END %token STRUCTURE_BEGIN STRUCTURE_END %token OUTPUT_BEGIN OUTPUT_END -%token RENDER +%token RENDER OPEN_PARENTHESES CLOSE_PARENTHESES %start template @@ -143,17 +144,12 @@ mainSection: /* empty */ $$ = $1; addNode(&$$, newOutputNode($3)); } - | mainSection STRUCTURE_BEGIN texts structureType text STRUCTURE_END - { - if (!checkCharset($3, " \t\n")) { - yyerror("unknown structure block command"); - YYERROR; - } - + | mainSection STRUCTURE_BEGIN optionalWhitespaces structureType optionalWhitespaces OPEN_PARENTHESES text CLOSE_PARENTHESES optionalWhitespaces STRUCTURE_END + { $$ = $1; switch($4) { case RENDER_NODE: - addNode(&$$, newRenderNode($5)); + addNode(&$$, newRenderNode($7)); break; default: yyerror("unhandled structure block command (internal error)"); @@ -162,6 +158,10 @@ mainSection: /* empty */ } ; +optionalWhitespaces: /* empty */ + | WHITESPACE optionalWhitespaces +; + structureType: RENDER { $$ = RENDER_NODE; @@ -199,10 +199,18 @@ text: TEXT { $$ = $1; } + | WHITESPACE + { + $$ = $1; + } | TEXT text { $$ = combineStr($1, $2); } + | WHITESPACE text + { + $$ = combineStr($1, $2); + } texts: /* empty */ { diff --git a/src/scanner.l b/src/scanner.l index d6b7be5..195dcbf 100644 --- a/src/scanner.l +++ b/src/scanner.l @@ -74,8 +74,11 @@ type_or_id {type_prefix}?{id}{type_pointer}* <STATEMENT>"e" { yylval.text = strdup(yytext); return TEXT; /* catch e as text */ } <STATEMENT>{statement_end} { BEGIN(isMetaSection ? META_SECTION : MAIN_SECTION); return STATEMENT_END; } -<STRUCTURE>[^#r]+ { yylval.text = strdup(yytext); return TEXT; } +<STRUCTURE>[^#r() \t\n]+ { yylval.text = strdup(yytext); return TEXT; } +<STRUCTURE>{whitespace}+ { yylval.text = strdup(yytext); return WHITESPACE; } <STRUCTURE>{render_token} { return RENDER; } +<STRUCTURE>"(" { return OPEN_PARENTHESES; } +<STRUCTURE>")" { return CLOSE_PARENTHESES; } <STRUCTURE>"r" { yylval.text = strdup(yytext); return TEXT; /* catch r as text */ } <STRUCTURE>"#" { yylval.text = strdup(yytext); return TEXT; /* catch # as text */ } <STRUCTURE>{structure_end} { BEGIN(isMetaSection ? META_SECTION : MAIN_SECTION); return STRUCTURE_END; }