#! /usr/bin/php4 -qC
<?php
-/* vim: set binary expandtab tabstop=4 shiftwidth=4:
+/* vim: set binary expandtab tabstop=4 shiftwidth=4 foldmethod=marker:
-------------------------------------------------------------------------------
Creado: jue jul 31 14:01:57 ART 2003
Autor: Martin Marrese <mmarre@mecon.gov.ar>
//Recibe como parametros el directorio o una lista de archivos a diagramar
-//////////////////////
-// TAG's XML
-//////////////////////
+//TAG's XML {{{
$comienzo = <<<EOT
<?xml version="1.0" encoding="UTF-8"?>
<XMI xmlns:UML="org.omg/standards/UML" verified="false" timestamp="" xmi.version="1.2" >
</XMI.content>
</XMI>
EOT3;
-
-
+//}}}
+//LINEAS TEMPLATES XMI {{{
$umlclass = '<UML:Class stereotype="##STEREOTYPE##" package="##PACKAGE##" xmi.id="##ID##" abstract="##ABSTRACT##" documentation="##DOCUMENTATION##" name="##NAME##" static="##STATIC##" scope="##SCOPE##" >';
$umlclass_c = '</UML:Class>';
$umllistitem = '<listitem open="0" type="##TYPE##" id="##ID##" label="##LABEL##" >';
$umllistitem_c = '</listitem>';
-
-//////////////////////
-
-
+//}}}
+//VARIABLES GLOBALES {{{
$ID = 0;
$IDPARAM = 0;
$ARRAY = array();
+//}}}
+//PARTE 1 {{{
for ($j = 1; $j < count($argv); $j++) {
$file = $argv[$j];
+ //ARMO LA LISTA DE ARCHIVOS {{{
// Si es un directorio, agrego cada archivo legible .php al argv.
if (is_dir($file)) {
$dh = opendir($file);
}
closedir($dh);
continue;
- // Si no, si se puede leer el archivo y es .php, lo procesa.
- } elseif (is_readable($file) and substr($file, -4) == '.php') {
+ }
+ //}}}
+ //GUARDO LA INFO{{{
+ elseif (is_readable($file) and substr($file, -4) == '.php') {
$cont = file ($file);
-
$DOCUMENTANDO = false;
$opciones = array ();
$cont_param = 0;
foreach ($cont as $linea) {
$linea = trim ($linea);
- $tmp = preg_split ('/[^\w_\/\*\@\$\']+/', $linea);
- //Agrego la documentacion
+ $tmp = preg_split ('/[^\w_\/\*\@\$\&\.\']+/', $linea);
+ //DOCUMENTACION {{{
if ($tmp['0'] == '/**') { //Comienza la documentacion
$DOCUMENTANDO = true;
}
if ($tmp['0'] == '*/') { //Termina la documentacion
$DOCUMENTANDO = false;
}
-
if ($DOCUMENTANDO) {
- if ($tmp['0'] = '*') {
- array_shift($tmp);
- }
- switch ($tmp['0']) {
- case '@access':
- switch ($tmp['1']) {
- case 'private' : $opciones['access'] = 201;
- break;
- case 'protected': $opciones['access'] = 202;
- break;
- default : $opciones['access'] = 200;
- }
- break;
- case '@package' : $opciones['package'] = $tmp['1'];
+ $tmp2 = ltrim ($linea,'* /**'); //Elimino el * o /** del comienzo de la linea
+ $accion = substr($tmp2, 0, strpos($tmp2,' ')); //Obtengo la accion
+ $value = trim(strstr($tmp2, ' ')); //Solo me importa lo que esta detras del @
+
+ switch ($accion) {
+ case '@access' : switch ($value) {
+ case 'private' : $opciones['access'] = 201;
+ break;
+ case 'protected': $opciones['access'] = 202;
+ break;
+ default : $opciones['access'] = 200;
+ }
+ $doc_param = 0;
+ break;
+ case '@package' : $opciones['package'] = $value;
+ $doc_param = 0;
break;
case '@abstract': $opciones['abstract'] = 1;
+ $doc_param = 0;
break;
- case '@static' : $opciones['static'] = 1;
+ case '@static' : $opciones['static'] = 1;
+ $doc_param = 0;
break;
- case '@var' : $opciones['type'] = $tmp['1'];
+ case '@var' : $opciones['type'] = substr($value, 0, strpos($value,' '));
+ $doc_param = 0;
break;
- case '@return' : $opciones['type'] = $tmp['1'];
+ case '@return' : $opciones['type'] = $value;
+ $doc_param = 0;
break;
- case '@param' : $opciones['param'][$cont_param]['type'] = $tmp['1'];
- $opciones['param'][$cont_param]['documentacion'] = implode (' ', array_slice($tmp,3));
+ case '@param' : $opciones['param'][$cont_param]['type'] = substr($value, 0, strpos($value,' '));
+ $opciones['param'][$cont_param]['documentacion'] = trim(strstr(trim(strstr($value, ' ')), ' '));
$cont_param++;
+ $doc_param = 1;
break;
default:
- if (array_key_exists('0',$tmp)) {
- @$opciones['documentacion'].= implode (' ',$tmp)."\n";
+ if (@$doc_param) {
+ $opciones['param'][$cont_param]['documentacion'].= $tmp2;
+ }
+ else {
+ @$opciones['documentacion'].= $tmp2;
}
}
}
-
- //CLASE
+ //}}}
+ //CLASE {{{
if (!$DOCUMENTANDO && $tmp['0'] == 'class') {
$ID++;
$IDCLASE = $ID;
$ARRAY[$ID]['attributes'] = array();
$opciones = array();
}
- //FUNCION
+ //}}}
+ //FUNCION {{{
if (!$DOCUMENTANDO && $tmp['0'] == 'function') {
$ID++;
+
+ if ($tmp['1']{0} == '_') {
+ $tmp['1'] = substr($tmp['1'], 1); //SACO EL _
+ }
+
$ARRAY[$IDCLASE]['operations'][$ID]['id'] = $ID;
$ARRAY[$IDCLASE]['operations'][$ID]['name'] = $tmp['1'];
$ARRAY[$IDCLASE]['operations'][$ID]['stereotype'] = (@$opciones['stereotype']) ? $opciones['stereotype'] : '';
$ARRAY[$IDCLASE]['operations'][$ID]['type'] = (@$opciones['type']) ? $opciones['type'] : '';
$ARRAY[$IDCLASE]['operations'][$ID]['param'] = array();
- //PARAMETROS
+ //PARAMETROS {{{
array_shift($tmp); //SACO EL FUNCTION
array_shift($tmp); //SACO EL NOMBRE DE LA FUNCION
for ($i = 0; $i <= count($tmp); $i++) {
- if ($tmp[$i]{0} == '$') { //AL FINAL DEJE EL $ PARA DIFERENCIAR LOS PARAMETROS DE LOS VALORES INICIALES QUE TOMAN
- $tmp[$i] = substr($tmp[$i], 1); //SACO EL $
+ if ($tmp[$i]{0} == '$'|| $tmp[$i]{0} == '&') { //Veo si empiezo con $ o &
+ switch ($tmp[$i]{0}) {
+ case '$': $tmp[$i] = substr($tmp[$i], 1); //SACO EL $
+ break;
+ case '&': $tmp[$i] = substr($tmp[$i], 2); //SACO EL & Y EL $
+ $opciones['param'][$i]['type'] =
+ (@$opciones['param'][$i]['type']) ? '&'.$opciones['param'][$i]['type'] : '';
+ break;
+ }
$OPANT = $i;
- $ARRAY[$IDCLASE]['operations'][$ID]['param'][$i]['id'] = $i;
- $ARRAY[$IDCLASE]['operations'][$ID]['param'][$i]['name'] = $tmp[$i];
- $ARRAY[$IDCLASE]['operations'][$ID]['param'][$i]['stereotype'] = (@$opciones['param'][$i]['stereotype']) ? $opciones['param'][$i]['stereotype'] : '';
- $ARRAY[$IDCLASE]['operations'][$ID]['param'][$i]['package'] = (@$opciones['param'][$i]['package']) ? $opciones['param'][$i]['package'] : '';
- $ARRAY[$IDCLASE]['operations'][$ID]['param'][$i]['abstract'] = (@$opciones['param'][$i]['abstract']) ? $opciones['param'][$i]['abstract'] : 0;
- $ARRAY[$IDCLASE]['operations'][$ID]['param'][$i]['documentation'] = (@$opciones['param'][$i]['documentacion']) ? $opciones['param'][$i]['documentacion'] : '';
- $ARRAY[$IDCLASE]['operations'][$ID]['param'][$i]['static'] = (@$opciones['param'][$i]['static']) ? $opciones['param'][$i]['static'] : 0;
- $ARRAY[$IDCLASE]['operations'][$ID]['param'][$i]['scope'] = (@$opciones['param'][$i]['access']) ? $opciones['param'][$i]['access'] : '';
- $ARRAY[$IDCLASE]['operations'][$ID]['param'][$i]['type'] = (@$opciones['param'][$i]['type']) ? $opciones['param'][$i]['type'] : '';
+ $ARRAY[$IDCLASE]['operations'][$ID]['param'][$i]['id'] = $i;
+ $ARRAY[$IDCLASE]['operations'][$ID]['param'][$i]['name'] = $tmp[$i];
+ $ARRAY[$IDCLASE]['operations'][$ID]['param'][$i]['stereotype'] =
+ (@$opciones['param'][$i]['stereotype']) ? $opciones['param'][$i]['stereotype'] : '';
+ $ARRAY[$IDCLASE]['operations'][$ID]['param'][$i]['package'] =
+ (@$opciones['param'][$i]['package']) ? $opciones['param'][$i]['package'] : '';
+ $ARRAY[$IDCLASE]['operations'][$ID]['param'][$i]['abstract'] =
+ (@$opciones['param'][$i]['abstract']) ? $opciones['param'][$i]['abstract'] : 0;
+ $ARRAY[$IDCLASE]['operations'][$ID]['param'][$i]['documentation'] =
+ (@$opciones['param'][$i]['documentacion']) ? $opciones['param'][$i]['documentacion'] : '';
+ $ARRAY[$IDCLASE]['operations'][$ID]['param'][$i]['static'] =
+ (@$opciones['param'][$i]['static']) ? $opciones['param'][$i]['static'] : 0;
+ $ARRAY[$IDCLASE]['operations'][$ID]['param'][$i]['scope'] =
+ (@$opciones['param'][$i]['access']) ? $opciones['param'][$i]['access'] : '';
+ $ARRAY[$IDCLASE]['operations'][$ID]['param'][$i]['type'] =
+ (@$opciones['param'][$i]['type']) ? $opciones['param'][$i]['type'] : '';
}
elseif ($tmp[$i] != '//' && $tmp[$i] != 'X2C' && $tmp[$i] != '') {
$ARRAY[$IDCLASE]['operations'][$ID]['param'][$OPANT]['value'] .= $tmp[$i];
}
}
+ //}}}
$opciones = array();
$cont_param = 0;
}
- //ATRIBUTOS
+ //}}}
+ //ATRIBUTOS {{{
if (!$DOCUMENTANDO && $tmp['0'] == 'var') {
$ID++;
$tmp['1'] = substr($tmp['1'], 1); //SACO EL $
$ARRAY[$IDCLASE]['attributes'][$ID]['value'] = (@$opciones['value']) ? $opciones['value'] : '';
$opciones = array(operations);
}
+ //}}}
}
}
+ //}}}
}
+//}}}
-$m = fopen ('./umlOut.xmi', 'w');
+
+//GUARDO EN EL ARCHIVO {{{
+$m =fopen ('./umlOut.xmi', 'w');
fwrite($m, $comienzo);
$LISTITEM = '';
//CLASES
foreach ($ARRAY as $ar) {
- //PREPARO LA CLASE {{{
+ //PREPARO LA CLASE
$tmp2 = $umlclass;
fwrite($m, preg_replace (array ('/##STEREOTYPE##/','/##PACKAGE##/','/##ID##/','/##ABSTRACT##/','/##DOCUMENTATION##/','/##NAME##/',
'/##STATIC##/','/##SCOPE##/'),
array ($ar['stereotype'],$ar['package'],$ar['id'],$ar['abstract'],$ar['documentation'],$ar['name'],
$ar['static'],$ar['scope']),
$tmp2)."\n");
- //PREPARO LOS LISTITEM {{{
+ //PREPARO LOS LISTITEM
$tmp2 = $umllistitem;
$LISTITEM.= preg_replace (array('/##TYPE##/','/##LABEL##/','/##ID##/'),array(813, $ar['name'], $ar['id']),$tmp2)."\n";
$tmp2)."\n");
}
fwrite($m,$umloperation_c."\n");
- //PREPARO LOS LISTITEM {{{
+ //PREPARO LOS LISTITEM
$tmp2 = $umllistitem;
$LISTITEM.= preg_replace (array('/##TYPE##/','/##LABEL##/','/##ID##/'),array(815, $op['name'], $op['id']),$tmp2)."\n";
$LISTITEM.=$umllistitem_c."\n";
array($op['stereotype'],$op['package'],$op['id'],$op['type'],$op['abstract'],$op['documentation'],$op['name'],
$op['static'],$op['scope'],$op['value']),
$tmp2)."\n");
- //PREPARO LOS LISTITEM {{{
+ //PREPARO LOS LISTITEM
$tmp2 = $umllistitem;
$LISTITEM.= preg_replace (array('/##TYPE##/','/##LABEL##/','/##ID##/'),array(814, $op['name'], $op['id']),$tmp2)."\n";
$LISTITEM.=$umllistitem_c."\n";
}
fwrite($m,$umlclass_c);
$LISTITEM.=$umllistitem_c."\n";
- //}}}
}
fwrite($m, $medio. $LISTITEM."\n".$fin);
+//}}}
?>