require 'rubyXL/objects/ooxml_object' require 'rubyXL/objects/simple_types' module RubyXL class BooleanValue < OOXMLObject define_attribute(:val, :bool, :required => true, :default => true) end class StringValue < OOXMLObject define_attribute(:val, :string, :required => true) end class IntegerValue < OOXMLObject define_attribute(:val, :int, :required => true) end class FloatValue < OOXMLObject define_attribute(:val, :float, :required => true) end class BooleanNode < OOXMLObject define_attribute(:_, :bool, :accessor => :value) end class StringNode < OOXMLObject define_attribute(:_, :string, :accessor => :value) end class IntegerNode < OOXMLObject define_attribute(:_, :int, :accessor => :value) end class FloatNode < OOXMLObject define_attribute(:_, :float, :accessor => :value) end class StringNodeW3C < OOXMLObject define_attribute(:_, :string, :accessor => :value) define_attribute('xsi:type', :string, :required => true, :default => 'dcterms:W3CDTF') end # http://www.schemacentral.com/sc/ooxml/e-docPropsVTypes_variant.html class Variant < OOXMLObject define_child_node(RubyXL::Variant, :node_name => 'vt:variant') # vector Vector # array Array # blob Binary Blob # oblob Binary Blob Object # empty Empty # null Null # int Integer # uint Unsigned Integer # decimal Decimal # stream Binary Stream # ostream Binary Stream Object # storage Binary Storage # ostorage Binary Storage Object # vstream Binary Versioned Stream # define_child_node(RubyXL::IntegerNode, :node_name => 'vt:i1') define_child_node(RubyXL::IntegerNode, :node_name => 'vt:i2') define_child_node(RubyXL::IntegerNode, :node_name => 'vt:i4') define_child_node(RubyXL::IntegerNode, :node_name => 'vt:i8') define_child_node(RubyXL::IntegerNode, :node_name => 'vt:ui1') define_child_node(RubyXL::IntegerNode, :node_name => 'vt:ui2') define_child_node(RubyXL::IntegerNode, :node_name => 'vt:ui4') define_child_node(RubyXL::IntegerNode, :node_name => 'vt:ui8') define_child_node(RubyXL::FloatNode, :node_name => 'vt:r4') define_child_node(RubyXL::FloatNode, :node_name => 'vt:r8') define_child_node(RubyXL::StringNode, :node_name => 'vt:lpstr') define_child_node(RubyXL::StringNode, :node_name => 'vt:lpstrw') define_child_node(RubyXL::StringNode, :node_name => 'vt:bstr') define_child_node(RubyXL::StringNode, :node_name => 'vt:date') define_child_node(RubyXL::StringNode, :node_name => 'vt:filetime') define_child_node(RubyXL::BooleanNode, :node_name => 'vt:bool') define_child_node(RubyXL::StringNode, :node_name => 'vt:cy') define_child_node(RubyXL::StringNode, :node_name => 'vt:error') define_child_node(RubyXL::StringNode, :node_name => 'vt:clsid') define_child_node(RubyXL::StringNode, :node_name => 'vt:cf') define_element_name 'vt:vector' end # http://www.schemacentral.com/sc/ooxml/e-docPropsVTypes_vector.html class Vector < OOXMLObject define_attribute(:baseType, RubyXL::ST_VectorBaseType, :required => true) define_attribute(:size, :int, :required => true) define_child_node(RubyXL::Variant, :collection => true, :node_name => 'vt:variant') define_child_node(RubyXL::IntegerNode, :collection => true, :node_name => 'vt:i1') define_child_node(RubyXL::IntegerNode, :collection => true, :node_name => 'vt:i2') define_child_node(RubyXL::IntegerNode, :collection => true, :node_name => 'vt:i4') define_child_node(RubyXL::IntegerNode, :collection => true, :node_name => 'vt:i8') define_child_node(RubyXL::IntegerNode, :collection => true, :node_name => 'vt:ui1') define_child_node(RubyXL::IntegerNode, :collection => true, :node_name => 'vt:ui2') define_child_node(RubyXL::IntegerNode, :collection => true, :node_name => 'vt:ui4') define_child_node(RubyXL::IntegerNode, :collection => true, :node_name => 'vt:ui8') define_child_node(RubyXL::FloatNode, :collection => true, :node_name => 'vt:r4') define_child_node(RubyXL::FloatNode, :collection => true, :node_name => 'vt:r8') define_child_node(RubyXL::StringNode, :collection => true, :node_name => 'vt:lpstr') define_child_node(RubyXL::StringNode, :collection => true, :node_name => 'vt:lpstrw') define_child_node(RubyXL::StringNode, :collection => true, :node_name => 'vt:bstr') define_child_node(RubyXL::StringNode, :collection => true, :node_name => 'vt:date') define_child_node(RubyXL::StringNode, :collection => true, :node_name => 'vt:filetime') define_child_node(RubyXL::BooleanNode, :collection => true, :node_name => 'vt:bool') define_child_node(RubyXL::StringNode, :collection => true, :node_name => 'vt:cy') define_child_node(RubyXL::StringNode, :collection => true, :node_name => 'vt:error') define_child_node(RubyXL::StringNode, :collection => true, :node_name => 'vt:clsid') define_child_node(RubyXL::StringNode, :collection => true, :node_name => 'vt:cf') define_element_name 'vt:vector' def before_write_xml # Fill out the count attribute known_child_nodes = obtain_class_variable(:@@ooxml_child_nodes) self.size = 0 known_child_nodes.values.each { |v| self.size += self.send(v[:accessor]).size } true end end class VectorValue < OOXMLObject define_child_node(RubyXL::Vector) end end