mullet 0.0.2 → 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/lib/mullet.rb CHANGED
@@ -1,8 +1,9 @@
1
- require 'mullet/default_model'
2
- require 'mullet/default_nested_model'
3
- require 'mullet/model'
1
+ require 'mullet/default_scope'
2
+ require 'mullet/default_nested_scope'
3
+ require 'mullet/scope'
4
4
  require 'mullet/template_error'
5
5
  require 'mullet/version'
6
+ require 'mullet/view'
6
7
 
7
8
  require 'mullet/html/layout'
8
9
  require 'mullet/html/template'
@@ -1,19 +1,19 @@
1
- require 'mullet/default_model'
1
+ require 'mullet/default_scope'
2
2
 
3
3
  module Mullet
4
4
 
5
- # Composite model that combines models in nested scopes. Tries each model in
5
+ # Composite scope that combines scopes in nested scopes. Tries each scope in
6
6
  # sequence until a value is successfully resolved.
7
- class DefaultNestedModel
8
- include Model
7
+ class DefaultNestedScope
8
+ include Scope
9
9
 
10
10
  # Constructor
11
11
  #
12
- # @param dataObjects
12
+ # @param data_objects
13
13
  # scopes in outer to inner order
14
- def initialize(*dataObjects)
14
+ def initialize(*data_objects)
15
15
  @scopes = []
16
- dataObjects.each {|data| push_scope(data) }
16
+ push_scope(*data_objects)
17
17
  end
18
18
 
19
19
  # Resolves variable name to value.
@@ -32,13 +32,15 @@ module Mullet
32
32
  return NOT_FOUND
33
33
  end
34
34
 
35
- # Adds a nested scope to search in subsequent lookups.
35
+ # Adds new innermost nested scopes.
36
36
  #
37
- # @param data
38
- # data object
39
- def push_scope(data)
40
- @scopes.push(
41
- data.respond_to?(:get_variable_value) ? data : DefaultModel.new(data))
37
+ # @param data_objects
38
+ # scopes in outer to inner order
39
+ def push_scope(*data_objects)
40
+ data_objects.each do |data|
41
+ @scopes.push(
42
+ data.respond_to?(:get_variable_value) ? data : DefaultScope.new(data))
43
+ end
42
44
  end
43
45
 
44
46
  # Removes innermost nested scope.
@@ -1,38 +1,32 @@
1
- require 'mullet/model'
1
+ require 'mullet/scope'
2
2
 
3
3
  module Mullet
4
4
 
5
- # Default model implementation which resolves variable names to values by
5
+ # Default scope implementation which resolves variable names to values by
6
6
  # reading from a data object. Given a variable name _key_, the following
7
7
  # mechanisms are tried in this order:
8
8
  #
9
- # * If the variable name is `this`, then return the object.
10
- # * If the object is a `Hash`, then use _key_ as the key to retrieve the
11
- # value from the hash.
9
+ # * If the variable name is `.`, then return the object.
12
10
  # * If the object has a method named _key_ taking no parameters, then use
13
11
  # the value returned from calling the method.
14
12
  # * If the object has an instance variable named @_key_, then use the
15
13
  # variable value.
14
+ # * If the object is a `Hash`, then use _key_ as the key to retrieve the
15
+ # value from the hash.
16
16
  #
17
17
  # If the value is a Proc, then use the value returned from calling it.
18
- class DefaultModel
19
- include Model
18
+ class DefaultScope
19
+ include Scope
20
20
 
21
21
  def initialize(data)
22
22
  @data = data
23
23
  end
24
24
 
25
25
  def fetch_impl(name)
26
- if name == :this
26
+ if name == :'.'
27
27
  return @data
28
28
  end
29
29
 
30
- # Is the variable name a key in a Hash?
31
- if @data.respond_to?(:fetch)
32
- # Call the block if the key is not found.
33
- return @data.fetch(name) {|k| @data.fetch(k.to_s(), NOT_FOUND) }
34
- end
35
-
36
30
  # Does the variable name match a method name in the object?
