]> git.llucax.com Git - z.facultad/75.43/tp1.git/commitdiff
Subo script para sacar comentarios del diagrama.
authorLeandro Lucarella <llucax@gmail.com>
Thu, 28 Apr 2005 04:26:47 +0000 (04:26 +0000)
committerLeandro Lucarella <llucax@gmail.com>
Thu, 28 Apr 2005 04:26:47 +0000 (04:26 +0000)
util/clases2spec.py [new file with mode: 0755]

diff --git a/util/clases2spec.py b/util/clases2spec.py
new file mode 100755 (executable)
index 0000000..4822cd1
--- /dev/null
@@ -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 </%s>" % 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 :