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.



211
212
213
214
215
216
217
218
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
# File 'lib/rexle.rb', line 211

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.



208
209
210
# File 'lib/rexle.rb', line 208

def doctype
  @doctype
end

#instructionsObject

Returns the value of attribute instructions.



209
210
211
# File 'lib/rexle.rb', line 209

def instructions
  @instructions
end

#prefixesObject (readonly)

Returns the value of attribute prefixes.



208
209
210
# File 'lib/rexle.rb', line 208

def prefixes
  @prefixes
end

Instance Method Details

#add_attribute(x) ⇒ Object



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

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

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



1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
# File 'lib/rexle.rb', line 1438

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



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

def add_text(s) end

#at_css(selector) ⇒ Object



254
255
256
# File 'lib/rexle.rb', line 254

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

#attribute(key) ⇒ Object



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

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

#attributesObject



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

def attributes() @doc.attributes end

#cloneObject



250
251
252
# File 'lib/rexle.rb', line 250

def clone()
  Rexle.new self.to_a
end

#content(options = {}) ⇒ Object



1500
1501
1502
# File 'lib/rexle.rb', line 1500

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

#css(selector) ⇒ Object



258
259
260
261
262
263
264
265
# File 'lib/rexle.rb', line 258

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



1454
1455
1456
1457
1458
# File 'lib/rexle.rb', line 1454

def delete(xpath)

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

end

#element(xpath) ⇒ Object



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

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

#elements(s = nil) ⇒ Object



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

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

#nameObject



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

def name() @doc.root.name end

#parse(x = nil) ⇒ Object



1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
# File 'lib/rexle.rb', line 1413

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



1473
1474
1475
# File 'lib/rexle.rb', line 1473

def root() 
  @doc.elements.first 
end

#text(xpath) ⇒ Object



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

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

#to_aObject



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

def to_a() @a end

#to_s(options = {}) ⇒ Object



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

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

#write(f) ⇒ Object



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

def write(f) 
  f.write xml 
end

#xml(options = {}) ⇒ Object



1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
# File 'lib/rexle.rb', line 1481

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.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



267
268
269
# File 'lib/rexle.rb', line 267

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