require 'active_support/core_ext/object/blank'
require 'active_support/core_ext/string/output_safety'
require 'set'
module ActionView
# = Action View Tag Helpers
module Helpers #:nodoc:
# Provides methods to generate HTML tags programmatically when you can't use
# a Builder. By default, they output XHTML compliant tags.
module TagHelper
extend ActiveSupport::Concern
include CaptureHelper
BOOLEAN_ATTRIBUTES = %w(disabled readonly multiple checked autobuffer
autoplay controls loop selected hidden scoped async
defer reversed ismap seemless muted required
autofocus novalidate formnovalidate open pubdate).to_set
BOOLEAN_ATTRIBUTES.merge(BOOLEAN_ATTRIBUTES.map {|attribute| attribute.to_sym })
PRE_CONTENT_STRINGS = {
:textarea => "\n"
}
# Returns an empty HTML tag of type +name+ which by default is XHTML
# compliant. Set +open+ to true to create an open tag compatible
# with HTML 4.0 and below. Add HTML attributes by passing an attributes
# hash to +options+. Set +escape+ to false to disable attribute value
# escaping.
#
# ==== Options
# You can use symbols or strings for the attribute names.
#
# Use +true+ with boolean attributes that can render with no value, like
# +disabled+ and +readonly+.
#
# HTML5 data-* attributes can be set with a single +data+ key
# pointing to a hash of sub-attributes.
#
# To play nicely with JavaScript conventions sub-attributes are dasherized.
# For example, a key +user_id+ would render as data-user-id and
# thus accessed as dataset.userId.
#
# Values are encoded to JSON, with the exception of strings and symbols.
# This may come in handy when using jQuery's HTML5-aware .data()
# from 1.4.3.
#
# ==== Examples
# tag("br")
# # =>
#
# tag("br", nil, true)
# # =>
#
# tag("input", :type => 'text', :disabled => true)
# # =>
#
# tag("img", :src => "open & shut.png")
# # =>
#
# tag("img", {:src => "open & shut.png"}, false, false)
# # =>
#
# tag("div", :data => {:name => 'Stephen', :city_state => %w(Chicago IL)})
# # =>
def tag(name, options = nil, open = false, escape = true)
"<#{name}#{tag_options(options, escape) if options}#{open ? ">" : " />"}".html_safe
end
# Returns an HTML block tag of type +name+ surrounding the +content+. Add
# HTML attributes by passing an attributes hash to +options+.
# Instead of passing the content as an argument, you can also use a block
# in which case, you pass your +options+ as the second parameter.
# Set escape to false to disable attribute value escaping.
#
# ==== Options
# The +options+ hash is used with attributes with no value like (disabled and
# readonly), which you can give a value of true in the +options+ hash. You can use
# symbols or strings for the attribute names.
#
# ==== Examples
# content_tag(:p, "Hello world!")
# # =>
Hello world!
# content_tag(:div, content_tag(:p, "Hello world!"), :class => "strong") # # =>Hello world!