Parse state object class. Instance of this class represent a parser‘s progress through a given template body.
Create and return a new parse state for the specified text. The initialData is used to propagate directive bookkeeping state through recursive parses.
# File /Users/ged/source/ruby/Arrow/lib/arrow/template/parser.rb, line 125
125: def initialize( text, template, initialData={} )
126: @scanner = StringScanner.new( text )
127: @template = template
128: @tag_open = nil
129: @tag_middle = nil
130: @tag_close = nil
131: @current_branch = []
132: @current_branch_node = nil
133: @current_node = nil
134: @data = initialData
135:
136: #self.log.debug "From %s: Created a parse state for %p (%p). Data is: %p" %
137: # [ caller(1).first, text, template, initialData ]
138: end
Add the given nodes to the state‘s syntax tree.
# File /Users/ged/source/ruby/Arrow/lib/arrow/template/parser.rb, line 199
199: def add_nodes( *nodes )
200: @current_branch.push( *nodes )
201: @current_node = @current_branch.last
202: return self
203: end
Add a branch belonging to the specified node to the parse state for the duration of the supplied block, removing and returning it when the block returns.
# File /Users/ged/source/ruby/Arrow/lib/arrow/template/parser.rb, line 210
210: def branch( node )
211: raise LocalJumpError, "no block given" unless
212: block_given?
213:
214: # Save and set the current branch node
215: entryNode = @current_branch_node
216: @current_branch_node = node
217:
218: # Push a new branch and make the current branch point to it
219: # while saving the one we entered with so it can be restored
220: # later.
221: entryBranch = @current_branch
222: entryBranch.push( @current_branch = [] )
223:
224: yield( self )
225:
226: # Restore the current branch and branch node to what they were
227: # before
228: @current_branch = entryBranch
229: @current_branch_node = entryNode
230:
231: return @current_branch.pop
232: end
Set the middle and closing tag patterns from the given matched opening string.
# File /Users/ged/source/ruby/Arrow/lib/arrow/template/parser.rb, line 191
191: def set_tag_patterns( opening )
192: @tag_open = opening
193: @tag_close = TAGCLOSE[ opening ]
194: @tag_middle = TAGMIDDLE[ @tag_close ]
195: end
--- SEC00162
--- ""
---
- name: current_branch
rw: R
a_desc: |+
The current <a href="State.html#M000167">branch</a> of the parse state.
Branches are added and removed for re-entrances into the parse loop.
- name: current_branch_node
rw: R
a_desc: |+
The pointer into the syntax tree for the node which is the base of the
current <a href="State.html#M000167">branch</a>.
- name: current_node
rw: R
a_desc: |+
The pointer into the syntax tree for the current node
- name: data
rw: R
a_desc: |+
A miscellaneous data hash to allow directives to keep their own state for a
parse.
- name: scanner
rw: R
a_desc: |+
The StringScanner object which is scanning the text being parsed.
- name: tag_close
rw: RW
a_desc: |+
The pattern that will match the current tag-closing characters during the
parse of a directive.
- name: tag_middle
rw: RW
a_desc: |+
The pattern that will match the middle of the current tag during the parse
of a directive.
- name: tag_open
rw: R
a_desc: |+
The string that contains the opening string of the current tag, if any.
---
- methods:
- visibility: public
aref: M000162
name: new
sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/template/parser.rb, line 125</span>\n\
125: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">initialize</span>( <span class=\"ruby-identifier\">text</span>, <span class=\"ruby-identifier\">template</span>, <span class=\"ruby-identifier\">initialData</span>={} )\n\
126: <span class=\"ruby-ivar\">@scanner</span> = <span class=\"ruby-constant\">StringScanner</span>.<span class=\"ruby-identifier\">new</span>( <span class=\"ruby-identifier\">text</span> )\n\
127: <span class=\"ruby-ivar\">@template</span> = <span class=\"ruby-identifier\">template</span>\n\
128: <span class=\"ruby-ivar\">@tag_open</span> = <span class=\"ruby-keyword kw\">nil</span>\n\
129: <span class=\"ruby-ivar\">@tag_middle</span> = <span class=\"ruby-keyword kw\">nil</span>\n\
130: <span class=\"ruby-ivar\">@tag_close</span> = <span class=\"ruby-keyword kw\">nil</span>\n\
131: <span class=\"ruby-ivar\">@current_branch</span> = []\n\
132: <span class=\"ruby-ivar\">@current_branch_node</span> = <span class=\"ruby-keyword kw\">nil</span>\n\
133: <span class=\"ruby-ivar\">@current_node</span> = <span class=\"ruby-keyword kw\">nil</span>\n\
134: <span class=\"ruby-ivar\">@data</span> = <span class=\"ruby-identifier\">initialData</span>\n\
135: \n\
136: <span class=\"ruby-comment cmt\">#self.log.debug "From %s: Created a parse state for %p (%p). Data is: %p" %</span>\n\
137: <span class=\"ruby-comment cmt\"># [ caller(1).first, text, template, initialData ]</span>\n\
138: <span class=\"ruby-keyword kw\">end</span>"
m_desc: |-
<p>
Create and return a <a href="State.html#M000162">new</a> parse state for
the specified <tt>text</tt>. The <tt>initialData</tt> is used to propagate
directive bookkeeping state through recursive parses.
</p>
params: ( text, template, initialData={} )
category: Class
type: Public
- methods:
- visibility: public
aref: M000166
name: "<<"
m_desc: |-
<p>
Alias for <a href="State.html#M000165">#add_nodes</a>
</p>
params: ( *nodes )
- visibility: public
aref: M000165
name: add_nodes
sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/template/parser.rb, line 199</span>\n\
199: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">add_nodes</span>( <span class=\"ruby-operator\">*</span><span class=\"ruby-identifier\">nodes</span> )\n\
200: <span class=\"ruby-ivar\">@current_branch</span>.<span class=\"ruby-identifier\">push</span>( <span class=\"ruby-operator\">*</span><span class=\"ruby-identifier\">nodes</span> )\n\
201: <span class=\"ruby-ivar\">@current_node</span> = <span class=\"ruby-ivar\">@current_branch</span>.<span class=\"ruby-identifier\">last</span>\n\
202: <span class=\"ruby-keyword kw\">return</span> <span class=\"ruby-keyword kw\">self</span>\n\
203: <span class=\"ruby-keyword kw\">end</span>"
aka:
- aref: State.html#M000166
name: "<<"
m_desc: |-
<p>
Add the given <tt>nodes</tt> to the state‘s syntax tree.
</p>
params: ( *nodes )
- visibility: public
aref: M000167
name: branch
sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/template/parser.rb, line 210</span>\n\
210: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">branch</span>( <span class=\"ruby-identifier\">node</span> )\n\
211: <span class=\"ruby-identifier\">raise</span> <span class=\"ruby-constant\">LocalJumpError</span>, <span class=\"ruby-value str\">"no block given"</span> <span class=\"ruby-keyword kw\">unless</span>\n\
212: <span class=\"ruby-identifier\">block_given?</span>\n\
213: \n\
214: <span class=\"ruby-comment cmt\"># Save and set the current branch node</span>\n\
215: <span class=\"ruby-identifier\">entryNode</span> = <span class=\"ruby-ivar\">@current_branch_node</span>\n\
216: <span class=\"ruby-ivar\">@current_branch_node</span> = <span class=\"ruby-identifier\">node</span>\n\
217: \n\
218: <span class=\"ruby-comment cmt\"># Push a new branch and make the current branch point to it</span>\n\
219: <span class=\"ruby-comment cmt\"># while saving the one we entered with so it can be restored</span>\n\
220: <span class=\"ruby-comment cmt\"># later.</span>\n\
221: <span class=\"ruby-identifier\">entryBranch</span> = <span class=\"ruby-ivar\">@current_branch</span>\n\
222: <span class=\"ruby-identifier\">entryBranch</span>.<span class=\"ruby-identifier\">push</span>( <span class=\"ruby-ivar\">@current_branch</span> = [] )\n\
223: \n\
224: <span class=\"ruby-keyword kw\">yield</span>( <span class=\"ruby-keyword kw\">self</span> )\n\
225: \n\
226: <span class=\"ruby-comment cmt\"># Restore the current branch and branch node to what they were</span>\n\
227: <span class=\"ruby-comment cmt\"># before</span>\n\
228: <span class=\"ruby-ivar\">@current_branch</span> = <span class=\"ruby-identifier\">entryBranch</span>\n\
229: <span class=\"ruby-ivar\">@current_branch_node</span> = <span class=\"ruby-identifier\">entryNode</span>\n\
230: \n\
231: <span class=\"ruby-keyword kw\">return</span> <span class=\"ruby-ivar\">@current_branch</span>.<span class=\"ruby-identifier\">pop</span>\n\
232: <span class=\"ruby-keyword kw\">end</span>"
m_desc: |-
<p>
Add a <a href="State.html#M000167">branch</a> belonging to the specified
<tt>node</tt> to the parse state for the duration of the supplied block,
removing and returning it when the block returns.
</p>
params: ( node ) {|self| ...}
- visibility: public
aref: M000163
name: line
sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/template/parser.rb, line 184</span>\n\
184: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">line</span>\n\
185: <span class=\"ruby-keyword kw\">return</span> <span class=\"ruby-ivar\">@scanner</span>.<span class=\"ruby-identifier\">string</span>[ <span class=\"ruby-value\">0</span>, <span class=\"ruby-ivar\">@scanner</span>.<span class=\"ruby-identifier\">pos</span> ].<span class=\"ruby-identifier\">count</span>( <span class=\"ruby-identifier\">$/</span> ) <span class=\"ruby-operator\">+</span> <span class=\"ruby-value\">1</span>\n\
186: <span class=\"ruby-keyword kw\">end</span>"
m_desc: |-
<p>
Return the <a href="State.html#M000163">line</a> number of the <a
href="State.html#M000163">line</a> on which the parse‘s pointer
current rests.
</p>
params: ()
- visibility: public
aref: M000164
name: set_tag_patterns
sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/template/parser.rb, line 191</span>\n\
191: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">set_tag_patterns</span>( <span class=\"ruby-identifier\">opening</span> )\n\
192: <span class=\"ruby-ivar\">@tag_open</span> = <span class=\"ruby-identifier\">opening</span>\n\
193: <span class=\"ruby-ivar\">@tag_close</span> = <span class=\"ruby-constant\">TAGCLOSE</span>[ <span class=\"ruby-identifier\">opening</span> ]\n\
194: <span class=\"ruby-ivar\">@tag_middle</span> = <span class=\"ruby-constant\">TAGMIDDLE</span>[ <span class=\"ruby-ivar\">@tag_close</span> ]\n\
195: <span class=\"ruby-keyword kw\">end</span>"
m_desc: |-
<p>
Set the middle and closing tag patterns from the given matched opening
string.
</p>
params: ( opening )
category: Instance
type: Public
---
Generated with the Darkfish Rdoc Generator.