<?php

/**------------------------------------------------
*
* Rooty, 2018 <rooty@rooty.me>
*
*
* This software is protected by copyright, please
* read the file COPYRIGHT.
* This program is distributed in the hope that it
* will be useful, but without any warranty; without
* even the implied warranty of merchantability or
* fitness for a particular purpose. Please
* read the file LICENCE.
*
*Fichier rssparser.php
*
*Ce fichier contient les classes d'accès aux données de fichier XML au format RSS (w3.org)
*
* @author Rooty <www.rooty.me|rooty@rooty.me>
* @link www.rooty.me
* @since 2004/04/13
* @version 0.3
* @copyright Copyright &copy; 2009-2018, Rooty
* @package system_data_source
* @subpackage xml
*
*/

#####################################################################################################
################################# Parametrage
#####################################################################################################
/**
* declaration du system... si cette variable n'est pas définie, les fichier inclus ne marche pas...
* cette variable est déclarée sur la page d'execution du script.
*<p> if ( !defined('SYSTEM_IN') )
* {
* die("Hacking attempt");
* }</p>
*/
if ( !defined('SYSTEM_IN') )
{
 die("Hacking attempt");
}

/**
* classe RSSParser
*
* Classe de gestion Spécifique de fichiers XML au format RSS
* à n'utiliser que par l'intermediaire de la classe XMLRSSParser
*
* @package system_data_source
* @subpackage xml
*
*/
class RSSParser
{
/**#@+
* @access private
*/

	/**
	* @var booléen
	* @desc Indique si l'on se situe a l'intérieur d'une balise .
	*/
	var $insideitem = false;

	/**
	* @var chaine
	* @desc indique le type de balise
	*/
	var $tag = "";

	/**
	* @var chaine
	* @desc indique le titre de la nouvelle
	*/
	var $title = "";

	/**
	* @var chaine
	* @desc indique le description de la nouvelle
	*/
	var $description = "";

	/**
	* @var chaine
	* @desc indique le lien rattaché a la nouvelle
	*/
	var $link = "";

	/**
	* @var chaine
	* @desc Chaine contenant la chaine finale en HTML
	*/
	var $finaldata;

/**#@-*/

	//
	// Constructor
	//
/**
* classe RSSParser
*
* Classe de gestion Spécifique de fichiers XML au format RSS
* à n'utiliser que par l'intermediaire de la classe XMLRSSParser
*/
	function RSSParser()
	{
		$this->__construct();
	}

	function __construct()
	{
		
	}

	/**
	* Evenement d'ouverture de balise
	*
	* Modifie les parametres en fonction des parametres de la balise ouverte.
	*
	* @param XMLParser Parseur XML ouvert
	* @param chaine nom du TAG ouvert
	* @param tableau tableau de chaines comprenant les attributs
	*/
	function startElement($parser, $tagName, $attrs)
	{
		if ($this->insideitem)
		{
			$this->tag = $tagName;
		} elseif ($tagName == "ITEM") {
			$this->insideitem = true;
		}
	}

	/**
	* Evenement de fermeture de balise
	*
	* Modifie les parametres en fonction des parametres de la balise fermée
	*
	* @param XMLParser Parseur XML ouvert
	* @param chaine nom du TAG ouvert
	*/
	function endElement($parser, $tagName)
	{
		if ($tagName == "ITEM")
		{
			$this->finaldata.=sprintf("<dt><b><a href='%s'>%s</a></b></dt>",trim($this->link),htmlspecialchars(trim($this->title)));
			$this->finaldata.=sprintf("<dd>%s</dd>",htmlspecialchars(trim($this->description)));
			$this->title = "";
			$this->description = "";
			$this->link = "";
			$this->insideitem = false;
		}
	}

	/**
	* Evenement d'interieur de balise
	*
	* initialise les parametres en fonction des parametres de la balise ouverte
	*
	* @param XMLParser Parseur XML ouvert
	* @param chaine données de la balise
	*/
	function characterData($parser, $data)
	{
		if ($this->insideitem)
		{
			switch ($this->tag)
			{
				case "TITLE":
				$this->title .= $data;
				break;
				case "DESCRIPTION":
				$this->description .= $data;
				break;
				case "LINK":
				$this->link .= $data;
				break;
			}
		}
	}

	/**
	* Retourne la sortie de l'analyseur RSS
	*
	* @return chaine Chaine HTML de sortie
	*/
	function ReturnData()
	{
		return $this->finaldata;
	}
}

/**
* classe XMLRSSParser
*
* Classe globale d'acces aux fichiers XML au format RSS
*
* @package system_data_source
* @subpackage xml
*
*/
class XMLRSSParser
{
/**#@+
* @access public
*/

	/**
	* @var XMLParser
	* @desc Parser XML PHP valide
	*/
	var $xml_parser;

	/**
	* @var RSSParser
	* @desc Objet de type RSSParser , nécessaire pour l'utilisation du fichier
	*/
	var $rss_parser;

	/**
	* @var fichier
	* @desc Flux de fichier ouvert par fopen
	*/
	var $fileStream;

/**#@-*/

	/**
	* Constructeur :
	*
	* <p> initialise le parseur et analyse les données </p>
	*
	* @param chaine Fichier a ouvrir
	*/
	function XMLRSSParser($fichier)
	{
		$this->__construct($fichier);
	}

	function __construct($fichier)
	{
		$this->xml_parser = xml_parser_create();
		$this->rss_parser = new RSSParser();

		xml_set_object($this->xml_parser,&$this->rss_parser);
		xml_set_element_handler($this->xml_parser, "startElement", "endElement");
		xml_set_character_data_handler($this->xml_parser, "characterData");

		$this->fileStream = fopen($fichier,"r") or die("Error reading RSS data.");

		while ($data = fread($this->fileStream, 4096))
			xml_parse($this->xml_parser, $data, feof($fp))
				or die(sprintf("XML error: %s at line %d",

			xml_error_string(xml_get_error_code($xml_parser)),

			xml_get_current_line_number($xml_parser)));

		fclose($fp);
		xml_parser_free($xml_parser);
	}

	/**
	* Retourne les données aux format HTML
	*
	* <p> Retourne les données de sortie du parseur RSS . </p>
	*/
	function returnData()
	{
		return $this->rss_parser->ReturnData();
	}
}
?>
