Module: MenuTxt

Defined in:
lib/menu_txt.rb,
lib/menu_txt/node.rb,
lib/menu_txt/version.rb,
lib/menu_txt/simple_node.rb

Defined Under Namespace

Modules: Node Classes: SimpleNode

Constant Summary collapse

LINE_REGEXP =
/\A(-*)\s*([^\|]+)\s*\|\s*(.+)\Z/.freeze
BLANK_REGEXP =
/\A[[:space:]]*\z/.freeze
VERSION =
"0.1.0"

Class Method Summary collapse

Class Method Details

.parse(io, root = SimpleNode.new(nil)) ⇒ Object



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

def parse(io, root = SimpleNode.new(nil))
  current_node = root

  io.each_line do |line|
    next if BLANK_REGEXP === line
    indent, name, url = line.match(LINE_REGEXP).captures.map(&:strip)
    current_node_indent_size = current_node.level + 1

    if (indent.size - current_node_indent_size) > 1
      raise "Can only nest submenus 1 level at a time: (#{line})"
    elsif indent.size > current_node_indent_size
      current_node = current_node.children.last
      current_node.add_child(name, url)
    elsif indent.size < current_node_indent_size
      unindents_count = current_node_indent_size - indent.size
      unindents_count.times { current_node = current_node.parent }
      current_node.add_child(name, url)
    else
      current_node.add_child(name, url)
    end
  end

  root
end

.parse_path(path, root = SimpleNode.new(nil)) ⇒ Object



11
12
13
# File 'lib/menu_txt.rb', line 11

def parse_path(path, root = SimpleNode.new(nil))
  File.open(path, 'r') { |file| parse(file, root) }
end