From aec88e340465b06fc08f2f8dd227d17d4dd43418 Mon Sep 17 00:00:00 2001 From: Danny Greg & Nathan Sobo Date: Thu, 19 Jan 2012 18:30:32 -0800 Subject: [PATCH] Add Builder.render and instance methods for tags Builder.render takes a function that calls tag methods and returns a view fragment. --- spec/stdlib/template/builder-spec.coffee | 13 +++++++++++++ src/stdlib/template/builder.coffee | 14 +++++++++++++- 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/spec/stdlib/template/builder-spec.coffee b/spec/stdlib/template/builder-spec.coffee index b3cc0d5d3..c0cd9519e 100644 --- a/spec/stdlib/template/builder-spec.coffee +++ b/spec/stdlib/template/builder-spec.coffee @@ -6,6 +6,19 @@ describe "Builder", -> beforeEach -> builder = new Builder + describe "@render", -> + fit "runs the given function in a fresh builder instance and returns the resulting view fragment", -> + fragment = + Builder.render -> + @div => + @ol class: 'cool-list', => + @li() + @li() + + expect(fragment).toMatchSelector('div') + expect(fragment.find('ol.cool-list')).toExist() + expect(fragment.find('li').length).toBe 2 + describe ".tag(name, args...)", -> it "can generate simple tags", -> builder.tag 'div' diff --git a/src/stdlib/template/builder.coffee b/src/stdlib/template/builder.coffee index 026da38a6..f1a277d91 100644 --- a/src/stdlib/template/builder.coffee +++ b/src/stdlib/template/builder.coffee @@ -6,6 +6,11 @@ Text = require 'template/text' module.exports = class Builder + @render: (fn) -> + builder = new this + fn.call(builder) + builder.toFragment() + @elements: normal: 'a abbr address article aside audio b bdi bdo blockquote body button canvas caption cite code colgroup datalist dd del details dfn div dl dt em @@ -18,6 +23,13 @@ class Builder void: 'area base br col command embed hr img input keygen link meta param source track wbr'.split /\s+/ + + @allElements: -> + @elements.normal.concat(@elements.void) + + _.each @allElements(), (tagName) => + @prototype[tagName] = (args...) -> @tag(tagName, args...) + constructor: -> @reset() @@ -37,7 +49,7 @@ class Builder @document.push(new OpenTag(name, options.attributes)) if @elementIsVoid(name) if (options.text? or options.content?) - throw new Error("Self-closing tag #{tag} cannot have text or content") + throw new Error("Self-closing tag #{name} cannot have text or content") else options.content?() @text(options.text) if options.text