Class: SyntaxTree::Tailwindcss::HamlMutationVisitor
- Inherits:
-
Haml::MutationVisitor
- Object
- Haml::MutationVisitor
- SyntaxTree::Tailwindcss::HamlMutationVisitor
- Defined in:
- lib/syntax_tree/tailwindcss/haml_mutation_visitor.rb
Instance Method Summary collapse
- #haml_attributes_mutation_visitor ⇒ Object
-
#initialize(sorter) ⇒ HamlMutationVisitor
constructor
A new instance of HamlMutationVisitor.
-
#rewrite_html_attributes(string) ⇒ Object
Rewrites ‘(class=“foo #something bar”)`.
- #visit_tag(node) ⇒ Object
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_visitor ⇒ Object
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 |