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.



248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
# File 'lib/rexle.rb', line 248

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.



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

def doctype
  @doctype
end

#instructionsObject

Returns the value of attribute instructions.



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

def instructions
  @instructions
end

#prefixesObject (readonly)

Returns the value of attribute prefixes.



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

def prefixes
  @prefixes
end

Instance Method Details

#add_attribute(x) ⇒ Object



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

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

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



1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
# File 'lib/rexle.rb', line 1294

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



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

def add_text(s) end

#at_css(selector) ⇒ Object



286
287
288
# File 'lib/rexle.rb', line 286

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

#attribute(key) ⇒ Object



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

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

#attributesObject



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

def attributes() @doc.attributes end

#cloneObject



282
283
284
# File 'lib/rexle.rb', line 282

def clone()
  Rexle.new self.to_a
end

#content(options = {}) ⇒ Object



1356
1357
1358
# File 'lib/rexle.rb', line 1356

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

#css(selector) ⇒ Object



290
291
292
# File 'lib/rexle.rb', line 290

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

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



1310
1311
1312
1313
1314
# File 'lib/rexle.rb', line 1310

def delete(xpath)

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

end

#element(xpath) ⇒ Object



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

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

#elements(s = nil) ⇒ Object



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

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

#nameObject



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

def name() @doc.root.name end

#parse(x = nil) ⇒ Object



1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
# File 'lib/rexle.rb', line 1269

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



1329
1330
1331
# File 'lib/rexle.rb', line 1329

def root() 
  @doc.elements.first 
end

#text(xpath) ⇒ Object



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

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

#to_aObject



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

def to_a() @a end

#to_s(options = {}) ⇒ Object



1323
1324
1325
1326
# File 'lib/rexle.rb', line 1323

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

#write(f) ⇒ Object



1333
1334
1335
# File 'lib/rexle.rb', line 1333

def write(f) 
  f.write xml 
end

#xml(options = {}) ⇒ Object



1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
# File 'lib/rexle.rb', line 1337

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



294
295
296
# File 'lib/rexle.rb', line 294

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