mirror of
https://github.com/haml/haml.git
synced 2022-11-09 12:33:31 -05:00
125 lines
3.6 KiB
Ruby
125 lines
3.6 KiB
Ruby
# frozen_string_literal: true
|
|
module Haml
|
|
module Helpers
|
|
module ActionViewMods
|
|
def render(*args, &block)
|
|
options = args.first
|
|
|
|
# If render :layout is used with a block, it concats rather than returning
|
|
# a string so we need it to keep thinking it's Haml until it hits the
|
|
# sub-render.
|
|
if is_haml? && !(options.is_a?(Hash) && options[:layout] && block_given?)
|
|
return non_haml { super }
|
|
end
|
|
super
|
|
end
|
|
|
|
def output_buffer
|
|
return haml_buffer.buffer if is_haml?
|
|
super
|
|
end
|
|
|
|
def output_buffer=(new_buffer)
|
|
if is_haml?
|
|
if Haml::Util.rails_xss_safe? && new_buffer.is_a?(ActiveSupport::SafeBuffer)
|
|
new_buffer = String.new(new_buffer)
|
|
end
|
|
haml_buffer.buffer = new_buffer
|
|
else
|
|
super
|
|
end
|
|
end
|
|
end
|
|
ActionView::Base.send(:prepend, ActionViewMods)
|
|
end
|
|
end
|
|
|
|
module ActionView
|
|
module Helpers
|
|
module CaptureHelper
|
|
def capture_with_haml(*args, &block)
|
|
if Haml::Helpers.block_is_haml?(block)
|
|
#double assignment is to avoid warnings
|
|
_hamlout = _hamlout = eval('_hamlout', block.binding) # Necessary since capture_haml checks _hamlout
|
|
|
|
capture_haml(*args, &block)
|
|
else
|
|
capture_without_haml(*args, &block)
|
|
end
|
|
end
|
|
alias_method :capture_without_haml, :capture
|
|
alias_method :capture, :capture_with_haml
|
|
end
|
|
|
|
module TagHelper
|
|
def content_tag_with_haml(name, *args, &block)
|
|
return content_tag_without_haml(name, *args, &block) unless is_haml?
|
|
|
|
preserve = haml_buffer.options.fetch(:preserve, %w[textarea pre code]).include?(name.to_s)
|
|
|
|
if block_given? && block_is_haml?(block) && preserve
|
|
return content_tag_without_haml(name, *args) {preserve(&block)}
|
|
end
|
|
|
|
content = content_tag_without_haml(name, *args, &block)
|
|
content = Haml::Helpers.preserve(content) if preserve && content
|
|
content
|
|
end
|
|
|
|
alias_method :content_tag_without_haml, :content_tag
|
|
alias_method :content_tag, :content_tag_with_haml
|
|
end
|
|
|
|
module HamlSupport
|
|
include Haml::Helpers
|
|
|
|
def haml_buffer
|
|
@template_object.send :haml_buffer
|
|
end
|
|
|
|
def is_haml?
|
|
@template_object.send :is_haml?
|
|
end
|
|
end
|
|
|
|
module Tags
|
|
class TextArea
|
|
include HamlSupport
|
|
end
|
|
end
|
|
|
|
class InstanceTag
|
|
include HamlSupport
|
|
|
|
def content_tag(*args, &block)
|
|
html_tag = content_tag_with_haml(*args, &block)
|
|
return html_tag unless respond_to?(:error_wrapping)
|
|
return error_wrapping(html_tag) if method(:error_wrapping).arity == 1
|
|
return html_tag unless object.respond_to?(:errors) && object.errors.respond_to?(:on)
|
|
return error_wrapping(html_tag, object.errors.on(@method_name))
|
|
end
|
|
end
|
|
|
|
module FormTagHelper
|
|
def form_tag_with_haml(url_for_options = {}, options = {}, *parameters_for_url, &proc)
|
|
if is_haml?
|
|
wrap_block = block_given? && block_is_haml?(proc)
|
|
if wrap_block
|
|
oldproc = proc
|
|
proc = haml_bind_proc do |*args|
|
|
concat "\n"
|
|
with_tabs(1) {oldproc.call(*args)}
|
|
end
|
|
end
|
|
res = form_tag_without_haml(url_for_options, options, *parameters_for_url, &proc) << "\n"
|
|
res << "\n" if wrap_block
|
|
res
|
|
else
|
|
form_tag_without_haml(url_for_options, options, *parameters_for_url, &proc)
|
|
end
|
|
end
|
|
alias_method :form_tag_without_haml, :form_tag
|
|
alias_method :form_tag, :form_tag_with_haml
|
|
end
|
|
end
|
|
end
|