diff --git a/lib/ruby-handlebars/parser.rb b/lib/ruby-handlebars/parser.rb index ca21386..0863e4d 100644 --- a/lib/ruby-handlebars/parser.rb +++ b/lib/ruby-handlebars/parser.rb @@ -42,11 +42,13 @@ class Parser < Parslet::Parser rule(:sq_string) { match("'") >> match("[^']").repeat.maybe.as(:str_content) >> match("'") } rule(:dq_string) { match('"') >> match('[^"]').repeat.maybe.as(:str_content) >> match('"') } rule(:string) { sq_string | dq_string } + rule(:digit) { match('[0-9]') } + rule(:integer) { digit.repeat(1).as(:integer_content) } rule(:parameter) { (as_kw >> space? >> pipe).absent? >> ( - (path | string).as(:parameter_name) | + (integer | path | string).as(:parameter_name) | (str('(') >> space? >> identifier.as(:safe_helper_name) >> (space? >> parameters.as(:parameters)).maybe >> space? >> str(')')) ) } diff --git a/lib/ruby-handlebars/tree.rb b/lib/ruby-handlebars/tree.rb index 08f68ef..64907ad 100644 --- a/lib/ruby-handlebars/tree.rb +++ b/lib/ruby-handlebars/tree.rb @@ -34,6 +34,12 @@ def _eval(context) end end + class Integer < TreeItem.new(:content) + def _eval(context) + return content.to_i + end + end + class Parameter < TreeItem.new(:name) def _eval(context) if name.is_a?(Parslet::Slice) @@ -105,6 +111,7 @@ class Transform < Parslet::Transform rule(replaced_unsafe_item: simple(:item)) {Tree::EscapedReplacement.new(item)} rule(replaced_safe_item: simple(:item)) {Tree::Replacement.new(item)} rule(str_content: simple(:content)) {Tree::String.new(content)} + rule(integer_content: simple(:content)) {Tree::Integer.new(content)} rule(parameter_name: simple(:name)) {Tree::Parameter.new(name)} rule( @@ -171,7 +178,7 @@ class Transform < Parslet::Transform ) { Tree::AsHelper.new(name, parameters, as_parameters, block_items, else_block_items) } - + rule( partial_name: simple(:partial_name), arguments: subtree(:arguments) diff --git a/spec/handlebars_spec.rb b/spec/handlebars_spec.rb index 91c3c8a..5ffd239 100644 --- a/spec/handlebars_spec.rb +++ b/spec/handlebars_spec.rb @@ -51,6 +51,11 @@ def evaluate(template, args = {}) expect(evaluate('Hello {{first-name}}', double("first-name": 'world'))).to eq('Hello world') end + it 'handles integer parameters' do + hbs.register_helper(:add){|context, a, b| a + b} + expect(evaluate('The sum is: {{add base_value 9}}', double("base_value": 2))).to eq('The sum is: 11') + end + context 'partials' do it 'simple' do hbs.register_partial('plic', "Plic") diff --git a/spec/parser_spec.rb b/spec/parser_spec.rb index 9809b4c..2356695 100644 --- a/spec/parser_spec.rb +++ b/spec/parser_spec.rb @@ -155,6 +155,22 @@ }) end + it 'with integer parameters' do + result = parser.parse('{{ add 5 192 }}') + expect(result).to eq({ + block_items: [ + { + unsafe_helper_name: "add", + parameters: [ + {parameter_name: {integer_content: '5'}}, + {parameter_name: {integer_content: '192'}} + ] + } + ] + }) + + end + it 'block' do expect(parser.parse('{{#capitalize}}plic{{/capitalize}}')).to eq({ block_items: [