lib/osheet/workbook_element.rb in osheet-0.10.0 vs lib/osheet/workbook_element.rb in osheet-1.0.0.rc.1
- old
+ new
@@ -1,17 +1,234 @@
-module Osheet::WorkbookElement
+require 'osheet/style'
+require 'osheet/worksheet'
- def workbook
- get_ivar(:workbook)
+module Osheet
+
+
+ class WorkbookElement
+
+ # This 'WorkbookElement' class handles all workbook state. It is setup
+ # and referenced by the 'Workbook' class when it runs builds
+
+ class PartialSet < ::Hash; end
+ class TemplateSet < PartialSet; end
+ class StyleSet < ::Array; end
+ class WorksheetSet < ::Array; end
+
+ attr_reader :title
+ attr_reader :templates, :partials, :styles, :worksheets
+
+ def initialize
+ @title = nil
+
+ @templates = TemplateSet.new
+ @partials = PartialSet.new
+ @styles = StyleSet.new
+ @worksheets = WorksheetSet.new
+ end
+
+ def title(value=nil)
+ value.nil? ? @title : @title = value.to_s
+ end
+
+ def template(template)
+ @templates << template
+ end
+
+ def partial(partial)
+ @partials << partial
+ end
+
+ def style(style)
+ @styles << style
+ end
+
+ def worksheet(worksheet)
+ @worksheets << worksheet
+ end
+
+ def styles(*args)
+ @styles.for(*args)
+ end
+
+ def ==(other)
+ title == other.title &&
+ templates == other.templates &&
+ partials == other.partials &&
+ styles == other.styles &&
+ worksheets == other.worksheets
+ end
+
end
- [:styles, :templates].each do |thing|
- define_method(thing) do
- if workbook && workbook.respond_to?(thing)
- workbook.send(thing)
+
+
+ class WorkbookElement::PartialSet
+
+ # this class is a Hash that behaves kinda like a set. I want to
+ # push partials into the set using the '<<' operator, only allow
+ # Osheet::Partial objs to be pushed, and then be able to reference
+ # a particular partial using its name
+
+ def initialize
+ super
+ end
+
+ def <<(partial)
+ if (key = verify(partial))
+ push(key, partial)
+ end
+ end
+
+ # return the named partial
+ def get(name)
+ lookup(key(name.to_s))
+ end
+
+ private
+
+ def lookup(key)
+ self[key]
+ end
+
+ # push the partial onto the key
+ def push(key, partial)
+ self[key] = partial
+ end
+
+ # verify the partial, init and return the key
+ # otherwise ArgumentError it up
+ def verify(partial)
+ unless partial.kind_of?(Partial)
+ raise ArgumentError, 'you can only push Osheet::Partial objs to the partial set'
+ end
+ pkey = partial_key(partial)
+ self[pkey] ||= nil
+ pkey
+ end
+
+ def partial_key(partial)
+ key(partial.instance_variable_get("@name"))
+ end
+
+ def key(name)
+ name.to_s
+ end
+
+ end
+
+
+
+ class WorkbookElement::TemplateSet < WorkbookElement::PartialSet
+
+ # this class is a PartialSet that keys off of the template element
+ # and name. Only Osheet::Template objs can be pushed, and you reference
+ # a particular template by its element and name
+
+ def initialize
+ super
+ end
+
+ # return the template set for the named element
+ def get(element, name)
+ lookup(key(element.to_s, name.to_s))
+ end
+
+ private
+
+ def lookup(key)
+ self[key.first][key.last] if self[key.first]
+ end
+
+ # push the template onto the key
+ def push(key, template)
+ self[key.first][key.last] = template
+ end
+
+ # verify the template, init the key set, and return the key string
+ # otherwise ArgumentError it up
+ def verify(template)
+ unless template.kind_of?(Template)
+ raise ArgumentError, 'you can only push Osheet::Template objs to the template set'
+ end
+ key = template_key(template)
+ self[key.first] ||= {}
+ self[key.first][key.last] ||= nil
+ key
+ end
+
+ def template_key(template)
+ key(template.instance_variable_get("@element"), template.instance_variable_get("@name"))
+ end
+
+ def key(element, name)
+ [element.to_s, name.to_s]
+ end
+
+ end
+
+
+
+ class WorkbookElement::StyleSet < ::Array
+
+ # this class is an Array with some helper methods. I want to
+ # push styles into the set using the '<<' operator, only allow
+ # Osheet::Style objs to be pushed, and then be able to reference
+ # a particular set of styles using a style class.
+
+ def initialize
+ super
+ end
+
+ def <<(value)
+ super if verify(value)
+ end
+
+ # return the style set for the style class
+ def for(style_class=nil)
+ style_class.nil? ? self : self.select{|s| s.match?(style_class)}
+ end
+
+ private
+
+ # verify the style, otherwise ArgumentError it up
+ def verify(style)
+ if style.kind_of?(Style)
+ true
else
- nil
+ raise ArgumentError, 'you can only push Osheet::Style objs to the style set'
end
end
+
end
+
+
+
+ class WorkbookElement::WorksheetSet < ::Array
+
+ # this class is just a wrapper to Array. I want to push worksheets
+ # into the set using the '<<' operator, but only allow Worksheet objs
+ # to be pushed.
+
+ def initialize
+ super
+ end
+
+ def <<(value)
+ super if verify(value)
+ end
+
+ private
+
+ # verify the worksheet, otherwise ArgumentError it up
+ def verify(worksheet)
+ if worksheet.kind_of?(Worksheet)
+ true
+ else
+ raise ArgumentError, 'can only push Osheet::Worksheet to the set'
+ end
+ end
+
+ end
+
end