function parse() { $domDoc = parent::getDOMDocument(); // applique l'expression XPath sur le DOM $domXpath = new DOMXPath($domDoc); $nodeList = parent::getDOMNodeList($domXpath, $this->xpath); // récupération du lieu de l'évènement $nodeLieu = parent::getDOMNodeList($domXpath, self::LIEU_XPATH); $lieu = $nodeLieu->item(0)->nodeValue; // l'année en cours de parsing. Sert sur plusieurs itérations. $anneeTmp; $evmtTmp; $evmtList = array(); foreach ($nodeList as $node) { // s'agit-il d'une nouvelle catégorie ? if ($node->attributes->getNamedItem("class") != null && $node->attributes->getNamedItem("class")->value == "ville-colonne-centre") { // s'agit-il d'une année ? if (preg_match(self::ANNEE_PATTERN, $node->nodeValue)) { $anneeTmp = preg_replace(self::ANNEE_PATTERN, "\$1", $node->nodeValue); } } elseif ($node->attributes->length == 0) { // récupération des détails de l'évènement $nodeDetails = parent::getDOMNodeList($domXpath, self::DETAILS_RELATIF_XPATH, $node); if ($nodeDetails->length == 0) { continue; } $detailsText = $nodeDetails->item(0)->nodeValue; // si on arrive à parser la description, l'horaire et éventuellement le détail if (preg_match(self::DETAILS_EVENEMENT_PATTERN, $detailsText, $detailsArray)) { $description = $detailsArray[1]; $heureDebut = intval($detailsArray[2]); $minuteDebut = intval($detailsArray[3]); $heureFin = intval($detailsArray[4]); $minuteFin = intval($detailsArray[5]); if (count($detailsArray) > 6) { $details = $detailsArray[6]; } // sinon, on insère tout dans la description } else { $description = $detailsText; } // récupération de la date de l'évènement $nodeDate = parent::getDOMNodeList($domXpath, self::DATE_RELATIF_XPATH, $node); // si on ne trouve pas le noeud, alors on passe au suivant if ($nodeDate->length == 0) { continue; } $dateText = $nodeDate->item(0)->nodeValue; $date = strptime($dateText, $this->dateEvenementPattern); /* si on ne parvient pas parser la date, on passe au noeud suivant car les évènements sans date ne nous intéressent pas */ if (!$date) { continue; } // on positionne l'année récupérée plus tôt DateUtil::setYearToStrptime($date, $anneeTmp); // on positionne l'heure de début si elle existe $dateDebut = $date; // FIXME: quand l'heure n'a pas été trouvée pour l'évènement en cours, c'est l'heure de l'évènement précédent qui est positionnée if (isset($heureDebut) && isset($minuteDebut)) { $dateDebut["tm_hour"] = $heureDebut; $dateDebut["tm_min"] = $minuteDebut; } // on positionne l'heure de fin si elle existe $dateFin = $date; if (isset($heureFin) && isset($minuteFin)) { $dateFin["tm_hour"] = $heureFin; $dateFin["tm_min"] = $minuteFin; } // récupération du lien de l'évènement $nodeLien = parent::getDOMNodeList($domXpath, self::LIEN_RELATIF_XPATH, $node); $lien = $nodeLien->item(0)->nodeValue; // construction de l'objet Evenement $evmtTmp = new Evenement(); $evmtTmp->description = $description; $evmtTmp->dateDebut = DateUtil::timestampFromStrptime($dateDebut); $evmtTmp->dateFin = DateUtil::timestampFromStrptime($dateFin); $evmtTmp->lieu = $lieu; $evmtTmp->lien = $this->url . "/../" . $lien; // ajoute l'évènement à la liste retournée array_push($evmtList, $evmtTmp); // réinitialisation des paramètres unset($description, $dateDebut, $dateFin, $lien, $heureDebut, $minuteDebut, $heureFin, $minuteFin); } } return $evmtList; }