Class: Antlers::Parser

Inherits:
Object
  • Object
show all
Defined in:
lib/parser.rb

Instance Method Summary collapse

Constructor Details

#initialize(namespace: nil) ⇒ Parser

Returns a new instance of Parser.



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

def initialize(namespace: nil)
  @factory = NodeFactory.new(namespace:)
end

Instance Method Details

#branch(node:, sequence:) ⇒ Object

rubocop:disable Metrics/AbcSize



16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# File 'lib/parser.rb', line 16

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 << @factory.var_node(segment:)
    elsif segment[:prop]
      node.children << @factory.prop_node(segment:)
    elsif segment[:slot]
      node.children << @factory.yield_node(segment:)
    elsif segment[:slot_def]
      slot_node = @factory.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 = @factory.for_node(segment:)
      node.children << for_node
      sub_branch(node: for_node, sequence:, end_key: :for_end, end_name: 'level_1')
    elsif segment[:form_def]
      form_node = @factory.form_node(segment:)
      node.children << form_node
      sub_branch(node: form_node, sequence:, end_key: :form_end, end_name: 'level_1')
    end
  end

  node
end

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



12
13
14
# File 'lib/parser.rb', line 12

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

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



46
47
48
49
50
51
# File 'lib/parser.rb', line 46

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