<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
    <title>ERBook::Document</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <link rel="stylesheet" href="../../css/reset.css" type="text/css" media="screen" />
    <link rel="stylesheet" href="../../css/main.css" type="text/css" media="screen" />
    <script src="../../js/jquery-1.3.2.min.js" type="text/javascript" charset="utf-8"></script>
    <script src="../../js/jquery-effect.js" type="text/javascript" charset="utf-8"></script>
    <script src="../../js/main.js" type="text/javascript" charset="utf-8"></script>
</head>

<body>     
    <div class="banner">
        <h1>
            <span class="type">Class</span> 
            ERBook::Document 
            
                <span class="parent">&lt; 
                    
                    Object
                    
                </span>
            
        </h1>
        <ul class="files">
            
            <li><a href="../../files/lib/erbook/document_rb.html">lib/erbook/document.rb</a></li>
            
        </ul>
    </div>
    <div id="bodyContent">
        <div id="content">
    

    

    
    

    
    
    <div class="sectiontitle">Methods</div>
    <dl class="methods">
    
        <dt>N</dt>
        <dd>
            <ul>
                
                <li><a href="#M000048">new</a></li>
                
            </ul>
        </dd>
    
        <dt>T</dt>
        <dd>
            <ul>
                
                <li><a href="#M000061">to_s</a></li>
                
            </ul>
        </dd>
    
    </dl>
    

    

    

    
    <div class="sectiontitle">Classes and Modules</div>
    <ul>
        
        <li><span class="type">CLASS</span> <a href="Document/Node.html">ERBook::Document::Node</a></li>
        
    </ul>
    

    

    
    <div class="sectiontitle">Attributes</div>
    <table border='0' cellpadding='5'>
        
        <tr valign='top'>
            <td class='attr-rw'>
                [R]
            </td>
            <td class='attr-name'>format</td>
            <td class='attr-desc'><p>
Data from the format specification file.
</p></td>
        </tr>
        
        <tr valign='top'>
            <td class='attr-rw'>
                [R]
            </td>
            <td class='attr-name'>roots</td>
            <td class='attr-desc'><p>
All root nodes in the document.
</p></td>
        </tr>
        
        <tr valign='top'>
            <td class='attr-rw'>
                [R]
            </td>
            <td class='attr-name'>nodes</td>
            <td class='attr-desc'><p>
All nodes in the document.
</p></td>
        </tr>
        
        <tr valign='top'>
            <td class='attr-rw'>
                [R]
            </td>
            <td class='attr-name'>nodes_by_type</td>
            <td class='attr-desc'><p>
All nodes in the document arranged by node type.
</p></td>
        </tr>
        
    </table>
    

    
            <div class="sectiontitle">Class Public methods</div>
            
            <div class="method">
                <div class="title" id="M000048">
                    
                    <a name="M000048"></a><b>new</b>(format_name, input_text, input_file, options = {})
                    
                </div>
                
                <div class="description">
                  <h4>Parameters</h4>
<dl>
<dt>format_name</dt><dd>Either the short-hand name of a built-in format or the path to a format
specification file.

</dd>
<dt>input_text</dt><dd>The body of the input document.

</dd>
<dt>input_file</dt><dd>Name of the file from which the input document originated.

</dd>
</dl>
<h4>Options</h4>
<dl>
<dt>:unindent</dt><dd>If true, all node content is unindented hierarchically.

