class Volt::ViewScope
Attributes
binding_number[RW]
bindings[R]
html[R]
path[RW]
Public Class Methods
new(handler, path)
click to toggle source
# File lib/volt/server/html_parser/view_scope.rb, line 10 def initialize(handler, path) @handler = handler @path = path @html = '' @bindings = {} @binding_number = 0 end
Public Instance Methods
<<(html)
click to toggle source
# File lib/volt/server/html_parser/view_scope.rb, line 19 def <<(html) @html << html end
add_asset_url(args)
click to toggle source
The asset_url binding handles linking assets so they will be precompiled properly using the sprockets pipeline.
# File lib/volt/server/html_parser/view_scope.rb, line 151 def add_asset_url(args) # Add a link to the handler @handler.link_asset(args.gsub(/["']/, '').strip) end
add_binding(content)
click to toggle source
# File lib/volt/server/html_parser/view_scope.rb, line 23 def add_binding(content) content = content.strip index = content.index(/[ \(]/) if index first_symbol = content[0...index] args = content[index..-1].strip case first_symbol when 'if' add_if(args) when 'unless' add_if("!(#{args})") when 'elsif' add_else(args) when 'else' if args.blank? add_else(nil) else fail "else does not take a conditional, #{content} was provided." end when 'view' add_template(args) when 'template' Volt.logger.warn('Deprecation warning: The template binding has been renamed to view. Please update any views accordingly.') add_template(args) when 'yield' add_yield(args) when 'asset_url' add_asset_url(args) else if content =~ /.each\s+do\s+\|/ add_each(content, false) elsif content =~ /.each_with_index\s+do\s+\|/ add_each(content, true) elsif content[0] == '#' # A comment binding, just ignore it. else add_content_binding(content) end end else case content when 'end' # Close the binding close_scope when 'else' add_else(nil) when 'yield' add_yield else add_content_binding(content) end end nil end
add_component(tag_name, attributes, unary)
click to toggle source
# File lib/volt/server/html_parser/view_scope.rb, line 135 def add_component(tag_name, attributes, unary) @handler.scope << ComponentViewScope.new(@handler, @path + "/__component#{@binding_number}", tag_name, attributes, unary) @handler.last.close_scope if unary end
add_content_binding(content)
click to toggle source
# File lib/volt/server/html_parser/view_scope.rb, line 80 def add_content_binding(content) @handler.html << "<!-- $#{@binding_number} --><!-- $/#{@binding_number} -->" save_binding(@binding_number, "lambda { |__p, __t, __c, __id| Volt::ContentBinding.new(__p, __t, __c, __id, Proc.new { #{content} }) }") @binding_number += 1 end
add_each(content, with_index)
click to toggle source
# File lib/volt/server/html_parser/view_scope.rb, line 96 def add_each(content, with_index) @handler.scope << EachScope.new(@handler, @path + "/__each#{@binding_number}", content, with_index) end
add_else(content)
click to toggle source
# File lib/volt/server/html_parser/view_scope.rb, line 92 def add_else(content) fail '#else can only be added inside of an if block' end
add_if(content)
click to toggle source
# File lib/volt/server/html_parser/view_scope.rb, line 86 def add_if(content) # Add with path for if group. @handler.scope << IfViewScope.new(@handler, @path + "/__ifg#{@binding_number}", content) @binding_number += 1 end
add_template(content)
click to toggle source
# File lib/volt/server/html_parser/view_scope.rb, line 100 def add_template(content) # Strip ( and ) from the outsides content = content.strip.gsub(/^\(/, '').gsub(/\)$/, '') @handler.html << "<!-- $#{@binding_number} --><!-- $/#{@binding_number} -->" save_binding(@binding_number, "lambda { |__p, __t, __c, __id| Volt::ViewBinding.new(__p, __t, __c, __id, #{@path.inspect}, Proc.new { [#{content}] }) }") @binding_number += 1 end
add_textarea(tag_name, attributes, unary)
click to toggle source
# File lib/volt/server/html_parser/view_scope.rb, line 141 def add_textarea(tag_name, attributes, unary) @handler.scope << TextareaScope.new(@handler, @path + "/__txtarea#{@binding_number}", attributes) @binding_number += 1 # close right away if unary @handler.last.close_scope if unary end
add_yield(content = nil)
click to toggle source
# File lib/volt/server/html_parser/view_scope.rb, line 110 def add_yield(content = nil) # Strip ( and ) from the outsides content ||= '' content = content.strip.gsub(/^\(/, '').gsub(/\)$/, '') @handler.html << "<!-- $#{@binding_number} --><!-- $/#{@binding_number} -->" save_binding(@binding_number, "lambda { |__p, __t, __c, __id| Volt::YieldBinding.new(__p, __t, __c, __id, Proc.new { [#{content}] }) }") @binding_number += 1 end
close_scope(pop = true)
click to toggle source
Called when this scope should be closed out
# File lib/volt/server/html_parser/view_scope.rb, line 157 def close_scope(pop = true) if pop scope = @handler.scope.pop else scope = @handler.last end fail "template path already exists: #{scope.path}" if @handler.templates[scope.path] template = { 'html' => scope.html } if scope.bindings.size > 0 # Add the bindings if there are any template['bindings'] = scope.bindings end @handler.templates[scope.path] = template end
last_method_name(getter)
click to toggle source
# File lib/volt/server/html_parser/view_scope.rb, line 131 def last_method_name(getter) getter.strip[/[^.]+$/] end
parent_fetcher(getter)
click to toggle source
Returns ruby code to fetch the parent. (by removing the last fetch) TODO: Probably want to do this with AST transforms with the parser/unparser gems
# File lib/volt/server/html_parser/view_scope.rb, line 123 def parent_fetcher(getter) parent = getter.strip.gsub(/[.][^.]+$/, '') parent = 'self' if parent.blank? || !getter.index('.') parent end
save_binding(binding_number, code)
click to toggle source
# File lib/volt/server/html_parser/view_scope.rb, line 178 def save_binding(binding_number, code) @bindings[binding_number] ||= [] @bindings[binding_number] << code end