Class: Rexle

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

Defined Under Namespace

Classes: CData, Comment, Element, Elements

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

Returns a new instance of Rexle.



318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
# File 'lib/rexle.rb', line 318

def initialize(x=nil)

  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.



315
316
317
# File 'lib/rexle.rb', line 315

def doctype
  @doctype
end

#instructionsObject

Returns the value of attribute instructions.



316
317
318
# File 'lib/rexle.rb', line 316

def instructions
  @instructions
end

#prefixesObject (readonly)

Returns the value of attribute prefixes.



315
316
317
# File 'lib/rexle.rb', line 315

def prefixes
  @prefixes
end

Instance Method Details

#add_attribute(x) ⇒ Object



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

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

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



1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
# File 'lib/rexle.rb', line 1347

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



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

def add_text(s) end

#at_css(selector) ⇒ Object



355
356
357
# File 'lib/rexle.rb', line 355

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

#attribute(key) ⇒ Object



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

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

#attributesObject



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

def attributes() @doc.attributes end

#cloneObject



351
352
353
# File 'lib/rexle.rb', line 351

def clone()
  Rexle.new self.to_a
end

#content(options = {}) ⇒ Object



1409
1410
1411
# File 'lib/rexle.rb', line 1409

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

#css(selector) ⇒ Object



359
360
361
# File 'lib/rexle.rb', line 359

def css(selector)
  selector.split(',').flat_map{|x| @doc.root.xpath RexleCSS.new(x).to_xpath}
end

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



1363
1364
1365
1366
1367
# File 'lib/rexle.rb', line 1363

def delete(xpath)

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

end

#element(xpath) ⇒ Object



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

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

#elements(s = nil) ⇒ Object



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

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

#nameObject



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

def name() @doc.root.name end

#parse(x = nil) ⇒ Object



1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
# File 'lib/rexle.rb', line 1322

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



1382
1383
1384
# File 'lib/rexle.rb', line 1382

def root() 
  @doc.elements.first 
end

#text(xpath) ⇒ Object



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

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

#to_aObject



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

def to_a() @a end

#to_s(options = {}) ⇒ Object



1376
1377
1378
1379
# File 'lib/rexle.rb', line 1376

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

#write(f) ⇒ Object



1386
1387
1388
# File 'lib/rexle.rb', line 1386

def write(f) 
  f.write xml 
end

#xml(options = {}) ⇒ Object



1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
# File 'lib/rexle.rb', line 1390

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



363
364
365
# File 'lib/rexle.rb', line 363

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