From e17ceac9ea0ce659bd1e1e746129a43bb516e05e Mon Sep 17 00:00:00 2001 From: Yusuf Kandemir Date: Mon, 12 Nov 2018 18:05:31 +0300 Subject: [PATCH] Added MicrodataDOMDocument This is for both gaining flexibility and made code cleaner. --- src/Microdata.php | 10 +++++++--- src/MicrodataDOMDocument.php | 31 +++++++++++++++++++++++++++++++ src/MicrodataParser.php | 12 ++++++------ tests/MicrodataParserTest.php | 3 ++- 4 files changed, 46 insertions(+), 10 deletions(-) create mode 100644 src/MicrodataDOMDocument.php diff --git a/src/Microdata.php b/src/Microdata.php index 9ddc975..4c04d4d 100644 --- a/src/Microdata.php +++ b/src/Microdata.php @@ -6,7 +6,7 @@ abstract class Microdata { public static function fromHTML($html, $documentURI = '') { - $dom = new \DOMDocument; + $dom = new MicrodataDOMDocument; $dom->loadHTML($html, LIBXML_NOERROR); $dom->documentURI = $documentURI; @@ -15,15 +15,19 @@ abstract class Microdata public static function fromHTMLFile($filename, $documentURI = '') { - $dom = new \DOMDocument; + $dom = new MicrodataDOMDocument; $dom->loadHTMLFile($filename); $dom->documentURI = $documentURI; return new MicrodataParser($dom); } - public static function fromDOMDocument(\DOMDocument $dom) + public static function fromDOMDocument(\DOMDocument $domDocument) { + $dom = new MicrodataDOMDocument; + $importedNode = $dom->importNode($domDocument->documentElement, true); + $dom->appendChild($importedNode); + return new MicrodataParser($dom); } } diff --git a/src/MicrodataDOMDocument.php b/src/MicrodataDOMDocument.php new file mode 100644 index 0000000..2ae375e --- /dev/null +++ b/src/MicrodataDOMDocument.php @@ -0,0 +1,31 @@ +xpath->query('//*[@itemscope and not(@itemprop)]'); + } + + public function loadHTML($source, $options = 0) + { + $return = parent::loadHTML($source, $options); + + $this->xpath = new \DOMXPath($this); + + return $return; + } + + public function loadHTMLFile($filename, $options = 0) + { + $return = parent::loadHTMLFile($filename, $options); + + $this->xpath = new \DOMXPath($this); + + return $return; + } +} diff --git a/src/MicrodataParser.php b/src/MicrodataParser.php index 6ee7213..4796ea5 100644 --- a/src/MicrodataParser.php +++ b/src/MicrodataParser.php @@ -4,14 +4,14 @@ namespace YusufKandemir\MicrodataParser; class MicrodataParser { - protected $topLevelItems; + protected $dom; - public function __construct(\DOMDocument $dom) + public function __construct(MicrodataDOMDocument $dom) { + $dom->registerNodeClass(\DOMDocument::class, MicrodataDOMDocument::class); $dom->registerNodeClass(\DOMElement::class, MicrodataDOMElement::class); - $xpath = new \DOMXPath($dom); - $this->topLevelItems = $xpath->query('//*[@itemscope and not(@itemprop)]'); + $this->dom = $dom; } public function toArray() @@ -36,8 +36,8 @@ class MicrodataParser $result->items = []; - foreach ($this->topLevelItems as $topLevelItem) { - $result->items[] = $this->getObject($topLevelItem); + foreach ($this->dom->getItems() as $item) { + $result->items[] = $this->getObject($item); } return $result; diff --git a/tests/MicrodataParserTest.php b/tests/MicrodataParserTest.php index 3848fa1..ffde0e7 100644 --- a/tests/MicrodataParserTest.php +++ b/tests/MicrodataParserTest.php @@ -2,6 +2,7 @@ namespace YusufKandemir\MicrodataParser\Tests; +use YusufKandemir\MicrodataParser\MicrodataDOMDocument; use YusufKandemir\MicrodataParser\MicrodataParser; class MicrodataParserTest extends \PHPUnit\Framework\TestCase @@ -13,7 +14,7 @@ class MicrodataParserTest extends \PHPUnit\Framework\TestCase protected function getParser($data) { - $dom = new \DOMDocument; + $dom = new MicrodataDOMDocument; $dom->loadHTML($data['source']); $dom->documentURI = $data['uri'];