Class: REXML::Source

Inherits:
Object
  • Object
show all
Includes:
Encoding
Defined in:
lib/rexml/source.rb

Overview

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

Direct Known Subclasses

IOSource

Constant Summary

Constants included from Private

Private::PRE_DEFINED_TERM_PATTERNS

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from Encoding

#decode, #encode

Constructor Details

#initialize(arg, encoding = nil) ⇒ Source

Constructor value, overriding all encoding detection

Parameters:

  • arg

    must be a String, and should be a valid XML document

  • encoding (defaults to: nil)

    if non-null, sets the encoding of the source to this



71
72
73
74
75
76
77
78
79
80
# File 'lib/rexml/source.rb', line 71

def initialize(arg, encoding=nil)
  @orig = arg
  @scanner = StringScanner.new(@orig)
  if encoding
    self.encoding = encoding
  else
    detect_encoding
  end
  @line = 0
end

Instance Attribute Details

#encodingObject

Returns the value of attribute encoding.



55
56
57
# File 'lib/rexml/source.rb', line 55

def encoding
  @encoding
end

#lineObject (readonly)

The line number of the last consumed text



54
55
56
# File 'lib/rexml/source.rb', line 54

def line
  @line
end

Instance Method Details

#bufferObject

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



83
84
85
# File 'lib/rexml/source.rb', line 83

def buffer
  @scanner.rest
end

#buffer_encoding=(encoding) ⇒ Object



87
88
89
# File 'lib/rexml/source.rb', line 87

def buffer_encoding=(encoding)
  @scanner.string.force_encoding(encoding)
end

#current_lineObject

Returns the current line in the source.

Returns:

  • the current line in the source



136
137
138
139
140
141
# File 'lib/rexml/source.rb', line 136

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

#empty?Boolean

Returns true if the Source is exhausted.

Returns:

  • (Boolean)

    true if the Source is exhausted



131
132
133
# File 'lib/rexml/source.rb', line 131

def empty?
  @scanner.eos?
end

#ensure_bufferObject



111
112
# File 'lib/rexml/source.rb', line 111

def ensure_buffer
end

#match(pattern, cons = false) ⇒ Object



114
115
116
117
118
119
120
# File 'lib/rexml/source.rb', line 114

def match(pattern, cons=false)
  if cons
    @scanner.scan(pattern).nil? ? nil : @scanner
  else
    @scanner.check(pattern).nil? ? nil : @scanner
  end
end

#positionObject



122
123
124
# File 'lib/rexml/source.rb', line 122

def position
  @scanner.pos
end

#position=(pos) ⇒ Object



126
127
128
# File 'lib/rexml/source.rb', line 126

def position=(pos)
  @scanner.pos = pos
end

#read(term = nil) ⇒ Object



98
99
# File 'lib/rexml/source.rb', line 98

def read(term = nil)
end

#read_until(term) ⇒ Object



101
102
103
104
105
106
107
108
109
# File 'lib/rexml/source.rb', line 101

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