summaryrefslogtreecommitdiff
path: root/lib/menu.rb
blob: 71690a42d6a8dc41d98478b53dcf01cc29be53f3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
class Menu < Array
  attr_accessor :parent

  #
  # class methods
  #

  #
  # load the menu.txt file, recursively, and build the in-memory menu array
  #
  def self.load(menu_file_path)
    @menu = Menu.new
    File.open(menu_file_path) do |file|
      append_menu_item(@menu, file)
    end
  end

  def self.menu
    @menu || Menu.new
  end

  def self.create(elements=[], parent=nil)
    menu = Menu[elements]
    menu.parent = parent
    return menu
  end

  #
  # public methods
  #

  def submenu(item_name=nil)
    if item_name
      submenu = detect {|item| item[0] == item_name} || Menu.new
    else
      submenu = self
    end
    return submenu[1..-1] # strip of first element
  end

  def name
    first
  end

  def path
    @path ||= begin
      if parent == nil
        []
      else
        parent.path + [name]
      end
    end
  end

  private

  def self.append_menu_item(menu, file)
    begin
      item = file.readline
    rescue EOFError
      # do nothing
    else
      if item !~ /^\s*#/
        depth = item.scan("  ").size
        sub_menu = sub_menu_for_depth(menu, depth)
        sub_menu << Menu.create(item.strip, sub_menu)
      end
      append_menu_item(menu, file)
    end
  end

  def self.sub_menu_for_depth(menu, depth)
    sub_menu = menu
    depth.times { sub_menu = sub_menu[-1] }
    sub_menu
  end

end