class Slim::Splat::Filter
@api private
def call(exp)
def call(exp) @splat_options = nil exp = compile(exp) if @splat_options opts = options.to_hash.reject { |k, v| !Filter.options.valid_key?(k) }.inspect [:multi, [:code, "#{@splat_options} = #{opts}"], exp] else exp end end
def make_builder(attrs)
def make_builder(attrs) @splat_options ||= unique_name builder = unique_name result = [:multi, [:code, "#{builder} = ::Slim::Splat::Builder.new(#{@splat_options})"]] attrs.each do |attr| result << if attr[0] == :html && attr[1] == :attr if attr[3][0] == :slim && attr[3][1] == :attrvalue [:code, "#{builder}.code_attr(#{attr[2].inspect}, #{attr[3][2]}, (#{attr[3][3]}))"] else tmp = unique_name [:multi, [:capture, tmp, compile(attr[3])], [:code, "#{builder}.attr(#{attr[2].inspect}, #{tmp})"]] end elsif attr[0] == :slim && attr[1] == :splat [:code, "#{builder}.splat_attrs((#{attr[2]}))"] else attr end end [builder, result] end
def on_html_attrs(*attrs)
-
(Array)
- Compiled temple expression
Parameters:
-
attrs
(Array
) -- Array of temple expressions
def on_html_attrs(*attrs) if attrs.any? { |attr| splat?(attr) } builder, block = make_builder(attrs) [:multi, block, [:dynamic, "#{builder}.build_attrs"]] else super end end
def on_html_tag(name, attrs, content = nil)
-
(Array)
- Compiled temple expression
Parameters:
-
content
(Array
) -- Temple expression -
attrs
(Array
) -- Temple expression -
name
(String
) -- Tag name
def on_html_tag(name, attrs, content = nil) return super if name != '*' builder, block = make_builder(attrs[2..-1]) if content [:multi, block, [:slim, :output, false, "#{builder}.build_tag #{empty_exp?(content) ? '{}' : 'do'}", compile(content)]] else [:multi, block, [:dynamic, "#{builder}.build_tag"]] end end
def splat?(attr)
def splat?(attr) # Splat attribute given attr[0] == :slim && attr[1] == :splat || # Hyphenated attribute also needs splat handling (attr[0] == :html && attr[1] == :attr && options[:hyphen_attrs].include?(attr[2]) && attr[3][0] == :slim && attr[3][1] == :attrvalue) end