# File nqxml/tokenizer.rb, line 555 def nextEntityTag while @currInput.pos >= @currInput.length @inputStack.pop() @currInput = @inputStack.last end sourceStartPos = @currInput.pos skipChars(8) # eat '<!ENTITY' skipSpaces() errorStrExtra = '' type = GENERAL_ENTITY:GENERAL_ENTITY if peekMatches?('%') # it's a parameter entity definition skipChar(1) # eat '%' skipSpaces() type = PARAMETER_ENTITY:PARAMETER_ENTITY errorStrExtra = '% ' end name = nextName() skipSpaces() # Page 39 ofspec: if GE def, EntityValue | (ExternalID # NDataDecl) if PE def, EntityValue | ExternalID entityValue = nil externalId = nil ndataName = nil if peekMatches?('SYSTEM') || peekMatches?('PUBLIC') externalId = nextExternalId('ENTITY') skipSpaces() if type == GENERAL_ENTITY:GENERAL_ENTITY # NDATA if peekMatches?('NDATA') skipChars(5) skipSpaces() ndataName = nextName() end end else # EntityValue # Parse character refs and parameter refs at the same time, # but not general entity refs. entityValue = replaceParamRefs(nextQuotedLiteral(name)) entityValue = NQXML.replaceCharacterRefs(entityValue) end skipSpaces() if !peekMatches?('>') str = "missing '>' after ENTITY #{errorStrExtra}" + "'#{name}' value" raise ParserError.new(str, self) end skipChar() # eat '>' src = @currInput.string[sourceStartPos ... @currInput.pos] entityTag = nil if type == PARAMETER_ENTITY:PARAMETER_ENTITY entityTag = ParameterEntityTag.new(name, entityValue, externalId, src) else entityTag = GeneralEntityTag.new(name, entityValue, externalId, ndataName, src) end # Add to list of parameter or internal entities for future # substitution. Warn the user if it has already been defined. entityHash = (type == PARAMETER_ENTITY:PARAMETER_ENTITY ? @paramEntities : @internalEntities) if entityHash[name] $stderr.puts "warning: ENTITY #{errorStrExtra}'#{name}'" + " already defined; first definition will be used" elsif entityValue entityHash[name] = entityValue else entityHash[name] = resolveSystemLiteral(externalId) end return entityTag end