240 lines
		
	
	
		
			6.7 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
		
		
			
		
	
	
			240 lines
		
	
	
		
			6.7 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
|  | <?php | ||
|  | class xmlParser { | ||
|  | 	 | ||
|  | 	var $att; | ||
|  | 	var $id; | ||
|  | 	var $title; | ||
|  | 	var $content = array (); | ||
|  | 	var $index = 0; | ||
|  | 	var $xml_parser; | ||
|  | 	var $tagname; | ||
|  | 	var $max_news = 0; | ||
|  | 	var $tag_open = false; | ||
|  | 	var $rss_charset = ''; | ||
|  | 	var $rss_option = ''; | ||
|  | 	var $lastdate = ''; | ||
|  | 	var $pre_lastdate = ''; | ||
|  | 	 | ||
|  | 	function xmlParser($file, $max) { | ||
|  | 		 | ||
|  | 		$this->max_news = $max; | ||
|  | 		 | ||
|  | 		$this->xml_parser = xml_parser_create(); | ||
|  | 		xml_set_object( $this->xml_parser, $this ); | ||
|  | 		xml_set_element_handler( $this->xml_parser, "startElement", "endElement" ); | ||
|  | 		xml_set_character_data_handler( $this->xml_parser, 'elementContent' ); | ||
|  | 		$this->rss_option = xml_parser_get_option( $this->xml_parser, XML_OPTION_TARGET_ENCODING ); | ||
|  | 		 | ||
|  | 		if( ! ($data = $this->_get_contents( $file )) ) { | ||
|  | 			$this->content[0]['title'] = "Fatal Error"; | ||
|  | 			$this->content[0]['description'] = "Fatal Error: could not open XML input (" . $file . ")"; | ||
|  | 			$this->content[0]['link'] = "#"; | ||
|  | 			$this->content[0]['date'] = time(); | ||
|  | 		} | ||
|  | 		 | ||
|  | 		preg_replace( "#encoding=\"(.+?)\"#ie", "\$this->get_charset('\\1')", $data ); | ||
|  | 		 | ||
|  | 		if( ! xml_parse( $this->xml_parser, $data ) ) { | ||
|  | 			 | ||
|  | 			$error_code = xml_get_error_code( $this->xml_parser ); | ||
|  | 			$error_line = xml_get_current_line_number( $this->xml_parser ); | ||
|  | 			 | ||
|  | 			if( $error_code == 4 ) { | ||
|  | 				 | ||
|  | 				$this->content = array (); | ||
|  | 				$this->index = 0; | ||
|  | 				$this->tag_open = false; | ||
|  | 				$this->tagname = ""; | ||
|  | 				 | ||
|  | 				$this->xml_parser = xml_parser_create(); | ||
|  | 				xml_set_object( $this->xml_parser, $this ); | ||
|  | 				xml_set_element_handler( $this->xml_parser, "startElement", "endElement" ); | ||
|  | 				xml_set_character_data_handler( $this->xml_parser, 'elementContent' ); | ||
|  | 				$this->rss_option = xml_parser_get_option( $this->xml_parser, XML_OPTION_TARGET_ENCODING ); | ||
|  | 				 | ||
|  | 				$data = iconv( $this->rss_charset, "utf-8", $data ); | ||
|  | 				 | ||
|  | 				if( ! xml_parse( $this->xml_parser, $data ) ) { | ||
|  | 					 | ||
|  | 					$this->content[0]['title'] = "XML error in File: " . $file; | ||
|  | 					$this->content[0]['description'] = sprintf( "XML error: %s at line %d", xml_error_string( xml_get_error_code( $this->xml_parser ) ), xml_get_current_line_number( $this->xml_parser ) ); | ||
|  | 					$this->content[0]['link'] = "#"; | ||
|  | 					$this->content[0]['date'] = time(); | ||
|  | 				 | ||
|  | 				} | ||
|  | 			 | ||
|  | 			} else { | ||
|  | 				 | ||
|  | 				$this->content[0]['title'] = "XML error in File: " . $file; | ||
|  | 				$this->content[0]['description'] = sprintf( "XML error: %s at line %d", xml_error_string( $error_code ), $error_line ); | ||
|  | 				$this->content[0]['link'] = "#"; | ||
|  | 				$this->content[0]['date'] = time(); | ||
|  | 			 | ||
|  | 			} | ||
|  | 		 | ||
|  | 		} | ||
|  | 		 | ||
|  | 		xml_parser_free( $this->xml_parser ); | ||
|  | 	} | ||
|  | 	 | ||
|  | 	function _get_contents($file) { | ||
|  | 		 | ||
|  | 		$data = false; | ||
|  | 		 | ||
|  | 		if( function_exists( 'curl_init' ) ) { | ||
|  | 			 | ||
|  | 			$ch = curl_init(); | ||
|  | 			curl_setopt( $ch, CURLOPT_URL, $file ); | ||
|  | 			curl_setopt( $ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT'] ); | ||
|  | 			@curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, 1 ); | ||
|  | 			curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 ); | ||
|  | 			curl_setopt( $ch, CURLOPT_CONNECTTIMEOUT, 10 ); | ||
|  | 			 | ||
|  | 			$data = curl_exec( $ch ); | ||
|  | 			curl_close( $ch ); | ||
|  | 		 | ||
|  | 		} | ||
|  | 		 | ||
|  | 		if( $data ) { | ||
|  | 			 | ||
|  | 			return $data; | ||
|  | 		 | ||
|  | 		} else { | ||
|  | 			 | ||
|  | 			$data = @file_get_contents( $file ); | ||
|  | 			 | ||
|  | 			if( $data ) return $data; | ||
|  | 			else return false; | ||
|  | 		 | ||
|  | 		} | ||
|  | 	 | ||
|  | 	} | ||
|  | 	 | ||
|  | 	function pre_parse($date) { | ||
|  | 		 | ||
|  | 		global $config; | ||
|  | 		 | ||
|  | 		$i = 0; | ||
|  | 		 | ||
|  | 		foreach ( $this->content as $content ) { | ||
|  | 			 | ||
|  | 			$content_date = strtotime( $content['date'] ); | ||
|  | 			 | ||
|  | 			if( $date ) { | ||
|  | 				$this->content[$i]['date'] = time() + ($config['date_adjust'] * 60); | ||
|  | 			} else { | ||
|  | 				$this->content[$i]['date'] = $content_date; | ||
|  | 			} | ||
|  | 			 | ||
|  | 			if( ! $i ) $this->lastdate = $content_date; | ||
|  | 			 | ||
|  | 			if( $i and $content_date > $this->lastdate ) $this->lastdate = $content_date; | ||
|  | 			 | ||
|  | 			if( $this->pre_lastdate != "" and $this->pre_lastdate >= $content_date ) { | ||
|  | 				unset( $this->content[$i] ); | ||
|  | 				$i ++; | ||
|  | 				continue; | ||
|  | 			} | ||
|  | 			 | ||
|  | 			$this->content[$i]['description'] = rtrim( $this->content[$i]['description'] ); | ||
|  | 			$this->content[$i]['content'] = rtrim( $this->content[$i]['content'] ); | ||
|  | 			 | ||
|  | 			if( $this->content[$i]['content'] != '' ) { | ||
|  | 				$this->content[$i]['description'] = $this->content[$i]['content']; | ||
|  | 			} | ||
|  | 			unset( $this->content[$i]['content'] ); | ||
|  | 			 | ||
|  | 			if( preg_match_all( "#<div id=\'news-id-(.+?)\'>#si", $this->content[$i]['description'], $out ) ) { | ||
|  | 				 | ||
|  | 				$this->content[$i]['description'] = preg_replace( "#<div id=\'news-id-(.+?)\'>#si", "", $this->content[$i]['description'] ); | ||
|  | 				$this->content[$i]['description'] = substr( $this->content[$i]['description'], 0, - 6 ); | ||
|  | 			 | ||
|  | 			} | ||
|  | 			 | ||
|  | 			$i ++; | ||
|  | 		} | ||
|  | 	 | ||
|  | 	} | ||
|  | 	 | ||
|  | 	function startElement($parser, $name, $attrs) { | ||
|  | 		 | ||
|  | 		if( $name == "ITEM" ) { | ||
|  | 			$this->tag_open = true; | ||
|  | 		} | ||
|  | 		 | ||
|  | 		$this->tagname = $name; | ||
|  | 	} | ||
|  | 	 | ||
|  | 	function endElement($parser, $name) { | ||
|  | 		 | ||
|  | 		if( $name == "ITEM" ) { | ||
|  | 			$this->index ++; | ||
|  | 			$this->tag_open = false; | ||
|  | 		} | ||
|  | 	} | ||
|  | 	 | ||
|  | 	function elementContent($parser, $data) { | ||
|  | 		 | ||
|  | 		if( $this->tag_open and $this->index < $this->max_news ) { | ||
|  | 			 | ||
|  | 			switch ($this->tagname) { | ||
|  | 				case 'TITLE' : | ||
|  | 					$this->content[$this->index]['title'] .= $data; | ||
|  | 					break; | ||
|  | 				case 'DESCRIPTION' : | ||
|  | 					$this->content[$this->index]['description'] .= $data; | ||
|  | 					break; | ||
|  | 				case 'CONTENT:ENCODED' : | ||
|  | 					$this->content[$this->index]['content'] .= $data; | ||
|  | 					break; | ||
|  | 				case 'LINK' : | ||
|  | 					$this->content[$this->index]['link'] .= $data; | ||
|  | 					break; | ||
|  | 				case 'PUBDATE' : | ||
|  | 					$this->content[$this->index]['date'] .= $data; | ||
|  | 					break; | ||
|  | 				case 'CATEGORY' : | ||
|  | 					$this->content[$this->index]['category'] .= $data; | ||
|  | 					break; | ||
|  | 				case 'DC:CREATOR' : | ||
|  | 					$this->content[$this->index]['author'] .= $data; | ||
|  | 					break; | ||
|  | 			 | ||
|  | 			} | ||
|  | 		} | ||
|  | 	 | ||
|  | 	} | ||
|  | 	 | ||
|  | 	function get_charset($charset) { | ||
|  | 		 | ||
|  | 		if( $this->rss_charset == '' ) $this->rss_charset = strtolower( $charset ); | ||
|  | 	 | ||
|  | 	} | ||
|  | 	 | ||
|  | 	function convert($from, $to) { | ||
|  | 		 | ||
|  | 		if( $from == '' ) return; | ||
|  | 		 | ||
|  | 		if( function_exists( 'iconv' ) ) { | ||
|  | 			$i = 0; | ||
|  | 			 | ||
|  | 			foreach ( $this->content as $content ) { | ||
|  | 				 | ||
|  | 				if( @iconv( $from, $to . "//IGNORE", $this->content[$i]['title'] ) ) $this->content[$i]['title'] = @iconv( $from, $to . "//IGNORE", $this->content[$i]['title'] ); | ||
|  | 				 | ||
|  | 				if( @iconv( $from, $to . "//IGNORE", $this->content[$i]['description'] ) ) $this->content[$i]['description'] = @iconv( $from, $to . "//IGNORE", $this->content[$i]['description'] ); | ||
|  | 				 | ||
|  | 				if( $this->content[$i]['content'] and @iconv( $from, $to . "//IGNORE", $this->content[$i]['content'] ) ) $this->content[$i]['content'] = @iconv( $from, $to . "//IGNORE", $this->content[$i]['content'] ); | ||
|  | 				 | ||
|  | 				if( $this->content[$i]['category'] and @iconv( $from, $to . "//IGNORE", $this->content[$i]['category'] ) ) $this->content[$i]['category'] = @iconv( $from, $to . "//IGNORE", $this->content[$i]['category'] ); | ||
|  | 				 | ||
|  | 				if( $this->content[$i]['author'] and @iconv( $from, $to . "//IGNORE", $this->content[$i]['author'] ) ) $this->content[$i]['author'] = @iconv( $from, $to . "//IGNORE", $this->content[$i]['author'] ); | ||
|  | 				 | ||
|  | 				$i ++; | ||
|  | 			 | ||
|  | 			} | ||
|  | 		} | ||
|  | 	} | ||
|  | } | ||
|  | 
 | ||
|  | ?>
 |