<?php
if(version_compare(PHP_VERSION, '5.3.0', '<'))
die('These classes are using Closures and other features that are available since PHP version 5.3.0. You are running PHP version '.PHP_VERSION.'. Please update your PHP.');
class DomQuery implements Iterator
{
public static $prototype = array();
public $items = array();
protected $position = 0;
public function __construct($context)
{
if($context instanceof DomNode)
$this->items[] = $context;
elseif($context instanceof Iterator || $context instanceof DomNodeList || is_array($context))
{
foreach($context as $node)
if($node instanceof DomNode)
$this->items[] = $node;
}
else
throw new Exception('Context must be instance of DomQuery, DomNode, DomNodeList or Array, but it is instance of '.get_class($context));
}
public function __call($method, $params)
{
$result = array();
if(!isset(self::$prototype[$method]) || !(self::$prototype[$method] instanceof Closure))
throw new Exception('Closure "'.$method.'" not found.');
$closure = self::$prototype[$method];
return $closure($this, $params);
}
public function get($index)
{
if(isset($this->items[$index]))
return $this->items[$index];
}
public function each(Closure $method)
{
foreach($this->items as $index => $context)
$method($context, $index);
return $this;
}
public function rewind() {$this->position = 0;}
public function valid() {return $this->position < count($this->items);}
public function key() {return $this->position;}
public function current() {return $this->items[$this->position];}
public function next() {$this->position++;}
public function __toString()
{
return '';
}
}
DomQuery::$prototype = array
( 'find' => function(DomQuery $context, Array $params)
{
$result = array();
foreach($context->items as $item)
{
$xpath = new DomXPath($item instanceof DomDocument ? $item : $item->ownerDocument);
foreach($xpath->query($params[0], $item) as $resultNode)
$result[] = $resultNode;
}
return new DomQuery($result);
}
, 'val' => function(DomQuery $context, Array $params)
{
if(isset($params[0]))
{
$context->each(
function($node) use ($params)
{
while($firstChild = $node->firstChild)
$node->removeChild($firstChild);
$node->appendChild($node->ownerDocument->createTextNode($params[0]));
}
);
return $context;
}
return $context->get(0)->nodeValue;
}
, 'attr' => function(DomQuery $context, Array $params)
{
if(isset($params[1]))
{
$context->each(
function($node) use ($params)
{
$node->setAttribute($params[0], $params[1]);
}
);
return $context;
}
return $context->get(0)->getAttribute($params[0]);
}
, 'removeAttr' => function(DomQuery $context, Array $params)
{
$context->each(function($node) use ($params) {$node->removeAttribute($params[0]);});
return $context;
}
, 'xml' => function(DomQuery $context, Array $params)
{
if(!isset($params[0]))
return $context->get(0);
$xml = new DomDocument();
if(strlen($params[0]) < 4)
$new = $xml->createTextNode('');
else
{
$xml->preserveWhiteSpace = false;
$xml->formatOutput = true;
$xml->loadXML($params[0]);
$new = $xml->documentElement;
}
$newNodes = array();
foreach($context->items as $node)
{
if($node->parentNode)
{
while($firstChild = $node->firstChild)
$node->removeChild($firstChild);
$node->appendChild($newNodes[] = $node->ownerDocument->importNode($new));
}
}
return $context;
}
);
function DQ($context)
{
return new DomQuery($context);
}
function DomQuery($context)
{
return new DomQuery($context);
}
|