37
31
  if @data.respond_to?(name)
38
32
  method = @data.method(name)
@@ -47,6 +41,12 @@ module Mullet
47
41
  return @data.instance_variable_get(variable)
48
42
  end
49
43
 
44
+ # Is the variable name a key in a Hash?
45
+ if @data.respond_to?(:fetch)
46
+ # If the key was not found, then try to find it as a String.
47
+ return @data.fetch(name) {|k| @data.fetch(k.to_s(), NOT_FOUND) }
48
+ end
49
+
50
50
  return NOT_FOUND
51
51
  end
52
52
 
@@ -1,4 +1,4 @@
1
- require 'mullet/model'
1
+ require 'mullet/scope'
2
2
 
3
3
  module Mullet; module HTML
4
4
 
@@ -23,7 +23,7 @@ module Mullet; module HTML
23
23
  # attributes to update
24
24
  def execute(render_context, attributes)
25
25
  value = get_value(render_context)
26
- if value == Model::NOT_FOUND || value == nil
26
+ if value == Scope::NOT_FOUND || value == nil
27
27
  # Value not found. Do not render the attribute.
28
28
  attributes.delete(@attribute_name)
29
29
  else
@@ -3,7 +3,7 @@ require 'mullet/template_error'
3
3
  require 'mullet/html/command'
4
4
  require 'mullet/html/message'
5
5
  require 'mullet/html/message_attribute_command'
6
- require 'mullet/html/model_attribute_command'
6
+ require 'mullet/html/scope_attribute_command'
7
7
 
8
8
  module Mullet; module HTML
9
9
 
@@ -43,7 +43,7 @@ module Mullet; module HTML
43
43
 
44
44
  def add_attribute_command(attribute_name, variable_name)
45
45
  @attribute_commands <<
46
- ModelAttributeCommand.new(attribute_name, variable_name)
46
+ ScopeAttributeCommand.new(attribute_name, variable_name)
47
47
  end
48
48
 
49
49
  def add_attribute_commands(attribute_variable_pairs)
@@ -1,5 +1,5 @@
1
1
  require 'mullet/html/command_element_renderer'
2
- require 'mullet/model'
2
+ require 'mullet/scope'
3
3
 
4
4
  module Mullet; module HTML
5
5
 
@@ -19,7 +19,7 @@ module Mullet; module HTML
19
19
 
20
20
  alias :super_render :render
21
21
 
22
- def render_nested_model(data, render_context)
22
+ def render_nested_scope(data, render_context)
23
23
  render_context.push_scope(data)
24
24
  super_render(render_context)
25
25
  render_context.pop_scope()
@@ -27,7 +27,7 @@ module Mullet; module HTML
27
27
 
28
28
  def render(render_context)
29
29
  value = render_context.get_variable_value(@variable_name)
30
- if value == Model::NOT_FOUND || value == nil || value == false
30
+ if value == Scope::NOT_FOUND || value == nil || value == false
31
31
  return
32
32
  end
33
33
 
@@ -36,11 +36,11 @@ module Mullet; module HTML
36
36
  end
37
37
 
38
38
  if value.respond_to?(:each)
39
- value.each {|item| render_nested_model(item, render_context) }
39
+ value.each {|item| render_nested_scope(item, render_context) }
40
40
  return
41
41
  end
42
42
 
43
- render_nested_model(value, render_context)
43
+ render_nested_scope(value, render_context)
44
44
  end
45
45
  end
46
46
 
@@ -1,5 +1,5 @@
1
1
  require 'mullet/html/command_element_renderer'
2
- require 'mullet/model'
2
+ require 'mullet/scope'
3
3
 
4
4
  module Mullet; module HTML
5
5
 
@@ -19,7 +19,7 @@ module Mullet; module HTML
19
19
 
20
20
  def should_render_element(render_context)
21
21
  value = render_context.get_variable_value(@variable_name)
22
- if value == Model::NOT_FOUND || value == nil
22
+ if value == Scope::NOT_FOUND || value == nil
23
23
  return false
24
24
  end
25
25
 
