Class: ActionView::Helpers::TagHelper::TagBuilder

Inherits:
Object
  • Object
show all
Includes:
CaptureHelper, OutputSafetyHelper
Defined in:
lib/action_view/helpers/tag_helper.rb

Overview

:nodoc:

Constant Summary collapse

VOID_ELEMENTS =
%i(area base br col embed hr img input keygen link meta param source track wbr).to_set

Instance Method Summary collapse

Methods included from OutputSafetyHelper

#raw, #safe_join, #to_sentence

Methods included from CaptureHelper

#capture, #content_for, #content_for?, #provide, #with_output_buffer

Constructor Details

#initialize(view_context) ⇒ TagBuilder

Returns a new instance of TagBuilder.

[View source]

48
49
50
# File 'lib/action_view/helpers/tag_helper.rb', line 48

def initialize(view_context)
  @view_context = view_context
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(called, *args, **options, &block) ⇒ Object (private)

[View source]

173
174
175
# File 'lib/action_view/helpers/tag_helper.rb', line 173

def method_missing(called, *args, **options, &block)
  tag_string(called, *args, **options, &block)
end

Instance Method Details

#boolean_tag_option(key) ⇒ Object

[View source]

120
121
122
# File 'lib/action_view/helpers/tag_helper.rb', line 120

def boolean_tag_option(key)
  %(#{key}="#{key}")
end

#content_tag_string(name, content, options, escape = true) ⇒ Object

[View source]

67
68
69
70
71
72
73
74
75
76
# File 'lib/action_view/helpers/tag_helper.rb', line 67

def (name, content, options, escape = true)
  tag_options = tag_options(options, escape) if options

  if escape
    name = ERB::Util.xml_name_escape(name)
    content = ERB::Util.unwrapped_html_escape(content)
  end

  "<#{name}#{tag_options}>#{PRE_CONTENT_STRINGS[name]}#{content}</#{name}>".html_safe
end

#p(*arguments, **options, &block) ⇒ Object

[View source]

52
53
54
# File 'lib/action_view/helpers/tag_helper.rb', line 52

def p(*arguments, **options, &block)
  tag_string(:p, *arguments, **options, &block)
end

#tag_option(key, value, escape) ⇒ Object

[View source]

124
125
126
127
128
129
130
131
132
133
134
135
136
137
# File 'lib/action_view/helpers/tag_helper.rb', line 124

def tag_option(key, value, escape)
  key = ERB::Util.xml_name_escape(key) if escape

  case value
  when Array, Hash
    value = TagHelper.build_tag_values(value) if key.to_s == "class"
    value = escape ? safe_join(value, " ") : value.join(" ")
  else
    value = escape ? ERB::Util.unwrapped_html_escape(value) : value.to_s
  end
  value = value.gsub('"', "&quot;") if value.include?('"')

  %(#{key}="#{value}")
end

#tag_options(options, escape = true) ⇒ Object

[View source]

78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
# File 'lib/action_view/helpers/tag_helper.rb', line 78

def tag_options(options, escape = true)
  return if options.blank?
  output = +""
  sep    = " "
  options.each_pair do |key, value|
    type = TAG_TYPES[key]
    if type == :data && value.is_a?(Hash)
      value.each_pair do |k, v|
        next if v.nil?
        output << sep
        output << prefix_tag_option(key, k, v, escape)
      end
    elsif type == :aria && value.is_a?(Hash)
      value.each_pair do |k, v|
        next if v.nil?

        case v
        when Array, Hash
          tokens = TagHelper.build_tag_values(v)
          next if tokens.none?

          v = safe_join(tokens, " ")
        else
          v = v.to_s
        end

        output << sep
        output << prefix_tag_option(key, k, v, escape)
      end
    elsif type == :boolean
      if value
        output << sep
        output << boolean_tag_option(key)
      end
    elsif !value.nil?
      output << sep
      output << tag_option(key, value, escape)
    end
  end
  output unless output.empty?
end

#tag_string(name, content = nil, **options, &block) ⇒ Object

[View source]

56
57
58
59
60
61
62
63
64
65
# File 'lib/action_view/helpers/tag_helper.rb', line 56

def tag_string(name, content = nil, **options, &block)
  escape = handle_deprecated_escape_options(options)

  content = @view_context.capture(self, &block) if block_given?
  if VOID_ELEMENTS.include?(name) && content.nil?
    "<#{name.to_s.dasherize}#{tag_options(options, escape)}>".html_safe
  else
    (name.to_s.dasherize, content || "", options, escape)
  end
end