module Hanami module Helpers module HtmlHelper # Empty HTML node # # @since 0.1.0 # @api private class EmptyHtmlNode # List of attributes that get special treatment when rendering. # # @since 0.2.5 # @api private # # @see http://www.w3.org/html/wg/drafts/html/master/infrastructure.html#boolean-attribute BOOLEAN_ATTRIBUTES = %w( allowfullscreen async autobuffer autofocus autoplay checked compact controls declare default defaultchecked defaultmuted defaultselected defer disabled draggable enabled formnovalidate hidden indeterminate inert ismap itemscope loop multiple muted nohref noresize noshade novalidate nowrap open pauseonexit pubdate readonly required reversed scoped seamless selected sortable spellcheck translate truespeed typemustmatch visible ).freeze # Attributes separator # # @since 0.1.0 # @api private ATTRIBUTES_SEPARATOR = ' '.freeze # Initialize a new empty HTML node # # @param name [Symbol,String] the name of the tag # @param attributes [Hash,NilClass] the optional tag attributes # # @return [Hanami::Helpers::HtmlHelper::EmptyHtmlNode] # # @since 0.1.0 # @api private def initialize(name, attributes) @name = name @attributes = attributes end # Resolve and return the output # # @return [String] the output # # @since 0.1.0 # @api private def to_s %(<#{@name}#{attributes}>) end private # Resolve the attributes # # @return [String,NilClass] the tag attributes # # @since 0.1.0 # @api private def attributes return unless defined?(@attributes) && !@attributes.nil? result = '' @attributes.each do |attribute_name, value| if boolean_attribute?(attribute_name) result << boolean_attribute(attribute_name, value) if value else result << attribute(attribute_name, value) end end result end # @api private def boolean_attribute?(attribute_name) BOOLEAN_ATTRIBUTES.include?(attribute_name.to_s) end # Do not render boolean attributes when their value is _false_. # @api private def boolean_attribute(attribute_name, _value) %(#{ATTRIBUTES_SEPARATOR}#{attribute_name}="#{attribute_name}") end # @api private def attribute(attribute_name, value) %(#{ATTRIBUTES_SEPARATOR}#{attribute_name}="#{value}") end end end end end