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.



199
200
201
202
203
204
205
206
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
# File 'lib/rexle.rb', line 199

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

  @rexle, @debug = rexle, debug
  
  puts 'inside Rexle' 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.



196
197
198
# File 'lib/rexle.rb', line 196

def doctype
  @doctype
end

#instructionsObject

Returns the value of attribute instructions.



197
198
199
# File 'lib/rexle.rb', line 197

def instructions
  @instructions
end

#prefixesObject (readonly)

Returns the value of attribute prefixes.



196
197
198
# File 'lib/rexle.rb', line 196

def prefixes
  @prefixes
end

Instance Method Details

#add_attribute(x) ⇒ Object



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

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

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



1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
# File 'lib/rexle.rb', line 1404

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



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

def add_text(s) end

#at_css(selector) ⇒ Object



241
242
243
# File 'lib/rexle.rb', line 241

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

#attribute(key) ⇒ Object



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

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

#attributesObject



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

def attributes() @doc.attributes end

#cloneObject



237
238
239
# File 'lib/rexle.rb', line 237

def clone()
  Rexle.new self.to_a
end

#content(options = {}) ⇒ Object



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

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

#css(selector) ⇒ Object



245
246
247
248
249
250
251
252
253
254
# File 'lib/rexle.rb', line 245

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



1420
1421
1422
1423
1424
# File 'lib/rexle.rb', line 1420

def delete(xpath)

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

end

#element(xpath) ⇒ Object



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

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

#elements(s = nil) ⇒ Object



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

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

#nameObject



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

def name() @doc.root.name end

#parse(x = nil) ⇒ Object



1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
# File 'lib/rexle.rb', line 1379

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



1439
1440
1441
# File 'lib/rexle.rb', line 1439

def root() 
  @doc.elements.first 
end

#text(xpath) ⇒ Object



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

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

#to_aObject



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

def to_a() @a end

#to_s(options = {}) ⇒ Object



1433
1434
1435
1436
# File 'lib/rexle.rb', line 1433

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

#write(f) ⇒ Object



1443
1444
1445
# File 'lib/rexle.rb', line 1443

def write(f) 
  f.write xml 
end

#xml(options = {}) ⇒ Object



1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
# File 'lib/rexle.rb', line 1447

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



256
257
258
# File 'lib/rexle.rb', line 256

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