<?php
class CSSHelper {
/**
* Gets the previous sibling DOMElement object.
* @param DOMNode $node
* @return NULL|DOMElement
*/
public static function getPreviousSiblingElement($node) {
do {
$node = $node->previousSibling;
} while ($node && !($node instanceof DOMElement));
return $node;
}
/**
* Gets the next sibling DOMElement object.
* @param DOMNode $node
* @return NULL|DOMElement
*/
public static function getNextSiblingElement($node) {
do {
$node = $node->nextSibling;
} while ($node && !($node instanceof DOMElement));
return $node;
}
public static function getChildElements($node) {
$ret = array();
$nodes = $node->childNodes;
foreach ($nodes as $node) {
if ($node instanceof DOMElement) {
array_push($ret, $node);
}
}
return $ret;
}
/**
* Gets elements by tagname.
* @param DOMElement $node
* @param string $tag_name
* @return array(DOMElement, ...)
*/
public static function getElementsByTagName($node, $tag_name) {
$ret = array();
$nodes = $node->getElementsByTagName($tag_name);
foreach ($nodes as $node) {
if ($node instanceof DOMElement) {
array_push($ret, $node);
}
}
return $ret;
}
/**
* Is the node in the given list?
* @param DOMNode $node
* @param array(DOMNode, ...) $items
* @return boolean
*/
public static function isNodeInList($node, $items, $offset = 0) {
$len = count($items);
for ($i = $offset; $i < $len; $i++) {
$item = $items[$i];
if ($item->isSameNode($node)) {
return TRUE;
}
}
return FALSE;
}
/**
* Merge two lists of nodes without repeating nodes.
* @param array(DOMNode, ...) $nodes1
* @param array(DOMNode, ...) $nodes2
* @return array(DOMNode, ...)
*/
public static function mergeNodes($items1, $items2) {
$ret = array();
$items = array_merge($items1, $items2);
$len = count($items);
for ($i = 0; $i < $len; $i++) {
$item = $items[$i];
if (!CSSHelper::isNodeInList($item, $items, $i + 1)) {
array_push($ret, $item);
}
}
return $ret;
}
/**
* Gets the string representation of a DOMNode object.
* @param DOMNode $node
* @return string
*/
public static function dom2str($node) {
$doc = $node instanceof DOMDocument? $node : $node->ownerDocument;
return $doc->saveXML($node);
}
/**
* Gets the nodes from a css selector expression.
* This function simplifies the use of CSSParser.
* @param DOMNode $node
* @param string $query A CSS selector expression.
* @return array(DOMElement, ...)
*/
public static function select($node, $query) {
$nodes = array();
$p = new CSSParser($node, $query);
$nodes = $p->parse();
return $nodes;
}
}
|