From 0c8be0413afd025d4b54e2a1a3c641cc024e2514 Mon Sep 17 00:00:00 2001 From: Leandro Lucarella Date: Thu, 28 Apr 2005 04:26:47 +0000 Subject: [PATCH] Subo script para sacar comentarios del diagrama. --- util/clases2spec.py | 130 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 130 insertions(+) create mode 100755 util/clases2spec.py diff --git a/util/clases2spec.py b/util/clases2spec.py new file mode 100755 index 0000000..4822cd1 --- /dev/null +++ b/util/clases2spec.py @@ -0,0 +1,130 @@ +#!/usr/bin/env python +# -*- coding: iso-8859-1 -*- + +from xml.sax import saxutils + +# Estados +E_CLASS = 1 +E_CLASS_NAME = 2 +E_CLASS_COMMENT = 3 +E_ATTRS = 4 +E_ATTR = 5 +E_ATTR_NAME = 6 +E_ATTR_COMMENT = 7 +E_ATTR_TYPE = 8 + +# Caracteres a eliminar +STRIPCHARS = '#\t\n ' + +class ObjFinder(saxutils.DefaultHandler): + def __init__(self): + self.estado = None + self.clases = [] + self.curr = None + self.curr_attr = None + def startElement(self, name, attrs): + #print " #### Start <%s %s>" % (name, dict(attrs)) + if name == 'dia:object': # Comienzo de una clase + if attrs.get('type', None) == 'UML - Class': + self.curr = {} + self.estado = E_CLASS + elif name == 'dia:attribute': + name = attrs.get('name', None) + if self.estado == E_CLASS: # Datos de la clase + if name == 'name': # Nombre de la clase + self.curr['name'] = '' + self.estado = E_CLASS_NAME + elif name == 'comment': # Es la descripción de la clase + self.curr['comment'] = '' + self.estado = E_CLASS_COMMENT + elif name == 'attributes': # Paso empezó a encontrar atributos + self.curr['attrs'] = [] + self.estado = E_ATTRS + elif self.estado == E_ATTR: # Datos del atributo + if name == 'name': # Nombre del atributo + self.curr_attr['name'] = '' + self.estado = E_ATTR_NAME + elif name == 'type': # Es el tipo del atributo + self.curr_attr['type'] = '' + self.estado = E_ATTR_TYPE + 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 + if self.estado == E_ATTRS: # Si estoy en una clase + self.curr_attr = {} + self.estado = E_ATTR # Paso a buscar sus atributos + def characters(self, data): + if self.estado == E_CLASS_NAME: + self.curr['name'] += data.strip(STRIPCHARS) + elif self.estado == E_CLASS_COMMENT: + self.curr['comment'] += data.strip(STRIPCHARS) + elif self.estado == E_ATTR_NAME: + self.curr_attr['name'] += data.strip(STRIPCHARS) + elif self.estado == E_ATTR_TYPE: + self.curr_attr['type'] += data.strip(STRIPCHARS) + elif self.estado == E_ATTR_COMMENT: + self.curr_attr['comment'] += data.strip(STRIPCHARS) + def endElement(self, name): + #print " #### Endt " % name + if name == 'dia:object': + if self.estado == E_CLASS: + self.clases.append(self.curr) + self.estado = None + self.curr = None + elif name == 'dia:attribute': + if self.estado == E_CLASS_NAME: + self.estado = E_CLASS + if self.estado == E_CLASS_COMMENT: + self.estado = E_CLASS + if self.estado == E_ATTR_NAME: + self.estado = E_ATTR + if self.estado == E_ATTR_TYPE: + self.estado = E_ATTR + if self.estado == E_ATTR_COMMENT: + self.estado = E_ATTR + if self.estado == E_ATTRS: + 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 + + +if __name__ == '__main__': + import sys + from xml.sax import make_parser + from xml.sax.handler import feature_namespaces + + # Verifica parámetros + if len(sys.argv) < 2: + print >>sys.stderr, 'Uso:', sys.argv[0], 'archivo.dia' + sys.exit(1) + + # Create a parser + parser = make_parser() + + # Tell the parser we are not interested in XML namespaces + parser.setFeature(feature_namespaces, 0) + + # Create the handler + dh = ObjFinder() + + # Tell the parser to use our handler + parser.setContentHandler(dh) + + # Parse the input + parser.parse(sys.argv[1]) + + # Recorro clases obtenidas + for c in dh.clases: + print + print 'Clase:', c['name'] + print 'Descripción:', c['comment'] + print 'Atributos:' + for a in c['attrs']: + print ' %(name)s (%(type)s): %(comment)s' % a + + +# vim: set et sw=4 sts=4 : -- 2.43.0