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
|