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