71690a42d6a8dc41d98478b53dcf01cc29be53f3
[leap_website.git] / lib / menu.rb
1 class Menu < Array
2   attr_accessor :parent
3
4   #
5   # class methods
6   #
7
8   #
9   # load the menu.txt file, recursively, and build the in-memory menu array
10   #
11   def self.load(menu_file_path)
12     @menu = Menu.new
13     File.open(menu_file_path) do |file|
14       append_menu_item(@menu, file)
15     end
16   end
17
18   def self.menu
19     @menu || Menu.new
20   end
21
22   def self.create(elements=[], parent=nil)
23     menu = Menu[elements]
24     menu.parent = parent
25     return menu
26   end
27
28   #
29   # public methods
30   #
31
32   def submenu(item_name=nil)
33     if item_name
34       submenu = detect {|item| item[0] == item_name} || Menu.new
35     else
36       submenu = self
37     end
38     return submenu[1..-1] # strip of first element
39   end
40
41   def name
42     first
43   end
44
45   def path
46     @path ||= begin
47       if parent == nil
48         []
49       else
50         parent.path + [name]
51       end
52     end
53   end
54
55   private
56
57   def self.append_menu_item(menu, file)
58     begin
59       item = file.readline
60     rescue EOFError
61       # do nothing
62     else
63       if item !~ /^\s*#/
64         depth = item.scan("  ").size
65         sub_menu = sub_menu_for_depth(menu, depth)
66         sub_menu << Menu.create(item.strip, sub_menu)
67       end
68       append_menu_item(menu, file)
69     end
70   end
71
72   def self.sub_menu_for_depth(menu, depth)
73     sub_menu = menu
74     depth.times { sub_menu = sub_menu[-1] }
75     sub_menu
76   end
77
78 end