require 'active_admin/arbre/html/element'
module Arbre
class Context < Arbre::HTML::Element
def indent_level
# A context does not increment the indent_level
super - 1
end
def bytesize
cached_html.bytesize
end
alias :length :bytesize
def respond_to?(method)
super || cached_html.respond_to?(method)
end
# Webservers treat Arbre::Context as a string. We override
# method_missing to delegate to the string representation
# of the html.
def method_missing(method, *args, &block)
if cached_html.respond_to? method
cached_html.send method, *args, &block
else
super
end
end
private
# Caches the rendered HTML so that we don't re-render just to
# get the content lenght or to delegate a method to the HTML
def cached_html
if defined?(@cached_html)
@cached_html
else
html = to_html
@cached_html = html if html.length > 0
html
end
end
end
end