Module: RubyXL::OOXMLObjectInstanceMethods
- Included in:
- OOXMLContainerObject, OOXMLObject
- Defined in:
- lib/rubyXL/objects/ooxml_object.rb
Instance Method Summary collapse
-
#before_write_xml ⇒ Object
Subclass provided filter to perform last-minute operations (cleanup, count, etc.) immediately prior to write, along with option to terminate the actual write if
false
is returned (for example, to avoid writing the collection’s root node if the collection is empty). - #dup ⇒ Object
-
#index_in_collection ⇒ Object
Prototype method.
- #initialize(params = {}) ⇒ Object
-
#write_xml(xml = nil, node_name_override = nil) ⇒ Object
Recursively write the OOXML object and all its children out as Nokogiri::XML.
Instance Method Details
#before_write_xml ⇒ Object
Subclass provided filter to perform last-minute operations (cleanup, count, etc.) immediately prior to write, along with option to terminate the actual write if false
is returned (for example, to avoid writing the collection’s root node if the collection is empty).
315 316 317 318 319 320 321 322 |
# File 'lib/rubyXL/objects/ooxml_object.rb', line 315 def before_write_xml #TODO# This will go away once containers are fully implemented. child_nodes = obtain_class_variable(:@@ooxml_child_nodes) child_nodes.each_pair { |child_node_name, child_node_params| self.count = self.send(child_node_params[:accessor]).size if child_node_params[:is_array] == :with_count } true end |
#dup ⇒ Object
294 295 296 297 298 |
# File 'lib/rubyXL/objects/ooxml_object.rb', line 294 def dup new_copy = super new_copy.count = 0 if obtain_class_variable(:@@ooxml_countable, false) new_copy end |
#index_in_collection ⇒ Object
Prototype method. For sparse collections (Rows
, Cells
, etc.) must return index at which this object is expected to reside in the collection. If nil
is returned, then object is simply added to the end of the collection.
303 304 305 |
# File 'lib/rubyXL/objects/ooxml_object.rb', line 303 def index_in_collection nil end |
#initialize(params = {}) ⇒ Object
207 208 209 210 211 212 213 214 215 |
# File 'lib/rubyXL/objects/ooxml_object.rb', line 207 def initialize(params = {}) obtain_class_variable(:@@ooxml_attributes).each_value { |v| instance_variable_set("@#{v[:accessor]}", params[v[:accessor]]) unless v[:computed] } init_child_nodes(params) instance_variable_set("@count", 0) if obtain_class_variable(:@@ooxml_countable, false) end |
#write_xml(xml = nil, node_name_override = nil) ⇒ Object
Recursively write the OOXML object and all its children out as Nokogiri::XML. Immediately before the actual generation, before_write_xml() is called to perform last-minute cleanup and validation operations; if it returns false
, an empty string is returned (rather than nil
, so Nokogiri::XML’s <<
operator can be used without additional nil
checking)
Parameters
-
xml
- Base Nokogiri::XML object used for building. If omitted, a blank document will be generated. -
node_name_override
- if present, is used instead of the default element name for this object provided bydefine_element_name
Examples
obj.write_xml
Creates a new Nokogiti::XML and
241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 |
# File 'lib/rubyXL/objects/ooxml_object.rb', line 241 def write_xml(xml = nil, node_name_override = nil) if xml.nil? then seed_xml = Nokogiri::XML('<?xml version = "1.0" standalone ="yes"?>') seed_xml.encoding = 'UTF-8' result = self.write_xml(seed_xml) return result if result == '' seed_xml << result return seed_xml.to_xml({ :indent => 0, :save_with => Nokogiri::XML::Node::SaveOptions::AS_XML }) end return '' unless before_write_xml attrs = obtain_class_variable(:@@ooxml_namespaces).dup obtain_class_variable(:@@ooxml_attributes).each_pair { |k, v| val = self.send(v[:accessor]) if val.nil? then next unless v[:required] val = v[:default] end val = val && case v[:attr_type] when :bool then val ? '1' : '0' when :float then val.to_s.gsub(/\.0*$/, '') # Trim trailing zeroes else val end attrs[k] = val } element_text = attrs.delete('_') elem = xml.create_element(node_name_override || obtain_class_variable(:@@ooxml_tag_name), attrs, element_text) child_nodes = obtain_class_variable(:@@ooxml_child_nodes) child_nodes.each_pair { |child_node_name, child_node_params| node_obj = get_node_object(child_node_params) next if node_obj.nil? if node_obj.respond_to?(:write_xml) && !node_obj.equal?(self) then # If child node is either +OOXMLObject+, or +OOXMLContainerObject+ on its first (envelope) pass, # serialize that object. elem << node_obj.write_xml(xml, child_node_name) else # If child node is either vanilla +Array+, or +OOXMLContainerObject+ on its seconds (content) pass, # serialize write its members. node_obj.each { |item| elem << item.write_xml(xml, child_node_name) unless item.nil? } end } elem end |