@@ -2,8 +2,8 @@ require 'mullet/html/attribute_command'
2
2
 
3
3
  module Mullet; module HTML
4
4
 
5
- # Operation to set attribute value from model.
6
- class ModelAttributeCommand
5
+ # Operation to set attribute to value resolved from a scope.
6
+ class ScopeAttributeCommand
7
7
  include AttributeCommand
8
8
 
9
9
  # Constructor
@@ -7,7 +7,7 @@ module Mullet; module HTML
7
7
  # loaded templates.
8
8
  #
9
9
  # By default, templates render an empty string when a variable is not found
10
- # or its value is null. Call the `on_missing` and `on_nil` methods to
10
+ # or its value is nil. Call the `on_missing` and `on_nil` methods to
11
11
  # configure how templates loaded by this loader should handle missing and nil
12
12
  # values respectively.
13
13
  class TemplateLoader
@@ -1,5 +1,5 @@
1
1
  require 'cgi'
2
- require 'mullet/default_nested_model'
2
+ require 'mullet/default_nested_scope'
3
3
 
4
4
  module Mullet
5
5
 
@@ -20,8 +20,8 @@ module Mullet
20
20
  # @param [#<<] output
21
21
  # where to write rendered output
22
22
  def initialize(data, missing_value_strategy, nil_value_strategy, output)
23
- @model = data.is_a?(DefaultNestedModel) ?
24
- data : DefaultNestedModel.new(data)
23
+ @scope = data.is_a?(DefaultNestedScope) ?
24
+ data : DefaultNestedScope.new(data)
25
25
  @on_missing = missing_value_strategy
26
26
  @on_nil = nil_value_strategy
27
27
  @output = output
@@ -43,7 +43,7 @@ module Mullet
43
43
  # variable name
44
44
  # @return value
45
45
  def get_variable_value(name)
46
- return @model.get_variable_value(name)
46
+ return @scope.get_variable_value(name)
47
47
  end
48
48
 
49
49
  # Adds a nested scope to search in subsequent lookups.
@@ -51,23 +51,23 @@ module Mullet
51
51
  # @param data
52
52
  # data object
53
53
  def push_scope(data)
54
- @model.push_scope(data)
54
+ @scope.push_scope(data)
55
55
  end
56
56
 
57
57
  # Removes innermost nested scope.
58
58
  def pop_scope()
59
- @model.pop_scope()
59
+ @scope.pop_scope()
60
60
  end
61
61
 
62
- # Gets model value that is intended for display in the rendered output.
62
+ # Gets scope value that is intended for display in the rendered output.
63
63
  # Applies configured strategies for handling missing and nil values.
64
64
  #
65
65
  # @param [Symbol] key
66
66
  # variable name
67
67
  # @return value
68
68
  def get_display_value(key)
69
- value = @model.get_variable_value(key)
70
- if value == Model::NOT_FOUND
69
+ value = @scope.get_variable_value(key)
70
+ if value == Scope::NOT_FOUND
71
71
  value = @on_missing.call(key)
72
72
  end
73
73
  if value == nil
@@ -1,8 +1,8 @@
1
1
  module Mullet
2
2
 
3
- # A model responds to the method `get_variable_value` taking a variable name
3
+ # A scope responds to the method `get_variable_value` taking a variable name
4
4
  # argument and returning the variable value.
5
- module Model
5
+ module Scope
6
6
 
7
7
  # special value indicating variable name was not found
8
8
  NOT_FOUND = Object.new()
