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.



207
208
209
210
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
# File 'lib/rexle.rb', line 207

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.



204
205
206
# File 'lib/rexle.rb', line 204

def doctype
  @doctype
end

#instructionsObject

Returns the value of attribute instructions.



205
206
207
# File 'lib/rexle.rb', line 205

def instructions
  @instructions
end

#prefixesObject (readonly)

Returns the value of attribute prefixes.



204
205
206
# File 'lib/rexle.rb', line 204

def prefixes
  @prefixes
end

Instance Method Details

#add_attribute(x) ⇒ Object



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

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

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



1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
# File 'lib/rexle.rb', line 1430

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



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

def add_text(s) end

#at_css(selector) ⇒ Object



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

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

#attribute(key) ⇒ Object



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

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

#attributesObject



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

def attributes() @doc.attributes end

#cloneObject



246
247
248
# File 'lib/rexle.rb', line 246

def clone()
  Rexle.new self.to_a
end

#content(options = {}) ⇒ Object



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

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

#css(selector) ⇒ Object



254
255
256
257
258
259
260
261
262
263
# File 'lib/rexle.rb', line 254

def css(selector)
  
  a = selector.split(',').flat_map do |x| 
    @doc.root.xpath RexleCSS.new(x).to_xpath
  end
  
  a.shift if self.kind_of? Rexle
  
  return a
end

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



1446
1447
1448
1449
1450
# File 'lib/rexle.rb', line 1446

def delete(xpath)

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

end

#element(xpath) ⇒ Object



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

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

#elements(s = nil) ⇒ Object



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

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

#nameObject



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

def name() @doc.root.name end

#parse(x = nil) ⇒ Object



1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
# File 'lib/rexle.rb', line 1405

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



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

def root() 
  @doc.elements.first 
end

#text(xpath) ⇒ Object



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

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

#to_aObject



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

def to_a() @a end

#to_s(options = {}) ⇒ Object



1459
1460
1461
1462
# File 'lib/rexle.rb', line 1459

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

#write(f) ⇒ Object



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

def write(f) 
  f.write xml 
end

#xml(options = {}) ⇒ Object



1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
# File 'lib/rexle.rb', line 1473

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



265
266
267
# File 'lib/rexle.rb', line 265

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