Sha256: 57718ca2cd698654c6f32f51dc8782750c9a2b0ea642913dab8ddc81cdeca118

Contents?: true

Size: 1.25 KB

Versions: 1

Compression:

Stored size: 1.25 KB

Contents

module Navigator
  # Renders a HTML tag.
  class Tag
    attr_reader :name, :content

    def self.names_without_suffix
      %w(img input)
    end

    def initialize name, content = nil, attributes: {}, activator: Navigator::TagActivator.new
      @name = String(name)
      @content = content
      @attributes = attributes.with_indifferent_access
      @activator = activator
    end

    def prefix
      ["<#{name}", format_attributes, ">"].compact * ""
    end

    def computed_content
      self.class.names_without_suffix.include?(name) ? nil : content
    end

    def suffix
      self.class.names_without_suffix.include?(name) ? nil : "</#{name}>"
    end

    def render
      [prefix, computed_content, suffix].compact * ""
    end

    private

    attr_reader :attributes, :activator

    def expand_data_attributes! attrs
      return unless attrs.key? :data
      attrs.delete(:data).each { |key, value| attrs["data-#{key}"] = value }
    end

    def concatenate_attributes attrs
      activator.activate(attrs).map { |key, value| %(#{key}="#{value}") } * " "
    end

    def format_attributes
      attrs = attributes.clone
      expand_data_attributes! attrs
      attrs = concatenate_attributes attrs
      attrs.empty? ? nil : " #{attrs}"
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
navigator-1.4.0 lib/navigator/tag.rb