public function &appendNode(DOMNode &$a_tag) { switch ($this->m_node->nodeType) { case XML_DOCUMENT_NODE: $node = $this->m_node->isSameNode($a_tag->ownerDocument) ? $a_tag : $this->m_node->importNode($a_tag, true); $this->m_node->appendChild($a_tag); return $this; case XML_ELEMENT_NODE: $node = $this->m_node->ownerDocument->isSameNode($a_tag->ownerDocument) ? $a_tag : $this->m_node->ownerDocument->importNode($a_tag, true); $this->m_node->appendChild($node); return $this; } return $this; }
protected function insertNode(DOMNode $tmp, DOMNode $node, $mode) { if ($mode === 'before' || $mode === 'after') { if ($node instanceof DOMText || $node instanceof DOMElement || $node instanceof DOMDocumentFragment) { if ($tmp->isSameNode($tmp->ownerDocument->documentElement)) { throw new BadMethodCallException('Cannot insert a ' . get_class($node) . ' node outside of the root node'); } } if ($mode === 'before') { return $tmp->parentNode->insertBefore($node, $tmp); } if ($tmp->nextSibling) { return $tmp->parentNode->insertBefore($node, $tmp->nextSibling); } return $tmp->parentNode->appendChild($node); } return $tmp->appendChild($node); }
/** * Create XPath * * @param \DOMNode $node * @return string */ protected function createXPath(\DOMNode $node) { $parentXPath = ''; $currentXPath = $node->getNodePath(); if ($node->parentNode !== null && !$node->isSameNode($node->parentNode)) { $parentXPath = $this->createXPath($node->parentNode); $pathParts = explode('/', $currentXPath); $currentXPath = '/' . end($pathParts); } $attributesXPath = ''; if ($node->hasAttributes()) { $attributes = []; foreach ($node->attributes as $name => $attribute) { if ($this->isIdAttribute($name)) { $attributes[] = sprintf('@%s="%s"', $name, $attribute->value); break; } } if (!empty($attributes)) { if (substr($currentXPath, -1) === ']') { $currentXPath = substr($currentXPath, 0, strrpos($currentXPath, '[')); } $attributesXPath = '[' . implode(' and ', $attributes) . ']'; } } return '/' . trim($parentXPath . $currentXPath . $attributesXPath, '/'); }
/** * Draw a final layout zone on its thumbnail. * * @access private * * @param ressource $thumbnail The thumbnail ressource * @param DOMNode $node The current node zone * @param array $clip The clip rect to draw * @param int $background The background color * @param int $gridcolumn The number of columns in the grid * @param boolean $lastChild True if the current node is the last child of its parent node * * @return int The new X axis position; */ private function drawThumbnailZone(&$thumbnail, $node, $clip, $background, $gridcolumn, $lastChild = false) { $x = $clip[0]; $y = $clip[1]; $width = $clip[2]; $height = $clip[3]; if (null !== ($spansize = preg_replace('/[^0-9]+/', '', $node->getAttribute('class')))) { $width = floor($width * $spansize / $gridcolumn); } if (false !== strpos($node->getAttribute('class'), 'Child')) { $height = floor($height / 2); } if (!$node->hasChildNodes()) { $this->drawRect($thumbnail, array($x, $y, $width, $height), $background, $width == $clip[2] || strpos($node->getAttribute('class'), 'hChild'), $lastChild); return $width + 2; } foreach ($node->childNodes as $child) { if (is_a($child, 'DOMText')) { continue; } if ('clear' == $child->getAttribute('class')) { $x = $clip[0]; $y = $clip[1] + floor($height / 2) + 2; continue; } $x += $this->drawThumbnailZone($thumbnail, $child, array($x, $y, $clip[2], $height), $background, $gridcolumn, $node->isSameNode($node->parentNode->lastChild)); } return $x + $width - 2; }
private function nodeIndex(DOMNode $n) { $cnt = 0; foreach ($n->parentNode->childNodes as $n2) { if ($n->isSameNode($n2)) { return $cnt; } $cnt++; } return false; }