You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
391 lines
9.8 KiB
391 lines
9.8 KiB
15 years ago
|
#!/usr/local/bin/php
|
||
|
<?
|
||
|
/*
|
||
|
Copyright (C) 2002 KSVG Team
|
||
|
This file is part of the KDE project
|
||
|
|
||
|
This library is free software; you can redistribute it and/or
|
||
|
modify it under the terms of the GNU Library General Public
|
||
|
License as published by the Free Software Foundation; either
|
||
|
version 2 of the License, or (at your option) any later version.
|
||
|
|
||
|
This library 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. See the GNU
|
||
|
Library General Public License for more details.
|
||
|
|
||
|
You should have received a copy of the GNU Library General Public License
|
||
|
along with this library; see the file COPYING.LIB. If not, write to
|
||
|
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
||
|
Boston, MA 02110-1301, USA.
|
||
|
*/
|
||
|
|
||
|
class ecma_class
|
||
|
{
|
||
|
var $properties; // array of properties
|
||
|
var $functions; // array of functions $functions[0][0]="geturl"; $functions[0][1]="2";
|
||
|
var $constants; // array of functions
|
||
|
var $class; // classname
|
||
|
var $params;
|
||
|
var $readonly;
|
||
|
|
||
|
function ecma_class($name)
|
||
|
{
|
||
|
$this->class=$name;
|
||
|
$this->functions=array();
|
||
|
$this->properties=array();
|
||
|
$this->constants=array();
|
||
|
$this->parmas=array();
|
||
|
}
|
||
|
|
||
|
function add_content($content)
|
||
|
{
|
||
|
if ($content->type==0)
|
||
|
{
|
||
|
if (!in_array($content->name,$this->properties))
|
||
|
{
|
||
|
$this->properties[]=$content->name;
|
||
|
$this->readonly[$content->name]=$content->readonly;
|
||
|
}
|
||
|
}
|
||
|
elseif ($content->type==1)
|
||
|
{
|
||
|
if (!in_array($content->name,$this->functions))
|
||
|
{
|
||
|
$this->functions[]=$content->name;
|
||
|
$this->params[$content->name]=$content->params;
|
||
|
}
|
||
|
}
|
||
|
elseif ($content->type==2)
|
||
|
{
|
||
|
if (!in_array($content->name,$this->constants))
|
||
|
$this->constants[]=$content->name;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function to_text()
|
||
|
{
|
||
|
$headline=$this->class." (".(sizeof($this->properties))." Properties and ".(sizeof($this->functions))." Functions and ".(sizeof($this->constants))." Constants)";
|
||
|
echo($headline."\n");
|
||
|
echo("====================");
|
||
|
echo("\n\n");
|
||
|
|
||
|
|
||
|
echo("Properties\n");
|
||
|
echo("----------\n");
|
||
|
for ($i=0;$i<sizeof($this->properties);$i++)
|
||
|
{
|
||
|
echo($this->properties[$i]."\n");
|
||
|
}
|
||
|
|
||
|
echo("\n");
|
||
|
echo("Functions\n");
|
||
|
echo("----------\n");
|
||
|
for ($i=0;$i<sizeof($this->functions);$i++)
|
||
|
{
|
||
|
echo($this->functions[$i]."\n");
|
||
|
}
|
||
|
|
||
|
echo("\n");
|
||
|
echo("Constants\n");
|
||
|
echo("----------\n");
|
||
|
for ($i=0;$i<sizeof($this->constants);$i++)
|
||
|
{
|
||
|
echo($this->constants[$i]."\n");
|
||
|
}
|
||
|
|
||
|
echo("\n%%%%%%%%%%%%%%%%%%%%%%%%\n\n");
|
||
|
}
|
||
|
|
||
|
function to_html()
|
||
|
{
|
||
|
echo("<a name=\"".$this->class."\"></a>");
|
||
|
echo("<a href=\"#toc\">Back to Index</a>");
|
||
|
echo("<table border=\"1\" style=\"border-width: medium; border-collapse: collapse\">\n");
|
||
|
echo("<tr><td colspan=\"3\"><h2 style=\"text-align: left\">".$this->class."</h2></td></tr>\n");
|
||
|
|
||
|
if (sizeof($this->functions)>0)
|
||
|
{
|
||
|
echo("<tr><td colspan=\"3\"><h3>Functions</h3></td></tr>\n");
|
||
|
|
||
|
for ($i=0;$i<sizeof($this->functions);$i++)
|
||
|
{
|
||
|
echo("<tr><td width=\"20\"> </td><td>".$this->functions[$i]."</td><td>".$this->params[$this->functions[$i]]." Parameter(s)</td></tr>\n");
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (sizeof($this->properties)>0)
|
||
|
{
|
||
|
echo("<tr><td colspan=\"3\"><h3>Properties</h3></td></tr>\n");
|
||
|
|
||
|
for ($i=0;$i<sizeof($this->properties);$i++)
|
||
|
{
|
||
|
if ($this->readonly[$this->properties[$i]])
|
||
|
$readonly="Property is ReadOnly";
|
||
|
else
|
||
|
$readonly="Property is ReadWrite";
|
||
|
|
||
|
echo("<tr><td width=\"20\"> </td><td>".$this->properties[$i]."</td><td>$readonly</td></tr>\n");
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (sizeof($this->constants)>0)
|
||
|
{
|
||
|
echo("<tr><td colspan=\"3\"><h3>Constants</h3></td></tr>\n");
|
||
|
|
||
|
for ($i=0;$i<sizeof($this->constants);$i++)
|
||
|
{
|
||
|
echo("<tr><td width=\"20\"> </td><td>".$this->constants[$i]."</td></tr>\n");
|
||
|
}
|
||
|
}
|
||
|
echo("</table><br><br>");
|
||
|
}
|
||
|
|
||
|
function to_svg(&$x,&$y)
|
||
|
{
|
||
|
$xtemp=$x+50;
|
||
|
$ytemp=$y+50;
|
||
|
|
||
|
echo("<text x=\"$xtemp\" y=\"$ytemp\">".$this->class."</text>");
|
||
|
|
||
|
$ytemp+=10;
|
||
|
|
||
|
if (sizeof($this->functions)>0)
|
||
|
{
|
||
|
echo("<text x=\"".$xtemp."\" y=\"".($ytemp)."\">Functions</text>\n");
|
||
|
|
||
|
$ytemp+=10;
|
||
|
|
||
|
for ($i=0;$i<sizeof($this->functions);$i++)
|
||
|
{
|
||
|
echo("<text x=\"".($xtemp+20)."\" y=\"".($ytemp)."\">".$this->functions[$i]." with ".$this->params[$this->functions[$i]]." Parameter(s)</text>\n");
|
||
|
$ytemp+=10;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (sizeof($this->properties)>0)
|
||
|
{
|
||
|
echo("<text x=\"".$xtemp."\" y=\"".($ytemp)."\">Properties</text>\n");
|
||
|
|
||
|
$ytemp+=10;
|
||
|
|
||
|
for ($i=0;$i<sizeof($this->properties);$i++)
|
||
|
{
|
||
|
if ($this->readonly[$this->properties[$i]])
|
||
|
$readonly="Property is ReadOnly";
|
||
|
else
|
||
|
$readonly="Property is ReadWrite";
|
||
|
|
||
|
echo("<text x=\"".($xtemp+20)."\" y=\"".$ytemp."\">".$this->properties[$i]." $readonly</text>\n");
|
||
|
$ytemp+=10;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (sizeof($this->constants)>0)
|
||
|
{
|
||
|
echo("<text x=\"".$xtemp."\" y=\"".$ytemp."\">Constants</text>\n");
|
||
|
|
||
|
$ytemp+=10;
|
||
|
|
||
|
for ($i=0;$i<sizeof($this->constants);$i++)
|
||
|
{
|
||
|
echo("<text x=\"".($xtemp+20)."\" y=\"".$ytemp."\">".$this->constants[$i]."</text>\n");
|
||
|
$ytemp+=10;
|
||
|
}
|
||
|
}
|
||
|
$x=$xtemp+200;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
class kalyptus_result
|
||
|
{
|
||
|
var $class;
|
||
|
var $type; // 0 = Property ; 1 = Function ; 2 = Constant
|
||
|
var $name;
|
||
|
var $params;
|
||
|
var $readonly;
|
||
|
|
||
|
function kalyptus_result($class,$type,$name,$params=0)
|
||
|
{
|
||
|
$this->class=$class;
|
||
|
$this->type=$type;
|
||
|
$this->name=$name;
|
||
|
$this->params=$params;
|
||
|
}
|
||
|
|
||
|
function setReadOnly($value)
|
||
|
{
|
||
|
$this->readonly=$value;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function parse_kalyptus($line,&$fp,&$last_constructor)
|
||
|
{
|
||
|
if (preg_match("/^[ \t^#]*([a-zA-Z_]*)[ \t]*KSVG::.*DontDelete/",$line,$match))
|
||
|
{
|
||
|
if (DEBUG) fputs($fp,"MATCH => Constant ".$match[1]." in class ".$match[2]."\n");
|
||
|
return new kalyptus_result($last_constructor,2,$match[1]);
|
||
|
}
|
||
|
elseif (preg_match("/^[ \t^#]*([a-zA-Z_]*)[ \t]*([a-zA-Z_]*)::.*Function ([0-9])/",$line,$match))
|
||
|
{
|
||
|
if (DEBUG) fputs($fp,"MATCH => Function ".$match[1]." in class ".$match[2]."\n");
|
||
|
return new kalyptus_result($match[2],1,$match[1],$match[3]);
|
||
|
}
|
||
|
elseif (preg_match("/^[ \t^#]*([a-zA-Z_]*)[ \t]*([a-zA-Z_]*)::.*DontDelete\|ReadOnly/",$line,$match))
|
||
|
{
|
||
|
if (DEBUG) fputs($fp,"MATCH => Property ".$match[1]." in class ".$match[2]."\n");
|
||
|
$property=new kalyptus_result($match[2],0,$match[1]);
|
||
|
$property->setReadOnly(true);
|
||
|
return $property;
|
||
|
}
|
||
|
elseif (preg_match("/^[ \t^#]*([a-zA-Z_]*)[ \t]*([a-zA-Z_]*)::.*DontDelete/",$line,$match))
|
||
|
{
|
||
|
if (DEBUG) fputs($fp,"MATCH => Property ".$match[1]." in class ".$match[2]."\n");
|
||
|
$property=new kalyptus_result($match[2],0,$match[1]);
|
||
|
$property->setReadOnly(false);
|
||
|
return $property;
|
||
|
}
|
||
|
elseif (preg_match("/^[ \t@begin^#]*([a-zA-Z_]*)Constructor::s_hashTable.*/",$line,$match))
|
||
|
{
|
||
|
if (DEBUG) fputs($fp,"Constructor => ".$match[1]."\n");
|
||
|
$last_constructor=$match[1];
|
||
|
return false;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if (DEBUG) fputs($fp,"Ignored => ".$line."\n");
|
||
|
return false;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function do_output($output,$ecma_classes)
|
||
|
{
|
||
|
ksort($ecma_classes);
|
||
|
|
||
|
reset($ecma_classes);
|
||
|
|
||
|
switch($output)
|
||
|
{
|
||
|
case "txt":
|
||
|
foreach ($ecma_classes as $classname => $obj)
|
||
|
{
|
||
|
$obj->to_text();
|
||
|
}
|
||
|
break;
|
||
|
case "svg":
|
||
|
echo("<svg width=\"100%\" height=\"100%\">\n");
|
||
|
|
||
|
$x=0;
|
||
|
$y=0;
|
||
|
|
||
|
foreach ($ecma_classes as $classname => $obj)
|
||
|
{
|
||
|
$obj->to_svg($x,$y);
|
||
|
}
|
||
|
echo("</svg>");
|
||
|
break;
|
||
|
default:
|
||
|
echo("<html>\n<body>\n");
|
||
|
|
||
|
echo("<a name=\"toc\"><h1>Contents</h1></a><br>\n");
|
||
|
|
||
|
foreach ($ecma_classes as $classname => $obj)
|
||
|
{
|
||
|
echo("<a href=\"#".$classname."\">$classname</a><br>\n");
|
||
|
}
|
||
|
|
||
|
echo("<hr>\n");
|
||
|
|
||
|
foreach ($ecma_classes as $classname => $obj)
|
||
|
{
|
||
|
$obj->to_html();
|
||
|
}
|
||
|
echo("</body>\n</html>");
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function searchKalyptusCode($file,&$fp)
|
||
|
{
|
||
|
global $ecma_classes;
|
||
|
|
||
|
ob_start();
|
||
|
readfile($file);
|
||
|
$content=ob_get_contents();
|
||
|
ob_end_clean();
|
||
|
|
||
|
if (preg_match("/@begin(.*)@end/s",$content,$matches)) // FIXME broken....if several @end's are there it takes always the last
|
||
|
{
|
||
|
if (DEBUG) fputs($fp,"Found ".(sizeof($matches)-1)." Matches in ".$file."\n");
|
||
|
for ($i=1;$i<sizeof($matches);$i++)
|
||
|
{
|
||
|
if (DEBUG) fputs($fp,"Checking ".$i.". Match\n");
|
||
|
$lines=explode("\n",$matches[$i]);
|
||
|
for ($j=0;$j<sizeof($lines);$j++)
|
||
|
{
|
||
|
$result=parse_kalyptus($lines[$j],$fp,$last_constructor);
|
||
|
if ($result)
|
||
|
$results[]=$result;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
for ($i=0;$i<sizeof($results);$i++)
|
||
|
{
|
||
|
if ($ecma_classes[$results[$i]->class])
|
||
|
$ecma_classes[$results[$i]->class]->add_content($results[$i]);
|
||
|
else
|
||
|
{
|
||
|
$ecma_classes[$results[$i]->class]=new ecma_class($results[$i]->class);
|
||
|
$ecma_classes[$results[$i]->class]->add_content($results[$i]);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function crawlFiles($path)
|
||
|
{
|
||
|
global $ecma_classes;
|
||
|
|
||
|
$fp=fopen("php://stderr","w+");
|
||
|
|
||
|
if ($dir = @opendir($path))
|
||
|
{
|
||
|
while (($file = readdir($dir)) !== false)
|
||
|
{
|
||
|
if (($file!=".") && ($file!=".."))
|
||
|
{
|
||
|
if (is_dir($path."/".$file))
|
||
|
{
|
||
|
fputs($fp,"Entering directory ".$file."\n");
|
||
|
crawlFiles($path."/".$file);
|
||
|
fputs($fp,"Leaving directory ".$file."\n");
|
||
|
}
|
||
|
elseif (is_file($path."/".$file) && preg_match("/^[A-Za-z0-9_]+(\.cc|\.cpp|\.h|\.hpp)$/",$file))
|
||
|
{
|
||
|
fputs($fp,"\tchecking $file\n");
|
||
|
searchKalyptusCode($path."/".$file,$fp);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
closedir($dir);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
define(DEBUG,0);
|
||
|
|
||
|
$ecma_classes=array();
|
||
|
|
||
|
$ksvg_path="../";
|
||
|
|
||
|
$path=basename(realpath($ksvg_path));
|
||
|
|
||
|
if ($path!="ksvg")
|
||
|
{
|
||
|
echo "Execute it in base ksvg dir please :S\n";
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
crawlFiles($ksvg_path);
|
||
|
|
||
|
do_output($argv[1],$ecma_classes);
|
||
|
?>
|