diff options
Diffstat (limited to 'lib/menu.rb')
-rw-r--r-- | lib/menu.rb | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/lib/menu.rb b/lib/menu.rb new file mode 100644 index 0000000..71690a4 --- /dev/null +++ b/lib/menu.rb @@ -0,0 +1,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
\ No newline at end of file |