cakephp2-php8/tests/lib/rss_writer_class.php
2005-09-11 02:35:47 +00:00

389 lines
No EOL
13 KiB
PHP

<?php
/* SVN FILE: $Id:*/
/**
* Short description for file.
*
* Long description for file
*
* PHP versions 4 and 5
*
* Copyright (c) Manuel Lemos 2001-2002
*
* Licensed under The BSD License
* Redistributions of files must retain the above copyright notice.
*
* @filesource
* @author Manuel Lemos
* @copyright Copyright (c) 2001-2002, Manuel Lemos
* @package tests
* @subpackage tests.lib
* @since CakePHP Test Suite v 1.0.0.0
* @version $Revision$
* @modifiedby $LastChangedBy$
* @lastmodified $Date$
* @license http://www.opensource.org/licenses/bsd-license.html BSD
*/
if(!defined("METAL_LIBRARY_XML_RSS_WRITER_CLASS"))
{
define("METAL_LIBRARY_XML_RSS_WRITER_CLASS",1);
class rss_writer_class extends xml_writer_class
{
/*
* Protected variables
*
*/
var $root="";
var $channel="";
var $image="";
var $textinput="";
var $items=0;
var $itemsequence="";
/*
* Public variables
*
*/
var $specification="1.0";
var $about="";
var $rssnamespaces=array();
var $allownoitems=0;
var $generatedcomment="Generated by: http://www.phpclasses.org/rsswriter";
/*
* Protected functions
*
*/
Function addrssproperties(&$properties,$parent,&$required,&$optional,$scope)
{
$noattributes=array();
$required_properties=0;
Reset($properties);
$end=(GetType($property=Key($properties))!="string");
for(;!$end;)
{
if(IsSet($required[$property]))
{
if($required[$property])
{
$this->error=("required ".$scope." property \"".$property."\" is already set");
return 0;
}
$required[$property]=1;
$required_properties++;
}
else
{
if(IsSet($optional[$property]))
{
if($optional[$property])
{
$this->error=("optional ".$scope." property \"".$property."\" is already set");
return 0;
}
$optional[$property]=1;
}
else
{
if(GetType($colon=strpos($property,":",0))=="integer")
{
$namespace=substr($property,0,$colon);
if(!(!strcmp($namespace,"rdf") || IsSet($this->rssnamespaces[$namespace])))
$this->error=("the name space of property \"".$property."\" was not declared");
}
else
$this->error=("\"".$property."\" is not a supported ".$scope." property");
}
}
if(!($this->adddatatag($property,$noattributes,$properties[$property],$parent,$path)))
return 0;
Next($properties);
$end=(GetType($property=Key($properties))!="string");
}
if($required_properties<count($required))
{
Reset($required);
$end=(GetType($property=Key($required))!="string");
for(;!$end;)
{
if(!($required[$property]))
{
$this->error=("it was not specified the required ".$scope." property \"".$property."\"");
return 0;
}
Next($required);
$end=(GetType($property=Key($required))!="string");
}
}
return 1;
}
/*
* Public functions
*
*/
Function addchannel(&$properties)
{
if(strcmp($this->error,""))
return 0;
if(strcmp($this->channel,""))
{
$this->error="a channel was already added";
return 0;
}
$channel_attributes=array();
switch($this->specification)
{
case "0.9":
$root="rdf:RDF";
$attributes=array("xmlns:rdf"=>"http://www.w3.org/1999/02/22-rdf-syntax-ns#","xmlns"=>"http://my.netscape.com/rdf/simple/0.9/");
$required=array("description"=>0,"link"=>0,"title"=>0);
$optional=array();
break;
case "0.91":
$root="rss";
$attributes=array("version"=>$this->specification);
$required=array("description"=>0,"language"=>0,"link"=>0,"title"=>0);
$optional=array("copyright"=>0,"docs"=>0,"lastBuildDate"=>0,"managingEditor"=>0,"pubDate"=>0,"rating"=>0,"webMaster"=>0);
break;
case "1.0":
if(!strcmp($this->about,""))
{
$this->error="it was not specified the about URL attribute";
return 0;
}
$root="rdf:RDF";
$attributes=array("xmlns:rdf"=>"http://www.w3.org/1999/02/22-rdf-syntax-ns#","xmlns"=>"http://purl.org/rss/1.0/");
Reset($this->rssnamespaces);
$end=(GetType($namespace=Key($this->rssnamespaces))!="string");
for(;!$end;)
{
if(!strcmp($namespace,"rdf"))
{
$this->error="the rdf namespace is being redeclared";
return 0;
}
$attributes[("xmlns:".$namespace)]=$this->rssnamespaces[$namespace];
Next($this->rssnamespaces);
$end=(GetType($namespace=Key($this->rssnamespaces))!="string");
}
$channel_attributes=array("rdf:about"=>$this->about);
$required=array("description"=>0,"link"=>0,"title"=>0);
$optional=array();
break;
default:
$this->error="it was not specified a supported RSS specification version";
return 0;
}
$this->addtag($root,$attributes,"",$path,1);
$this->root=$path;
if(!($this->addtag("channel",$channel_attributes,$this->root,$path,1)))
return 0;
if(!($this->addrssproperties($properties,$path,$required,$optional,"channel")))
return 0;
$this->channel=$path;
return 1;
}
Function additem(&$properties)
{
if(strcmp($this->error,""))
return 0;
if(!strcmp($this->channel,""))
{
$this->error="the channel was not yet added";
return 0;
}
if(strcmp($this->textinput,""))
{
$this->error="items can not be added to the channel after defining the textinput";
return 0;
}
$attributes=array();
switch($this->specification)
{
case "0.9":
$parent=$this->root;
break;
case "0.91":
$parent=$this->channel;
break;
case "1.0":
if(IsSet($properties["link"]))
$attributes["rdf:about"]=$properties["link"];
$parent=$this->root;
break;
default:
$this->error="it was not specified a supported RSS specification version";
return 0;
}
if(!($this->addtag("item",$attributes,$parent,$path,1)))
return 0;
$required=array("link"=>0,"title"=>0);
$optional=array("description"=>0);
if(!($this->addrssproperties($properties,$path,$required,$optional,"item")))
return 0;
if(!strcmp($this->specification,"1.0"))
{
if(!strcmp($this->itemsequence,""))
{
$attributes=array();
if(!($this->addtag("items",$attributes,$this->channel,$path,1) && $this->addtag("rdf:Seq",$attributes,$path,$path,1)))
return 0;
$this->itemsequence=$path;
}
$attributes=array("rdf:resource"=>$properties["link"]);
if(!($this->addtag("rdf:li",$attributes,$this->itemsequence,$path,0)))
return 0;
}
$this->items++;
return 1;
}
Function addimage(&$properties)
{
if(strcmp($this->error,""))
return 0;
if(!strcmp($this->channel,""))
{
$this->error="the channel was not yet added";
return 0;
}
if(strcmp($this->image,""))
{
$this->error="the channel image was already associated";
return 0;
}
if($this->items!=0)
{
$this->error="the image can only be defined before adding the channel items";
return 0;
}
$attributes=array();
switch($this->specification)
{
case "0.9":
$parent=$this->root;
break;
case "0.91":
$parent=$this->channel;
break;
case "1.0":
if(IsSet($properties["url"]))
$attributes["rdf:about"]=$properties["url"];
$parent=$this->root;
break;
default:
$this->error="it was not specified a supported RSS specification version";
return 0;
}
if(!($this->addtag("image",$attributes,$parent,$path,1)))
return 0;
$this->image=$path;
$required=array("link"=>0,"title"=>0,"url"=>0);
$optional=array("description"=>0,"width"=>0,"height"=>0);
if(!($this->addrssproperties($properties,$this->image,$required,$optional,"image")))
return 0;
if(!strcmp($this->specification,"1.0"))
{
$attributes=array("rdf:resource"=>$properties["url"]);
return $this->addtag("image",$attributes,$this->channel,$path,0);
}
return 1;
}
Function addtextinput(&$properties)
{
if(strcmp($this->error,""))
return 0;
if(!strcmp($this->channel,""))
{
$this->error="the channel was not yet added";
return 0;
}
if(strcmp($this->textinput,""))
{
$this->error="the channel text input was already associated";
return 0;
}
if($this->items==0 && !$this->allownoitems)
{
$this->error="it were not specified any items before defining the channel text input";
return 0;
}
$attributes=array();
switch($this->specification)
{
case "0.9":
$parent=$this->root;
break;
case "0.91":
$parent=$this->channel;
break;
case "1.0":
if(IsSet($properties["link"]))
$attributes["rdf:about"]=$properties["link"];
$parent=$this->root;
break;
default:
$this->error="it was not specified a supported RSS specification version";
return 0;
}
if(!($this->addtag("textinput",$attributes,$parent,$path,1)))
return 0;
$this->textinput=$path;
$required=array("description"=>0,"link"=>0,"name"=>0,"title"=>0);
$optional=array();
if(!($this->addrssproperties($properties,$this->textinput,$required,$optional,"textinput")))
return 0;
if(!strcmp($this->specification,"1.0"))
{
$attributes=array("rdf:resource"=>$properties["link"]);
return $this->addtag("textinput",$attributes,$this->channel,$path,0);
}
return 1;
}
Function writerss(&$output)
{
if(strcmp($this->error,""))
return 0;
if(!strcmp($this->channel,""))
{
$this->error="it was not defined the RSS channel";
return 0;
}
if($this->items==0 && !$this->allownoitems)
{
$this->error="it were not defined any RSS channel items";
return 0;
}
switch($this->specification)
{
case "0.9":
$this->dtdtype="PUBLIC";
$this->dtddefinition="-//Netscape Communications//DTD RSS 0.9//EN";
$this->dtdurl="http://my.netscape.com/publish/formats/rss-0.9.dtd";
break;
case "0.91":
$this->dtdtype="PUBLIC";
$this->dtddefinition="-//Netscape Communications//DTD RSS 0.91//EN";
$this->dtdurl="http://my.netscape.com/publish/formats/rss-0.91.dtd";
break;
case "1.0":
$this->dtdtype="";
break;
default:
$this->error="it was not specified a supported RSS specification version";
return 0;
}
return $this->write($output);
}
};
}
?>