예제 #1
0
 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;
 }