Class: HamlLint::Tree::TagNode

Inherits:
Node
  • Object
show all
Defined in:
lib/haml_lint/tree/tag_node.rb

Overview

Represents a tag node in a HAML document.

Instance Attribute Summary

Attributes inherited from Node

#children, #line, #parent, #type

Instance Method Summary collapse

Methods inherited from Node

#find, #initialize, #inspect, #next_node, #source_code, #successor, #text

Constructor Details

This class inherits a constructor from HamlLint::Tree::Node

Instance Method Details

#attributes_sourceHash

Returns the source code for the static and dynamic attributes of a tag.

Examples:

For ‘%tag.class{ id: ’hello’ }(lang=en)‘, this returns:

{ :static => '.class', :hash => " id: 'hello' ", :html => "lang=en" }

Returns:

  • (Hash)


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
# File 'lib/haml_lint/tree/tag_node.rb', line 87

def attributes_source
  @attr_source ||=
    begin
      _explicit_tag, static_attrs, rest =
        source_code.scan(/\A\s*(%[-:\w]+)?([-:\w\.\#]*)(.*)/m)[0]

      attr_types = {
        '{' => [:hash, %w[{ }]],
        '(' => [:html, %w[( )]],
        '[' => [:object_ref, %w[[ ]]],
      }

      attr_source = { static: static_attrs }
      while rest
        type, chars = attr_types[rest[0]]
        break unless type # Not an attribute opening character, so we're done

        # Can't define multiple of the same attribute type (e.g. two {...})
        break if attr_source[type]

        attr_source[type], rest = Haml::Util.balance(rest, *chars)
      end

      attr_source
    end
end

#contains_script?true, false

Returns whether this tag contains executable script (e.g. is followed by a ‘=`).

Returns:

  • (true, false)


19
20
21
# File 'lib/haml_lint/tree/tag_node.rb', line 19

def contains_script?
  @value[:parse] && !@value[:value].strip.empty?
end

#dynamic_attributes_sourceHash

Returns the source code for the dynamic attributes defined in ‘…`, `(…)`, or `[…]` after a tag name.

Examples:

For ‘%tag.class{ id: ’hello’ }(lang=en)‘, this returns:

{ :hash => " id: 'hello' ", :html => "lang=en" }

Returns:

  • (Hash)


75
76
77
78
# File 'lib/haml_lint/tree/tag_node.rb', line 75

def dynamic_attributes_source
  @dynamic_attributes_source ||=
    attributes_source.reject { |key| key == :static }
end

#dynamic_attributes_sourcesArray<String>

Computed set of attribute hashes code.

This is a combination of all dynamically calculated attributes from the different attribute setting syntaxes (‘…`/`(…)`), converted into Ruby code.

Returns:

  • (Array<String>)


11
12
13
# File 'lib/haml_lint/tree/tag_node.rb', line 11

def dynamic_attributes_sources
  @value[:attributes_hashes]
end

#has_hash_attribute?(attribute) ⇒ true, false

Returns whether this tag has a specified attribute.

Returns:

  • (true, false)


26
27
28
# File 'lib/haml_lint/tree/tag_node.rb', line 26

def has_hash_attribute?(attribute)
  hash_attributes? && existing_attributes.include?(attribute)
end

#hash_attributes?true, false

Whether this tag node has a set of hash attributes defined via the curly brace syntax (e.g. ‘%tag{ lang: ’en’ }‘).

Returns:

  • (true, false)


118
119
120
# File 'lib/haml_lint/tree/tag_node.rb', line 118

def hash_attributes?
  !dynamic_attributes_source[:hash].nil?
end

#hash_attributes_sourceString

Attributes defined after the tag name in Ruby hash brackets (‘{}`).

Examples:

For ‘%tag.class{ lang: ’en’ }‘, this returns:

" lang: 'en' "

Returns:

  • (String)

    source without the surrounding curly braces



128
129
130
# File 'lib/haml_lint/tree/tag_node.rb', line 128

def hash_attributes_source
  dynamic_attributes_source[:hash]
end

#html_attributes?true, false

Whether this tag node has a set of HTML attributes defined via the parentheses syntax (e.g. ‘%tag(lang=en)`).

Returns:

  • (true, false)


136
137
138
# File 'lib/haml_lint/tree/tag_node.rb', line 136

def html_attributes?
  !dynamic_attributes_source[:html].nil?
end

#html_attributes_sourceString?

Attributes defined after the tag name in parentheses (‘()`).

Examples:

For ‘%tag.class(lang=en)`, this returns:

"lang=en"

Returns:

  • (String, nil)

    source without the surrounding parentheses, or ‘nil` if it has not been defined



147
148
149
# File 'lib/haml_lint/tree/tag_node.rb', line 147

def html_attributes_source
  dynamic_attributes_source[:html][/\A\((.*)\)\z/, 1] if html_attributes?
end

#object_reference?true, false

Whether this tag node has a set of square brackets (e.g. ‘%tag`) following it that indicates its class and ID will be to the value of the given object’s #to_key or #id method (in that order).

Returns:

  • (true, false)


163
164
165
# File 'lib/haml_lint/tree/tag_node.rb', line 163

def object_reference?
  @value[:object_ref].to_s != 'nil'
end

#object_reference_sourceString?

Source code for the contents of the node’s object reference.

Returns:

  • (String, nil)

    string source of object reference or ‘nil` if it has not been defined

See Also:



172
173
174
# File 'lib/haml_lint/tree/tag_node.rb', line 172

def object_reference_source
  @value[:object_ref][/\A\[(.*)\]\z/, 1] if object_reference?
end

#remove_inner_whitespace?true, false

Whether this node had a ‘<` after it signifying that outer whitespace should be removed.

Returns:

  • (true, false)


180
181
182
# File 'lib/haml_lint/tree/tag_node.rb', line 180

def remove_inner_whitespace?
  @value[:nuke_inner_whitespace]
end

#remove_outer_whitespace?true, false

Whether this node had a ‘>` after it signifying that outer whitespace should be removed.

Returns:

  • (true, false)


188
189
190
# File 'lib/haml_lint/tree/tag_node.rb', line 188

def remove_outer_whitespace?
  @value[:nuke_outer_whitespace]
end

#scriptString

Returns the script source that will be evaluated to produce this tag’s inner content, if any.

Returns:

  • (String)


196
197
198
# File 'lib/haml_lint/tree/tag_node.rb', line 196

def script
  (@value[:value] if @value[:parse]) || ''
end

#static_attributes_sourceString

Static element attributes defined after the tag name.

Examples:

For ‘%tag.button#start-button`, this returns:

'.button#start-button'

Returns:

  • (String)


64
65
66
# File 'lib/haml_lint/tree/tag_node.rb', line 64

def static_attributes_source
  attributes_source[:static] || ''
end

#static_classesArray<String>

List of classes statically defined for this tag.

Examples:

For ‘%tag.button.button-info{ class: status }`, this returns:

['button', 'button-info']

Returns:

  • (Array<String>)

    list of statically defined classes with leading dot removed



37
38
39
40
41
42
# File 'lib/haml_lint/tree/tag_node.rb', line 37

def static_classes
  @static_classes ||=
    begin
      static_attributes_source.scan(/\.([-:\w]+)/)
    end
end

#static_idsArray<String>

List of ids statically defined for this tag.

Examples:

For ‘%tag.button#start-button{ id: special_id }`, this returns:

['start-button']

Returns:

  • (Array<String>)

    list of statically defined ids with leading ‘#` removed



51
52
53
54
55
56
# File 'lib/haml_lint/tree/tag_node.rb', line 51

def static_ids
  @static_ids ||=
    begin
      static_attributes_source.scan(/#([-:\w]+)/)
    end
end

#tag_nameString

Name of the HTML tag.

Returns:

  • (String)


154
155
156
# File 'lib/haml_lint/tree/tag_node.rb', line 154

def tag_name
  @value[:name]
end