Class: Rexle

Inherits:
Object
  • Object
show all
Includes:
XMLhelper
Defined in:
lib/rexle.rb

Defined Under Namespace

Classes: CData, Comment, Element, Elements, Recordset

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from XMLhelper

#doc_pretty_print, #doc_print, #inspect, #pretty_print, #processing_instructions, #scan_print, #scan_to_a

Constructor Details

#initialize(x = nil, rexle: self, debug: false) ⇒ Rexle

Returns a new instance of Rexle.



219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
# File 'lib/rexle.rb', line 219

def initialize(x=nil, rexle: self, debug: false)

  @rexle, @debug = rexle, debug
  $debug = @debug

  puts 'inside Rexle'.debug if debug

  super()

  @instructions = [["xml", "version='1.0' encoding='UTF-8'"]]
  @doctype = :xml

  # what type of input is it? Is it a string, array
  if x then
    procs = {
      String: proc {|x| parse_string(x)},
      Array: proc {|x| x},
      RexleParser: ->(x){ parse_rexle(x)}
    }

    doc_node = ['doc', Attributes.new]

    @a = procs[x.class.to_s.to_sym].call(x)

    @doc = scan_element(*(doc_node << @a))

    # fetch the namespaces
    @prefixes = []

    if @doc.root.attributes then

      xmlns = @doc.root.attributes.select {|k,v| k[/^xmlns:/]}
      @prefixes = xmlns.keys.map{|x| x[/\w+$/]}
    end

  end

end

Instance Attribute Details

#doctypeObject (readonly)

Returns the value of attribute doctype.



216
217
218
# File 'lib/rexle.rb', line 216

def doctype
  @doctype
end

#instructionsObject

Returns the value of attribute instructions.



217
218
219
# File 'lib/rexle.rb', line 217

def instructions
  @instructions
end

#prefixesObject (readonly)

Returns the value of attribute prefixes.



216
217
218
# File 'lib/rexle.rb', line 216

def prefixes
  @prefixes
end

Instance Method Details

#add_attribute(x) ⇒ Object



1448
# File 'lib/rexle.rb', line 1448

def add_attribute(x) @doc.attribute(x) end

#add_element(element) ⇒ Object Also known as: add



1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
# File 'lib/rexle.rb', line 1452

def add_element(element)

  if @doc then
    raise 'attempted adding second root element to document' if @doc.root
    @doc.root.add_element(element)
  else
    doc_node = ['doc', Attributes.new, element.to_a]
    @doc = scan_element(*doc_node)
  end
  element
end

#add_text(s) ⇒ Object



1464
# File 'lib/rexle.rb', line 1464

def add_text(s) end

#at_css(selector) ⇒ Object



262
263
264
# File 'lib/rexle.rb', line 262

def at_css(selector)
  @doc.root.element RexleCSS.new(selector).to_xpath
end

#attribute(key) ⇒ Object



1449
# File 'lib/rexle.rb', line 1449

def attribute(key) @doc.attribute(key) end

#attributesObject



1450
# File 'lib/rexle.rb', line 1450

def attributes() @doc.attributes end

#cloneObject



258
259
260
# File 'lib/rexle.rb', line 258

def clone()
  Rexle.new self.to_a
end

#content(options = {}) ⇒ Object



1514
1515
1516
# File 'lib/rexle.rb', line 1514

def content(options={})
  CGI.unescapeHTML(xml(options))
end

#css(selector) ⇒ Object



266
267
268
269
270
271
272
273
# File 'lib/rexle.rb', line 266

def css(selector)

  a = selector.split(',').flat_map do |x|
    @doc.root.xpath RexleCSS.new(x).to_xpath
  end

  return a
end

#delete(xpath) ⇒ Object Also known as: remove



1468
1469
1470
1471
1472
# File 'lib/rexle.rb', line 1468

def delete(xpath)

  @doc.xpath(xpath).each {|e| e.delete; e = nil }

end

#element(xpath) ⇒ Object



1476
# File 'lib/rexle.rb', line 1476

def element(xpath) self.xpath(xpath).first end

#elements(s = nil) ⇒ Object



1477
# File 'lib/rexle.rb', line 1477

def elements(s=nil) @doc.elements(s) end

#nameObject



1478
# File 'lib/rexle.rb', line 1478

def name() @doc.root.name end

#parse(x = nil) ⇒ Object



1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
# File 'lib/rexle.rb', line 1427

def parse(x=nil)

  a = []

  if x then
    procs = {
      String: proc {|x| parse_string(x)},
      Array: proc {|x| x}
    }
    a = procs[x.class.to_s.to_sym].call(x)
  else
    a = yield
  end

  doc_node = ['doc',Attributes.new]
  @a = procs[x.class.to_s.to_sym].call(x)
  @doc = scan_element(*(doc_node << @a))

  self
end

#rootObject



1487
1488
1489
# File 'lib/rexle.rb', line 1487

def root()
  @doc.elements.first
end

#text(xpath) ⇒ Object



1486
# File 'lib/rexle.rb', line 1486

def text(xpath) @doc.text(xpath) end

#to_aObject



1479
# File 'lib/rexle.rb', line 1479

def to_a() @a end

#to_s(options = {}) ⇒ Object



1481
1482
1483
1484
# File 'lib/rexle.rb', line 1481

def to_s(options={})
  return '<UNDEFINED/>' unless @doc
  self.xml options
end

#write(f) ⇒ Object



1491
1492
1493
# File 'lib/rexle.rb', line 1491

def write(f)
  f.write xml
end

#xml(options = {}) ⇒ Object



1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
# File 'lib/rexle.rb', line 1495

def xml(options={})

  return '' unless @doc
  o = {pretty: false, declaration: true}.merge(options)
  msg = o[:pretty] == false ? :doc_print : :doc_pretty_print

  r = ''

  if o[:declaration] == true then

    unless @instructions and @instructions.assoc 'xml' then
      @instructions.unshift ["xml","version='1.0' encoding='UTF-8'"]
    end
  end

  r << method(msg).call(self.root.children, o[:declaration]).strip
  r
end

#xpath(path, &blk) ⇒ Object



275
276
277
# File 'lib/rexle.rb', line 275

def xpath(path,  &blk)
  @doc.xpath(path,  &blk)
end