diff options
author | elijah <elijah@riseup.net> | 2012-08-24 21:12:36 -0700 |
---|---|---|
committer | elijah <elijah@riseup.net> | 2012-08-24 21:12:36 -0700 |
commit | 627f0488e5bd3c31359fc9e78acffbfea4a86a8b (patch) | |
tree | f7b14733e314cf82d5fa3e18cbe9d98c2ffe5c7c /lib/menu.rb | |
parent | b774dea07f97b078fa17e5dcbf901d1c83fed0d6 (diff) |
committed website v. 0.1.0
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 |