README.mdown in handlebars-0.6.0 vs README.mdown in handlebars-0.7.0

- old
+ new

@@ -24,10 +24,12 @@ ### Block Helpers: Just like JavaScript, you can write block helpers with an `{{else}}` section. To print out a section twice if a condition is met: + # V8 maps the first argument sent to a block to "this". All subsequent arguments are as + # described in the Handlebars documentation. handlebars.register_helper(:twice) do |context, condition, block| if condition "#{block.fn(context)}#{block.fn(context)}" else block.inverse(context) @@ -35,10 +37,42 @@ end template = handlebars.compile("{{#twice foo}}Hurray!{{else}}Boo!{{/twice}}") template.call(foo: true) #=> Hurray!Hurray! template.call(foo: false) #=> Boo! +### Private variables: + +Just like JavaScript, block helpers can inject private variables into their child templates. +These can be accessed in a template using the `@` prefix: + + handlebars.register_helper(:list) do |this, context, block| + "<ul>" + context.each_with_index.map do |x, i| + if block.keys.include? "data" + data = handlebars.create_frame(block.data) + data.index = i + end + "<li>" + block.fn(x, data: data) + "</li>" + end.join + "</ul>" + end + template = handlebars.compile("{{#list array}}{{@index}}. {{title}}{{/list}}") + template.call(array: [{title: "Memento"}, {title: "Inception"}]) + #=> "<ul><li>0. Memento</li><li>1. Inception</li></ul>" + +### Hash arguments: + +When using hash arguments, beware of one gotcha - V8 defines the #hash method for every +object. Therefore, to access the hash object of the options argument Handlebars sends to your +block, you must use the `[]` method: + + handlebars.register_helper :list do |this, context, options| + attrs = options[:hash].map{|k,v| "#{k}=\"#{v}\""}.join(' ') + "<ul #{attrs}>" + context.map{|item| "<li>" + options.fn(item) + "</li>"}.join + "</ul>" + end + template = handlebars.compile(%({{#list nav id="nav-bar" class="top"}}<a href="{{url}}">{{title}}</a>{{/list}})) + template.call({nav: [{url: 'www.google.com', title: 'Google'}]}) + #=> <ul class="top" id="nav-bar"><li><a href="www.google.com">Google</a></li></ul> + ### Safe Strings By default, handlebars will escape strings that are returned by your block helpers. To mark a string as safe: @@ -69,9 +103,17 @@ end end t = handlebars.compile("{{>missing}}") t.call #=> 1 miss(es) when trying to look up a partial t.call #=> 2 miss(es) when tyring to look up a partial + +### Security + +In general, you should not trust user-provided templates: a template can call any method +(with no arguments) or access any property on any object in the `Handlebars::Context`. + +If you'd like to render user-provided templates, you'd want to make sure you do so in a +sanitized Context, e.g. no filesystem access, read-only or no database access, etc. ## Test rspec spec/