@@ -0,0 +1,100 @@
1
+ require 'mullet/sinatra/engine'
2
+ require 'sinatra/base'
3
+
4
+ module Mullet
5
+
6
+ # Sinatra extension for rendering views with Mullet.
7
+ #
8
+ # Example:
9
+ #
10
+ # require 'mullet/sinatra'
11
+ #
12
+ # class App < Sinatra::Base
13
+ # register Mullet::Sinatra
14
+ #
15
+ # set :mullet, {
16
+ # # path to folder containing template .html files. If not set, then
17
+ # # default is `settings.views`
18
+ # template_path: "views"
19
+ # }
20
+ #
21
+ # get '/' do
22
+ # mullet :index
23
+ # end
24
+ # end
25
+ #
26
+ # When `mullet :index` is called, the engine will attempt to load a Ruby view
27
+ # class named `Views::Index` from the `views/index.rb` file. If the view
28
+ # class is not found, then the engine will render the template file
29
+ # `view/index.html` directly.
30
+ #
31
+ # By default, the rendered page will passed to a layout view named `:layout`.
32
+ # The rendered page content is passed to the layout template in the variable
33
+ # `content`.
34
+ module Sinatra
35
+ module Helpers
36
+ @@engine = Mullet::Sinatra::Engine.new()
37
+
38
+ def mullet(view_name, options={}, locals={})
39
+ # The options hash may contain a key :locals with the value being a
40
+ # hash mapping variable names to values.
41
+ locals.merge!(options.delete(:locals) || {})
42
+
43
+ # Get application settings.
44
+ view_options = { root: settings.root, views: settings.views }
45
+
46
+ if settings.respond_to?(:mullet)
47
+ view_options = settings.mullet.merge(view_options)
48
+ end
49
+
50
+ view_options.merge!(options)
51
+
52
+ # Copy instance variables set by Sinatra application.
53
+ application_data = Object.new()
54
+ instance_variables.each do |name|
55
+ application_data.instance_variable_set(
56
+ name, instance_variable_get(name))
57
+ end
58
+
59
+ # Render view.
60
+ template = @@engine.get_template(view_name, view_options)
61
+ view_class = @@engine.get_view_class(view_name, view_options)
62
+ view = view_class.new()
63
+ view.set_model(application_data, locals)
64
+ output = ''
65
+ template.execute(view, output)
66
+
67
+ # Render layout.
68
+ layout_name = :layout
69
+ if options[:layout]
70
+ layout_name = options[:layout]
71
+ end
72
+
73
+ if layout_name != false
74
+ # If configured layout is true or nil, then use :layout.
75
+ if layout_name == true || !layout_name
76
+ layout_name = :layout
77
+ end
78
+
79
+ layout = @@engine.get_template(layout_name, view_options)
80
+ view_class = @@engine.get_view_class(layout_name, view_options)
81
+ view = view_class.new()
82
+ view.set_model(application_data, locals, { content: output })
83
+ layout_output = ''
84
+ layout.execute(view, layout_output)
85
+ output = layout_output
86
+ end
87
+
88
+ return output
89
+ end
90
+ end
91
+
92
+ # Called when this extension is registered.
93
+ def self.registered(app)
94
+ app.helpers Mullet::Sinatra::Helpers
95
+ end
96
+
97
+ end
98
+ end
99
+
100
+ Sinatra.register Mullet::Sinatra
@@ -0,0 +1,102 @@
1
+ require 'mullet'
2
+
3
+ module Mullet; module Sinatra
4
+
5
+ # Loads view classes and template files.
6
+ class Engine
7
+
8
+ def initialize()
9
+ @class_cache = Hash.new()
10
+ @loader = Mullet::HTML::TemplateLoader.new(nil)
11
+ end
12
+
13
+ # Gets template.
14
+ #
15
+ # @param [Symbol] view_name
16
+ # view name
17
+ # @param [Hash] options
18
+ # options
19
+ # @return template
20
+ def get_template(view_name, options)
21
+ template_path = options[:template_path] || options[:views]
22
+ @loader.template_path = template_path
23
+ return @loader.load("#{view_name.to_s()}.html")
24
+ end
25
+
26
+ # Gets view class.
27
+ #
28
+ # @param [Symbol] view_name
29
+ # view name
30
+ # @param [Hash] options
31
+ # options
32
+ # @return view class
33
+ def get_view_class(view_name, options)
34
+ view_class = @class_cache.fetch(view_name, nil)
35
+ if view_class == nil
36
+ view_class = find_class(view_name.to_s(), options)
37
+ @class_cache.store(view_name, view_class)
38
+ end
39
+ return view_class
40
+ end
41
+
42
+ private
43
+
44
+ # Gets the named view class.
45
+ #
46
+ # @param [String] view_name
47
+ # view name
48
+ # @param [Hash] options
49
+ # options
50
+ # @return view class, or `View` if not found
51
+ def find_class(view_name, options)
52
+ relative_view_path = options[:views]
53
+ if relative_view_path.start_with?(options[:root])
54
+ relative_view_path = relative_view_path[options[:root].size()..-1]
55
+ end
56
+ relative_view_path.sub!(/^\//, '')
57
+
58
+ # Construct string in form sub_folder/user_list
59
+ relative_view_name = File.join(relative_view_path, view_name)
60
+
61
+ # Convert view name from the format sub_folder/user_list to the format
62
+ # SubFolder::UserList
63
+ class_name = relative_view_name.split('/').map do |namespace|
64
+ namespace.split(/[-_]/).map do |part|
65
+ part[0] = part[0].chr.upcase
66
+ part
67
+ end.join
68
+ end.join('::')
69
+
70
+ # Is the class already defined?
71
+ if const = const_get!(class_name)
72
+ return const
73
+ end
74
+
75
+ full_view_name = File.join(options[:views], view_name)
76
+ if File.exists?("#{full_view_name}.rb")
77
+ require full_view_name
78
+ else
79
+ return View
80
+ end
81
+
82
+ if const = const_get!(class_name)
83
+ return const
84
+ end
85
+ return View
86
+ end
87
+
88
+ # Finds constant by fully qualified name.
89
+ #
90
+ # @param [String] name
91
+ # fully qualified name to find
92
+ # @return constant, or `nil` if not found
93
+ def const_get!(name)
94
+ name.split('::').inject(Object) do |cur_class, part|
95
+ cur_class.const_get(part)
96
+ end
97
+ rescue NameError
98
+ nil
99
+ end
100
+ end
101
+
102
+ end; end
@@ -1,3 +1,3 @@
1
1
  module Mullet
2
- VERSION = '0.0.2'
2
+ VERSION = '0.0.3'
3
3
  end
@@ -0,0 +1,29 @@
1
+ require 'mullet/default_nested_scope'
2
+
3
+ module Mullet
4
+
5
+ # Adapts model data for rendering in a template. Applications will typically
6
+ # define subclasses with attributes that will be referenced by name from the
7
+ # templates.
8
+ class View
9
+
10
+ # Sets model to adapt. Applications do not have to call this method
11
+ # directly. The template engine will call this method implicitly.
12
+ #
13
+ # @param data_objects
14
+ # scopes in outer to inner order
15
+ def set_model(*data_objects)
16
+ @model = DefaultNestedScope.new(*data_objects)
17
+ end
18
+
19
+ # Resolves variable name to value from the model.
20
+ #
21
+ # @param [Symbol] name
22
+ # variable name
23
+ # @return variable value
24
+ def fetch(name)
25
+ return @model.get_variable_value(name)
26
+ end
27
+ end
28
+
29
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mullet
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-11-30 00:00:00.000000000 Z
12
+ date: 2012-04-04 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: i18n
16
- requirement: &2152850480 !ruby/object:Gem::Requirement
16
+ requirement: &2152575380 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: 0.6.0
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *2152850480
24
+ version_requirements: *2152575380
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: nokogiri
27
- requirement: &2152848500 !ruby/object:Gem::Requirement
27
+ requirement: &2152574680 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: 1.5.0
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *2152848500
35
+ version_requirements: *2152574680
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: redcarpet
38
- requirement: &2152844660 !ruby/object:Gem::Requirement
38
+ requirement: &2152574020 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: 1.17.2
44
44
  type: :development
45
45
  prerelease: false
46
- version_requirements: *2152844660
46
+ version_requirements: *2152574020
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: yard
49
- requirement: &2152842280 !ruby/object:Gem::Requirement
49
+ requirement: &2152573060 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ! '>='
@@ -54,19 +54,20 @@ dependencies:
54
54
  version: 0.7.3
55
55
  type: :development
56
56
  prerelease: false
57
- version_requirements: *2152842280
57
+ version_requirements: *2152573060
58
58
  description: ! "It's like Mustache but the variables are in HTML attributes.\n\n *
59
59
  Extremely simple variable syntax is incapable of expressing logic in the\n templates.\n
60
- \ * Templates are clean HTML. Your HTML authoring tool and browser will\n correctly
61
- display the templates while you prototype your user interface.\n"
60
+ \ * Templates are clean HTML which your HTML authoring tool and browser can\n display
61
+ correctly. You can use the templates as a static HTML prototype\n for your user
62
+ interface.\n"
62
63
  email: pukkaone@gmail.com
63
64
  executables: []
64
65
  extensions: []
65
66
  extra_rdoc_files: []
66
67
  files:
67
68
  - lib/mullet/container.rb
68
- - lib/mullet/default_model.rb
69
- - lib/mullet/default_nested_model.rb
69
+ - lib/mullet/default_nested_scope.rb
70
+ - lib/mullet/default_scope.rb
70
71
  - lib/mullet/html/attribute_command.rb
71
72
  - lib/mullet/html/attributes.rb
72
73
  - lib/mullet/html/command.rb
@@ -79,7 +80,6 @@ files:
79
80
  - lib/mullet/html/layout.rb
80
81
  - lib/mullet/html/message.rb
81
82
  - lib/mullet/html/message_attribute_command.rb
82
- - lib/mullet/html/model_attribute_command.rb
83
83
  - lib/mullet/html/page_builder.rb
84
84
  - lib/mullet/html/parser/attribute.rb
85
85
  - lib/mullet/html/parser/constants.rb
@@ -89,17 +89,20 @@ files:
89
89
  - lib/mullet/html/parser/simple_parser.rb
90
90
  - lib/mullet/html/parser/tokenizer.rb
91
91
  - lib/mullet/html/remove_mode.rb
92
+ - lib/mullet/html/scope_attribute_command.rb
92
93
  - lib/mullet/html/static_text_renderer.rb
93
94
  - lib/mullet/html/template.rb
94
95
  - lib/mullet/html/template_builder.rb
95
96
  - lib/mullet/html/template_loader.rb
96
97
  - lib/mullet/html/template_parser.rb
97
98
  - lib/mullet/html/unless_element_renderer.rb
98
- - lib/mullet/model.rb
99
99
  - lib/mullet/render_context.rb
100
+ - lib/mullet/scope.rb
101
+ - lib/mullet/sinatra/engine.rb
102
+ - lib/mullet/sinatra.rb
100
103
  - lib/mullet/template_error.rb
101
- - lib/mullet/tilt.rb
102
104
  - lib/mullet/version.rb
105
+ - lib/mullet/view.rb
103
106
  - lib/mullet.rb
104
107
  homepage: http://pukkaone.github.com/mullet/
105
108
  licenses: []
data/lib/mullet/tilt.rb DELETED
@@ -1,37 +0,0 @@
1
- require 'mullet'
2
- require 'tilt'
3
-
4
- # Registers the Mullet template engine in Tilt to handle file names with the
5
- # `html` extension.
6
- module Mullet; module Tilt
7
-
8
- class MulletTemplate < ::Tilt::Template
9
-
10
- def initialize_engine
11
- @@loader = Mullet::HTML::TemplateLoader.new(nil)
12
- @@parser = Mullet::HTML::TemplateParser.new(@@loader)
13
- end
14
-
15
- def prepare
16
- if file
17
- @@loader.template_path = File.dirname(file)
18
- end
19
-
20
- @template = @@parser.parse(data)
21
- end
22
-
23
- def evaluate(scope, locals, &block)
24
- if block
25
- content = block.call()
26
- locals = locals.merge(content: content)
27
- end
28
-
29
- output = ''
30
- @template.execute(DefaultNestedModel.new(scope, locals), output)
31
- return output
32
- end
33
-
34
- ::Tilt.register self, :html
35
- end
36
-
37
- end; end