]> git.llucax.com Git - z.facultad/75.10/miklolife.git/blobdiff - scripts/clases2spec.py
no se me ocurrio otra forma pero estoy dispuesto a cambiarlo si es necesario
[z.facultad/75.10/miklolife.git] / scripts / clases2spec.py
index 4822cd19625eb42548f5663b6b81e8220a1f7977..818d1ddcbcd8e2373d3ab31dd87c83952bd7a78c 100755 (executable)
@@ -12,6 +12,11 @@ E_ATTR          = 5
 E_ATTR_NAME     = 6
 E_ATTR_COMMENT  = 7
 E_ATTR_TYPE     = 8
+E_OPS           = 9
+E_OP            = 10
+E_OP_NAME       = 11
+E_OP_COMMENT    = 12
+E_OP_TYPE       = 13
 
 # Caracteres a eliminar
 STRIPCHARS = '#\t\n '
@@ -40,6 +45,9 @@ class ObjFinder(saxutils.DefaultHandler):
                 elif name == 'attributes': # Paso empezó a encontrar atributos
                     self.curr['attrs'] = []
                     self.estado = E_ATTRS
+                elif name == 'operations': # Paso empezó a encontrar operaciones
+                    self.curr['ops'] = []
+                    self.estado = E_OPS
             elif self.estado == E_ATTR:  # Datos del atributo
                 if name == 'name':       # Nombre del atributo
                     self.curr_attr['name'] = ''
@@ -50,10 +58,23 @@ class ObjFinder(saxutils.DefaultHandler):
                 elif name == 'comment':  # Es la descripción del atributo
                     self.curr_attr['comment'] = ''
                     self.estado = E_ATTR_COMMENT
-        elif name == 'dia:composite': # Comienzo de attributos de clase
+            elif self.estado == E_OP:    # Datos del atributo
+                if name == 'name':       # Nombre del atributo
+                    self.curr_op['name'] = ''
+                    self.estado = E_OP_NAME
+                elif name == 'type':     # Es el tipo del atributo
+                    self.curr_op['type'] = ''
+                    self.estado = E_OP_TYPE
+                elif name == 'comment':  # Es la descripción del atributo
+                    self.curr_op['comment'] = ''
+                    self.estado = E_OP_COMMENT
+        elif name == 'dia:composite':   # Comienzo de attributos de clase
             if self.estado == E_ATTRS:  # Si estoy en una clase
                 self.curr_attr = {}
-                self.estado = E_ATTR   # Paso a buscar sus atributos
+                self.estado = E_ATTR    # Paso a buscar sus operaciones
+            elif self.estado == E_OPS:  # Si estoy en una clase
+                self.curr_op = {}
+                self.estado = E_OP   # Paso a buscar sus atributos
     def characters(self, data):
         if self.estado == E_CLASS_NAME:
             self.curr['name'] += data.strip(STRIPCHARS)
@@ -65,6 +86,12 @@ class ObjFinder(saxutils.DefaultHandler):
             self.curr_attr['type'] += data.strip(STRIPCHARS)
         elif self.estado == E_ATTR_COMMENT:
             self.curr_attr['comment'] += data.strip(STRIPCHARS)
+        elif self.estado == E_OP_NAME:
+            self.curr_op['name'] += data.strip(STRIPCHARS)
+        elif self.estado == E_OP_TYPE:
+            self.curr_op['type'] += data.strip(STRIPCHARS)
+        elif self.estado == E_OP_COMMENT:
+            self.curr_op['comment'] += data.strip(STRIPCHARS)
     def endElement(self, name):
         #print " #### Endt </%s>" % name
         if name == 'dia:object':
@@ -75,21 +102,33 @@ class ObjFinder(saxutils.DefaultHandler):
         elif name == 'dia:attribute':
             if self.estado == E_CLASS_NAME:
                 self.estado = E_CLASS
-            if self.estado == E_CLASS_COMMENT:
+            elif self.estado == E_CLASS_COMMENT:
                 self.estado = E_CLASS
-            if self.estado == E_ATTR_NAME:
+            elif self.estado == E_ATTR_NAME:
                 self.estado = E_ATTR
-            if self.estado == E_ATTR_TYPE:
+            elif self.estado == E_ATTR_TYPE:
                 self.estado = E_ATTR
-            if self.estado == E_ATTR_COMMENT:
+            elif self.estado == E_ATTR_COMMENT:
                 self.estado = E_ATTR
-            if self.estado == E_ATTRS:
+            elif self.estado == E_ATTRS:
+                self.estado = E_CLASS
+            elif self.estado == E_OP_NAME:
+                self.estado = E_OP
+            elif self.estado == E_OP_TYPE:
+                self.estado = E_OP
+            elif self.estado == E_OP_COMMENT:
+                self.estado = E_OP
+            elif self.estado == E_OPS:
                 self.estado = E_CLASS
         elif name == 'dia:composite':
             if self.estado == E_ATTR:
                 self.curr['attrs'].append(self.curr_attr)
                 self.curr_attr = None
                 self.estado = E_ATTRS
+            elif self.estado == E_OP:
+                self.curr['ops'].append(self.curr_op)
+                self.curr_op = None
+                self.estado = E_OPS
 
 
 if __name__ == '__main__':
@@ -99,7 +138,8 @@ if __name__ == '__main__':
 
     # Verifica parámetros
     if len(sys.argv) < 2:
-        print >>sys.stderr, 'Uso:', sys.argv[0], 'archivo.dia'
+        print >>sys.stderr, 'Uso:', sys.argv[0], 'archivo.dia [-n]'
+        print >>sys.stderr, '-n si no se quieren incluir los métodos'
         sys.exit(1)
 
     # Create a parser
@@ -117,14 +157,34 @@ if __name__ == '__main__':
     # Parse the input
     parser.parse(sys.argv[1])
 
+    # Veo si hay que poner métodos
+    metodos = True
+    if len(sys.argv) > 2 and sys.argv[2] == '-n':
+        metodos = False
+
+    print '<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2//EN">'
+    print '<html lang="es"><head><title>Especificación</title></head><body>'
     # Recorro clases obtenidas
     for c in dh.clases:
-        print
-        print 'Clase:', c['name']
-        print 'Descripción:', c['comment']
-        print 'Atributos:'
+        print '<table width="100%%" border="1" summary="Especificación de clase %s">' \
+            % c['name'].encode('iso-8859-1', 'replace')
+        print '<tr><th colspan="3">%s</th></tr>' % c['name'].encode('iso-8859-1', 'replace')
+        print '<tr><td colspan="3">%s</td></tr>' % c['comment'].encode('iso-8859-1', 'replace')
+        print '<tr><th>Atributo</th><th>Tipo</th><th>Descripción</th></tr>'
         for a in c['attrs']:
-            print '    %(name)s (%(type)s): %(comment)s' % a
+            print '<tr><td>%s</td><td>%s</td><td>%s</td></tr>' \
+                % (a['name'].encode('iso-8859-1', 'replace'),
+                    a['type'].encode('iso-8859-1', 'replace'),
+                    a['comment'].encode('iso-8859-1', 'replace'))
+        if metodos:
+            print '<tr><th>Método</th><th>Retorno</th><th>Descripción</th></tr>'
+            for o in c['ops']:
+                print '<tr><td>%s</td><td>%s</td><td>%s</td></tr>' \
+                    % (o['name'].encode('iso-8859-1', 'replace'),
+                        o['type'].encode('iso-8859-1', 'replace'),
+                        o['comment'].encode('iso-8859-1', 'replace'))
+        print '</table>'
+    print '</body></html>'
 
 
 # vim: set et sw=4 sts=4 :