summaryrefslogtreecommitdiff
path: root/lib/menu.rb
diff options
context:
space:
mode:
authorelijah <elijah@riseup.net>2012-08-24 21:12:36 -0700
committerelijah <elijah@riseup.net>2012-08-24 21:12:36 -0700
commit627f0488e5bd3c31359fc9e78acffbfea4a86a8b (patch)
treef7b14733e314cf82d5fa3e18cbe9d98c2ffe5c7c /lib/menu.rb
parentb774dea07f97b078fa17e5dcbf901d1c83fed0d6 (diff)
committed website v. 0.1.0
Diffstat (limited to 'lib/menu.rb')
-rw-r--r--lib/menu.rb78
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