File: C:/Ruby27-x64/share/doc/ruby/html/REXML/Parsers/BaseParser.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>class REXML::Parsers::BaseParser - RDoc Documentation</title>
<script type="text/javascript">
var rdoc_rel_prefix = "../../";
var index_rel_prefix = "../../";
</script>
<script src="../../js/navigation.js" defer></script>
<script src="../../js/search.js" defer></script>
<script src="../../js/search_index.js" defer></script>
<script src="../../js/searcher.js" defer></script>
<script src="../../js/darkfish.js" defer></script>
<link href="../../css/fonts.css" rel="stylesheet">
<link href="../../css/rdoc.css" rel="stylesheet">
<body id="top" role="document" class="class">
<nav role="navigation">
<div id="project-navigation">
<div id="home-section" role="region" title="Quick navigation" class="nav-section">
<h2>
<a href="../../index.html" rel="home">Home</a>
</h2>
<div id="table-of-contents-navigation">
<a href="../../table_of_contents.html#pages">Pages</a>
<a href="../../table_of_contents.html#classes">Classes</a>
<a href="../../table_of_contents.html#methods">Methods</a>
</div>
</div>
<div id="search-section" role="search" class="project-section initially-hidden">
<form action="#" method="get" accept-charset="utf-8">
<div id="search-field-wrapper">
<input id="search-field" role="combobox" aria-label="Search"
aria-autocomplete="list" aria-controls="search-results"
type="text" name="search" placeholder="Search" spellcheck="false"
title="Type to search, Up and Down to navigate, Enter to load">
</div>
<ul id="search-results" aria-label="Search Results"
aria-busy="false" aria-expanded="false"
aria-atomic="false" class="initially-hidden"></ul>
</form>
</div>
</div>
<div id="class-metadata">
<div id="parent-class-section" class="nav-section">
<h3>Parent</h3>
<p class="link"><a href="../../Object.html">Object</a>
</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-new">::new</a>
<li ><a href="#method-i-add_listener">#add_listener</a>
<li ><a href="#method-i-empty-3F">#empty?</a>
<li ><a href="#method-i-entity">#entity</a>
<li ><a href="#method-i-has_next-3F">#has_next?</a>
<li ><a href="#method-i-need_source_encoding_update-3F">#need_source_encoding_update?</a>
<li ><a href="#method-i-normalize">#normalize</a>
<li ><a href="#method-i-parse_attributes">#parse_attributes</a>
<li ><a href="#method-i-parse_id">#parse_id</a>
<li ><a href="#method-i-parse_id_invalid_details">#parse_id_invalid_details</a>
<li ><a href="#method-i-parse_name">#parse_name</a>
<li ><a href="#method-i-peek">#peek</a>
<li ><a href="#method-i-position">#position</a>
<li ><a href="#method-i-process_instruction">#process_instruction</a>
<li ><a href="#method-i-pull">#pull</a>
<li ><a href="#method-i-pull_event">#pull_event</a>
<li ><a href="#method-i-stream-3D">#stream=</a>
<li ><a href="#method-i-unnormalize">#unnormalize</a>
<li ><a href="#method-i-unshift">#unshift</a>
</ul>
</div>
</div>
</nav>
<main role="main" aria-labelledby="class-REXML::Parsers::BaseParser">
<h1 id="class-REXML::Parsers::BaseParser" class="class">
class REXML::Parsers::BaseParser
</h1>
<section class="description">
<h1 id="class-REXML::Parsers::BaseParser-label-Using+the+Pull+Parser">Using the Pull Parser<span><a href="#class-REXML::Parsers::BaseParser-label-Using+the+Pull+Parser">¶</a> <a href="#top">↑</a></span></h1>
<p><em>This API is experimental, and subject to change.</em></p>
<pre class="ruby"><span class="ruby-identifier">parser</span> = <span class="ruby-constant">PullParser</span>.<span class="ruby-identifier">new</span>( <span class="ruby-string">"<a>text<b att='val'/>txet</a>"</span> )
<span class="ruby-keyword">while</span> <span class="ruby-identifier">parser</span>.<span class="ruby-identifier">has_next?</span>
<span class="ruby-identifier">res</span> = <span class="ruby-identifier">parser</span>.<span class="ruby-identifier">next</span>
<span class="ruby-identifier">puts</span> <span class="ruby-identifier">res</span>[<span class="ruby-value">1</span>][<span class="ruby-string">'att'</span>] <span class="ruby-keyword">if</span> <span class="ruby-identifier">res</span>.<span class="ruby-identifier">start_tag?</span> <span class="ruby-keyword">and</span> <span class="ruby-identifier">res</span>[<span class="ruby-value">0</span>] <span class="ruby-operator">==</span> <span class="ruby-string">'b'</span>
<span class="ruby-keyword">end</span>
</pre>
<p>See the <a href="PullEvent.html"><code>PullEvent</code></a> class for information on the content of the results. The data is identical to the arguments passed for the various events to the <a href="../StreamListener.html"><code>StreamListener</code></a> API.</p>
<p>Notice that:</p>
<pre class="ruby"><span class="ruby-identifier">parser</span> = <span class="ruby-constant">PullParser</span>.<span class="ruby-identifier">new</span>( <span class="ruby-string">"<a>BAD DOCUMENT"</span> )
<span class="ruby-keyword">while</span> <span class="ruby-identifier">parser</span>.<span class="ruby-identifier">has_next?</span>
<span class="ruby-identifier">res</span> = <span class="ruby-identifier">parser</span>.<span class="ruby-identifier">next</span>
<span class="ruby-identifier">raise</span> <span class="ruby-identifier">res</span>[<span class="ruby-value">1</span>] <span class="ruby-keyword">if</span> <span class="ruby-identifier">res</span>.<span class="ruby-identifier">error?</span>
<span class="ruby-keyword">end</span>
</pre>
<p>Nat Price gave me some good ideas for the API.</p>
</section>
<section id="5Buntitled-5D" class="documentation-section">
<section class="constants-list">
<header>
<h3>Constants</h3>
</header>
<dl>
<dt id="ATTDEF">ATTDEF
<dd>
<dt id="ATTDEF_RE">ATTDEF_RE
<dd>
<dt id="ATTLISTDECL_PATTERN">ATTLISTDECL_PATTERN
<dd>
<dt id="ATTLISTDECL_START">ATTLISTDECL_START
<dd>
<dt id="ATTRIBUTE_PATTERN">ATTRIBUTE_PATTERN
<dd>
<dt id="ATTTYPE">ATTTYPE
<dd>
<dt id="ATTVALUE">ATTVALUE
<dd>
<dt id="CDATA_END">CDATA_END
<dd>
<dt id="CDATA_PATTERN">CDATA_PATTERN
<dd>
<dt id="CDATA_START">CDATA_START
<dd>
<dt id="CLOSE_MATCH">CLOSE_MATCH
<dd>
<dt id="COMBININGCHAR">COMBININGCHAR
<dd>
<dt id="COMMENT_PATTERN">COMMENT_PATTERN
<dd>
<dt id="COMMENT_START">COMMENT_START
<dd>
<dt id="DEFAULTDECL">DEFAULTDECL
<dd>
<dt id="DEFAULT_ENTITIES">DEFAULT_ENTITIES
<dd>
<dt id="DIGIT">DIGIT
<dd>
<dt id="DOCTYPE_END">DOCTYPE_END
<dd>
<dt id="DOCTYPE_START">DOCTYPE_START
<dd>
<dt id="ELEMENTDECL_PATTERN">ELEMENTDECL_PATTERN
<dd>
<dt id="ELEMENTDECL_START">ELEMENTDECL_START
<dd>
<dt id="ENCODING">ENCODING
<dd>
<dt id="ENTITYDECL">ENTITYDECL
<dd>
<dt id="ENTITYDEF">ENTITYDEF
<dd>
<dt id="ENTITYVALUE">ENTITYVALUE
<dd>
<dt id="ENTITY_START">ENTITY_START
<dd>
<dt id="ENUMERATEDTYPE">ENUMERATEDTYPE
<dd>
<dt id="ENUMERATION">ENUMERATION
<dd>
<dt id="EREFERENCE">EREFERENCE
<dd>
<dt id="EXTENDER">EXTENDER
<dd>
<dt id="EXTERNALID">EXTERNALID
<dd>
<dt id="EXTERNAL_ID_PUBLIC">EXTERNAL_ID_PUBLIC
<dd>
<dt id="EXTERNAL_ID_SYSTEM">EXTERNAL_ID_SYSTEM
<dd>
<dt id="GEDECL">GEDECL
<dd>
<dt id="INSTRUCTION_PATTERN">INSTRUCTION_PATTERN
<dd>
<dt id="INSTRUCTION_START">INSTRUCTION_START
<dd>
<dt id="LETTER">LETTER
<dd>
<dt id="NAME">NAME
<dd>
<dt id="NAMECHAR">NAMECHAR
<dd>
<dt id="NCNAME_STR">NCNAME_STR
<dd>
<dt id="NDATADECL">NDATADECL
<dd>
<dt id="NMTOKEN">NMTOKEN
<dd>
<dt id="NMTOKENS">NMTOKENS
<dd>
<dt id="NOTATIONDECL_START">NOTATIONDECL_START
<dd>
<dt id="NOTATIONTYPE">NOTATIONTYPE
<dd>
<dt id="PEDECL">PEDECL
<dd>
<dt id="PEDEF">PEDEF
<dd>
<dt id="PEREFERENCE">PEREFERENCE
<dd>
<dt id="PUBIDCHAR">PUBIDCHAR
<dd><p><a href="../Entity.html"><code>Entity</code></a> constants</p>
<dt id="PUBIDLITERAL">PUBIDLITERAL
<dd>
<dt id="PUBLIC_ID">PUBLIC_ID
<dd>
<dt id="QNAME">QNAME
<dd>
<dt id="QNAME_STR">QNAME_STR
<dd>
<dt id="REFERENCE">REFERENCE
<dd>
<dt id="REFERENCE_RE">REFERENCE_RE
<dd>
<dt id="STANDALONE">STANDALONE
<dd>
<dt id="SYSTEMENTITY">SYSTEMENTITY
<dd>
<dt id="SYSTEMLITERAL">SYSTEMLITERAL
<dd>
<dt id="TAG_MATCH">TAG_MATCH
<dd>
<dt id="TEXT_PATTERN">TEXT_PATTERN
<dd>
<dt id="UNAME_STR">UNAME_STR
<dd><p>Just for backward compatibility. For example, kramdown uses this. It's not used in <a href="../../REXML.html"><code>REXML</code></a>.</p>
<dt id="VERSION">VERSION
<dd>
<dt id="XMLDECL_PATTERN">XMLDECL_PATTERN
<dd>
<dt id="XMLDECL_START">XMLDECL_START
<dd>
</dl>
</section>
<section class="attribute-method-details" class="method-section">
<header>
<h3>Attributes</h3>
</header>
<div id="attribute-i-source" class="method-detail">
<div class="method-heading attribute-method-heading">
<span class="method-name">source</span><span
class="attribute-access-type">[R]</span>
</div>
<div class="method-description">
</div>
</div>
</section>
<section id="public-class-5Buntitled-5D-method-details" class="method-section">
<header>
<h3>Public Class Methods</h3>
</header>
<div id="method-c-new" class="method-detail ">
<div class="method-heading">
<span class="method-name">new</span><span
class="method-args">( source )</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/rexml/parsers/baseparser.rb, line 115</span>
<span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">initialize</span>( <span class="ruby-identifier">source</span> )
<span class="ruby-keyword">self</span>.<span class="ruby-identifier">stream</span> = <span class="ruby-identifier">source</span>
<span class="ruby-ivar">@listeners</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-add_listener" class="method-detail ">
<div class="method-heading">
<span class="method-name">add_listener</span><span
class="method-args">( listener )</span>
<span class="method-click-advice">click to toggle source</span>
</div>
<div class="method-description">
<div class="method-source-code" id="add_listener-source">
<pre><span class="ruby-comment"># File lib/rexml/parsers/baseparser.rb, line 120</span>
<span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">add_listener</span>( <span class="ruby-identifier">listener</span> )
<span class="ruby-ivar">@listeners</span> <span class="ruby-operator"><<</span> <span class="ruby-identifier">listener</span>
<span class="ruby-keyword">end</span></pre>
</div>
</div>
</div>
<div id="method-i-empty-3F" class="method-detail ">
<div class="method-heading">
<span class="method-name">empty?</span><span
class="method-args">()</span>
<span class="method-click-advice">click to toggle source</span>
</div>
<div class="method-description">
<p>Returns true if there are no more events</p>
<div class="method-source-code" id="empty-3F-source">
<pre><span class="ruby-comment"># File lib/rexml/parsers/baseparser.rb, line 146</span>
<span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">empty?</span>
<span class="ruby-keyword">return</span> (<span class="ruby-ivar">@source</span>.<span class="ruby-identifier">empty?</span> <span class="ruby-keyword">and</span> <span class="ruby-ivar">@stack</span>.<span class="ruby-identifier">empty?</span>)
<span class="ruby-keyword">end</span></pre>
</div>
</div>
</div>
<div id="method-i-entity" class="method-detail ">
<div class="method-heading">
<span class="method-name">entity</span><span
class="method-args">( reference, entities )</span>
<span class="method-click-advice">click to toggle source</span>
</div>
<div class="method-description">
<div class="method-source-code" id="entity-source">
<pre><span class="ruby-comment"># File lib/rexml/parsers/baseparser.rb, line 438</span>
<span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">entity</span>( <span class="ruby-identifier">reference</span>, <span class="ruby-identifier">entities</span> )
<span class="ruby-identifier">value</span> = <span class="ruby-keyword">nil</span>
<span class="ruby-identifier">value</span> = <span class="ruby-identifier">entities</span>[ <span class="ruby-identifier">reference</span> ] <span class="ruby-keyword">if</span> <span class="ruby-identifier">entities</span>
<span class="ruby-keyword">if</span> <span class="ruby-keyword">not</span> <span class="ruby-identifier">value</span>
<span class="ruby-identifier">value</span> = <span class="ruby-constant">DEFAULT_ENTITIES</span>[ <span class="ruby-identifier">reference</span> ]
<span class="ruby-identifier">value</span> = <span class="ruby-identifier">value</span>[<span class="ruby-value">2</span>] <span class="ruby-keyword">if</span> <span class="ruby-identifier">value</span>
<span class="ruby-keyword">end</span>
<span class="ruby-identifier">unnormalize</span>( <span class="ruby-identifier">value</span>, <span class="ruby-identifier">entities</span> ) <span class="ruby-keyword">if</span> <span class="ruby-identifier">value</span>
<span class="ruby-keyword">end</span></pre>
</div>
</div>
</div>
<div id="method-i-has_next-3F" class="method-detail ">
<div class="method-heading">
<span class="method-name">has_next?</span><span
class="method-args">()</span>
<span class="method-click-advice">click to toggle source</span>
</div>
<div class="method-description">
<p>Returns true if there are more events. Synonymous with !empty?</p>
<div class="method-source-code" id="has_next-3F-source">
<pre><span class="ruby-comment"># File lib/rexml/parsers/baseparser.rb, line 151</span>
<span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">has_next?</span>
<span class="ruby-keyword">return</span> <span class="ruby-operator">!</span>(<span class="ruby-ivar">@source</span>.<span class="ruby-identifier">empty?</span> <span class="ruby-keyword">and</span> <span class="ruby-ivar">@stack</span>.<span class="ruby-identifier">empty?</span>)
<span class="ruby-keyword">end</span></pre>
</div>
</div>
</div>
<div id="method-i-normalize" class="method-detail ">
<div class="method-heading">
<span class="method-name">normalize</span><span
class="method-args">( input, entities=nil, entity_filter=nil )</span>
<span class="method-click-advice">click to toggle source</span>
</div>
<div class="method-description">
<p>Escapes all possible entities</p>
<div class="method-source-code" id="normalize-source">
<pre><span class="ruby-comment"># File lib/rexml/parsers/baseparser.rb, line 449</span>
<span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">normalize</span>( <span class="ruby-identifier">input</span>, <span class="ruby-identifier">entities</span>=<span class="ruby-keyword">nil</span>, <span class="ruby-identifier">entity_filter</span>=<span class="ruby-keyword">nil</span> )
<span class="ruby-identifier">copy</span> = <span class="ruby-identifier">input</span>.<span class="ruby-identifier">clone</span>
<span class="ruby-comment"># Doing it like this rather than in a loop improves the speed</span>
<span class="ruby-identifier">copy</span>.<span class="ruby-identifier">gsub!</span>( <span class="ruby-constant">EREFERENCE</span>, <span class="ruby-string">'&amp;'</span> )
<span class="ruby-identifier">entities</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">key</span>, <span class="ruby-identifier">value</span><span class="ruby-operator">|</span>
<span class="ruby-identifier">copy</span>.<span class="ruby-identifier">gsub!</span>( <span class="ruby-identifier">value</span>, <span class="ruby-node">"&#{key};"</span> ) <span class="ruby-keyword">unless</span> <span class="ruby-identifier">entity_filter</span> <span class="ruby-keyword">and</span>
<span class="ruby-identifier">entity_filter</span>.<span class="ruby-identifier">include?</span>(<span class="ruby-identifier">entity</span>)
<span class="ruby-keyword">end</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">entities</span>
<span class="ruby-identifier">copy</span>.<span class="ruby-identifier">gsub!</span>( <span class="ruby-constant">EREFERENCE</span>, <span class="ruby-string">'&amp;'</span> )
<span class="ruby-constant">DEFAULT_ENTITIES</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">key</span>, <span class="ruby-identifier">value</span><span class="ruby-operator">|</span>
<span class="ruby-identifier">copy</span>.<span class="ruby-identifier">gsub!</span>( <span class="ruby-identifier">value</span>[<span class="ruby-value">3</span>], <span class="ruby-identifier">value</span>[<span class="ruby-value">1</span>] )
<span class="ruby-keyword">end</span>
<span class="ruby-identifier">copy</span>
<span class="ruby-keyword">end</span></pre>
</div>
</div>
</div>
<div id="method-i-peek" class="method-detail ">
<div class="method-heading">
<span class="method-name">peek</span><span
class="method-args">(depth=0)</span>
<span class="method-click-advice">click to toggle source</span>
</div>
<div class="method-description">
<p>Peek at the <code>depth</code> event in the stack. The first element on the stack is at depth 0. If <code>depth</code> is -1, will parse to the end of the input stream and return the last event, which is always :end_document. Be aware that this causes the stream to be parsed up to the <code>depth</code> event, so you can effectively pre-parse the entire document (pull the entire thing into memory) using this method.</p>
<div class="method-source-code" id="peek-source">
<pre><span class="ruby-comment"># File lib/rexml/parsers/baseparser.rb, line 167</span>
<span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">peek</span> <span class="ruby-identifier">depth</span>=<span class="ruby-value">0</span>
<span class="ruby-identifier">raise</span> <span class="ruby-node">%Q[Illegal argument "#{depth}"]</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">depth</span> <span class="ruby-operator"><</span> <span class="ruby-value">-1</span>
<span class="ruby-identifier">temp</span> = []
<span class="ruby-keyword">if</span> <span class="ruby-identifier">depth</span> <span class="ruby-operator">==</span> <span class="ruby-value">-1</span>
<span class="ruby-identifier">temp</span>.<span class="ruby-identifier">push</span>(<span class="ruby-identifier">pull</span>()) <span class="ruby-keyword">until</span> <span class="ruby-identifier">empty?</span>
<span class="ruby-keyword">else</span>
<span class="ruby-keyword">while</span> <span class="ruby-ivar">@stack</span>.<span class="ruby-identifier">size</span><span class="ruby-operator">+</span><span class="ruby-identifier">temp</span>.<span class="ruby-identifier">size</span> <span class="ruby-operator"><</span> <span class="ruby-identifier">depth</span><span class="ruby-value">+1</span>
<span class="ruby-identifier">temp</span>.<span class="ruby-identifier">push</span>(<span class="ruby-identifier">pull</span>())
<span class="ruby-keyword">end</span>
<span class="ruby-keyword">end</span>
<span class="ruby-ivar">@stack</span> <span class="ruby-operator">+=</span> <span class="ruby-identifier">temp</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">temp</span>.<span class="ruby-identifier">size</span> <span class="ruby-operator">></span> <span class="ruby-value">0</span>
<span class="ruby-ivar">@stack</span>[<span class="ruby-identifier">depth</span>]
<span class="ruby-keyword">end</span></pre>
</div>
</div>
</div>
<div id="method-i-position" class="method-detail ">
<div class="method-heading">
<span class="method-name">position</span><span
class="method-args">()</span>
<span class="method-click-advice">click to toggle source</span>
</div>
<div class="method-description">
<div class="method-source-code" id="position-source">
<pre><span class="ruby-comment"># File lib/rexml/parsers/baseparser.rb, line 136</span>
<span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">position</span>
<span class="ruby-keyword">if</span> <span class="ruby-ivar">@source</span>.<span class="ruby-identifier">respond_to?</span> <span class="ruby-value">:position</span>
<span class="ruby-ivar">@source</span>.<span class="ruby-identifier">position</span>
<span class="ruby-keyword">else</span>
<span class="ruby-comment"># FIXME</span>
<span class="ruby-value">0</span>
<span class="ruby-keyword">end</span>
<span class="ruby-keyword">end</span></pre>
</div>
</div>
</div>
<div id="method-i-pull" class="method-detail ">
<div class="method-heading">
<span class="method-name">pull</span><span
class="method-args">()</span>
<span class="method-click-advice">click to toggle source</span>
</div>
<div class="method-description">
<p>Returns the next event. This is a <code>PullEvent</code> object.</p>
<div class="method-source-code" id="pull-source">
<pre><span class="ruby-comment"># File lib/rexml/parsers/baseparser.rb, line 182</span>
<span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">pull</span>
<span class="ruby-identifier">pull_event</span>.<span class="ruby-identifier">tap</span> <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">event</span><span class="ruby-operator">|</span>
<span class="ruby-ivar">@listeners</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">listener</span><span class="ruby-operator">|</span>
<span class="ruby-identifier">listener</span>.<span class="ruby-identifier">receive</span> <span class="ruby-identifier">event</span>
<span class="ruby-keyword">end</span>
<span class="ruby-keyword">end</span>
<span class="ruby-keyword">end</span></pre>
</div>
</div>
</div>
<div id="method-i-stream-3D" class="method-detail ">
<div class="method-heading">
<span class="method-name">stream=</span><span
class="method-args">( source )</span>
<span class="method-click-advice">click to toggle source</span>
</div>
<div class="method-description">
<div class="method-source-code" id="stream-3D-source">
<pre><span class="ruby-comment"># File lib/rexml/parsers/baseparser.rb, line 126</span>
<span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">stream=</span>( <span class="ruby-identifier">source</span> )
<span class="ruby-ivar">@source</span> = <span class="ruby-constant">SourceFactory</span>.<span class="ruby-identifier">create_from</span>( <span class="ruby-identifier">source</span> )
<span class="ruby-ivar">@closed</span> = <span class="ruby-keyword">nil</span>
<span class="ruby-ivar">@document_status</span> = <span class="ruby-keyword">nil</span>
<span class="ruby-ivar">@tags</span> = []
<span class="ruby-ivar">@stack</span> = []
<span class="ruby-ivar">@entities</span> = []
<span class="ruby-ivar">@nsstack</span> = []
<span class="ruby-keyword">end</span></pre>
</div>
</div>
</div>
<div id="method-i-unnormalize" class="method-detail ">
<div class="method-heading">
<span class="method-name">unnormalize</span><span
class="method-args">( string, entities=nil, filter=nil )</span>
<span class="method-click-advice">click to toggle source</span>
</div>
<div class="method-description">
<p>Unescapes all possible entities</p>
<div class="method-source-code" id="unnormalize-source">
<pre><span class="ruby-comment"># File lib/rexml/parsers/baseparser.rb, line 465</span>
<span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">unnormalize</span>( <span class="ruby-identifier">string</span>, <span class="ruby-identifier">entities</span>=<span class="ruby-keyword">nil</span>, <span class="ruby-identifier">filter</span>=<span class="ruby-keyword">nil</span> )
<span class="ruby-identifier">rv</span> = <span class="ruby-identifier">string</span>.<span class="ruby-identifier">clone</span>
<span class="ruby-identifier">rv</span>.<span class="ruby-identifier">gsub!</span>( <span class="ruby-regexp">/\r\n?/</span>, <span class="ruby-string">"\n"</span> )
<span class="ruby-identifier">matches</span> = <span class="ruby-identifier">rv</span>.<span class="ruby-identifier">scan</span>( <span class="ruby-constant">REFERENCE_RE</span> )
<span class="ruby-keyword">return</span> <span class="ruby-identifier">rv</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">matches</span>.<span class="ruby-identifier">size</span> <span class="ruby-operator">==</span> <span class="ruby-value">0</span>
<span class="ruby-identifier">rv</span>.<span class="ruby-identifier">gsub!</span>( <span class="ruby-regexp">/&#0*((?:\d+)|(?:x[a-fA-F0-9]+));/</span> ) {
<span class="ruby-identifier">m</span>=<span class="ruby-node">$1</span>
<span class="ruby-identifier">m</span> = <span class="ruby-node">"0#{m}"</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">m</span>[<span class="ruby-value">0</span>] <span class="ruby-operator">==</span> <span class="ruby-value">?x</span>
[<span class="ruby-constant">Integer</span>(<span class="ruby-identifier">m</span>)].<span class="ruby-identifier">pack</span>(<span class="ruby-string">'U*'</span>)
}
<span class="ruby-identifier">matches</span>.<span class="ruby-identifier">collect!</span>{<span class="ruby-operator">|</span><span class="ruby-identifier">x</span><span class="ruby-operator">|</span><span class="ruby-identifier">x</span>[<span class="ruby-value">0</span>]}.<span class="ruby-identifier">compact!</span>
<span class="ruby-keyword">if</span> <span class="ruby-identifier">matches</span>.<span class="ruby-identifier">size</span> <span class="ruby-operator">></span> <span class="ruby-value">0</span>
<span class="ruby-identifier">matches</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">entity_reference</span><span class="ruby-operator">|</span>
<span class="ruby-keyword">unless</span> <span class="ruby-identifier">filter</span> <span class="ruby-keyword">and</span> <span class="ruby-identifier">filter</span>.<span class="ruby-identifier">include?</span>(<span class="ruby-identifier">entity_reference</span>)
<span class="ruby-identifier">entity_value</span> = <span class="ruby-identifier">entity</span>( <span class="ruby-identifier">entity_reference</span>, <span class="ruby-identifier">entities</span> )
<span class="ruby-keyword">if</span> <span class="ruby-identifier">entity_value</span>
<span class="ruby-identifier">re</span> = <span class="ruby-regexp">/&#{entity_reference};/</span>
<span class="ruby-identifier">rv</span>.<span class="ruby-identifier">gsub!</span>( <span class="ruby-identifier">re</span>, <span class="ruby-identifier">entity_value</span> )
<span class="ruby-keyword">else</span>
<span class="ruby-identifier">er</span> = <span class="ruby-constant">DEFAULT_ENTITIES</span>[<span class="ruby-identifier">entity_reference</span>]
<span class="ruby-identifier">rv</span>.<span class="ruby-identifier">gsub!</span>( <span class="ruby-identifier">er</span>[<span class="ruby-value">0</span>], <span class="ruby-identifier">er</span>[<span class="ruby-value">2</span>] ) <span class="ruby-keyword">if</span> <span class="ruby-identifier">er</span>
<span class="ruby-keyword">end</span>
<span class="ruby-keyword">end</span>
<span class="ruby-keyword">end</span>
<span class="ruby-identifier">rv</span>.<span class="ruby-identifier">gsub!</span>( <span class="ruby-regexp">/&amp;/</span>, <span class="ruby-string">'&'</span> )
<span class="ruby-keyword">end</span>
<span class="ruby-identifier">rv</span>
<span class="ruby-keyword">end</span></pre>
</div>
</div>
</div>
<div id="method-i-unshift" class="method-detail ">
<div class="method-heading">
<span class="method-name">unshift</span><span
class="method-args">(token)</span>
<span class="method-click-advice">click to toggle source</span>
</div>
<div class="method-description">
<p>Push an event back on the head of the stream. This method has (theoretically) infinite depth.</p>
<div class="method-source-code" id="unshift-source">
<pre><span class="ruby-comment"># File lib/rexml/parsers/baseparser.rb, line 157</span>
<span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">unshift</span> <span class="ruby-identifier">token</span>
<span class="ruby-ivar">@stack</span>.<span class="ruby-identifier">unshift</span>(<span class="ruby-identifier">token</span>)
<span class="ruby-keyword">end</span></pre>
</div>
</div>
</div>
</section>
<section id="private-instance-5Buntitled-5D-method-details" class="method-section">
<header>
<h3>Private Instance Methods</h3>
</header>
<div id="method-i-need_source_encoding_update-3F" class="method-detail ">
<div class="method-heading">
<span class="method-name">need_source_encoding_update?</span><span
class="method-args">(xml_declaration_encoding)</span>
<span class="method-click-advice">click to toggle source</span>
</div>
<div class="method-description">
<div class="method-source-code" id="need_source_encoding_update-3F-source">
<pre><span class="ruby-comment"># File lib/rexml/parsers/baseparser.rb, line 495</span>
<span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">need_source_encoding_update?</span>(<span class="ruby-identifier">xml_declaration_encoding</span>)
<span class="ruby-keyword">return</span> <span class="ruby-keyword">false</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">xml_declaration_encoding</span>.<span class="ruby-identifier">nil?</span>
<span class="ruby-keyword">return</span> <span class="ruby-keyword">false</span> <span class="ruby-keyword">if</span> <span class="ruby-regexp">/\AUTF-16\z/i</span> <span class="ruby-operator">=~</span> <span class="ruby-identifier">xml_declaration_encoding</span>
<span class="ruby-keyword">true</span>
<span class="ruby-keyword">end</span></pre>
</div>
</div>
</div>
<div id="method-i-parse_attributes" class="method-detail ">
<div class="method-heading">
<span class="method-name">parse_attributes</span><span
class="method-args">(prefixes, curr_ns)</span>
<span class="method-click-advice">click to toggle source</span>
</div>
<div class="method-description">
<div class="method-source-code" id="parse_attributes-source">
<pre><span class="ruby-comment"># File lib/rexml/parsers/baseparser.rb, line 589</span>
<span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">parse_attributes</span>(<span class="ruby-identifier">prefixes</span>, <span class="ruby-identifier">curr_ns</span>)
<span class="ruby-identifier">attributes</span> = {}
<span class="ruby-identifier">closed</span> = <span class="ruby-keyword">false</span>
<span class="ruby-identifier">match_data</span> = <span class="ruby-ivar">@source</span>.<span class="ruby-identifier">match</span>(<span class="ruby-regexp">/^(.*?)(\/)?>/um</span>, <span class="ruby-keyword">true</span>)
<span class="ruby-keyword">if</span> <span class="ruby-identifier">match_data</span>.<span class="ruby-identifier">nil?</span>
<span class="ruby-identifier">message</span> = <span class="ruby-string">"Start tag isn't ended"</span>
<span class="ruby-identifier">raise</span> <span class="ruby-constant">REXML</span><span class="ruby-operator">::</span><span class="ruby-constant">ParseException</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">message</span>, <span class="ruby-ivar">@source</span>)
<span class="ruby-keyword">end</span>
<span class="ruby-identifier">raw_attributes</span> = <span class="ruby-identifier">match_data</span>[<span class="ruby-value">1</span>]
<span class="ruby-identifier">closed</span> = <span class="ruby-operator">!</span><span class="ruby-identifier">match_data</span>[<span class="ruby-value">2</span>].<span class="ruby-identifier">nil?</span>
<span class="ruby-keyword">return</span> <span class="ruby-identifier">attributes</span>, <span class="ruby-identifier">closed</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">raw_attributes</span>.<span class="ruby-identifier">nil?</span>
<span class="ruby-keyword">return</span> <span class="ruby-identifier">attributes</span>, <span class="ruby-identifier">closed</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">raw_attributes</span>.<span class="ruby-identifier">empty?</span>
<span class="ruby-identifier">scanner</span> = <span class="ruby-constant">StringScanner</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">raw_attributes</span>)
<span class="ruby-keyword">until</span> <span class="ruby-identifier">scanner</span>.<span class="ruby-identifier">eos?</span>
<span class="ruby-keyword">if</span> <span class="ruby-identifier">scanner</span>.<span class="ruby-identifier">scan</span>(<span class="ruby-regexp">/\s+/</span>)
<span class="ruby-keyword">break</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">scanner</span>.<span class="ruby-identifier">eos?</span>
<span class="ruby-keyword">end</span>
<span class="ruby-identifier">pos</span> = <span class="ruby-identifier">scanner</span>.<span class="ruby-identifier">pos</span>
<span class="ruby-identifier">loop</span> <span class="ruby-keyword">do</span>
<span class="ruby-keyword">break</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">scanner</span>.<span class="ruby-identifier">scan</span>(<span class="ruby-constant">ATTRIBUTE_PATTERN</span>)
<span class="ruby-keyword">unless</span> <span class="ruby-identifier">scanner</span>.<span class="ruby-identifier">scan</span>(<span class="ruby-constant">QNAME</span>)
<span class="ruby-identifier">message</span> = <span class="ruby-node">"Invalid attribute name: <#{scanner.rest}>"</span>
<span class="ruby-identifier">raise</span> <span class="ruby-constant">REXML</span><span class="ruby-operator">::</span><span class="ruby-constant">ParseException</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">message</span>, <span class="ruby-ivar">@source</span>)
<span class="ruby-keyword">end</span>
<span class="ruby-identifier">name</span> = <span class="ruby-identifier">scanner</span>[<span class="ruby-value">0</span>]
<span class="ruby-keyword">unless</span> <span class="ruby-identifier">scanner</span>.<span class="ruby-identifier">scan</span>(<span class="ruby-regexp">/\s*=\s*/um</span>)
<span class="ruby-identifier">message</span> = <span class="ruby-node">"Missing attribute equal: <#{name}>"</span>
<span class="ruby-identifier">raise</span> <span class="ruby-constant">REXML</span><span class="ruby-operator">::</span><span class="ruby-constant">ParseException</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">message</span>, <span class="ruby-ivar">@source</span>)
<span class="ruby-keyword">end</span>
<span class="ruby-identifier">quote</span> = <span class="ruby-identifier">scanner</span>.<span class="ruby-identifier">scan</span>(<span class="ruby-regexp">/['"]/</span>)
<span class="ruby-keyword">unless</span> <span class="ruby-identifier">quote</span>
<span class="ruby-identifier">message</span> = <span class="ruby-node">"Missing attribute value start quote: <#{name}>"</span>
<span class="ruby-identifier">raise</span> <span class="ruby-constant">REXML</span><span class="ruby-operator">::</span><span class="ruby-constant">ParseException</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">message</span>, <span class="ruby-ivar">@source</span>)
<span class="ruby-keyword">end</span>
<span class="ruby-keyword">unless</span> <span class="ruby-identifier">scanner</span>.<span class="ruby-identifier">scan</span>(<span class="ruby-regexp">/.*#{Regexp.escape(quote)}/um</span>)
<span class="ruby-identifier">match_data</span> = <span class="ruby-ivar">@source</span>.<span class="ruby-identifier">match</span>(<span class="ruby-regexp">/^(.*?)(\/)?>/um</span>, <span class="ruby-keyword">true</span>)
<span class="ruby-keyword">if</span> <span class="ruby-identifier">match_data</span>
<span class="ruby-identifier">scanner</span> <span class="ruby-operator"><<</span> <span class="ruby-string">"/"</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">closed</span>
<span class="ruby-identifier">scanner</span> <span class="ruby-operator"><<</span> <span class="ruby-string">">"</span>
<span class="ruby-identifier">scanner</span> <span class="ruby-operator"><<</span> <span class="ruby-identifier">match_data</span>[<span class="ruby-value">1</span>]
<span class="ruby-identifier">scanner</span>.<span class="ruby-identifier">pos</span> = <span class="ruby-identifier">pos</span>
<span class="ruby-identifier">closed</span> = <span class="ruby-operator">!</span><span class="ruby-identifier">match_data</span>[<span class="ruby-value">2</span>].<span class="ruby-identifier">nil?</span>
<span class="ruby-keyword">next</span>
<span class="ruby-keyword">end</span>
<span class="ruby-identifier">message</span> =
<span class="ruby-node">"Missing attribute value end quote: <#{name}>: <#{quote}>"</span>
<span class="ruby-identifier">raise</span> <span class="ruby-constant">REXML</span><span class="ruby-operator">::</span><span class="ruby-constant">ParseException</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">message</span>, <span class="ruby-ivar">@source</span>)
<span class="ruby-keyword">end</span>
<span class="ruby-keyword">end</span>
<span class="ruby-identifier">name</span> = <span class="ruby-identifier">scanner</span>[<span class="ruby-value">1</span>]
<span class="ruby-identifier">prefix</span> = <span class="ruby-identifier">scanner</span>[<span class="ruby-value">2</span>]
<span class="ruby-identifier">local_part</span> = <span class="ruby-identifier">scanner</span>[<span class="ruby-value">3</span>]
<span class="ruby-comment"># quote = scanner[4]</span>
<span class="ruby-identifier">value</span> = <span class="ruby-identifier">scanner</span>[<span class="ruby-value">5</span>]
<span class="ruby-keyword">if</span> <span class="ruby-identifier">prefix</span> <span class="ruby-operator">==</span> <span class="ruby-string">"xmlns"</span>
<span class="ruby-keyword">if</span> <span class="ruby-identifier">local_part</span> <span class="ruby-operator">==</span> <span class="ruby-string">"xml"</span>
<span class="ruby-keyword">if</span> <span class="ruby-identifier">value</span> <span class="ruby-operator">!=</span> <span class="ruby-string">"http://www.w3.org/XML/1998/namespace"</span>
<span class="ruby-identifier">msg</span> = <span class="ruby-string">"The 'xml' prefix must not be bound to any other namespace "</span><span class="ruby-operator">+</span>
<span class="ruby-string">"(http://www.w3.org/TR/REC-xml-names/#ns-decl)"</span>
<span class="ruby-identifier">raise</span> <span class="ruby-constant">REXML</span><span class="ruby-operator">::</span><span class="ruby-constant">ParseException</span>.<span class="ruby-identifier">new</span>( <span class="ruby-identifier">msg</span>, <span class="ruby-ivar">@source</span>, <span class="ruby-keyword">self</span> )
<span class="ruby-keyword">end</span>
<span class="ruby-keyword">elsif</span> <span class="ruby-identifier">local_part</span> <span class="ruby-operator">==</span> <span class="ruby-string">"xmlns"</span>
<span class="ruby-identifier">msg</span> = <span class="ruby-string">"The 'xmlns' prefix must not be declared "</span><span class="ruby-operator">+</span>
<span class="ruby-string">"(http://www.w3.org/TR/REC-xml-names/#ns-decl)"</span>
<span class="ruby-identifier">raise</span> <span class="ruby-constant">REXML</span><span class="ruby-operator">::</span><span class="ruby-constant">ParseException</span>.<span class="ruby-identifier">new</span>( <span class="ruby-identifier">msg</span>, <span class="ruby-ivar">@source</span>, <span class="ruby-keyword">self</span>)
<span class="ruby-keyword">end</span>
<span class="ruby-identifier">curr_ns</span> <span class="ruby-operator"><<</span> <span class="ruby-identifier">local_part</span>
<span class="ruby-keyword">elsif</span> <span class="ruby-identifier">prefix</span>
<span class="ruby-identifier">prefixes</span> <span class="ruby-operator"><<</span> <span class="ruby-identifier">prefix</span> <span class="ruby-keyword">unless</span> <span class="ruby-identifier">prefix</span> <span class="ruby-operator">==</span> <span class="ruby-string">"xml"</span>
<span class="ruby-keyword">end</span>
<span class="ruby-keyword">if</span> <span class="ruby-identifier">attributes</span>.<span class="ruby-identifier">has_key?</span>(<span class="ruby-identifier">name</span>)
<span class="ruby-identifier">msg</span> = <span class="ruby-node">"Duplicate attribute #{name.inspect}"</span>
<span class="ruby-identifier">raise</span> <span class="ruby-constant">REXML</span><span class="ruby-operator">::</span><span class="ruby-constant">ParseException</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">msg</span>, <span class="ruby-ivar">@source</span>, <span class="ruby-keyword">self</span>)
<span class="ruby-keyword">end</span>
<span class="ruby-identifier">attributes</span>[<span class="ruby-identifier">name</span>] = <span class="ruby-identifier">value</span>
<span class="ruby-keyword">end</span>
<span class="ruby-keyword">return</span> <span class="ruby-identifier">attributes</span>, <span class="ruby-identifier">closed</span>
<span class="ruby-keyword">end</span></pre>
</div>
</div>
</div>
<div id="method-i-parse_id" class="method-detail ">
<div class="method-heading">
<span class="method-name">parse_id</span><span
class="method-args">(base_error_message, accept_external_id:, accept_public_id:)</span>
<span class="method-click-advice">click to toggle source</span>
</div>
<div class="method-description">
<div class="method-source-code" id="parse_id-source">
<pre><span class="ruby-comment"># File lib/rexml/parsers/baseparser.rb, line 514</span>
<span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">parse_id</span>(<span class="ruby-identifier">base_error_message</span>,
<span class="ruby-value">accept_external_id:</span>,
<span class="ruby-value">accept_public_id:</span>)
<span class="ruby-keyword">if</span> <span class="ruby-identifier">accept_external_id</span> <span class="ruby-keyword">and</span> (<span class="ruby-identifier">md</span> = <span class="ruby-ivar">@source</span>.<span class="ruby-identifier">match</span>(<span class="ruby-constant">EXTERNAL_ID_PUBLIC</span>, <span class="ruby-keyword">true</span>))
<span class="ruby-identifier">pubid</span> = <span class="ruby-identifier">system</span> = <span class="ruby-keyword">nil</span>
<span class="ruby-identifier">pubid_literal</span> = <span class="ruby-identifier">md</span>[<span class="ruby-value">1</span>]
<span class="ruby-identifier">pubid</span> = <span class="ruby-identifier">pubid_literal</span>[<span class="ruby-value">1</span><span class="ruby-operator">..</span><span class="ruby-value">-2</span>] <span class="ruby-keyword">if</span> <span class="ruby-identifier">pubid_literal</span> <span class="ruby-comment"># Remove quote</span>
<span class="ruby-identifier">system_literal</span> = <span class="ruby-identifier">md</span>[<span class="ruby-value">2</span>]
<span class="ruby-identifier">system</span> = <span class="ruby-identifier">system_literal</span>[<span class="ruby-value">1</span><span class="ruby-operator">..</span><span class="ruby-value">-2</span>] <span class="ruby-keyword">if</span> <span class="ruby-identifier">system_literal</span> <span class="ruby-comment"># Remove quote</span>
[<span class="ruby-string">"PUBLIC"</span>, <span class="ruby-identifier">pubid</span>, <span class="ruby-identifier">system</span>]
<span class="ruby-keyword">elsif</span> <span class="ruby-identifier">accept_public_id</span> <span class="ruby-keyword">and</span> (<span class="ruby-identifier">md</span> = <span class="ruby-ivar">@source</span>.<span class="ruby-identifier">match</span>(<span class="ruby-constant">PUBLIC_ID</span>, <span class="ruby-keyword">true</span>))
<span class="ruby-identifier">pubid</span> = <span class="ruby-identifier">system</span> = <span class="ruby-keyword">nil</span>
<span class="ruby-identifier">pubid_literal</span> = <span class="ruby-identifier">md</span>[<span class="ruby-value">1</span>]
<span class="ruby-identifier">pubid</span> = <span class="ruby-identifier">pubid_literal</span>[<span class="ruby-value">1</span><span class="ruby-operator">..</span><span class="ruby-value">-2</span>] <span class="ruby-keyword">if</span> <span class="ruby-identifier">pubid_literal</span> <span class="ruby-comment"># Remove quote</span>
[<span class="ruby-string">"PUBLIC"</span>, <span class="ruby-identifier">pubid</span>, <span class="ruby-keyword">nil</span>]
<span class="ruby-keyword">elsif</span> <span class="ruby-identifier">accept_external_id</span> <span class="ruby-keyword">and</span> (<span class="ruby-identifier">md</span> = <span class="ruby-ivar">@source</span>.<span class="ruby-identifier">match</span>(<span class="ruby-constant">EXTERNAL_ID_SYSTEM</span>, <span class="ruby-keyword">true</span>))
<span class="ruby-identifier">system</span> = <span class="ruby-keyword">nil</span>
<span class="ruby-identifier">system_literal</span> = <span class="ruby-identifier">md</span>[<span class="ruby-value">1</span>]
<span class="ruby-identifier">system</span> = <span class="ruby-identifier">system_literal</span>[<span class="ruby-value">1</span><span class="ruby-operator">..</span><span class="ruby-value">-2</span>] <span class="ruby-keyword">if</span> <span class="ruby-identifier">system_literal</span> <span class="ruby-comment"># Remove quote</span>
[<span class="ruby-string">"SYSTEM"</span>, <span class="ruby-keyword">nil</span>, <span class="ruby-identifier">system</span>]
<span class="ruby-keyword">else</span>
<span class="ruby-identifier">details</span> = <span class="ruby-identifier">parse_id_invalid_details</span>(<span class="ruby-value">accept_external_id:</span> <span class="ruby-identifier">accept_external_id</span>,
<span class="ruby-value">accept_public_id:</span> <span class="ruby-identifier">accept_public_id</span>)
<span class="ruby-identifier">message</span> = <span class="ruby-node">"#{base_error_message}: #{details}"</span>
<span class="ruby-identifier">raise</span> <span class="ruby-constant">REXML</span><span class="ruby-operator">::</span><span class="ruby-constant">ParseException</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">message</span>, <span class="ruby-ivar">@source</span>)
<span class="ruby-keyword">end</span>
<span class="ruby-keyword">end</span></pre>
</div>
</div>
</div>
<div id="method-i-parse_id_invalid_details" class="method-detail ">
<div class="method-heading">
<span class="method-name">parse_id_invalid_details</span><span
class="method-args">(accept_external_id:, accept_public_id:)</span>
<span class="method-click-advice">click to toggle source</span>
</div>
<div class="method-description">
<div class="method-source-code" id="parse_id_invalid_details-source">
<pre><span class="ruby-comment"># File lib/rexml/parsers/baseparser.rb, line 542</span>
<span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">parse_id_invalid_details</span>(<span class="ruby-value">accept_external_id:</span>,
<span class="ruby-value">accept_public_id:</span>)
<span class="ruby-identifier">public</span> = <span class="ruby-regexp">/\A\s*PUBLIC/um</span>
<span class="ruby-identifier">system</span> = <span class="ruby-regexp">/\A\s*SYSTEM/um</span>
<span class="ruby-keyword">if</span> (<span class="ruby-identifier">accept_external_id</span> <span class="ruby-keyword">or</span> <span class="ruby-identifier">accept_public_id</span>) <span class="ruby-keyword">and</span> <span class="ruby-ivar">@source</span>.<span class="ruby-identifier">match</span>(<span class="ruby-regexp">/#{public}/um</span>)
<span class="ruby-keyword">if</span> <span class="ruby-ivar">@source</span>.<span class="ruby-identifier">match</span>(<span class="ruby-regexp">/#{public}(?:\s+[^'"]|\s*[\[>])/um</span>)
<span class="ruby-keyword">return</span> <span class="ruby-string">"public ID literal is missing"</span>
<span class="ruby-keyword">end</span>
<span class="ruby-keyword">unless</span> <span class="ruby-ivar">@source</span>.<span class="ruby-identifier">match</span>(<span class="ruby-regexp">/#{public}\s+#{PUBIDLITERAL}/um</span>)
<span class="ruby-keyword">return</span> <span class="ruby-string">"invalid public ID literal"</span>
<span class="ruby-keyword">end</span>
<span class="ruby-keyword">if</span> <span class="ruby-identifier">accept_public_id</span>
<span class="ruby-keyword">if</span> <span class="ruby-ivar">@source</span>.<span class="ruby-identifier">match</span>(<span class="ruby-regexp">/#{public}\s+#{PUBIDLITERAL}\s+[^'"]/um</span>)
<span class="ruby-keyword">return</span> <span class="ruby-string">"system ID literal is missing"</span>
<span class="ruby-keyword">end</span>
<span class="ruby-keyword">unless</span> <span class="ruby-ivar">@source</span>.<span class="ruby-identifier">match</span>(<span class="ruby-regexp">/#{public}\s+#{PUBIDLITERAL}\s+#{SYSTEMLITERAL}/um</span>)
<span class="ruby-keyword">return</span> <span class="ruby-string">"invalid system literal"</span>
<span class="ruby-keyword">end</span>
<span class="ruby-string">"garbage after system literal"</span>
<span class="ruby-keyword">else</span>
<span class="ruby-string">"garbage after public ID literal"</span>
<span class="ruby-keyword">end</span>
<span class="ruby-keyword">elsif</span> <span class="ruby-identifier">accept_external_id</span> <span class="ruby-keyword">and</span> <span class="ruby-ivar">@source</span>.<span class="ruby-identifier">match</span>(<span class="ruby-regexp">/#{system}/um</span>)
<span class="ruby-keyword">if</span> <span class="ruby-ivar">@source</span>.<span class="ruby-identifier">match</span>(<span class="ruby-regexp">/#{system}(?:\s+[^'"]|\s*[\[>])/um</span>)
<span class="ruby-keyword">return</span> <span class="ruby-string">"system literal is missing"</span>
<span class="ruby-keyword">end</span>
<span class="ruby-keyword">unless</span> <span class="ruby-ivar">@source</span>.<span class="ruby-identifier">match</span>(<span class="ruby-regexp">/#{system}\s+#{SYSTEMLITERAL}/um</span>)
<span class="ruby-keyword">return</span> <span class="ruby-string">"invalid system literal"</span>
<span class="ruby-keyword">end</span>
<span class="ruby-string">"garbage after system literal"</span>
<span class="ruby-keyword">else</span>
<span class="ruby-keyword">unless</span> <span class="ruby-ivar">@source</span>.<span class="ruby-identifier">match</span>(<span class="ruby-regexp">/\A\s*(?:PUBLIC|SYSTEM)\s/um</span>)
<span class="ruby-keyword">return</span> <span class="ruby-string">"invalid ID type"</span>
<span class="ruby-keyword">end</span>
<span class="ruby-string">"ID type is missing"</span>
<span class="ruby-keyword">end</span>
<span class="ruby-keyword">end</span></pre>
</div>
</div>
</div>
<div id="method-i-parse_name" class="method-detail ">
<div class="method-heading">
<span class="method-name">parse_name</span><span
class="method-args">(base_error_message)</span>
<span class="method-click-advice">click to toggle source</span>
</div>
<div class="method-description">
<div class="method-source-code" id="parse_name-source">
<pre><span class="ruby-comment"># File lib/rexml/parsers/baseparser.rb, line 501</span>
<span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">parse_name</span>(<span class="ruby-identifier">base_error_message</span>)
<span class="ruby-identifier">md</span> = <span class="ruby-ivar">@source</span>.<span class="ruby-identifier">match</span>(<span class="ruby-regexp">/\A\s*#{NAME}/um</span>, <span class="ruby-keyword">true</span>)
<span class="ruby-keyword">unless</span> <span class="ruby-identifier">md</span>
<span class="ruby-keyword">if</span> <span class="ruby-ivar">@source</span>.<span class="ruby-identifier">match</span>(<span class="ruby-regexp">/\A\s*\S/um</span>)
<span class="ruby-identifier">message</span> = <span class="ruby-node">"#{base_error_message}: invalid name"</span>
<span class="ruby-keyword">else</span>
<span class="ruby-identifier">message</span> = <span class="ruby-node">"#{base_error_message}: name is missing"</span>
<span class="ruby-keyword">end</span>
<span class="ruby-identifier">raise</span> <span class="ruby-constant">REXML</span><span class="ruby-operator">::</span><span class="ruby-constant">ParseException</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">message</span>, <span class="ruby-ivar">@source</span>)
<span class="ruby-keyword">end</span>
<span class="ruby-identifier">md</span>[<span class="ruby-value">1</span>]
<span class="ruby-keyword">end</span></pre>
</div>
</div>
</div>
<div id="method-i-process_instruction" class="method-detail ">
<div class="method-heading">
<span class="method-name">process_instruction</span><span
class="method-args">()</span>
<span class="method-click-advice">click to toggle source</span>
</div>
<div class="method-description">
<div class="method-source-code" id="process_instruction-source">
<pre><span class="ruby-comment"># File lib/rexml/parsers/baseparser.rb, line 580</span>
<span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">process_instruction</span>
<span class="ruby-identifier">match_data</span> = <span class="ruby-ivar">@source</span>.<span class="ruby-identifier">match</span>(<span class="ruby-constant">INSTRUCTION_PATTERN</span>, <span class="ruby-keyword">true</span>)
<span class="ruby-keyword">unless</span> <span class="ruby-identifier">match_data</span>
<span class="ruby-identifier">message</span> = <span class="ruby-string">"Invalid processing instruction node"</span>
<span class="ruby-identifier">raise</span> <span class="ruby-constant">REXML</span><span class="ruby-operator">::</span><span class="ruby-constant">ParseException</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">message</span>, <span class="ruby-ivar">@source</span>)
<span class="ruby-keyword">end</span>
[<span class="ruby-value">:processing_instruction</span>, <span class="ruby-identifier">match_data</span>[<span class="ruby-value">1</span>], <span class="ruby-identifier">match_data</span>[<span class="ruby-value">2</span>]]
<span class="ruby-keyword">end</span></pre>
</div>
</div>
</div>
<div id="method-i-pull_event" class="method-detail ">
<div class="method-heading">
<span class="method-name">pull_event</span><span
class="method-args">()</span>
<span class="method-click-advice">click to toggle source</span>
</div>
<div class="method-description">
<div class="method-source-code" id="pull_event-source">
<pre><span class="ruby-comment"># File lib/rexml/parsers/baseparser.rb, line 190</span>
<span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">pull_event</span>
<span class="ruby-keyword">if</span> <span class="ruby-ivar">@closed</span>
<span class="ruby-identifier">x</span>, <span class="ruby-ivar">@closed</span> = <span class="ruby-ivar">@closed</span>, <span class="ruby-keyword">nil</span>
<span class="ruby-keyword">return</span> [ <span class="ruby-value">:end_element</span>, <span class="ruby-identifier">x</span> ]
<span class="ruby-keyword">end</span>
<span class="ruby-keyword">return</span> [ <span class="ruby-value">:end_document</span> ] <span class="ruby-keyword">if</span> <span class="ruby-identifier">empty?</span>
<span class="ruby-keyword">return</span> <span class="ruby-ivar">@stack</span>.<span class="ruby-identifier">shift</span> <span class="ruby-keyword">if</span> <span class="ruby-ivar">@stack</span>.<span class="ruby-identifier">size</span> <span class="ruby-operator">></span> <span class="ruby-value">0</span>
<span class="ruby-comment">#STDERR.puts @source.encoding</span>
<span class="ruby-comment">#STDERR.puts "BUFFER = #{@source.buffer.inspect}"</span>
<span class="ruby-keyword">if</span> <span class="ruby-ivar">@document_status</span> <span class="ruby-operator">==</span> <span class="ruby-keyword">nil</span>
<span class="ruby-identifier">word</span> = <span class="ruby-ivar">@source</span>.<span class="ruby-identifier">match</span>( <span class="ruby-regexp">/\A((?:\s+)|(?:<[^>]*>))/um</span> )
<span class="ruby-identifier">word</span> = <span class="ruby-identifier">word</span>[<span class="ruby-value">1</span>] <span class="ruby-keyword">unless</span> <span class="ruby-identifier">word</span>.<span class="ruby-identifier">nil?</span>
<span class="ruby-comment">#STDERR.puts "WORD = #{word.inspect}"</span>
<span class="ruby-keyword">case</span> <span class="ruby-identifier">word</span>
<span class="ruby-keyword">when</span> <span class="ruby-constant">COMMENT_START</span>
<span class="ruby-keyword">return</span> [ <span class="ruby-value">:comment</span>, <span class="ruby-ivar">@source</span>.<span class="ruby-identifier">match</span>( <span class="ruby-constant">COMMENT_PATTERN</span>, <span class="ruby-keyword">true</span> )[<span class="ruby-value">1</span>] ]
<span class="ruby-keyword">when</span> <span class="ruby-constant">XMLDECL_START</span>
<span class="ruby-comment">#STDERR.puts "XMLDECL"</span>
<span class="ruby-identifier">results</span> = <span class="ruby-ivar">@source</span>.<span class="ruby-identifier">match</span>( <span class="ruby-constant">XMLDECL_PATTERN</span>, <span class="ruby-keyword">true</span> )[<span class="ruby-value">1</span>]
<span class="ruby-identifier">version</span> = <span class="ruby-constant">VERSION</span>.<span class="ruby-identifier">match</span>( <span class="ruby-identifier">results</span> )
<span class="ruby-identifier">version</span> = <span class="ruby-identifier">version</span>[<span class="ruby-value">1</span>] <span class="ruby-keyword">unless</span> <span class="ruby-identifier">version</span>.<span class="ruby-identifier">nil?</span>
<span class="ruby-identifier">encoding</span> = <span class="ruby-constant">ENCODING</span>.<span class="ruby-identifier">match</span>(<span class="ruby-identifier">results</span>)
<span class="ruby-identifier">encoding</span> = <span class="ruby-identifier">encoding</span>[<span class="ruby-value">1</span>] <span class="ruby-keyword">unless</span> <span class="ruby-identifier">encoding</span>.<span class="ruby-identifier">nil?</span>
<span class="ruby-keyword">if</span> <span class="ruby-identifier">need_source_encoding_update?</span>(<span class="ruby-identifier">encoding</span>)
<span class="ruby-ivar">@source</span>.<span class="ruby-identifier">encoding</span> = <span class="ruby-identifier">encoding</span>
<span class="ruby-keyword">end</span>
<span class="ruby-keyword">if</span> <span class="ruby-identifier">encoding</span>.<span class="ruby-identifier">nil?</span> <span class="ruby-keyword">and</span> <span class="ruby-regexp">/\AUTF-16(?:BE|LE)\z/i</span> <span class="ruby-operator">=~</span> <span class="ruby-ivar">@source</span>.<span class="ruby-identifier">encoding</span>
<span class="ruby-identifier">encoding</span> = <span class="ruby-string">"UTF-16"</span>
<span class="ruby-keyword">end</span>
<span class="ruby-identifier">standalone</span> = <span class="ruby-constant">STANDALONE</span>.<span class="ruby-identifier">match</span>(<span class="ruby-identifier">results</span>)
<span class="ruby-identifier">standalone</span> = <span class="ruby-identifier">standalone</span>[<span class="ruby-value">1</span>] <span class="ruby-keyword">unless</span> <span class="ruby-identifier">standalone</span>.<span class="ruby-identifier">nil?</span>
<span class="ruby-keyword">return</span> [ <span class="ruby-value">:xmldecl</span>, <span class="ruby-identifier">version</span>, <span class="ruby-identifier">encoding</span>, <span class="ruby-identifier">standalone</span> ]
<span class="ruby-keyword">when</span> <span class="ruby-constant">INSTRUCTION_START</span>
<span class="ruby-keyword">return</span> <span class="ruby-identifier">process_instruction</span>
<span class="ruby-keyword">when</span> <span class="ruby-constant">DOCTYPE_START</span>
<span class="ruby-identifier">base_error_message</span> = <span class="ruby-string">"Malformed DOCTYPE"</span>
<span class="ruby-ivar">@source</span>.<span class="ruby-identifier">match</span>(<span class="ruby-constant">DOCTYPE_START</span>, <span class="ruby-keyword">true</span>)
<span class="ruby-ivar">@nsstack</span>.<span class="ruby-identifier">unshift</span>(<span class="ruby-identifier">curr_ns</span>=<span class="ruby-constant">Set</span>.<span class="ruby-identifier">new</span>)
<span class="ruby-identifier">name</span> = <span class="ruby-identifier">parse_name</span>(<span class="ruby-identifier">base_error_message</span>)
<span class="ruby-keyword">if</span> <span class="ruby-ivar">@source</span>.<span class="ruby-identifier">match</span>(<span class="ruby-regexp">/\A\s*\[/um</span>, <span class="ruby-keyword">true</span>)
<span class="ruby-identifier">id</span> = [<span class="ruby-keyword">nil</span>, <span class="ruby-keyword">nil</span>, <span class="ruby-keyword">nil</span>]
<span class="ruby-ivar">@document_status</span> = <span class="ruby-value">:in_doctype</span>
<span class="ruby-keyword">elsif</span> <span class="ruby-ivar">@source</span>.<span class="ruby-identifier">match</span>(<span class="ruby-regexp">/\A\s*>/um</span>, <span class="ruby-keyword">true</span>)
<span class="ruby-identifier">id</span> = [<span class="ruby-keyword">nil</span>, <span class="ruby-keyword">nil</span>, <span class="ruby-keyword">nil</span>]
<span class="ruby-ivar">@document_status</span> = <span class="ruby-value">:after_doctype</span>
<span class="ruby-keyword">else</span>
<span class="ruby-identifier">id</span> = <span class="ruby-identifier">parse_id</span>(<span class="ruby-identifier">base_error_message</span>,
<span class="ruby-value">accept_external_id:</span> <span class="ruby-keyword">true</span>,
<span class="ruby-value">accept_public_id:</span> <span class="ruby-keyword">false</span>)
<span class="ruby-keyword">if</span> <span class="ruby-identifier">id</span>[<span class="ruby-value">0</span>] <span class="ruby-operator">==</span> <span class="ruby-string">"SYSTEM"</span>
<span class="ruby-comment"># For backward compatibility</span>
<span class="ruby-identifier">id</span>[<span class="ruby-value">1</span>], <span class="ruby-identifier">id</span>[<span class="ruby-value">2</span>] = <span class="ruby-identifier">id</span>[<span class="ruby-value">2</span>], <span class="ruby-keyword">nil</span>
<span class="ruby-keyword">end</span>
<span class="ruby-keyword">if</span> <span class="ruby-ivar">@source</span>.<span class="ruby-identifier">match</span>(<span class="ruby-regexp">/\A\s*\[/um</span>, <span class="ruby-keyword">true</span>)
<span class="ruby-ivar">@document_status</span> = <span class="ruby-value">:in_doctype</span>
<span class="ruby-keyword">elsif</span> <span class="ruby-ivar">@source</span>.<span class="ruby-identifier">match</span>(<span class="ruby-regexp">/\A\s*>/um</span>, <span class="ruby-keyword">true</span>)
<span class="ruby-ivar">@document_status</span> = <span class="ruby-value">:after_doctype</span>
<span class="ruby-keyword">else</span>
<span class="ruby-identifier">message</span> = <span class="ruby-node">"#{base_error_message}: garbage after external ID"</span>
<span class="ruby-identifier">raise</span> <span class="ruby-constant">REXML</span><span class="ruby-operator">::</span><span class="ruby-constant">ParseException</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">message</span>, <span class="ruby-ivar">@source</span>)
<span class="ruby-keyword">end</span>
<span class="ruby-keyword">end</span>
<span class="ruby-identifier">args</span> = [<span class="ruby-value">:start_doctype</span>, <span class="ruby-identifier">name</span>, <span class="ruby-operator">*</span><span class="ruby-identifier">id</span>]
<span class="ruby-keyword">if</span> <span class="ruby-ivar">@document_status</span> <span class="ruby-operator">==</span> <span class="ruby-value">:after_doctype</span>
<span class="ruby-ivar">@source</span>.<span class="ruby-identifier">match</span>(<span class="ruby-regexp">/\A\s*/um</span>, <span class="ruby-keyword">true</span>)
<span class="ruby-ivar">@stack</span> <span class="ruby-operator"><<</span> [ <span class="ruby-value">:end_doctype</span> ]
<span class="ruby-keyword">end</span>
<span class="ruby-keyword">return</span> <span class="ruby-identifier">args</span>
<span class="ruby-keyword">when</span> <span class="ruby-regexp">/\A\s+/</span>
<span class="ruby-keyword">else</span>
<span class="ruby-ivar">@document_status</span> = <span class="ruby-value">:after_doctype</span>
<span class="ruby-keyword">if</span> <span class="ruby-ivar">@source</span>.<span class="ruby-identifier">encoding</span> <span class="ruby-operator">==</span> <span class="ruby-string">"UTF-8"</span>
<span class="ruby-ivar">@source</span>.<span class="ruby-identifier">buffer</span>.<span class="ruby-identifier">force_encoding</span>(<span class="ruby-operator">::</span><span class="ruby-constant">Encoding</span><span class="ruby-operator">::</span><span class="ruby-constant">UTF_8</span>)
<span class="ruby-keyword">end</span>
<span class="ruby-keyword">end</span>
<span class="ruby-keyword">end</span>
<span class="ruby-keyword">if</span> <span class="ruby-ivar">@document_status</span> <span class="ruby-operator">==</span> <span class="ruby-value">:in_doctype</span>
<span class="ruby-identifier">md</span> = <span class="ruby-ivar">@source</span>.<span class="ruby-identifier">match</span>(<span class="ruby-regexp">/\A\s*(.*?>)/um</span>)
<span class="ruby-keyword">case</span> <span class="ruby-identifier">md</span>[<span class="ruby-value">1</span>]
<span class="ruby-keyword">when</span> <span class="ruby-constant">SYSTEMENTITY</span>
<span class="ruby-identifier">match</span> = <span class="ruby-ivar">@source</span>.<span class="ruby-identifier">match</span>( <span class="ruby-constant">SYSTEMENTITY</span>, <span class="ruby-keyword">true</span> )[<span class="ruby-value">1</span>]
<span class="ruby-keyword">return</span> [ <span class="ruby-value">:externalentity</span>, <span class="ruby-identifier">match</span> ]
<span class="ruby-keyword">when</span> <span class="ruby-constant">ELEMENTDECL_START</span>
<span class="ruby-keyword">return</span> [ <span class="ruby-value">:elementdecl</span>, <span class="ruby-ivar">@source</span>.<span class="ruby-identifier">match</span>( <span class="ruby-constant">ELEMENTDECL_PATTERN</span>, <span class="ruby-keyword">true</span> )[<span class="ruby-value">1</span>] ]
<span class="ruby-keyword">when</span> <span class="ruby-constant">ENTITY_START</span>
<span class="ruby-identifier">match</span> = <span class="ruby-ivar">@source</span>.<span class="ruby-identifier">match</span>( <span class="ruby-constant">ENTITYDECL</span>, <span class="ruby-keyword">true</span> ).<span class="ruby-identifier">to_a</span>.<span class="ruby-identifier">compact</span>
<span class="ruby-identifier">match</span>[<span class="ruby-value">0</span>] = <span class="ruby-value">:entitydecl</span>
<span class="ruby-identifier">ref</span> = <span class="ruby-keyword">false</span>
<span class="ruby-keyword">if</span> <span class="ruby-identifier">match</span>[<span class="ruby-value">1</span>] <span class="ruby-operator">==</span> <span class="ruby-string">'%'</span>
<span class="ruby-identifier">ref</span> = <span class="ruby-keyword">true</span>
<span class="ruby-identifier">match</span>.<span class="ruby-identifier">delete_at</span> <span class="ruby-value">1</span>
<span class="ruby-keyword">end</span>
<span class="ruby-comment"># Now we have to sort out what kind of entity reference this is</span>
<span class="ruby-keyword">if</span> <span class="ruby-identifier">match</span>[<span class="ruby-value">2</span>] <span class="ruby-operator">==</span> <span class="ruby-string">'SYSTEM'</span>
<span class="ruby-comment"># External reference</span>
<span class="ruby-identifier">match</span>[<span class="ruby-value">3</span>] = <span class="ruby-identifier">match</span>[<span class="ruby-value">3</span>][<span class="ruby-value">1</span><span class="ruby-operator">..</span><span class="ruby-value">-2</span>] <span class="ruby-comment"># PUBID</span>
<span class="ruby-identifier">match</span>.<span class="ruby-identifier">delete_at</span>(<span class="ruby-value">4</span>) <span class="ruby-keyword">if</span> <span class="ruby-identifier">match</span>.<span class="ruby-identifier">size</span> <span class="ruby-operator">></span> <span class="ruby-value">4</span> <span class="ruby-comment"># Chop out NDATA decl</span>
<span class="ruby-comment"># match is [ :entity, name, SYSTEM, pubid(, ndata)? ]</span>
<span class="ruby-keyword">elsif</span> <span class="ruby-identifier">match</span>[<span class="ruby-value">2</span>] <span class="ruby-operator">==</span> <span class="ruby-string">'PUBLIC'</span>
<span class="ruby-comment"># External reference</span>
<span class="ruby-identifier">match</span>[<span class="ruby-value">3</span>] = <span class="ruby-identifier">match</span>[<span class="ruby-value">3</span>][<span class="ruby-value">1</span><span class="ruby-operator">..</span><span class="ruby-value">-2</span>] <span class="ruby-comment"># PUBID</span>
<span class="ruby-identifier">match</span>[<span class="ruby-value">4</span>] = <span class="ruby-identifier">match</span>[<span class="ruby-value">4</span>][<span class="ruby-value">1</span><span class="ruby-operator">..</span><span class="ruby-value">-2</span>] <span class="ruby-comment"># HREF</span>
<span class="ruby-identifier">match</span>.<span class="ruby-identifier">delete_at</span>(<span class="ruby-value">5</span>) <span class="ruby-keyword">if</span> <span class="ruby-identifier">match</span>.<span class="ruby-identifier">size</span> <span class="ruby-operator">></span> <span class="ruby-value">5</span> <span class="ruby-comment"># Chop out NDATA decl</span>
<span class="ruby-comment"># match is [ :entity, name, PUBLIC, pubid, href(, ndata)? ]</span>
<span class="ruby-keyword">else</span>
<span class="ruby-identifier">match</span>[<span class="ruby-value">2</span>] = <span class="ruby-identifier">match</span>[<span class="ruby-value">2</span>][<span class="ruby-value">1</span><span class="ruby-operator">..</span><span class="ruby-value">-2</span>]
<span class="ruby-identifier">match</span>.<span class="ruby-identifier">pop</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">match</span>.<span class="ruby-identifier">size</span> <span class="ruby-operator">==</span> <span class="ruby-value">4</span>
<span class="ruby-comment"># match is [ :entity, name, value ]</span>
<span class="ruby-keyword">end</span>
<span class="ruby-identifier">match</span> <span class="ruby-operator"><<</span> <span class="ruby-string">'%'</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">ref</span>
<span class="ruby-keyword">return</span> <span class="ruby-identifier">match</span>
<span class="ruby-keyword">when</span> <span class="ruby-constant">ATTLISTDECL_START</span>
<span class="ruby-identifier">md</span> = <span class="ruby-ivar">@source</span>.<span class="ruby-identifier">match</span>( <span class="ruby-constant">ATTLISTDECL_PATTERN</span>, <span class="ruby-keyword">true</span> )
<span class="ruby-identifier">raise</span> <span class="ruby-constant">REXML</span><span class="ruby-operator">::</span><span class="ruby-constant">ParseException</span>.<span class="ruby-identifier">new</span>( <span class="ruby-string">"Bad ATTLIST declaration!"</span>, <span class="ruby-ivar">@source</span> ) <span class="ruby-keyword">if</span> <span class="ruby-identifier">md</span>.<span class="ruby-identifier">nil?</span>
<span class="ruby-identifier">element</span> = <span class="ruby-identifier">md</span>[<span class="ruby-value">1</span>]
<span class="ruby-identifier">contents</span> = <span class="ruby-identifier">md</span>[<span class="ruby-value">0</span>]
<span class="ruby-identifier">pairs</span> = {}
<span class="ruby-identifier">values</span> = <span class="ruby-identifier">md</span>[<span class="ruby-value">0</span>].<span class="ruby-identifier">scan</span>( <span class="ruby-constant">ATTDEF_RE</span> )
<span class="ruby-identifier">values</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">attdef</span><span class="ruby-operator">|</span>
<span class="ruby-keyword">unless</span> <span class="ruby-identifier">attdef</span>[<span class="ruby-value">3</span>] <span class="ruby-operator">==</span> <span class="ruby-string">"#IMPLIED"</span>
<span class="ruby-identifier">attdef</span>.<span class="ruby-identifier">compact!</span>
<span class="ruby-identifier">val</span> = <span class="ruby-identifier">attdef</span>[<span class="ruby-value">3</span>]
<span class="ruby-identifier">val</span> = <span class="ruby-identifier">attdef</span>[<span class="ruby-value">4</span>] <span class="ruby-keyword">if</span> <span class="ruby-identifier">val</span> <span class="ruby-operator">==</span> <span class="ruby-string">"#FIXED "</span>
<span class="ruby-identifier">pairs</span>[<span class="ruby-identifier">attdef</span>[<span class="ruby-value">0</span>]] = <span class="ruby-identifier">val</span>
<span class="ruby-keyword">if</span> <span class="ruby-identifier">attdef</span>[<span class="ruby-value">0</span>] <span class="ruby-operator">=~</span> <span class="ruby-regexp">/^xmlns:(.*)/</span>
<span class="ruby-ivar">@nsstack</span>[<span class="ruby-value">0</span>] <span class="ruby-operator"><<</span> <span class="ruby-node">$1</span>
<span class="ruby-keyword">end</span>
<span class="ruby-keyword">end</span>
<span class="ruby-keyword">end</span>
<span class="ruby-keyword">return</span> [ <span class="ruby-value">:attlistdecl</span>, <span class="ruby-identifier">element</span>, <span class="ruby-identifier">pairs</span>, <span class="ruby-identifier">contents</span> ]
<span class="ruby-keyword">when</span> <span class="ruby-constant">NOTATIONDECL_START</span>
<span class="ruby-identifier">base_error_message</span> = <span class="ruby-string">"Malformed notation declaration"</span>
<span class="ruby-keyword">unless</span> <span class="ruby-ivar">@source</span>.<span class="ruby-identifier">match</span>(<span class="ruby-regexp">/\A\s*<!NOTATION\s+/um</span>, <span class="ruby-keyword">true</span>)
<span class="ruby-keyword">if</span> <span class="ruby-ivar">@source</span>.<span class="ruby-identifier">match</span>(<span class="ruby-regexp">/\A\s*<!NOTATION\s*>/um</span>)
<span class="ruby-identifier">message</span> = <span class="ruby-node">"#{base_error_message}: name is missing"</span>
<span class="ruby-keyword">else</span>
<span class="ruby-identifier">message</span> = <span class="ruby-node">"#{base_error_message}: invalid declaration name"</span>
<span class="ruby-keyword">end</span>
<span class="ruby-identifier">raise</span> <span class="ruby-constant">REXML</span><span class="ruby-operator">::</span><span class="ruby-constant">ParseException</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">message</span>, <span class="ruby-ivar">@source</span>)
<span class="ruby-keyword">end</span>
<span class="ruby-identifier">name</span> = <span class="ruby-identifier">parse_name</span>(<span class="ruby-identifier">base_error_message</span>)
<span class="ruby-identifier">id</span> = <span class="ruby-identifier">parse_id</span>(<span class="ruby-identifier">base_error_message</span>,
<span class="ruby-value">accept_external_id:</span> <span class="ruby-keyword">true</span>,
<span class="ruby-value">accept_public_id:</span> <span class="ruby-keyword">true</span>)
<span class="ruby-keyword">unless</span> <span class="ruby-ivar">@source</span>.<span class="ruby-identifier">match</span>(<span class="ruby-regexp">/\A\s*>/um</span>, <span class="ruby-keyword">true</span>)
<span class="ruby-identifier">message</span> = <span class="ruby-node">"#{base_error_message}: garbage before end >"</span>
<span class="ruby-identifier">raise</span> <span class="ruby-constant">REXML</span><span class="ruby-operator">::</span><span class="ruby-constant">ParseException</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">message</span>, <span class="ruby-ivar">@source</span>)
<span class="ruby-keyword">end</span>
<span class="ruby-keyword">return</span> [<span class="ruby-value">:notationdecl</span>, <span class="ruby-identifier">name</span>, <span class="ruby-operator">*</span><span class="ruby-identifier">id</span>]
<span class="ruby-keyword">when</span> <span class="ruby-constant">DOCTYPE_END</span>
<span class="ruby-ivar">@document_status</span> = <span class="ruby-value">:after_doctype</span>
<span class="ruby-ivar">@source</span>.<span class="ruby-identifier">match</span>( <span class="ruby-constant">DOCTYPE_END</span>, <span class="ruby-keyword">true</span> )
<span class="ruby-keyword">return</span> [ <span class="ruby-value">:end_doctype</span> ]
<span class="ruby-keyword">end</span>
<span class="ruby-keyword">end</span>
<span class="ruby-keyword">if</span> <span class="ruby-ivar">@document_status</span> <span class="ruby-operator">==</span> <span class="ruby-value">:after_doctype</span>
<span class="ruby-ivar">@source</span>.<span class="ruby-identifier">match</span>(<span class="ruby-regexp">/\A\s*/um</span>, <span class="ruby-keyword">true</span>)
<span class="ruby-keyword">end</span>
<span class="ruby-keyword">begin</span>
<span class="ruby-ivar">@source</span>.<span class="ruby-identifier">read</span> <span class="ruby-keyword">if</span> <span class="ruby-ivar">@source</span>.<span class="ruby-identifier">buffer</span>.<span class="ruby-identifier">size</span><span class="ruby-operator"><</span><span class="ruby-value">2</span>
<span class="ruby-keyword">if</span> <span class="ruby-ivar">@source</span>.<span class="ruby-identifier">buffer</span>[<span class="ruby-value">0</span>] <span class="ruby-operator">==</span> <span class="ruby-value">?<</span>
<span class="ruby-keyword">if</span> <span class="ruby-ivar">@source</span>.<span class="ruby-identifier">buffer</span>[<span class="ruby-value">1</span>] <span class="ruby-operator">==</span> <span class="ruby-value">?/</span>
<span class="ruby-ivar">@nsstack</span>.<span class="ruby-identifier">shift</span>
<span class="ruby-identifier">last_tag</span> = <span class="ruby-ivar">@tags</span>.<span class="ruby-identifier">pop</span>
<span class="ruby-identifier">md</span> = <span class="ruby-ivar">@source</span>.<span class="ruby-identifier">match</span>( <span class="ruby-constant">CLOSE_MATCH</span>, <span class="ruby-keyword">true</span> )
<span class="ruby-keyword">if</span> <span class="ruby-identifier">md</span> <span class="ruby-keyword">and</span> <span class="ruby-operator">!</span><span class="ruby-identifier">last_tag</span>
<span class="ruby-identifier">message</span> = <span class="ruby-node">"Unexpected top-level end tag (got '#{md[1]}')"</span>
<span class="ruby-identifier">raise</span> <span class="ruby-constant">REXML</span><span class="ruby-operator">::</span><span class="ruby-constant">ParseException</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">message</span>, <span class="ruby-ivar">@source</span>)
<span class="ruby-keyword">end</span>
<span class="ruby-keyword">if</span> <span class="ruby-identifier">md</span>.<span class="ruby-identifier">nil?</span> <span class="ruby-keyword">or</span> <span class="ruby-identifier">last_tag</span> <span class="ruby-operator">!=</span> <span class="ruby-identifier">md</span>[<span class="ruby-value">1</span>]
<span class="ruby-identifier">message</span> = <span class="ruby-node">"Missing end tag for '#{last_tag}'"</span>
<span class="ruby-identifier">message</span> <span class="ruby-operator"><<</span> <span class="ruby-node">" (got '#{md[1]}')"</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">md</span>
<span class="ruby-identifier">raise</span> <span class="ruby-constant">REXML</span><span class="ruby-operator">::</span><span class="ruby-constant">ParseException</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">message</span>, <span class="ruby-ivar">@source</span>)
<span class="ruby-keyword">end</span>
<span class="ruby-keyword">return</span> [ <span class="ruby-value">:end_element</span>, <span class="ruby-identifier">last_tag</span> ]
<span class="ruby-keyword">elsif</span> <span class="ruby-ivar">@source</span>.<span class="ruby-identifier">buffer</span>[<span class="ruby-value">1</span>] <span class="ruby-operator">==</span> <span class="ruby-value">?!</span>
<span class="ruby-identifier">md</span> = <span class="ruby-ivar">@source</span>.<span class="ruby-identifier">match</span>(<span class="ruby-regexp">/\A(\s*[^>]*>)/um</span>)
<span class="ruby-comment">#STDERR.puts "SOURCE BUFFER = #{source.buffer}, #{source.buffer.size}"</span>
<span class="ruby-identifier">raise</span> <span class="ruby-constant">REXML</span><span class="ruby-operator">::</span><span class="ruby-constant">ParseException</span>.<span class="ruby-identifier">new</span>(<span class="ruby-string">"Malformed node"</span>, <span class="ruby-ivar">@source</span>) <span class="ruby-keyword">unless</span> <span class="ruby-identifier">md</span>
<span class="ruby-keyword">if</span> <span class="ruby-identifier">md</span>[<span class="ruby-value">0</span>][<span class="ruby-value">2</span>] <span class="ruby-operator">==</span> <span class="ruby-value">?-</span>
<span class="ruby-identifier">md</span> = <span class="ruby-ivar">@source</span>.<span class="ruby-identifier">match</span>( <span class="ruby-constant">COMMENT_PATTERN</span>, <span class="ruby-keyword">true</span> )
<span class="ruby-keyword">case</span> <span class="ruby-identifier">md</span>[<span class="ruby-value">1</span>]
<span class="ruby-keyword">when</span> <span class="ruby-regexp">/--/</span>, <span class="ruby-regexp">/-\z/</span>
<span class="ruby-identifier">raise</span> <span class="ruby-constant">REXML</span><span class="ruby-operator">::</span><span class="ruby-constant">ParseException</span>.<span class="ruby-identifier">new</span>(<span class="ruby-string">"Malformed comment"</span>, <span class="ruby-ivar">@source</span>)
<span class="ruby-keyword">end</span>
<span class="ruby-keyword">return</span> [ <span class="ruby-value">:comment</span>, <span class="ruby-identifier">md</span>[<span class="ruby-value">1</span>] ] <span class="ruby-keyword">if</span> <span class="ruby-identifier">md</span>
<span class="ruby-keyword">else</span>
<span class="ruby-identifier">md</span> = <span class="ruby-ivar">@source</span>.<span class="ruby-identifier">match</span>( <span class="ruby-constant">CDATA_PATTERN</span>, <span class="ruby-keyword">true</span> )
<span class="ruby-keyword">return</span> [ <span class="ruby-value">:cdata</span>, <span class="ruby-identifier">md</span>[<span class="ruby-value">1</span>] ] <span class="ruby-keyword">if</span> <span class="ruby-identifier">md</span>
<span class="ruby-keyword">end</span>
<span class="ruby-identifier">raise</span> <span class="ruby-constant">REXML</span><span class="ruby-operator">::</span><span class="ruby-constant">ParseException</span>.<span class="ruby-identifier">new</span>( <span class="ruby-string">"Declarations can only occur "</span><span class="ruby-operator">+</span>
<span class="ruby-string">"in the doctype declaration."</span>, <span class="ruby-ivar">@source</span>)
<span class="ruby-keyword">elsif</span> <span class="ruby-ivar">@source</span>.<span class="ruby-identifier">buffer</span>[<span class="ruby-value">1</span>] <span class="ruby-operator">==</span> <span class="ruby-value">??</span>
<span class="ruby-keyword">return</span> <span class="ruby-identifier">process_instruction</span>
<span class="ruby-keyword">else</span>
<span class="ruby-comment"># Get the next tag</span>
<span class="ruby-identifier">md</span> = <span class="ruby-ivar">@source</span>.<span class="ruby-identifier">match</span>(<span class="ruby-constant">TAG_MATCH</span>, <span class="ruby-keyword">true</span>)
<span class="ruby-keyword">unless</span> <span class="ruby-identifier">md</span>
<span class="ruby-identifier">raise</span> <span class="ruby-constant">REXML</span><span class="ruby-operator">::</span><span class="ruby-constant">ParseException</span>.<span class="ruby-identifier">new</span>(<span class="ruby-string">"malformed XML: missing tag start"</span>, <span class="ruby-ivar">@source</span>)
<span class="ruby-keyword">end</span>
<span class="ruby-ivar">@document_status</span> = <span class="ruby-value">:in_element</span>
<span class="ruby-identifier">prefixes</span> = <span class="ruby-constant">Set</span>.<span class="ruby-identifier">new</span>
<span class="ruby-identifier">prefixes</span> <span class="ruby-operator"><<</span> <span class="ruby-identifier">md</span>[<span class="ruby-value">2</span>] <span class="ruby-keyword">if</span> <span class="ruby-identifier">md</span>[<span class="ruby-value">2</span>]
<span class="ruby-ivar">@nsstack</span>.<span class="ruby-identifier">unshift</span>(<span class="ruby-identifier">curr_ns</span>=<span class="ruby-constant">Set</span>.<span class="ruby-identifier">new</span>)
<span class="ruby-identifier">attributes</span>, <span class="ruby-identifier">closed</span> = <span class="ruby-identifier">parse_attributes</span>(<span class="ruby-identifier">prefixes</span>, <span class="ruby-identifier">curr_ns</span>)
<span class="ruby-comment"># Verify that all of the prefixes have been defined</span>
<span class="ruby-keyword">for</span> <span class="ruby-identifier">prefix</span> <span class="ruby-keyword">in</span> <span class="ruby-identifier">prefixes</span>
<span class="ruby-keyword">unless</span> <span class="ruby-ivar">@nsstack</span>.<span class="ruby-identifier">find</span>{<span class="ruby-operator">|</span><span class="ruby-identifier">k</span><span class="ruby-operator">|</span> <span class="ruby-identifier">k</span>.<span class="ruby-identifier">member?</span>(<span class="ruby-identifier">prefix</span>)}
<span class="ruby-identifier">raise</span> <span class="ruby-constant">UndefinedNamespaceException</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">prefix</span>,<span class="ruby-ivar">@source</span>,<span class="ruby-keyword">self</span>)
<span class="ruby-keyword">end</span>
<span class="ruby-keyword">end</span>
<span class="ruby-keyword">if</span> <span class="ruby-identifier">closed</span>
<span class="ruby-ivar">@closed</span> = <span class="ruby-identifier">md</span>[<span class="ruby-value">1</span>]
<span class="ruby-ivar">@nsstack</span>.<span class="ruby-identifier">shift</span>
<span class="ruby-keyword">else</span>
<span class="ruby-ivar">@tags</span>.<span class="ruby-identifier">push</span>( <span class="ruby-identifier">md</span>[<span class="ruby-value">1</span>] )
<span class="ruby-keyword">end</span>
<span class="ruby-keyword">return</span> [ <span class="ruby-value">:start_element</span>, <span class="ruby-identifier">md</span>[<span class="ruby-value">1</span>], <span class="ruby-identifier">attributes</span> ]
<span class="ruby-keyword">end</span>
<span class="ruby-keyword">else</span>
<span class="ruby-identifier">md</span> = <span class="ruby-ivar">@source</span>.<span class="ruby-identifier">match</span>( <span class="ruby-constant">TEXT_PATTERN</span>, <span class="ruby-keyword">true</span> )
<span class="ruby-keyword">if</span> <span class="ruby-identifier">md</span>[<span class="ruby-value">0</span>].<span class="ruby-identifier">length</span> <span class="ruby-operator">==</span> <span class="ruby-value">0</span>
<span class="ruby-ivar">@source</span>.<span class="ruby-identifier">match</span>( <span class="ruby-regexp">/(\s+)/</span>, <span class="ruby-keyword">true</span> )
<span class="ruby-keyword">end</span>
<span class="ruby-comment">#STDERR.puts "GOT #{md[1].inspect}" unless md[0].length == 0</span>
<span class="ruby-comment">#return [ :text, "" ] if md[0].length == 0</span>
<span class="ruby-comment"># unnormalized = Text::unnormalize( md[1], self )</span>
<span class="ruby-comment"># return PullEvent.new( :text, md[1], unnormalized )</span>
<span class="ruby-keyword">return</span> [ <span class="ruby-value">:text</span>, <span class="ruby-identifier">md</span>[<span class="ruby-value">1</span>] ]
<span class="ruby-keyword">end</span>
<span class="ruby-keyword">rescue</span> <span class="ruby-constant">REXML</span><span class="ruby-operator">::</span><span class="ruby-constant">UndefinedNamespaceException</span>
<span class="ruby-identifier">raise</span>
<span class="ruby-keyword">rescue</span> <span class="ruby-constant">REXML</span><span class="ruby-operator">::</span><span class="ruby-constant">ParseException</span>
<span class="ruby-identifier">raise</span>
<span class="ruby-keyword">rescue</span> <span class="ruby-operator">=></span> <span class="ruby-identifier">error</span>
<span class="ruby-identifier">raise</span> <span class="ruby-constant">REXML</span><span class="ruby-operator">::</span><span class="ruby-constant">ParseException</span>.<span class="ruby-identifier">new</span>( <span class="ruby-string">"Exception parsing"</span>,
<span class="ruby-ivar">@source</span>, <span class="ruby-keyword">self</span>, (<span class="ruby-identifier">error</span> <span class="ruby-operator">?</span> <span class="ruby-identifier">error</span> <span class="ruby-operator">:</span> <span class="ruby-identifier">$!</span>) )
<span class="ruby-keyword">end</span>
<span class="ruby-keyword">return</span> [ <span class="ruby-value">:dummy</span> ]
<span class="ruby-keyword">end</span></pre>
</div>
</div>
</div>
</section>
</section>
</main>
<footer id="validator-badges" role="contentinfo">
<p><a href="https://validator.w3.org/check/referer">Validate</a>
<p>Generated by <a href="https://ruby.github.io/rdoc/">RDoc</a> 6.2.1.1.
<p>Based on <a href="http://deveiate.org/projects/Darkfish-RDoc/">Darkfish</a> by <a href="http://deveiate.org">Michael Granger</a>.
</footer>