Module: Antlers::Parser

Defined in:
lib/parser.rb

Class Method Summary collapse

Class Method Details

.branch(node:, sequence:) ⇒ Object

rubocop:disable Metrics/AbcSize



13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# File 'lib/parser.rb', line 13

def branch(node:, sequence:) # rubocop:disable Metrics/AbcSize
  until sequence.empty?
    segment = sequence.shift

    if segment.is_a?(String)
      node.children << segment
    elsif segment[:var]
      node.children << NodeFactory.var_node(segment:)
    elsif segment[:prop]
      node.children << NodeFactory.prop_node(segment:)
    elsif segment[:slot]
      node.children << NodeFactory.yield_node(segment:)
    elsif segment[:slot_def]
      slot_node = NodeFactory.slot_node(segment:)
      node.children << slot_node
      sub_branch(node: slot_node, sequence:, end_key: :slot_end, end_name: slot_node.name)
    elsif segment[:for_def]
      for_node = NodeFactory.for_node(segment:)
      node.children << for_node
      sub_branch(node: for_node, sequence:, end_key: :for_end, end_name: 'level_1')
    end
  end

  node
end

.parse(sequence, id: :root_node) ⇒ Object



9
10
11
# File 'lib/parser.rb', line 9

def parse(sequence, id: :root_node)
  branch(node: RootNode.new(name: id), sequence:)
end

.sub_branch(node:, sequence:, end_key:, end_name: nil) ⇒ Object



39
40
41
42
43
44
# File 'lib/parser.rb', line 39

def sub_branch(node:, sequence:, end_key:, end_name: nil)
  sub_sequence = []
  sub_sequence << sequence.shift until sequence.first.is_a?(Hash) && sequence.first[end_key] == end_name

  branch(node:, sequence: sub_sequence)
end