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 '
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'] = ''
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)
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':
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__':
# 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
# 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 :