class REXML::Source - rexml: Ruby Standard Library Documentation

# class REXML::Source

A `Source` can be searched for patterns, and wraps buffers and other objects and provides consumption of text

### Attributes

encoding[R]
line[R]

The line number of the last consumed text

### Public Class Methods

new(arg, encoding=nil) click to toggle source

Constructor @param arg must be a String, and should be a valid XML document @param encoding if non-null, sets the encoding of the source to this value, overriding all encoding detection

    # File rexml-3.4.0/lib/rexml/source.rb, line 81
    def initialize(arg, encoding=nil)
      @orig = arg
      @scanner = StringScanner.new(@orig)
      if encoding
        self.encoding = encoding
      else
        detect_encoding
      end
      @line = 0
      @encoded_terms = {}
    end

### Public Instance Methods

buffer() click to toggle source

The current buffer (what we’re going to read next)

    # File rexml-3.4.0/lib/rexml/source.rb, line 94
    def buffer
      @scanner.rest
    end

buffer_encoding=(encoding) click to toggle source

    # File rexml-3.4.0/lib/rexml/source.rb, line 104
    def buffer_encoding=(encoding)
      @scanner.string.force_encoding(encoding)
    end

current_line() click to toggle source

@return the current line in the source

    # File rexml-3.4.0/lib/rexml/source.rb, line 161
    def current_line
      lines = @orig.split
      res = lines.grep @scanner.rest[0..30]
      res = res[-1] if res.kind_of? Array
      lines.index( res ) if res
    end

drop_parsed_content() click to toggle source

    # File rexml-3.4.0/lib/rexml/source.rb, line 98
    def drop_parsed_content
      if @scanner.pos > Private::SCANNER_RESET_SIZE
        @scanner.string = @scanner.rest
      end
    end

empty?() click to toggle source

@return true if the `Source` is exhausted

    # File rexml-3.4.0/lib/rexml/source.rb, line 156
    def empty?
      @scanner.eos?
    end

encoding=(enc) click to toggle source

Inherited from `Encoding` Overridden to support optimized en/decoding

Calls superclass method `REXML::Encoding#encoding=`

    # File rexml-3.4.0/lib/rexml/source.rb, line 110
    def encoding=(enc)
      return unless super
      encoding_updated
    end

ensure_buffer() click to toggle source

    # File rexml-3.4.0/lib/rexml/source.rb, line 128
    def ensure_buffer
    end

match(pattern, cons=false) click to toggle source

    # File rexml-3.4.0/lib/rexml/source.rb, line 131
    def match(pattern, cons=false)
      if cons
        @scanner.scan(pattern).nil? ? nil : @scanner
      else
        @scanner.check(pattern).nil? ? nil : @scanner
      end
    end

match?(pattern, cons=false) click to toggle source

    # File rexml-3.4.0/lib/rexml/source.rb, line 139
    def match?(pattern, cons=false)
      if cons
        !@scanner.skip(pattern).nil?
      else
        !@scanner.match?(pattern).nil?
      end
    end

position() click to toggle source

    # File rexml-3.4.0/lib/rexml/source.rb, line 147
    def position
      @scanner.pos
    end

position=(pos) click to toggle source

    # File rexml-3.4.0/lib/rexml/source.rb, line 151
    def position=(pos)
      @scanner.pos = pos
    end

read(term = nil) click to toggle source

    # File rexml-3.4.0/lib/rexml/source.rb, line 115
    def read(term = nil)
    end

read_until(term) click to toggle source

    # File rexml-3.4.0/lib/rexml/source.rb, line 118
    def read_until(term)
      pattern = Private::PRE_DEFINED_TERM_PATTERNS[term] || /#{Regexp.escape(term)}/
      data = @scanner.scan_until(pattern)
      unless data
        data = @scanner.rest
        @scanner.pos = @scanner.string.bytesize
      end
      data
    end

### Private Instance Methods

detect_encoding() click to toggle source

    # File rexml-3.4.0/lib/rexml/source.rb, line 170
    def detect_encoding
      scanner_encoding = @scanner.rest.encoding
      detected_encoding = "UTF-8"
      begin
        @scanner.string.force_encoding("ASCII-8BIT")
        if @scanner.scan(/\xfe\xff/n)
          detected_encoding = "UTF-16BE"
        elsif @scanner.scan(/\xff\xfe/n)
          detected_encoding = "UTF-16LE"
        elsif @scanner.scan(/\xef\xbb\xbf/n)
          detected_encoding = "UTF-8"
        end
      ensure
        @scanner.string.force_encoding(scanner_encoding)
      end
      self.encoding = detected_encoding
    end

encoding_updated() click to toggle source

    # File rexml-3.4.0/lib/rexml/source.rb, line 188
    def encoding_updated
      if @encoding != 'UTF-8'
        @scanner.string = decode(@scanner.rest)
        @to_utf = true
      else
        @to_utf = false
        @scanner.string.force_encoding(::Encoding::UTF_8)
      end
    end