</dd>
</dl>

                </div>
                
                
                
                
                <div class="sourcecode">
                    <p class="source-link">
                        Source: <a href="javascript:toggleSource('M000048_source')" id="l_M000048_source">show</a>
                        
                        | <a href="http://github.com/sunaku/erbook/blob/9c3f6ad5c94f67d3f20e896873dbc7b127036c44/lib/erbook/document.rb#L42" target="_blank" class="github_url">on GitHub</a>
                        
                    </p>
                    <div id="M000048_source" class="dyn-source">
                        <pre><span class="ruby-comment cmt"># File lib/erbook/document.rb, line 42</span>
    <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">initialize</span> <span class="ruby-identifier">format_name</span>, <span class="ruby-identifier">input_text</span>, <span class="ruby-identifier">input_file</span>, <span class="ruby-identifier">options</span> = {}
      <span class="ruby-comment cmt"># process format specification</span>
        <span class="ruby-ivar">@format_file</span> = <span class="ruby-identifier">format_name</span>.<span class="ruby-identifier">to_s</span>

        <span class="ruby-constant">File</span>.<span class="ruby-identifier">file?</span> <span class="ruby-ivar">@format_file</span> <span class="ruby-keyword kw">or</span>
          <span class="ruby-ivar">@format_file</span> = <span class="ruby-constant">File</span>.<span class="ruby-identifier">join</span>(<span class="ruby-constant">ERBook</span><span class="ruby-operator">::</span><span class="ruby-constant">FORMATS_DIR</span>, <span class="ruby-ivar">@format_file</span> <span class="ruby-operator">+</span> <span class="ruby-value str">'.yaml'</span>)

        <span class="ruby-keyword kw">begin</span>
          <span class="ruby-ivar">@format</span> = <span class="ruby-constant">YAML</span>.<span class="ruby-identifier">load_file</span>(<span class="ruby-ivar">@format_file</span>)
          <span class="ruby-ivar">@format</span>[<span class="ruby-identifier">:file</span>] = <span class="ruby-constant">File</span>.<span class="ruby-identifier">expand_path</span>(<span class="ruby-ivar">@format_file</span>)
          <span class="ruby-ivar">@format</span>[<span class="ruby-identifier">:name</span>] = <span class="ruby-constant">File</span>.<span class="ruby-identifier">basename</span>(<span class="ruby-ivar">@format_file</span>).<span class="ruby-identifier">sub</span>(<span class="ruby-regexp re">/\..*?$/</span>, <span class="ruby-value str">''</span>)

          <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@format</span>.<span class="ruby-identifier">key?</span> <span class="ruby-value str">'code'</span>
            <span class="ruby-identifier">eval</span> <span class="ruby-ivar">@format</span>[<span class="ruby-value str">'code'</span>].<span class="ruby-identifier">to_s</span>, <span class="ruby-constant">TOPLEVEL_BINDING</span>, <span class="ruby-node">&quot;#{@format_file}:code&quot;</span>
          <span class="ruby-keyword kw">end</span>

        <span class="ruby-keyword kw">rescue</span> <span class="ruby-constant">Exception</span>
          <span class="ruby-identifier">error</span> <span class="ruby-node">&quot;Could not load format specification file #{@format_file.inspect}&quot;</span>
        <span class="ruby-keyword kw">end</span>

        <span class="ruby-ivar">@node_defs</span> = <span class="ruby-ivar">@format</span>[<span class="ruby-value str">'nodes'</span>]

      <span class="ruby-comment cmt"># process input document</span>
      <span class="ruby-keyword kw">begin</span>
        <span class="ruby-comment cmt"># create sandbox for input evaluation</span>
          <span class="ruby-identifier">template</span> = <span class="ruby-constant">Template</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">input_file</span>, <span class="ruby-identifier">input_text</span>, <span class="ruby-identifier">options</span>[<span class="ruby-identifier">:unindent</span>])
          <span class="ruby-identifier">sandbox</span> = <span class="ruby-identifier">template</span>.<span class="ruby-identifier">sandbox</span>

          <span class="ruby-ivar">@template_vars</span> = {
            <span class="ruby-identifier">:@format</span>        =<span class="ruby-operator">&gt;</span> <span class="ruby-ivar">@format</span>,
            <span class="ruby-identifier">:@roots</span>         =<span class="ruby-operator">&gt;</span> <span class="ruby-ivar">@roots</span> = [], <span class="ruby-comment cmt"># root nodes of all trees</span>
            <span class="ruby-identifier">:@nodes</span>         =<span class="ruby-operator">&gt;</span> <span class="ruby-ivar">@nodes</span> = [], <span class="ruby-comment cmt"># all nodes in the forest</span>
            <span class="ruby-identifier">:@nodes_by_type</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-ivar">@nodes_by_type</span> = <span class="ruby-constant">Hash</span>.<span class="ruby-identifier">new</span> {<span class="ruby-operator">|</span><span class="ruby-identifier">h</span>,<span class="ruby-identifier">k</span><span class="ruby-operator">|</span> <span class="ruby-identifier">h</span>[<span class="ruby-identifier">k</span>] = [] },
            <span class="ruby-identifier">:@stack</span>         =<span class="ruby-operator">&gt;</span> [], <span class="ruby-comment cmt"># stack for all nodes</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">sandbox</span>.<span class="ruby-identifier">instance_variable_set</span>(<span class="ruby-identifier">k</span>, <span class="ruby-identifier">v</span>) }

          <span class="ruby-comment cmt">##</span>
          <span class="ruby-comment cmt"># Handles the method call from a node</span>
          <span class="ruby-comment cmt"># placeholder in the input document.</span>
          <span class="ruby-comment cmt">#</span>
          <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">sandbox</span>.<span class="ruby-identifier">__node_impl__</span> <span class="ruby-identifier">node_type</span>, <span class="ruby-operator">*</span><span class="ruby-identifier">node_args</span>, <span class="ruby-operator">&amp;</span><span class="ruby-identifier">node_content</span>
            <span class="ruby-identifier">node</span> = <span class="ruby-constant">Node</span>.<span class="ruby-identifier">new</span>(
              <span class="ruby-identifier">:type</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">node_type</span>,
              <span class="ruby-identifier">:defn</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-ivar">@format</span>[<span class="ruby-value str">'nodes'</span>][<span class="ruby-identifier">node_type</span>],
              <span class="ruby-identifier">:args</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">node_args</span>,
              <span class="ruby-identifier">:children</span> =<span class="ruby-operator">&gt;</span> [],

              <span class="ruby-comment cmt"># omit erbook internals from the stack trace</span>
              <span class="ruby-identifier">:trace</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">caller</span>.<span class="ruby-identifier">reject</span> {<span class="ruby-operator">|</span><span class="ruby-identifier">t</span><span class="ruby-operator">|</span>
                [<span class="ruby-identifier">$0</span>, <span class="ruby-constant">ERBook</span><span class="ruby-operator">::</span><span class="ruby-constant">INSTALL</span>].<span class="ruby-identifier">any?</span> {<span class="ruby-operator">|</span><span class="ruby-identifier">f</span><span class="ruby-operator">|</span> <span class="ruby-identifier">t</span>.<span class="ruby-identifier">index</span>(<span class="ruby-identifier">f</span>) <span class="ruby-operator">==</span> <span class="ruby-value">0</span> }
              }
            )
            <span class="ruby-ivar">@nodes</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">node</span>
            <span class="ruby-ivar">@nodes_by_type</span>[<span class="ruby-identifier">node</span>.<span class="ruby-identifier">type</span>] <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">node</span>

            <span class="ruby-comment cmt"># calculate occurrence number for this node</span>
            <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">node</span>.<span class="ruby-identifier">defn</span>[<span class="ruby-value str">'number'</span>]
              <span class="ruby-ivar">@count</span> <span class="ruby-operator">||=</span> <span class="ruby-constant">Hash</span>.<span class="ruby-identifier">new</span> {<span class="ruby-operator">|</span><span class="ruby-identifier">h</span>,<span class="ruby-identifier">k</span><span class="ruby-operator">|</span> <span class="ruby-identifier">h</span>[<span class="ruby-identifier">k</span>] = []}
              <span class="ruby-identifier">node</span>.<span class="ruby-identifier">number</span> = (<span class="ruby-ivar">@count</span>[<span class="ruby-identifier">node</span>.<span class="ruby-identifier">type</span>] <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">node</span>).<span class="ruby-identifier">length</span>
            <span class="ruby-keyword kw">end</span>

            <span class="ruby-comment cmt"># assign node family</span>
            <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">parent</span> = <span class="ruby-ivar">@stack</span>.<span class="ruby-identifier">last</span>
              <span class="ruby-identifier">parent</span>.<span class="ruby-identifier">children</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">node</span>
              <span class="ruby-identifier">node</span>.<span class="ruby-identifier">parent</span> = <span class="ruby-identifier">parent</span>
              <span class="ruby-identifier">node</span>.<span class="ruby-identifier">depth</span> = <span class="ruby-identifier">parent</span>.<span class="ruby-identifier">depth</span>
              <span class="ruby-identifier">node</span>.<span class="ruby-identifier">depth</span> <span class="ruby-operator">+=</span> <span class="ruby-value">1</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">node</span>.<span class="ruby-identifier">defn</span>[<span class="ruby-value str">'depth'</span>]

              <span class="ruby-comment cmt"># calculate latex-style index number for this node</span>
              <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">node</span>.<span class="ruby-identifier">defn</span>[<span class="ruby-value str">'index'</span>]
                <span class="ruby-identifier">ancestry</span> = <span class="ruby-ivar">@stack</span>.<span class="ruby-identifier">reverse</span>.<span class="ruby-identifier">find</span> {<span class="ruby-operator">|</span><span class="ruby-identifier">n</span><span class="ruby-operator">|</span> <span class="ruby-identifier">n</span>.<span class="ruby-identifier">defn</span>[<span class="ruby-value str">'index'</span>] }.<span class="ruby-identifier">index</span>
                <span class="ruby-identifier">branches</span> = <span class="ruby-identifier">node</span>.<span class="ruby-identifier">parent</span>.<span class="ruby-identifier">children</span>.<span class="ruby-identifier">select</span> {<span class="ruby-operator">|</span><span class="ruby-identifier">n</span><span class="ruby-operator">|</span> <span class="ruby-identifier">n</span>.<span class="ruby-identifier">index</span> }

                <span class="ruby-identifier">node</span>.<span class="ruby-identifier">index</span> = [<span class="ruby-identifier">ancestry</span>, <span class="ruby-identifier">branches</span>.<span class="ruby-identifier">length</span> <span class="ruby-operator">+</span> <span class="ruby-value">1</span>].<span class="ruby-identifier">join</span>(<span class="ruby-value str">'.'</span>)
              <span class="ruby-keyword kw">end</span>
            <span class="ruby-keyword kw">else</span>
              <span class="ruby-ivar">@roots</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">node</span>
              <span class="ruby-identifier">node</span>.<span class="ruby-identifier">parent</span> = <span class="ruby-keyword kw">nil</span>
              <span class="ruby-identifier">node</span>.<span class="ruby-identifier">depth</span> = <span class="ruby-value">0</span>

              <span class="ruby-comment cmt"># calculate latex-style index number for this node</span>
              <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">node</span>.<span class="ruby-identifier">defn</span>[<span class="ruby-value str">'index'</span>]
                <span class="ruby-identifier">branches</span> = <span class="ruby-ivar">@roots</span>.<span class="ruby-identifier">select</span> {<span class="ruby-operator">|</span><span class="ruby-identifier">n</span><span class="ruby-operator">|</span> <span class="ruby-identifier">n</span>.<span class="ruby-identifier">index</span> }
                <span class="ruby-identifier">node</span>.<span class="ruby-identifier">index</span> = (<span class="ruby-identifier">branches</span>.<span class="ruby-identifier">length</span> <span class="ruby-operator">+</span> <span class="ruby-value">1</span>).<span class="ruby-identifier">to_s</span>
              <span class="ruby-keyword kw">end</span>
            <span class="ruby-keyword kw">end</span>

            <span class="ruby-comment cmt"># assign node content</span>
            <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">block_given?</span>
              <span class="ruby-ivar">@stack</span>.<span class="ruby-identifier">push</span> <span class="ruby-identifier">node</span>
              <span class="ruby-identifier">node</span>.<span class="ruby-identifier">content</span> = <span class="ruby-identifier">__block_content__</span>(<span class="ruby-identifier">node</span>, <span class="ruby-operator">&amp;</span><span class="ruby-identifier">node_content</span>)
              <span class="ruby-ivar">@stack</span>.<span class="ruby-identifier">pop</span>
            <span class="ruby-keyword kw">end</span>

            <span class="ruby-ivar">@buffer</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">node</span>

            <span class="ruby-keyword kw">nil</span>
          <span class="ruby-keyword kw">end</span>

          <span class="ruby-ivar">@node_defs</span>.<span class="ruby-identifier">each_key</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">type</span><span class="ruby-operator">|</span>
            <span class="ruby-comment cmt"># XXX: using a string because define_method()</span>
            <span class="ruby-comment cmt">#      does not accept a block until Ruby 1.9</span>
            <span class="ruby-identifier">file</span>, <span class="ruby-identifier">line</span> = <span class="ruby-keyword kw">__FILE__</span>, <span class="ruby-keyword kw">__LINE__</span>; <span class="ruby-identifier">eval</span> <span class="ruby-node">%{
              def sandbox.#{type} *node_args, &amp;node_content
                __node_impl__ #{type.inspect}, *node_args, &amp;node_content
              end
            }</span>, <span class="ruby-identifier">binding</span>, <span class="ruby-identifier">file</span>, <span class="ruby-identifier">line</span>
          <span class="ruby-keyword kw">end</span>

        <span class="ruby-comment cmt"># evaluate the input &amp; build the document tree</span>
          <span class="ruby-identifier">template</span>.<span class="ruby-identifier">render</span>
          <span class="ruby-ivar">@processed_document</span> = <span class="ruby-identifier">template</span>.<span class="ruby-identifier">buffer</span>

        <span class="ruby-comment cmt"># chain block-level nodes together for local navigation</span>
          <span class="ruby-identifier">block_nodes</span> = <span class="ruby-ivar">@nodes</span>.<span class="ruby-identifier">reject</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">n</span><span class="ruby-operator">|</span>
            <span class="ruby-identifier">n</span>.<span class="ruby-identifier">defn</span>[<span class="ruby-value str">'bypass'</span>] <span class="ruby-operator">||</span> <span class="ruby-identifier">n</span>.<span class="ruby-identifier">defn</span>[<span class="ruby-value str">'inline'</span>]
          <span class="ruby-keyword kw">end</span>

          <span class="ruby-identifier">require</span> <span class="ruby-value str">'enumerator'</span>
          <span class="ruby-identifier">block_nodes</span>.<span class="ruby-identifier">each_cons</span>(<span class="ruby-value">2</span>) <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">a</span>, <span class="ruby-identifier">b</span><span class="ruby-operator">|</span>
            <span class="ruby-identifier">a</span>.<span class="ruby-identifier">next_node</span> = <span class="ruby-identifier">b</span>
            <span class="ruby-identifier">b</span>.<span class="ruby-identifier">prev_node</span> = <span class="ruby-identifier">a</span>
          <span class="ruby-keyword kw">end</span>

        <span class="ruby-comment cmt"># calculate output for all nodes</span>
          <span class="ruby-identifier">actual_output_by_node</span> = {}

          <span class="ruby-identifier">visitor</span> = <span class="ruby-identifier">lambda</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">n</span><span class="ruby-operator">|</span>
            <span class="ruby-comment cmt">#</span>
            <span class="ruby-comment cmt"># allow child nodes to calculate their actual</span>
            <span class="ruby-comment cmt"># output and to set their identifier as Node#output</span>
            <span class="ruby-comment cmt">#</span>
            <span class="ruby-comment cmt"># we do this nodes first because this node's</span>
            <span class="ruby-comment cmt"># content contains the child nodes' output</span>
            <span class="ruby-comment cmt">#</span>
            <span class="ruby-identifier">n</span>.<span class="ruby-identifier">children</span>.<span class="ruby-identifier">each</span> {<span class="ruby-operator">|</span><span class="ruby-identifier">c</span><span class="ruby-operator">|</span> <span class="ruby-identifier">visitor</span>.<span class="ruby-identifier">call</span> <span class="ruby-identifier">c</span> }

            <span class="ruby-comment cmt"># calculate the output for this node</span>
            <span class="ruby-identifier">actual_output</span> = <span class="ruby-constant">Template</span>.<span class="ruby-identifier">new</span>(
              <span class="ruby-node">&quot;#{@format_file}:nodes:#{n.type}:output&quot;</span>,
              <span class="ruby-identifier">n</span>.<span class="ruby-identifier">defn</span>[<span class="ruby-value str">'output'</span>].<span class="ruby-identifier">to_s</span>.<span class="ruby-identifier">chomp</span>
            ).<span class="ruby-identifier">render_with</span>(<span class="ruby-ivar">@template_vars</span>.<span class="ruby-identifier">merge</span>(<span class="ruby-identifier">:@node</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">n</span>))

            <span class="ruby-comment cmt"># reveal child nodes' actual output in this node's actual output</span>
            <span class="ruby-identifier">n</span>.<span class="ruby-identifier">children</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">c</span><span class="ruby-operator">|</span>
              <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">c</span>.<span class="ruby-identifier">defn</span>[<span class="ruby-value str">'inline'</span>] <span class="ruby-operator">&amp;&amp;</span> <span class="ruby-operator">!</span><span class="ruby-identifier">c</span>.<span class="ruby-identifier">defn</span>[<span class="ruby-value str">'bypass'</span>]
                <span class="ruby-identifier">actual_output</span>[<span class="ruby-identifier">c</span>.<span class="ruby-identifier">output</span>] = <span class="ruby-identifier">actual_output_by_node</span>[<span class="ruby-identifier">c</span>]

              <span class="ruby-keyword kw">else</span>
                <span class="ruby-comment cmt"># pull block-level node out of paragraph tag added by Maruku</span>
                <span class="ruby-identifier">actual_output</span>.<span class="ruby-identifier">sub!</span> <span class="ruby-node">%r/(&lt;p&gt;\s*)?#{Regexp.quote c.output}/</span> <span class="ruby-keyword kw">do</span>
                  <span class="ruby-identifier">actual_output_by_node</span>[<span class="ruby-identifier">c</span>] <span class="ruby-operator">+</span> <span class="ruby-identifier">$1</span>.<span class="ruby-identifier">to_s</span>
                <span class="ruby-keyword kw">end</span>
              <span class="ruby-keyword kw">end</span>
            <span class="ruby-keyword kw">end</span>

            <span class="ruby-identifier">actual_output_by_node</span>[<span class="ruby-identifier">n</span>] = <span class="ruby-identifier">actual_output</span>

            <span class="ruby-comment cmt">#</span>
            <span class="ruby-comment cmt"># allow the parent node to calculate its actual</span>
            <span class="ruby-comment cmt"># output without interference from the output of</span>
            <span class="ruby-comment cmt"># this node (Node#to_s is aliased to Node#output)</span>
            <span class="ruby-comment cmt">#</span>
            <span class="ruby-comment cmt"># this assumes that having this node's string</span>
            <span class="ruby-comment cmt"># representation be a consecutive sequence of digits</span>
            <span class="ruby-comment cmt"># will not interfere with the text-to-whatever</span>
            <span class="ruby-comment cmt"># transformation defined by the format specification</span>
            <span class="ruby-comment cmt">#</span>
            <span class="ruby-identifier">n</span>.<span class="ruby-identifier">output</span> = <span class="ruby-constant">Digest</span><span class="ruby-operator">::</span><span class="ruby-constant">SHA1</span>.<span class="ruby-identifier">digest</span>(<span class="ruby-identifier">n</span>.<span class="ruby-identifier">object_id</span>.<span class="ruby-identifier">to_s</span>).<span class="ruby-identifier">unpack</span>(<span class="ruby-value str">'I*'</span>).<span class="ruby-identifier">join</span>
          <span class="ruby-keyword kw">end</span>

          <span class="ruby-ivar">@roots</span>.<span class="ruby-identifier">each</span> {<span class="ruby-operator">|</span><span class="ruby-identifier">n</span><span class="ruby-operator">|</span> <span class="ruby-identifier">visitor</span>.<span class="ruby-identifier">call</span> <span class="ruby-identifier">n</span> }

          <span class="ruby-comment cmt"># replace the temporary identifier with each node's actual output</span>
          <span class="ruby-ivar">@nodes</span>.<span class="ruby-identifier">each</span> {<span class="ruby-operator">|</span><span class="ruby-identifier">n</span><span class="ruby-operator">|</span> <span class="ruby-identifier">n</span>.<span class="ruby-identifier">output</span> = <span class="ruby-identifier">actual_output_by_node</span>[<span class="ruby-identifier">n</span>] }

      <span class="ruby-keyword kw">rescue</span> <span class="ruby-constant">Exception</span>
        <span class="ruby-identifier">puts</span> <span class="ruby-identifier">input_text</span> <span class="ruby-comment cmt"># so the user can debug line numbers in stack trace</span>
        <span class="ruby-identifier">error</span> <span class="ruby-node">&quot;Could not process input document #{input_file.inspect}&quot;</span>
      <span class="ruby-keyword kw">end</span>
    <span class="ruby-keyword kw">end</span></pre>
                    </div>
                </div>
                
            </div>
            
            <div class="sectiontitle">Instance Public methods</div>
            
            <div class="method">
                <div class="title" id="M000061">
                    
                    <a name="M000061"></a><b>to_s</b>()
                    
                </div>
                
                <div class="description">
                  <p>
Returns the output of this document.
</p>

                </div>
                
                
                
                
                <div class="sourcecode">
                    <p class="source-link">
                        Source: <a href="javascript:toggleSource('M000061_source')" id="l_M000061_source">show</a>
                        
                        | <a href="http://github.com/sunaku/erbook/blob/9c3f6ad5c94f67d3f20e896873dbc7b127036c44/lib/erbook/document.rb#L227" target="_blank" class="github_url">on GitHub</a>
                        
                    </p>
                    <div id="M000061_source" class="dyn-source">
                        <pre><span class="ruby-comment cmt"># File lib/erbook/document.rb, line 227</span>
    <span class="ruby-keyword kw">def</span>  <span class="ruby-identifier">to_s</span><span class="ruby-identifier">to_s</span>
      <span class="ruby-constant">Template</span>.<span class="ruby-identifier">new</span>(<span class="ruby-node">&quot;#{@format_file}:output&quot;</span>, <span class="ruby-ivar">@format</span>[<span class="ruby-value str">'output'</span>].<span class="ruby-identifier">to_s</span>).
      <span class="ruby-identifier">render_with</span>(<span class="ruby-ivar">@template_vars</span>.<span class="ruby-identifier">merge</span>(<span class="ruby-identifier">:@content</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-ivar">@processed_document</span>.<span class="ruby-identifier">join</span>))
    <span class="ruby-keyword kw">end</span></pre>
                    </div>
                </div>
                
            </div>
            
</div>
    </div>
  </body>
</html>