65 lines
1.6 KiB
PHP
65 lines
1.6 KiB
PHP
|
<?php
|
||
|
namespace enshrined\svgSanitize\data;
|
||
|
|
||
|
class XPath extends \DOMXPath
|
||
|
{
|
||
|
const DEFAULT_NAMESPACE_PREFIX = 'svg';
|
||
|
|
||
|
/**
|
||
|
* @var string
|
||
|
*/
|
||
|
protected $defaultNamespaceURI;
|
||
|
|
||
|
public function __construct(\DOMDocument $doc)
|
||
|
{
|
||
|
parent::__construct($doc);
|
||
|
$this->handleDefaultNamespace();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @param string $nodeName
|
||
|
* @return string
|
||
|
*/
|
||
|
public function createNodeName($nodeName)
|
||
|
{
|
||
|
if (empty($this->defaultNamespaceURI)) {
|
||
|
return $nodeName;
|
||
|
}
|
||
|
return self::DEFAULT_NAMESPACE_PREFIX . ':' . $nodeName;
|
||
|
}
|
||
|
|
||
|
protected function handleDefaultNamespace()
|
||
|
{
|
||
|
$rootElements = $this->getRootElements();
|
||
|
|
||
|
if (count($rootElements) !== 1) {
|
||
|
throw new \LogicException(
|
||
|
sprintf('Got %d svg elements, expected exactly one', count($rootElements)),
|
||
|
1570870568
|
||
|
);
|
||
|
}
|
||
|
$this->defaultNamespaceURI = (string)$rootElements[0]->namespaceURI;
|
||
|
|
||
|
if ($this->defaultNamespaceURI !== '') {
|
||
|
$this->registerNamespace(self::DEFAULT_NAMESPACE_PREFIX, $this->defaultNamespaceURI);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @return \DOMElement[]
|
||
|
*/
|
||
|
protected function getRootElements()
|
||
|
{
|
||
|
$rootElements = [];
|
||
|
$elements = $this->document->getElementsByTagName('svg');
|
||
|
/** @var \DOMElement $element */
|
||
|
foreach ($elements as $element) {
|
||
|
if ($element->parentNode !== $this->document) {
|
||
|
continue;
|
||
|
}
|
||
|
$rootElements[] = $element;
|
||
|
}
|
||
|
return $rootElements;
|
||
|
}
|
||
|
}
|