<?php
class Parser {
private $restaurants = array();
private $logger;
function __construct(iOutput $logger, $restaurants) {
$this->logger = $logger;
if (empty($restaurants) || !is_array($restaurants)) {
throw new InvalidArgumentException("Array argument required");
}
$this->restaurants = $restaurants;
}
public function parse() {
foreach ($this->restaurants as $restaurant) {
$source = file_get_contents($restaurant->getUrl());
if ($source === false) {
continue;
}
$dom = new DOMDocument();
@$dom->loadHTML($source);
$xpath_obj = new DOMXPath($dom);
$this->logger->addHeader($restaurant);
foreach ($restaurant->getXpaths() as $name => $xpath) {
$found = $xpath_obj->query($xpath);
if ($found === false || $found->length === 0) {
continue;
}
$this->logger->addMealHeader($name);
$this->logger->startListing();
$parsed = $restaurant->runCallbackParser($found, $this->logger);
if ($parsed === false)
{
$exists = false;
foreach ($found->item(0)->childNodes as $elem) {
$meal = trim($elem->nodeValue);
if (!empty($meal)) {
$this->logger->addMeal($meal);
$exists = true;
}
}
}
$this->logger->endListing();
if ($parsed === '' OR (isset($exists) AND !$exists)) {
$this->logger->emptyRestaurant();
}
}
}
}
}