Class REXML::IOSource
In: rexml/source.rb
Parent: Source

A Source that wraps an IO. See the Source class for method documentation

Methods

consume   current_line   empty?   match   new   position   read   scan  

Public Class methods

block_size has been deprecated

[Source]

# File rexml/source.rb, line 134
    def initialize(arg, block_size=500, encoding=nil)
      @er_source = @source = arg
      @to_utf = false

      # Determining the encoding is a deceptively difficult issue to resolve.
      # First, we check the first two bytes for UTF-16.  Then we
      # assume that the encoding is at least ASCII enough for the '>', and
      # we read until we get one of those.  This gives us the XML declaration,
      # if there is one.  If there isn't one, the file MUST be UTF-8, as per
      # the XML spec.  If there is one, we can determine the encoding from
      # it.
      @buffer = ""
      str = @source.read( 2 )
      if encoding
        self.encoding = encoding
      elsif 0xfe == str[0] && 0xff == str[1]
        @line_break = "\000>"
      elsif 0xff == str[0] && 0xfe == str[1]
        @line_break = ">\000"
      elsif 0xef == str[0] && 0xbb == str[1]
        str += @source.read(1)
        str = '' if (0xbf == str[2])
        @line_break = ">"
      else
        @line_break = ">"
      end
      super str+@source.readline( @line_break )
    end

Public Instance methods

[Source]

# File rexml/source.rb, line 200
    def consume( pattern )
      match( pattern, true )
    end

@return the current line in the source

[Source]

# File rexml/source.rb, line 231
    def current_line
      begin
        pos = @er_source.pos        # The byte position in the source
        lineno = @er_source.lineno  # The XML < position in the source
        @er_source.rewind
        line = 0                    # The \r\n position in the source
        begin
          while @er_source.pos < pos
            @er_source.readline
            line += 1
          end
        rescue
        end
      rescue IOError
        pos = -1
        line = -1
      end
      [pos, lineno, line]
    end

[Source]

# File rexml/source.rb, line 222
    def empty?
      super and ( @source.nil? || @source.eof? )
    end

[Source]

# File rexml/source.rb, line 204
    def match( pattern, cons=false )
      rv = pattern.match(@buffer)
      @buffer = $' if cons and rv
      while !rv and @source
        begin
          str = @source.readline(@line_break)
          str = decode(str) if @to_utf and str
          @buffer << str
          rv = pattern.match(@buffer)
          @buffer = $' if cons and rv
        rescue
          @source = nil
        end
      end
      rv.taint
      rv
    end

[Source]

# File rexml/source.rb, line 226
    def position
      @er_source.stat.pipe? ? 0 : @er_source.pos
    end

[Source]

# File rexml/source.rb, line 190
    def read
      begin
        str = @source.readline(@line_break)
        str = decode(str) if @to_utf and str 
        @buffer << str
      rescue Exception, NameError
        @source = nil
      end
    end

[Source]

# File rexml/source.rb, line 163
    def scan(pattern, cons=false)
      rv = super
      # You'll notice that this next section is very similar to the same
      # section in match(), but just a liiittle different.  This is
      # because it is a touch faster to do it this way with scan()
      # than the way match() does it; enough faster to warrent duplicating
      # some code
      if rv.size == 0
        until @buffer =~ pattern or @source.nil?
          begin
            # READLINE OPT
            #str = @source.read(@block_size)
            str = @source.readline(@line_break)
            str = decode(str) if @to_utf and str
            @buffer << str
          rescue Iconv::IllegalSequence
            raise
          rescue
            @source = nil
          end
        end
        rv = super
      end
      rv.taint
      rv
    end

[Validate]

ruby-doc.org is hosted and maintained by James Britt and Happy Camper Studios, a Ruby application development company in Phoenix, Arizona. The site was created in 2002 as part of the Ruby Documentation Project to promote the Ruby language and to help other Ruby hackers.

Documentation content on ruby-doc.org is provided by remarkable members of the Ruby community.

For more information on the Ruby programming language, visit ruby-lang.org.

Want to help improve Ruby's API docs? See Ruby Documentation Guidelines.