rdoc/RubyXL/OOXMLObject.html in rubyXL-2.2.0 vs rdoc/RubyXL/OOXMLObject.html in rubyXL-2.3.0

- old
+ new

@@ -2,11 +2,11 @@ <html> <head> <meta charset="UTF-8"> -<title>class RubyXL::OOXMLObject - rubyXL 2.1.3</title> +<title>class RubyXL::OOXMLObject - rubyXL 2.3.0</title> <link href="../fonts.css" rel="stylesheet"> <link href="../rdoc.css" rel="stylesheet"> <script type="text/javascript"> @@ -65,55 +65,21 @@ </div> - <!-- Method Quickref --> -<div id="method-list-section" class="nav-section"> - <h3>Methods</h3> - - <ul class="link-list" role="directory"> - <li ><a href="#method-c-define_attribute">::define_attribute</a> - - <li ><a href="#method-c-define_child_node">::define_child_node</a> - - <li ><a href="#method-c-define_element_name">::define_element_name</a> - - <li ><a href="#method-c-new">::new</a> - - <li ><a href="#method-c-obtain_class_variable">::obtain_class_variable</a> - - <li ><a href="#method-c-parse">::parse</a> - - <li ><a href="#method-c-set_countable">::set_countable</a> - - <li ><a href="#method-i-before_write_xml">#before_write_xml</a> - - <li class="calls-super" ><a href="#method-i-dup">#dup</a> - - <li ><a href="#method-i-index_in_collection">#index_in_collection</a> - - <li ><a href="#method-i-write_xml">#write_xml</a> - - </ul> -</div> - </div> </nav> <main role="main" aria-labelledby="class-RubyXL::OOXMLObject"> <h1 id="class-RubyXL::OOXMLObject" class="class"> class RubyXL::OOXMLObject </h1> <section class="description"> -<p>Parent class for defining OOXML based objects (not unlike Rails’ -<code>ActiveRecord</code>!) Most importantly, provides functionality of -parsing such objects from XML, and marshalling them to XML.</p> - </section> @@ -125,732 +91,9 @@ - <section id="public-class-5Buntitled-5D-method-details" class="method-section"> - <header> - <h3>Public Class Methods</h3> - </header> - - - <div id="method-c-define_attribute" class="method-detail "> - - <div class="method-heading"> - <span class="method-name">define_attribute</span><span - class="method-args">(attr_name, attr_type, extra_params = {})</span> - - <span class="method-click-advice">click to toggle source</span> - - </div> - - - <div class="method-description"> - - <p>Defines an attribute of OOXML object.</p> - -<h3 id="method-c-define_attribute-label-Parameters">Parameters<span><a href="#method-c-define_attribute-label-Parameters">&para;</a> <a href="#documentation">&uarr;</a></span></h3> -<ul><li> -<p><code>attribute_name</code> - Name of the element attribute as seen in the -source XML. Can be either <code>&quot;String&quot;</code> or -<code>:Symbol</code></p> -<ul><li> -<p>Special attibute name <code>'_'</code> (underscore) denotes the value of -the element rather than attribute.</p> -</li></ul> -</li><li> -<p><code>attribute_type</code> - Specifies the conversion type for the -attribute when parsing. Available options are:</p> -<ul><li> -<p><code>:int</code> - <code>Integer</code></p> -</li><li> -<p><code>:float</code> - <code>Float</code></p> -</li><li> -<p><code>:string</code> - <code>String</code> (no conversion)</p> -</li><li> -<p><code>:sqref</code> - <a href="Sqref.html">RubyXL::Sqref</a></p> -</li><li> -<p><code>:ref</code> - <a href="Reference.html">RubyXL::Reference</a></p> -</li><li> -<p><code>:bool</code> - <code>Boolean</code> ("1" and "true" convert to -<code>true</code>, others to <code>false</code>)</p> -</li><li> -<p>one of <code>simple_types</code> - <code>String</code>, plus the list of -acceptable values is saved for future validation (not used yet).</p> -</li></ul> -</li><li> -<p><code>extra_parameters</code> - Hash of optional parameters as follows:</p> -<ul><li> -<p><code>:accessor</code> - Name of the accessor for this attribute to be -defined on the object. If not provided, defaults to classidied -<code>attribute_name</code>.</p> -</li><li> -<p><code>:default</code> - Value this attribute defaults to if not explicitly -provided.</p> -</li><li> -<p><code>:required</code> - Whether this attribute is required when writing -XML. If the value of the attrinute is not explicitly provided, -<code>:default</code> is written instead.</p> -</li></ul> -</li></ul> - -<h4 id="method-c-define_attribute-label-Examples">Examples<span><a href="#method-c-define_attribute-label-Examples">&para;</a> <a href="#documentation">&uarr;</a></span></h4> - -<pre class="ruby"><span class="ruby-identifier">define_attribute</span>(:<span class="ruby-identifier">outline</span>, :<span class="ruby-identifier">bool</span>, :<span class="ruby-identifier">default</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-keyword">true</span>) -</pre> - -<p>A <code>Boolean</code> attribute ‘outline’ with default value -<code>true</code> will be accessible by calling <code>obj.outline</code></p> - -<pre>define_attribute(:uniqueCount, :int)</pre> - -<p>An <code>Integer</code> attribute ‘uniqueCount’ accessible as -<code>obj.unique_count</code></p> - -<pre class="ruby"><span class="ruby-identifier">define_attribute</span>(:<span class="ruby-identifier">_</span>, :<span class="ruby-identifier">string</span>, :<span class="ruby-identifier">accessor</span> =<span class="ruby-operator">&gt;</span> :<span class="ruby-identifier">expression</span>) -</pre> - -<p>The value of the element will be accessible as a <code>String</code> by -calling <code>obj.expression</code></p> - -<pre class="ruby"><span class="ruby-identifier">define_attribute</span>(:<span class="ruby-identifier">errorStyle</span>, :<span class="ruby-identifier">string</span>, :<span class="ruby-identifier">default</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-string">'stop'</span>, :<span class="ruby-identifier">values</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-node">%w{ stop warning information }</span>) -</pre> - -<p>A <code>String</code> attribute named ‘errorStyle’ will be accessible as -<code>obj.error_style</code>, valid values are -<code>&quot;stop&quot;</code>, <code>&quot;warning&quot;</code>, -<code>&quot;information&quot;</code></p> - - - - - <div class="method-source-code" id="define_attribute-source"> - <pre><span class="ruby-comment"># File lib/rubyXL/objects/ooxml_object.rb, line 53</span> -<span class="ruby-keyword">def</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">define_attribute</span>(<span class="ruby-identifier">attr_name</span>, <span class="ruby-identifier">attr_type</span>, <span class="ruby-identifier">extra_params</span> = {}) - <span class="ruby-identifier">attrs</span> = <span class="ruby-identifier">obtain_class_variable</span>(<span class="ruby-value">:@@ooxml_attributes</span>) - - <span class="ruby-identifier">accessor</span> = <span class="ruby-identifier">extra_params</span>[<span class="ruby-value">:accessor</span>] <span class="ruby-operator">||</span> <span class="ruby-identifier">accessorize</span>(<span class="ruby-identifier">attr_name</span>) - <span class="ruby-identifier">attr_name</span> = <span class="ruby-identifier">attr_name</span>.<span class="ruby-identifier">to_s</span> - - <span class="ruby-identifier">attr_hash</span> = { - <span class="ruby-value">:accessor</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">accessor</span>, - <span class="ruby-value">:attr_type</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">attr_type</span>, - <span class="ruby-value">:optional</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-operator">!</span><span class="ruby-identifier">extra_params</span>[<span class="ruby-value">:required</span>], - <span class="ruby-value">:default</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">extra_params</span>[<span class="ruby-value">:default</span>], - } - - <span class="ruby-keyword">if</span> <span class="ruby-identifier">attr_type</span>.<span class="ruby-identifier">is_a?</span>(<span class="ruby-constant">Array</span>) <span class="ruby-keyword">then</span> - <span class="ruby-identifier">attr_hash</span>[<span class="ruby-value">:values</span>] = <span class="ruby-identifier">attr_type</span> - <span class="ruby-identifier">attr_hash</span>[<span class="ruby-value">:attr_type</span>] = <span class="ruby-value">:string</span> - <span class="ruby-keyword">end</span> - - - <span class="ruby-identifier">attrs</span>[<span class="ruby-identifier">attr_name</span>] = <span class="ruby-identifier">attr_hash</span> - - <span class="ruby-keyword">self</span>.<span class="ruby-identifier">send</span>(<span class="ruby-value">:attr_accessor</span>, <span class="ruby-identifier">accessor</span>) -<span class="ruby-keyword">end</span></pre> - </div> - - </div> - - - - - </div> - - - <div id="method-c-define_child_node" class="method-detail "> - - <div class="method-heading"> - <span class="method-name">define_child_node</span><span - class="method-args">(klass, extra_params = {})</span> - - <span class="method-click-advice">click to toggle source</span> - - </div> - - - <div class="method-description"> - - <p>Defines a child node of OOXML object.</p> - -<h3 id="method-c-define_child_node-label-Parameters">Parameters<span><a href="#method-c-define_child_node-label-Parameters">&para;</a> <a href="#documentation">&uarr;</a></span></h3> -<ul><li> -<p><code>klass</code> - Class (descendant of <a -href="OOXMLObject.html">RubyXL::OOXMLObject</a>) of the child nodes. Child -node objects will be produced by calling <code>parse</code> method of that -class.</p> -</li><li> -<p><code>extra_parameters</code> - Hash of optional parameters as follows:</p> -<ul><li> -<p><code>:accessor</code> - Name of the accessor for this attribute to be -defined on the object. If not provided, defaults to classidied -<code>attribute_name</code>.</p> -</li><li> -<p><code>:node_name</code> - Node name for the child node, in case it does not -match the one defined by the <code>klass</code>.</p> -</li><li> -<p><code>:collection</code> - Whether the child node should be treated as a -single node or a collection of nodes:</p> -<ul><li> -<p><code>false</code> (default) - child node is directly accessible through -the respective accessor;</p> -</li><li> -<p><code>true</code> - a collection of child nodes is accessed as -<code>Array</code> through the respective accessor;</p> -</li><li> -<p><code>:with_count</code> - same as <code>true</code>, but in addition, the -attribute <code>count</code> is defined on the current object, that will be -automatically set to the number of elements in the collection at the start -of <code>write_xml</code> call.</p> -</li></ul> -</li></ul> -</li></ul> - -<h4 id="method-c-define_child_node-label-Examples">Examples<span><a href="#method-c-define_child_node-label-Examples">&para;</a> <a href="#documentation">&uarr;</a></span></h4> - -<pre>define_child_node(RubyXL::Alignment)</pre> - -<p>Define a singular child node parsed by the RubyXL::BorderEdge.parse() and -accessed by the default <code>obj.alignment</code> accessor</p> - -<pre class="ruby"><span class="ruby-identifier">define_child_node</span>(<span class="ruby-constant">RubyXL</span><span class="ruby-operator">::</span><span class="ruby-constant">Hyperlink</span>, :<span class="ruby-identifier">colection</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-keyword">true</span>, :<span class="ruby-identifier">accessor</span> =<span class="ruby-operator">&gt;</span> :<span class="ruby-identifier">hyperlinks</span>) -</pre> - -<p>Define an array of nodes accessed by <code>obj.hyperlinks</code> accessor, -each of which will be parsed by the <a -href="OOXMLObject.html#method-c-parse">::parse</a></p> - -<pre class="ruby"><span class="ruby-identifier">define_child_node</span>(<span class="ruby-constant">RubyXL</span><span class="ruby-operator">::</span><span class="ruby-constant">BorderEdge</span>, :<span class="ruby-identifier">node_name</span> =<span class="ruby-operator">&gt;</span> :<span class="ruby-identifier">left</span>) -<span class="ruby-identifier">define_child_node</span>(<span class="ruby-constant">RubyXL</span><span class="ruby-operator">::</span><span class="ruby-constant">BorderEdge</span>, :<span class="ruby-identifier">node_name</span> =<span class="ruby-operator">&gt;</span> :<span class="ruby-identifier">right</span>) -</pre> - -<p>Use class <a href="BorderEdge.html">RubyXL::BorderEdge</a> when parsing -both the elements <code>&lt;left ...&gt;</code> and <code>&lt;right -...&gt;</code> elements.</p> - -<pre class="ruby"><span class="ruby-identifier">define_child_node</span>(<span class="ruby-constant">RubyXL</span><span class="ruby-operator">::</span><span class="ruby-constant">Font</span>, :<span class="ruby-identifier">collection</span> =<span class="ruby-operator">&gt;</span> :<span class="ruby-identifier">with_count</span>, :<span class="ruby-identifier">accessor</span> =<span class="ruby-operator">&gt;</span> :<span class="ruby-identifier">fonts</span>) -</pre> - -<p>Upon writing of the object this was defined on, its <code>count</code> -attribute will be set to the count of nodes in <code>fonts</code> array</p> - - - - - <div class="method-source-code" id="define_child_node-source"> - <pre><span class="ruby-comment"># File lib/rubyXL/objects/ooxml_object.rb, line 97</span> -<span class="ruby-keyword">def</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">define_child_node</span>(<span class="ruby-identifier">klass</span>, <span class="ruby-identifier">extra_params</span> = {}) - <span class="ruby-identifier">child_nodes</span> = <span class="ruby-identifier">obtain_class_variable</span>(<span class="ruby-value">:@@ooxml_child_nodes</span>) - <span class="ruby-identifier">child_node_name</span> = (<span class="ruby-identifier">extra_params</span>[<span class="ruby-value">:node_name</span>] <span class="ruby-operator">||</span> <span class="ruby-identifier">klass</span>.<span class="ruby-identifier">class_variable_get</span>(<span class="ruby-value">:@@ooxml_tag_name</span>)).<span class="ruby-identifier">to_s</span> - <span class="ruby-identifier">accessor</span> = (<span class="ruby-identifier">extra_params</span>[<span class="ruby-value">:accessor</span>] <span class="ruby-operator">||</span> <span class="ruby-identifier">accessorize</span>(<span class="ruby-identifier">child_node_name</span>)).<span class="ruby-identifier">to_sym</span> - - <span class="ruby-identifier">child_nodes</span>[<span class="ruby-identifier">child_node_name</span>] = { - <span class="ruby-value">:class</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">klass</span>, - <span class="ruby-value">:is_array</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">extra_params</span>[<span class="ruby-value">:collection</span>], - <span class="ruby-value">:accessor</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">accessor</span> - } - - <span class="ruby-keyword">if</span> <span class="ruby-identifier">extra_params</span>[<span class="ruby-value">:collection</span>] <span class="ruby-operator">==</span> <span class="ruby-value">:with_count</span> <span class="ruby-keyword">then</span> - <span class="ruby-identifier">define_attribute</span>(<span class="ruby-value">:count</span>, <span class="ruby-value">:int</span>, <span class="ruby-value">:required</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-keyword">true</span>) - <span class="ruby-keyword">end</span> - - <span class="ruby-keyword">self</span>.<span class="ruby-identifier">send</span>(<span class="ruby-value">:attr_accessor</span>, <span class="ruby-identifier">accessor</span>) -<span class="ruby-keyword">end</span></pre> - </div> - - </div> - - - - - </div> - - - <div id="method-c-define_element_name" class="method-detail "> - - <div class="method-heading"> - <span class="method-name">define_element_name</span><span - class="method-args">(element_name)</span> - - <span class="method-click-advice">click to toggle source</span> - - </div> - - - <div class="method-description"> - - <p>Defines the name of the element that represents the current OOXML object. -Should only be used once per object. In case of different objects -represented by the same class in different parts of OOXML tree, -<code>:node_name</code> extra parameter can be used to override the -default element name.</p> - -<h3 id="method-c-define_element_name-label-Parameters">Parameters<span><a href="#method-c-define_element_name-label-Parameters">&para;</a> <a href="#documentation">&uarr;</a></span></h3> -<ul><li> -<p><code>element_name</code></p> -</li></ul> - -<h4 id="method-c-define_element_name-label-Examples">Examples<span><a href="#method-c-define_element_name-label-Examples">&para;</a> <a href="#documentation">&uarr;</a></span></h4> - -<pre>define_element_name 'externalReference'</pre> - - - - - <div class="method-source-code" id="define_element_name-source"> - <pre><span class="ruby-comment"># File lib/rubyXL/objects/ooxml_object.rb, line 122</span> -<span class="ruby-keyword">def</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">define_element_name</span>(<span class="ruby-identifier">element_name</span>) - <span class="ruby-keyword">self</span>.<span class="ruby-identifier">class_variable_set</span>(<span class="ruby-value">:@@ooxml_tag_name</span>, <span class="ruby-identifier">element_name</span>) -<span class="ruby-keyword">end</span></pre> - </div> - - </div> - - - - - </div> - - - <div id="method-c-new" class="method-detail "> - - <div class="method-heading"> - <span class="method-name">new</span><span - class="method-args">(params = {})</span> - - <span class="method-click-advice">click to toggle source</span> - - </div> - - - <div class="method-description"> - - - - - - - <div class="method-source-code" id="new-source"> - <pre><span class="ruby-comment"># File lib/rubyXL/objects/ooxml_object.rb, line 188</span> -<span class="ruby-keyword">def</span> <span class="ruby-identifier">initialize</span>(<span class="ruby-identifier">params</span> = {}) - <span class="ruby-identifier">obtain_class_variable</span>(<span class="ruby-value">:@@ooxml_attributes</span>).<span class="ruby-identifier">each_value</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">v</span><span class="ruby-operator">|</span> - <span class="ruby-identifier">instance_variable_set</span>(<span class="ruby-node">&quot;@#{v[:accessor]}&quot;</span>, <span class="ruby-identifier">params</span>[<span class="ruby-identifier">v</span>[<span class="ruby-value">:accessor</span>]]) - } - - <span class="ruby-identifier">obtain_class_variable</span>(<span class="ruby-value">:@@ooxml_child_nodes</span>).<span class="ruby-identifier">each_value</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">v</span><span class="ruby-operator">|</span> - - <span class="ruby-identifier">initial_value</span> = - <span class="ruby-keyword">if</span> <span class="ruby-identifier">params</span>.<span class="ruby-identifier">has_key?</span>(<span class="ruby-identifier">v</span>[<span class="ruby-value">:accessor</span>]) <span class="ruby-keyword">then</span> <span class="ruby-identifier">params</span>[<span class="ruby-identifier">v</span>[<span class="ruby-value">:accessor</span>]] - <span class="ruby-keyword">elsif</span> <span class="ruby-identifier">v</span>[<span class="ruby-value">:is_array</span>] <span class="ruby-keyword">then</span> [] - <span class="ruby-keyword">else</span> <span class="ruby-keyword">nil</span> - <span class="ruby-keyword">end</span> - - <span class="ruby-identifier">instance_variable_set</span>(<span class="ruby-node">&quot;@#{v[:accessor]}&quot;</span>, <span class="ruby-identifier">initial_value</span>) - } - - <span class="ruby-identifier">instance_variable_set</span>(<span class="ruby-string">&quot;@count&quot;</span>, <span class="ruby-value">0</span>) <span class="ruby-keyword">if</span> <span class="ruby-identifier">obtain_class_variable</span>(<span class="ruby-value">:@@ooxml_countable</span>, <span class="ruby-keyword">false</span>) -<span class="ruby-keyword">end</span></pre> - </div> - - </div> - - - - - </div> - - - <div id="method-c-obtain_class_variable" class="method-detail "> - - <div class="method-heading"> - <span class="method-name">obtain_class_variable</span><span - class="method-args">(var_name, default = {})</span> - - <span class="method-click-advice">click to toggle source</span> - - </div> - - - <div class="method-description"> - - <p>Get the value of a [sub]class variable if it exists, or create the -respective variable with the passed-in <code>default</code> (or +{}+, if -not specified)</p> - -<p>Throughout this class, we are setting class variables through explicit -method calls rather than by directly addressing the name of the variable -because of context issues: addressing variable by name creates it in the -context of defining class, while calling the setter/getter method addresses -it in the context of descendant class, which is what we need.</p> - - - - - <div class="method-source-code" id="obtain_class_variable-source"> - <pre><span class="ruby-comment"># File lib/rubyXL/objects/ooxml_object.rb, line 15</span> -<span class="ruby-keyword">def</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">obtain_class_variable</span>(<span class="ruby-identifier">var_name</span>, <span class="ruby-identifier">default</span> = {}) - <span class="ruby-keyword">if</span> <span class="ruby-identifier">class_variable_defined?</span>(<span class="ruby-identifier">var_name</span>) <span class="ruby-keyword">then</span> - <span class="ruby-keyword">self</span>.<span class="ruby-identifier">class_variable_get</span>(<span class="ruby-identifier">var_name</span>) - <span class="ruby-keyword">else</span> - <span class="ruby-keyword">self</span>.<span class="ruby-identifier">class_variable_set</span>(<span class="ruby-identifier">var_name</span>, <span class="ruby-identifier">default</span>) - <span class="ruby-keyword">end</span> -<span class="ruby-keyword">end</span></pre> - </div> - - </div> - - - - - </div> - - - <div id="method-c-parse" class="method-detail "> - - <div class="method-heading"> - <span class="method-name">parse</span><span - class="method-args">(node)</span> - - <span class="method-click-advice">click to toggle source</span> - - </div> - - - <div class="method-description"> - - - - - - - <div class="method-source-code" id="parse-source"> - <pre><span class="ruby-comment"># File lib/rubyXL/objects/ooxml_object.rb, line 207</span> - <span class="ruby-keyword">def</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">parse</span>(<span class="ruby-identifier">node</span>) - <span class="ruby-identifier">node</span> = <span class="ruby-constant">Nokogiri</span><span class="ruby-operator">::</span><span class="ruby-constant">XML</span>.<span class="ruby-identifier">parse</span>(<span class="ruby-identifier">node</span>) <span class="ruby-keyword">if</span> <span class="ruby-identifier">node</span>.<span class="ruby-identifier">is_a?</span>(<span class="ruby-constant">IO</span>) <span class="ruby-operator">||</span> <span class="ruby-identifier">node</span>.<span class="ruby-identifier">is_a?</span>(<span class="ruby-constant">String</span>) - - <span class="ruby-keyword">if</span> <span class="ruby-identifier">node</span>.<span class="ruby-identifier">is_a?</span>(<span class="ruby-constant">Nokogiri</span><span class="ruby-operator">::</span><span class="ruby-constant">XML</span><span class="ruby-operator">::</span><span class="ruby-constant">Document</span>) <span class="ruby-keyword">then</span> -<span class="ruby-comment"># @namespaces = node.namespaces </span> - <span class="ruby-identifier">node</span> = <span class="ruby-identifier">node</span>.<span class="ruby-identifier">root</span> -<span class="ruby-comment"># ignorable_attr = node.attributes['Ignorable'] </span> -<span class="ruby-comment"># @ignorables &lt;&lt; ignorable_attr.value if ignorable_attr </span> - <span class="ruby-keyword">end</span> - - <span class="ruby-identifier">obj</span> = <span class="ruby-keyword">self</span>.<span class="ruby-identifier">new</span> - - <span class="ruby-identifier">known_attributes</span> = <span class="ruby-identifier">obtain_class_variable</span>(<span class="ruby-value">:@@ooxml_attributes</span>) - - <span class="ruby-identifier">content_params</span> = <span class="ruby-identifier">known_attributes</span>[<span class="ruby-string">'_'</span>] - <span class="ruby-identifier">process_attribute</span>(<span class="ruby-identifier">obj</span>, <span class="ruby-identifier">node</span>.<span class="ruby-identifier">text</span>, <span class="ruby-identifier">content_params</span>) <span class="ruby-keyword">if</span> <span class="ruby-identifier">content_params</span> - - <span class="ruby-identifier">node</span>.<span class="ruby-identifier">attributes</span>.<span class="ruby-identifier">each_pair</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">attr_name</span>, <span class="ruby-identifier">attr</span><span class="ruby-operator">|</span> - <span class="ruby-identifier">attr_name</span> = <span class="ruby-keyword">if</span> <span class="ruby-identifier">attr</span>.<span class="ruby-identifier">namespace</span> <span class="ruby-keyword">then</span> <span class="ruby-node">&quot;#{attr.namespace.prefix}:#{attr.name}&quot;</span> - <span class="ruby-keyword">else</span> <span class="ruby-identifier">attr</span>.<span class="ruby-identifier">name</span> - <span class="ruby-keyword">end</span> - - <span class="ruby-identifier">attr_params</span> = <span class="ruby-identifier">known_attributes</span>[<span class="ruby-identifier">attr_name</span>] - - <span class="ruby-keyword">next</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">attr_params</span>.<span class="ruby-identifier">nil?</span> - <span class="ruby-comment"># raise &quot;Unknown attribute: #{attr_name}&quot; if attr_params.nil? </span> - <span class="ruby-identifier">process_attribute</span>(<span class="ruby-identifier">obj</span>, <span class="ruby-identifier">attr</span>.<span class="ruby-identifier">value</span>, <span class="ruby-identifier">attr_params</span>) - } - - <span class="ruby-identifier">known_child_nodes</span> = <span class="ruby-identifier">obtain_class_variable</span>(<span class="ruby-value">:@@ooxml_child_nodes</span>) - - <span class="ruby-keyword">unless</span> <span class="ruby-identifier">known_child_nodes</span>.<span class="ruby-identifier">empty?</span> - <span class="ruby-identifier">node</span>.<span class="ruby-identifier">element_children</span>.<span class="ruby-identifier">each</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">child_node</span><span class="ruby-operator">|</span> - - <span class="ruby-identifier">child_node_name</span> = <span class="ruby-keyword">if</span> <span class="ruby-identifier">child_node</span>.<span class="ruby-identifier">namespace</span>.<span class="ruby-identifier">prefix</span> <span class="ruby-keyword">then</span> - <span class="ruby-node">&quot;#{child_node.namespace.prefix}:#{child_node.name}&quot;</span> - <span class="ruby-keyword">else</span> <span class="ruby-identifier">child_node</span>.<span class="ruby-identifier">name</span> - <span class="ruby-keyword">end</span> - - <span class="ruby-identifier">child_node_params</span> = <span class="ruby-identifier">known_child_nodes</span>[<span class="ruby-identifier">child_node_name</span>] - <span class="ruby-identifier">raise</span> <span class="ruby-node">&quot;Unknown child node: #{child_node_name}&quot;</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">child_node_params</span>.<span class="ruby-identifier">nil?</span> - <span class="ruby-identifier">parsed_object</span> = <span class="ruby-identifier">child_node_params</span>[<span class="ruby-value">:class</span>].<span class="ruby-identifier">parse</span>(<span class="ruby-identifier">child_node</span>) - <span class="ruby-keyword">if</span> <span class="ruby-identifier">child_node_params</span>[<span class="ruby-value">:is_array</span>] <span class="ruby-keyword">then</span> - <span class="ruby-identifier">index</span> = <span class="ruby-identifier">parsed_object</span>.<span class="ruby-identifier">index_in_collection</span> - <span class="ruby-identifier">collection</span> = <span class="ruby-identifier">obj</span>.<span class="ruby-identifier">send</span>(<span class="ruby-identifier">child_node_params</span>[<span class="ruby-value">:accessor</span>]) - <span class="ruby-keyword">if</span> <span class="ruby-identifier">index</span>.<span class="ruby-identifier">nil?</span> <span class="ruby-keyword">then</span> - <span class="ruby-identifier">collection</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">parsed_object</span> - <span class="ruby-keyword">else</span> - <span class="ruby-identifier">collection</span>[<span class="ruby-identifier">index</span>] = <span class="ruby-identifier">parsed_object</span> - <span class="ruby-keyword">end</span> - <span class="ruby-keyword">else</span> - <span class="ruby-identifier">obj</span>.<span class="ruby-identifier">send</span>(<span class="ruby-node">&quot;#{child_node_params[:accessor]}=&quot;</span>, <span class="ruby-identifier">parsed_object</span>) - <span class="ruby-keyword">end</span> - } - <span class="ruby-keyword">end</span> - - <span class="ruby-identifier">obj</span> - <span class="ruby-keyword">end</span></pre> - </div> - - </div> - - - - - </div> - - - <div id="method-c-set_countable" class="method-detail "> - - <div class="method-heading"> - <span class="method-name">set_countable</span><span - class="method-args">()</span> - - <span class="method-click-advice">click to toggle source</span> - - </div> - - - <div class="method-description"> - - <p>TODO# This method will eventually be obsoleted.</p> - - - - - <div class="method-source-code" id="set_countable-source"> - <pre><span class="ruby-comment"># File lib/rubyXL/objects/ooxml_object.rb, line 127</span> -<span class="ruby-keyword">def</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">set_countable</span> - <span class="ruby-keyword">self</span>.<span class="ruby-identifier">class_variable_set</span>(<span class="ruby-value">:@@ooxml_countable</span>, <span class="ruby-keyword">true</span>) - <span class="ruby-keyword">self</span>.<span class="ruby-identifier">send</span>(<span class="ruby-value">:attr_accessor</span>, <span class="ruby-value">:count</span>) -<span class="ruby-keyword">end</span></pre> - </div> - - </div> - - - - - </div> - - - </section> - - <section id="public-instance-5Buntitled-5D-method-details" class="method-section"> - <header> - <h3>Public Instance Methods</h3> - </header> - - - <div id="method-i-before_write_xml" class="method-detail "> - - <div class="method-heading"> - <span class="method-name">before_write_xml</span><span - class="method-args">()</span> - - <span class="method-click-advice">click to toggle source</span> - - </div> - - - <div class="method-description"> - - <p>Subclass provided filter to perform last-minute operations (cleanup, count, -etc.) immediately prior to write, along with option to terminate the actual -write if <code>false</code> is returned (for example, to avoid writing the -collection’s root node if the collection is empty).</p> - - - - - <div class="method-source-code" id="before_write_xml-source"> - <pre><span class="ruby-comment"># File lib/rubyXL/objects/ooxml_object.rb, line 282</span> -<span class="ruby-keyword">def</span> <span class="ruby-identifier">before_write_xml</span> - <span class="ruby-identifier">child_nodes</span> = <span class="ruby-identifier">obtain_class_variable</span>(<span class="ruby-value">:@@ooxml_child_nodes</span>) - <span class="ruby-identifier">child_nodes</span>.<span class="ruby-identifier">each_pair</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">child_node_name</span>, <span class="ruby-identifier">child_node_params</span><span class="ruby-operator">|</span> - <span class="ruby-keyword">self</span>.<span class="ruby-identifier">count</span> = <span class="ruby-keyword">self</span>.<span class="ruby-identifier">send</span>(<span class="ruby-identifier">child_node_params</span>[<span class="ruby-value">:accessor</span>]).<span class="ruby-identifier">size</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">child_node_params</span>[<span class="ruby-value">:is_array</span>] <span class="ruby-operator">==</span> <span class="ruby-value">:with_count</span> - } - <span class="ruby-keyword">true</span> -<span class="ruby-keyword">end</span></pre> - </div> - - </div> - - - - - </div> - - - <div id="method-i-dup" class="method-detail "> - - <div class="method-heading"> - <span class="method-name">dup</span><span - class="method-args">()</span> - - <span class="method-click-advice">click to toggle source</span> - - </div> - - - <div class="method-description"> - - - - - <div class="method-calls-super"> - Calls superclass method - - </div> - - - - <div class="method-source-code" id="dup-source"> - <pre><span class="ruby-comment"># File lib/rubyXL/objects/ooxml_object.rb, line 266</span> -<span class="ruby-keyword">def</span> <span class="ruby-identifier">dup</span> - <span class="ruby-identifier">new_copy</span> = <span class="ruby-keyword">super</span> - <span class="ruby-identifier">new_copy</span>.<span class="ruby-identifier">count</span> = <span class="ruby-value">0</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">obtain_class_variable</span>(<span class="ruby-value">:@@ooxml_countable</span>, <span class="ruby-keyword">false</span>) - <span class="ruby-identifier">new_copy</span> -<span class="ruby-keyword">end</span></pre> - </div> - - </div> - - - - - </div> - - - <div id="method-i-index_in_collection" class="method-detail "> - - <div class="method-heading"> - <span class="method-name">index_in_collection</span><span - class="method-args">()</span> - - <span class="method-click-advice">click to toggle source</span> - - </div> - - - <div class="method-description"> - - <p>Prototype method. For sparse collections (<code>Rows</code>, -<code>Cells</code>, etc.) must return index at which this object is -expected to reside in the collection. If <code>nil</code> is returned, then -object is simply added to the end of the collection.</p> - - - - - <div class="method-source-code" id="index_in_collection-source"> - <pre><span class="ruby-comment"># File lib/rubyXL/objects/ooxml_object.rb, line 275</span> -<span class="ruby-keyword">def</span> <span class="ruby-identifier">index_in_collection</span> - <span class="ruby-keyword">nil</span> -<span class="ruby-keyword">end</span></pre> - </div> - - </div> - - - - - </div> - - - <div id="method-i-write_xml" class="method-detail "> - - <div class="method-heading"> - <span class="method-name">write_xml</span><span - class="method-args">(xml = nil, node_name_override = nil)</span> - - <span class="method-click-advice">click to toggle source</span> - - </div> - - - <div class="method-description"> - - <p>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 <code>false</code>, an empty string is -returned (rather than <code>nil</code>, so Nokogiri::XML’s -<code>&amp;lt;&amp;lt;</code> operator can be used without additional -<code>nil</code> checking)</p> - -<h3 id="method-i-write_xml-label-Parameters">Parameters<span><a href="#method-i-write_xml-label-Parameters">&para;</a> <a href="#documentation">&uarr;</a></span></h3> -<ul><li> -<p><code>xml</code> - Base Nokogiri::XML object used for building. If omitted, -a blank document will be generated.</p> -</li><li> -<p><code>node_name_override</code> - if present, is used instead of the -default element name for this object provided by -<code>define_element_name</code></p> -</li></ul> - -<h4 id="method-i-write_xml-label-Examples">Examples<span><a href="#method-i-write_xml-label-Examples">&para;</a> <a href="#documentation">&uarr;</a></span></h4> - -<pre>obj.write_xml</pre> - -<p>Creates a new Nokogiti::XML and</p> - - - - - <div class="method-source-code" id="write_xml-source"> - <pre><span class="ruby-comment"># File lib/rubyXL/objects/ooxml_object.rb, line 142</span> -<span class="ruby-keyword">def</span> <span class="ruby-identifier">write_xml</span>(<span class="ruby-identifier">xml</span> = <span class="ruby-keyword">nil</span>, <span class="ruby-identifier">node_name_override</span> = <span class="ruby-keyword">nil</span>) - <span class="ruby-keyword">if</span> <span class="ruby-identifier">xml</span>.<span class="ruby-identifier">nil?</span> <span class="ruby-keyword">then</span> - <span class="ruby-identifier">seed_xml</span> = <span class="ruby-constant">Nokogiri</span><span class="ruby-operator">::</span><span class="ruby-constant">XML</span>(<span class="ruby-string">'&lt;?xml version = &quot;1.0&quot; standalone =&quot;yes&quot;?&gt;'</span>) - <span class="ruby-identifier">seed_xml</span>.<span class="ruby-identifier">encoding</span> = <span class="ruby-string">'UTF-8'</span> - <span class="ruby-identifier">result</span> = <span class="ruby-keyword">self</span>.<span class="ruby-identifier">write_xml</span>(<span class="ruby-identifier">seed_xml</span>) - <span class="ruby-keyword">return</span> <span class="ruby-identifier">result</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">result</span> <span class="ruby-operator">==</span> <span class="ruby-string">''</span> - <span class="ruby-identifier">seed_xml</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">result</span> - <span class="ruby-keyword">return</span> <span class="ruby-identifier">seed_xml</span>.<span class="ruby-identifier">to_xml</span>({ <span class="ruby-value">:indent</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-value">0</span>, <span class="ruby-value">:save_with</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-constant">Nokogiri</span><span class="ruby-operator">::</span><span class="ruby-constant">XML</span><span class="ruby-operator">::</span><span class="ruby-constant">Node</span><span class="ruby-operator">::</span><span class="ruby-constant">SaveOptions</span><span class="ruby-operator">::</span><span class="ruby-constant">AS_XML</span> }) - <span class="ruby-keyword">end</span> - - <span class="ruby-keyword">return</span> <span class="ruby-string">''</span> <span class="ruby-keyword">unless</span> <span class="ruby-identifier">before_write_xml</span> - - <span class="ruby-identifier">attrs</span> = <span class="ruby-identifier">obtain_class_variable</span>(<span class="ruby-value">:@@ooxml_namespaces</span>).<span class="ruby-identifier">dup</span> - - <span class="ruby-identifier">obtain_class_variable</span>(<span class="ruby-value">:@@ooxml_attributes</span>).<span class="ruby-identifier">each_pair</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">k</span>, <span class="ruby-identifier">v</span><span class="ruby-operator">|</span> - <span class="ruby-identifier">val</span> = <span class="ruby-keyword">self</span>.<span class="ruby-identifier">send</span>(<span class="ruby-identifier">v</span>[<span class="ruby-value">:accessor</span>]) - - <span class="ruby-keyword">if</span> <span class="ruby-identifier">val</span>.<span class="ruby-identifier">nil?</span> <span class="ruby-keyword">then</span> - <span class="ruby-keyword">next</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">v</span>[<span class="ruby-value">:optional</span>] - <span class="ruby-identifier">val</span> = <span class="ruby-identifier">v</span>[<span class="ruby-value">:default</span>] - <span class="ruby-keyword">end</span> - - <span class="ruby-identifier">val</span> = <span class="ruby-identifier">val</span> <span class="ruby-operator">&amp;&amp;</span> - <span class="ruby-keyword">case</span> <span class="ruby-identifier">v</span>[<span class="ruby-value">:attr_type</span>] - <span class="ruby-keyword">when</span> <span class="ruby-value">:bool</span> <span class="ruby-keyword">then</span> <span class="ruby-identifier">val</span> <span class="ruby-operator">?</span> <span class="ruby-string">'1'</span> <span class="ruby-operator">:</span> <span class="ruby-string">'0'</span> - <span class="ruby-keyword">when</span> <span class="ruby-value">:float</span> <span class="ruby-keyword">then</span> <span class="ruby-identifier">val</span>.<span class="ruby-identifier">to_s</span>.<span class="ruby-identifier">gsub</span>(<span class="ruby-regexp">/\.0*$/</span>, <span class="ruby-string">''</span>) <span class="ruby-comment"># Trim trailing zeroes </span> - <span class="ruby-keyword">else</span> <span class="ruby-identifier">val</span> - <span class="ruby-keyword">end</span> - - <span class="ruby-identifier">attrs</span>[<span class="ruby-identifier">k</span>] = <span class="ruby-identifier">val</span> - } - - <span class="ruby-identifier">element_text</span> = <span class="ruby-identifier">attrs</span>.<span class="ruby-identifier">delete</span>(<span class="ruby-string">'_'</span>) - <span class="ruby-identifier">elem</span> = <span class="ruby-identifier">xml</span>.<span class="ruby-identifier">create_element</span>(<span class="ruby-identifier">node_name_override</span> <span class="ruby-operator">||</span> <span class="ruby-identifier">obtain_class_variable</span>(<span class="ruby-value">:@@ooxml_tag_name</span>), <span class="ruby-identifier">attrs</span>, <span class="ruby-identifier">element_text</span>) - <span class="ruby-identifier">child_nodes</span> = <span class="ruby-identifier">obtain_class_variable</span>(<span class="ruby-value">:@@ooxml_child_nodes</span>) - <span class="ruby-identifier">child_nodes</span>.<span class="ruby-identifier">each_pair</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">child_node_name</span>, <span class="ruby-identifier">child_node_params</span><span class="ruby-operator">|</span> - <span class="ruby-identifier">obj</span> = <span class="ruby-keyword">self</span>.<span class="ruby-identifier">send</span>(<span class="ruby-identifier">child_node_params</span>[<span class="ruby-value">:accessor</span>]) - <span class="ruby-keyword">unless</span> <span class="ruby-identifier">obj</span>.<span class="ruby-identifier">nil?</span> - <span class="ruby-keyword">if</span> <span class="ruby-identifier">child_node_params</span>[<span class="ruby-value">:is_array</span>] <span class="ruby-keyword">then</span> <span class="ruby-identifier">obj</span>.<span class="ruby-identifier">each</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">item</span><span class="ruby-operator">|</span> <span class="ruby-identifier">elem</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">item</span>.<span class="ruby-identifier">write_xml</span>(<span class="ruby-identifier">xml</span>, <span class="ruby-identifier">child_node_name</span>) <span class="ruby-keyword">unless</span> <span class="ruby-identifier">item</span>.<span class="ruby-identifier">nil?</span> } - <span class="ruby-keyword">else</span> <span class="ruby-identifier">elem</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">obj</span>.<span class="ruby-identifier">write_xml</span>(<span class="ruby-identifier">xml</span>, <span class="ruby-identifier">child_node_name</span>) - <span class="ruby-keyword">end</span> - <span class="ruby-keyword">end</span> - } - <span class="ruby-identifier">elem</span> -<span class="ruby-keyword">end</span></pre> - </div> - - </div> - - - - - </div> - - - </section> - </section> </main> <footer id="validator-badges" role="contentinfo">