diff --git a/examples/decorator/template.hbs b/examples/decorator/template.hbs index c21a40395..5b965182b 100644 --- a/examples/decorator/template.hbs +++ b/examples/decorator/template.hbs @@ -7,12 +7,12 @@
Rendered by Handlebars from {{engine}} data.
diff --git a/examples/partials/base0.hbs b/examples/partials/base0.hbs index 63360e2af..34b38e763 100644 --- a/examples/partials/base0.hbs +++ b/examples/partials/base0.hbs @@ -2,6 +2,6 @@ {{title}}Rendered in partial, parent is {{parent}}
{{/inline}} -{{! remove whitespaces with ~ }} -{{~> (parent)~}} +{{> (parent)}} diff --git a/examples/render/template.hbs b/examples/render/template.hbs index b6817adb1..2a62d014f 100644 --- a/examples/render/template.hbs +++ b/examples/render/template.hbs @@ -5,12 +5,12 @@Rendered by Handlebars from {{engine}} data.
diff --git a/examples/script/template.hbs b/examples/script/template.hbs index cfcb0d2cc..c04253c72 100644 --- a/examples/script/template.hbs +++ b/examples/script/template.hbs @@ -1,10 +1,10 @@ Bundesliga Match Day -{{#each this as |match| ~}} +{{#each this as |match|}} {{#each match as |team|}} {{team.name}} - {{score team.goals}} {{#each team.goals as |scorer|}} > {{scorer}} {{/each}} - {{~ /each}} + {{/each}} --- {{/each}} diff --git a/src/grammar.pest b/src/grammar.pest index 34044324d..9f87fae94 100644 --- a/src/grammar.pest +++ b/src/grammar.pest @@ -55,37 +55,45 @@ decorator_expression = { "{{" ~ pre_whitespace_omitter? ~ "*" ~ exp_line ~ pro_whitespace_omitter? ~ "}}" } partial_expression = { "{{" ~ pre_whitespace_omitter? ~ ">" ~ partial_exp_line ~ pro_whitespace_omitter? ~ "}}" } + +brackets_open = @{ (NEWLINE ~ (" "|"\t")*)? ~ "{{" } +brackets_close = @{ "}}" ~ ((" "|"\t")* ~ NEWLINE)? } + invert_tag_item = { "else"|"^" } -invert_tag = { !escape ~ "{{" ~ pre_whitespace_omitter? ~ invert_tag_item - ~ pro_whitespace_omitter? ~ "}}"} -helper_block_start = { "{{" ~ pre_whitespace_omitter? ~ "#" ~ exp_line ~ - pro_whitespace_omitter? ~ "}}" } -helper_block_end = { "{{" ~ pre_whitespace_omitter? ~ "/" ~ identifier ~ - pro_whitespace_omitter? ~ "}}" } +invert_tag = { !escape ~ brackets_open ~ pre_whitespace_omitter? ~ invert_tag_item + ~ pro_whitespace_omitter? ~ brackets_close } +helper_block_start = { brackets_open ~ pre_whitespace_omitter? ~ "#" ~ exp_line ~ + pro_whitespace_omitter? ~ brackets_close } +helper_block_end = { brackets_open ~ pre_whitespace_omitter? ~ "/" ~ identifier ~ + pro_whitespace_omitter? ~ brackets_close } helper_block = _{ helper_block_start ~ template ~ (invert_tag ~ template)? ~ helper_block_end } -decorator_block_start = { "{{" ~ pre_whitespace_omitter? ~ "#" ~ "*" - ~ exp_line ~ pro_whitespace_omitter? ~ "}}" } -decorator_block_end = { "{{" ~ pre_whitespace_omitter? ~ "/" ~ identifier ~ - pro_whitespace_omitter? ~ "}}" } +decorator_block_start = { brackets_open ~ pre_whitespace_omitter? ~ "#" ~ "*" + ~ exp_line ~ pro_whitespace_omitter? ~ brackets_close } +decorator_block_end = { brackets_open ~ pre_whitespace_omitter? ~ "/" ~ identifier ~ + pro_whitespace_omitter? ~ brackets_close } decorator_block = _{ decorator_block_start ~ template ~ decorator_block_end } -partial_block_start = { "{{" ~ pre_whitespace_omitter? ~ "#" ~ ">" - ~ partial_exp_line ~ pro_whitespace_omitter? ~ "}}" } -partial_block_end = { "{{" ~ pre_whitespace_omitter? ~ "/" ~ partial_identifier ~ - pro_whitespace_omitter? ~ "}}" } +partial_block_start = { brackets_open ~ pre_whitespace_omitter? ~ "#" ~ ">" + ~ partial_exp_line ~ pro_whitespace_omitter? ~ brackets_close } +partial_block_end = { brackets_open ~ pre_whitespace_omitter? ~ "/" ~ partial_identifier ~ + pro_whitespace_omitter? ~ brackets_close } partial_block = _{ partial_block_start ~ template ~ partial_block_end } -raw_block_start = { "{{{{" ~ pre_whitespace_omitter? ~ exp_line ~ - pro_whitespace_omitter? ~ "}}}}" } -raw_block_end = { "{{{{" ~ pre_whitespace_omitter? ~ "/" ~ identifier ~ - pro_whitespace_omitter? ~ "}}}}" } +double_brackets_open = @{ (NEWLINE ~ (" "|"\t")*)? ~ "{{{{" } +double_brackets_close = @{ "}}}}" ~ ((" "|"\t")* ~ NEWLINE)? } + +raw_block_start = { double_brackets_open ~ pre_whitespace_omitter? ~ exp_line ~ + pro_whitespace_omitter? ~ double_brackets_close } +raw_block_end = { double_brackets_open ~ pre_whitespace_omitter? ~ "/" ~ identifier ~ + pro_whitespace_omitter? ~ double_brackets_close } raw_block = _{ raw_block_start ~ raw_block_text ~ raw_block_end } -hbs_comment = { "{{!--" ~ (!"--}}" ~ ANY)* ~ "--}}" } -hbs_comment_compact = { "{{!" ~ (!"}}" ~ ANY)* ~ "}}" } +comment_brackets_open = @{ ("\r"? ~ "\n" ~ (" "|"\t")*)? ~ "{{!" } +hbs_comment = { comment_brackets_open ~ "--" ~ (!"--}}" ~ ANY)* ~ "--" ~ brackets_close } +hbs_comment_compact = { comment_brackets_open ~ (!"}}" ~ ANY)* ~ brackets_close } template = { ( raw_text | diff --git a/src/grammar.rs b/src/grammar.rs index 40d526bbc..6f7b23803 100644 --- a/src/grammar.rs +++ b/src/grammar.rs @@ -145,7 +145,9 @@ mod test { let s = vec!["{{!--