Class: SyntaxTree::Tailwindcss::HamlMutationVisitor

Inherits:
Haml::MutationVisitor show all
Defined in:
lib/syntax_tree/tailwindcss/haml_mutation_visitor.rb

Instance Method Summary collapse

Methods inherited from Haml::MutationVisitor

#copy_and_visit_children, #visit

Constructor Details

#initialize(sorter) ⇒ HamlMutationVisitor

Returns a new instance of HamlMutationVisitor.



8
9
10
11
12
# File 'lib/syntax_tree/tailwindcss/haml_mutation_visitor.rb', line 8

def initialize(sorter)
  super()
  @sorter = sorter
  @ruby_visitor = SyntaxTree::Tailwindcss::RubyMutationVisitor.new(@sorter)
end

Instance Method Details

#haml_attributes_mutation_visitorObject



60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
# File 'lib/syntax_tree/tailwindcss/haml_mutation_visitor.rb', line 60

def haml_attributes_mutation_visitor
  @haml_attributes_mutation_visitor ||=
    SyntaxTree.mutation do |visitor|
      # Rewrite `class: ["foo", "bar"]` and `class: "foo bar"`
      visitor.mutate(<<~PATTERN) do |node|
          Assoc[
            key: Label[value: 'class:'] | SymbolLiteral[value: Kw[value: 'class']],
            value: ArrayLiteral[contents: Args] | StringLiteral
          ]
        PATTERN
        case node.value
        when ArrayLiteral
          args = @ruby_visitor.rewrite_args(node.value.contents)
          node.copy(value: node.value.copy(contents: args))
        when StringLiteral
          new_value = @ruby_visitor.rewrite_string_literal(node.value)
          node.copy(value: new_value)
        else
          node
        end
      end
    end
end

#rewrite_html_attributes(string) ⇒ Object

Rewrites ‘(class=“foo #something bar”)`



35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# File 'lib/syntax_tree/tailwindcss/haml_mutation_visitor.rb', line 35

def rewrite_html_attributes(string)
  new_string = string.dup

  pattern = <<~PATTERN
    Assoc[
      key: StringLiteral[parts: [TStringContent[value: "class"]]],
      value: StringLiteral
    ]
  PATTERN

  SyntaxTree.search(string, pattern) do |assoc_node|
    location = assoc_node.value.location
    rewritten = @ruby_visitor.rewrite_string_literal(assoc_node.value)

    formatter = SyntaxTree::Formatter.new(string, [], 10_000)
    rewritten.format(formatter)
    formatter.flush(0)
    formatted = formatter.output.join

    new_string[location.start_char...location.end_char] = formatted
  end

  new_string
end

#visit_tag(node) ⇒ Object



14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# File 'lib/syntax_tree/tailwindcss/haml_mutation_visitor.rb', line 14

def visit_tag(node)
  super.tap do |clone|
    next unless node.value

    # Rewrite `.foo.bar`
    if node.value[:attributes].key?("class")
      clone.value[:attributes]["class"] = @sorter.sort(
        node.value[:attributes]["class"].split
      ).join(" ")
    end

    # Rewrite `(class="foo #{something} bar")`
    if node.value[:dynamic_attributes].new&.include?('"class"')
      clone.value[:dynamic_attributes] = node.value[:dynamic_attributes].dup.tap do |attrs|
        attrs.new = rewrite_html_attributes(attrs.new)
      end
    end
  end
end