[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Gzz-commits] gzz/metacode uml.py umltool.py
From: |
Asko Soukka |
Subject: |
[Gzz-commits] gzz/metacode uml.py umltool.py |
Date: |
Sun, 15 Dec 2002 20:08:49 -0500 |
CVSROOT: /cvsroot/gzz
Module name: gzz
Changes by: Asko Soukka <address@hidden> 02/12/15 20:08:49
Modified files:
metacode : uml.py
Added files:
metacode : umltool.py
Log message:
split uml.py
CVSWeb URLs:
http://savannah.gnu.org/cgi-bin/viewcvs/gzz/gzz/metacode/umltool.py?rev=1.1
http://savannah.gnu.org/cgi-bin/viewcvs/gzz/gzz/metacode/uml.py.diff?tr1=1.19&tr2=1.20&r1=text&r2=text
Patches:
Index: gzz/metacode/uml.py
diff -u gzz/metacode/uml.py:1.19 gzz/metacode/uml.py:1.20
--- gzz/metacode/uml.py:1.19 Thu Aug 29 07:43:35 2002
+++ gzz/metacode/uml.py Sun Dec 15 20:08:49 2002
@@ -15,742 +15,8 @@
# file for more details.
#
-from __future__ import nested_scopes
-import re
-import os
import sys
-import random
-import string
-
-jlinkpackage = None
-
-def matchRemove(p, s):
- "Match pattern p in s and remove the match, return (match, ns)"
- m = re.match(p,s)
- if m: s = re.sub(p, "", s)
- return (m, s)
-
-def resolveTabs(s):
- return re.sub("\t", " ", s);
-
-def initSpaces(s):
- n = len(re.match("^\s*", s).group())
- return (n, s.strip())
-
-def randomVar():
- l = len(string.letters)
- return "".join([
- string.letters[random.randint(0, l-1)]
- for k in range(20)])
-
-def parseIndented(s):
- stack = [(-1, [])]
- for r in s.split("\n") :
- if re.match("^\s*$", r): continue
- r = resolveTabs(r)
- (n,x) = initSpaces(r)
- while n < stack[-1][0]:
- stack.pop()
- if n > stack[-1][0]:
- new = (n, [x])
- stack[-1][1].append(new[1])
- stack.append(new)
- else: # x == stack[-1][0]:
- new = (n, [x])
- stack[-2][1].append(new[1])
- stack.pop()
- stack.append(new)
- return stack[0][1]
-
-class namedEl:
- def docontents(self, l):
- global curList
- self.jlink = None
- for el in l:
- self.handleContained(el)
- print self.jlink
- def handleContained(self, el):
- if el[0] == "jlink":
- jlink = el[1:]
- if len(jlink):
- self.jlink = jlink[0][0]
- else:
- self.jlink = self.defaultjlink()
- else:
- curList.addContainedElement(self.name, el)
- def defaultjlink(self):
- return self.name
- def jlinkstr(self, box):
- if self.jlink != None:
- return 'showjlink("'+self.jlink+'", ('+box+'));'
- return ""
- def repl(self, s):
- s = s.replace("%%", self.var)
- s = s.replace("%name%", self.name)
- if "stereo" in dir(self):
- s = s.replace("%stereo%", self.stereo or "")
- return s
- def drawCode(self):
- s = """
- drawmeasuredpic(%%);
- """
- return self.repl(s)
-
-class mpsequence:
- def getVarForY(self, before, after):
- """Get a variable name for a Y coordinate.
- Padding before and after.
- """
- v1 = randomVar()
- v2 = randomVar()
- yvar = self.yvar
- self.ycode += """
- numeric %(v1)s, %(v2)s;
- %(v2)s = %(yvar)s - %(before)s - %(after)s;
- %(v1)s = %(yvar)s - %(before)s;
- """ % locals()
- self.yvar = v2
- return v1;
- class call:
- def __init__(self, parent, sourcex, toks, l):
- self.var = randomVar()
- self.parent = parent
- self.targetx = "(xpart(%s.c))" % (toks[1])
- self.targetname = toks[1]
- if toks[1] not in parent.seqobjs:
- parent.seqobjs.append(toks[1])
- if sourcex == None:
- # self.sourcex = "(" + self.targetx + " - 100)"
- self.sourcex = "-50"
- else:
- self.sourcex = sourcex
- if len(toks) > 2:
- self.text = " ".join(toks[2:])
- else:
- self.text = "\"\""
- self.list = parent.parseContents(self.targetx, l)
- def setupCode(self):
- return " ".join([e.setupCode() for e in self.list])
- def measure(self):
- self.yu = self.parent.getVarForY(5,5)
- for e in self.list:
- e.measure()
- self.yl = self.parent.getVarForY(0, 15)
- def drawCode_measure(self):
- s = """
- sequencecallmeasure(%(sourcex)s, %(targetx)s, %(yu)s, %(yl)s,
%(text)s);
- """ % self.__dict__;
- return s + " ".join([e.drawCode_measure() for e in self.list])
- def drawCode_draw(self):
- s = """
- sequencecall(%(sourcex)s, %(targetx)s, %(yu)s, %(yl)s,
%(text)s);
- """ % self.__dict__;
- return s + " ".join([e.drawCode_draw() for e in self.list])
-
- class delete(call):
- def drawCode_measure(self):
- s = mpsequence.call.drawCode_measure(self)
- self.parent.seqobjsdeletes[self.targetname] = self.yl;
- return s
-
- def drawCode_draw(self):
- s = mpsequence.call.drawCode_draw(self)
- return (s +
- " sequencedestroy( %(targetx)s, %(yl)s ); "
- % self.__dict__)
- class create(call):
- def measure(self):
- self.yu = self.parent.getVarForY(10,10)
- for e in self.list:
- e.measure()
- self.yl = self.parent.getVarForY(20, 20)
- def drawCode_measure(self):
- s = """
- sequencecreatemeasure(%(sourcex)s, %(targetname)s, %(yu)s,
%(yl)s, %(text)s);
- """ % self.__dict__;
- return s + " ".join([e.drawCode_measure() for e in self.list])
-
- def drawCode_draw(self):
- s = """
- sequencecreate(%(sourcex)s, %(targetname)s, %(yu)s, %(yl)s,
%(text)s);
- """ % self.__dict__;
- return s + " ".join([e.drawCode_draw() for e in self.list])
-
-
-
- def __init__(self, var, s, l):
- self.seqobjs = []
- self.seqobjsdeletes = {}
- toks = s.split(" ");
- s = toks[0]
- self.var = var or s
- self.name = s
- self.list = self.parseContents(None, l)
- self.ycode = ""
-
- def parseContents(self, sourceName, list):
- l = []
- for el in list:
- toks = el[0].split(" ")
- s = toks[0]
- if s == "call":
- l.append(self.call(self, sourceName, toks, el[1:]))
- elif s == "delete":
- l.append(self.delete(self, sourceName, toks, el[1:]))
- elif s == "create":
- l.append(self.create(self, sourceName, toks, el[1:]))
- elif s == "return":
- pass
- else:
- assert 0, "Must have call or return, not '"+s+"'"
- return l
- def setupCode(self):
- return self.repl(
- " ".join([e.setupCode() for e in self.list])
- )
- def lifeend(self, obj):
- return self.seqobjsdeletes.get(obj, self.yvar)
- def drawCode(self):
- self.yvar = randomVar()
- self.ycode = "numeric %(yvar)s; %(yvar)s = -50;" % self.__dict__;
- for e in self.list:
- e.measure()
- m = self.ycode
- m += " ".join([e.drawCode_measure() for e in self.list])
- m += " ".join([
- "sequencedrawlifeline(%s, %s);" % (so, self.lifeend(so))
- for so in self.seqobjs
- ])
- m += " ".join([e.drawCode_draw() for e in self.list])
- return self.repl(m)
- def repl(self, s):
- s = s.replace("%%", self.var)
- return s
-
-
-class mpclass(namedEl):
- def __init__(self, var, s, l):
- print "mpclass:",s,l
- toks = s.split(" ");
- s = toks[0]
- self.stereo = None
- for tok in toks[1:]:
- mat = re.match('"(.*)"', tok)
- if mat:
- self.stereo = mat.group(1)
- self.var = var or s
- self.name = s
- self.methods = self.fields = []
- self.docontents(l)
- def handleContained(self, el):
- if el[0] == "methods":
- self.methods = el[1:]
- elif el[0] == "fields":
- self.fields = el[1:]
- else:
- namedEl.handleContained(self, el)
- def defaultjlink(self):
- if jlinkpackage != None and "." not in self.name:
- return jlinkpackage + "." + self.name
- return self.name
- def setupCode(self):
- s = """
- picture %%.cls, %%.pict, %%.meth, %%.sep, %%.fiel, %%.stereo;
- numeric %%.maxwid;
- %%.cls = classTitle("%name%");
- %%.meth = stackStrings(defaultfont, 1, METHODS);
- %%.fiel = stackStrings(defaultfont, 1, FIELDS);
- STEREO
-
- maxwid(%%.maxwid, %%.stereo);
- maxwid(%%.maxwid, %%.cls);
- maxwid(%%.maxwid, %%.meth);
- maxwid(%%.maxwid, %%.fiel);
-
- maxwidctr(%%.maxwid, %%.stereo);
- maxwidctr(%%.maxwid, %%.cls);
-
- %%.sep = nullpicture;
- addto %%.sep doublepath (0,0)--(%%.maxwid,0) withpen currentpen;
- %%.pict = stackpics(%%.stereo, %%.cls, %%.sep, %%.meth, %%.sep,
%%.fiel);
-
- picmeasurements(%%);
- """
- s = s.replace("METHODS", ", ".join(
- [ '"'+m[0]+'"' for m in self.methods ] ))
- s = s.replace("FIELDS", ", ".join(
- [ '"'+m[0]+'"' for m in self.fields ] ))
- if self.stereo:
- s = s.replace("STEREO",
- "%%.stereo = stereotype(\"%stereo%\");")
- else:
- s = s.replace("STEREO",
- "%%.stereo = nullpicture;")
- return self.repl(s)
- def drawCode(self):
- s = self.jlinkstr("bboxmeasuredpic(%%)") + """
- drawmeasuredpic(%%);
- draw bboxmeasuredpic(%%);
- """
- return self.repl(s)
-
-class mppackage(namedEl):
- def __init__(self, var, s, l):
- print "mppackage:",s,l
- self.var = var or s
- self.name = s
- self.docontents(l)
- def setupCode(self):
- s = """
- picture %%.pict;
- %%.pict = classTitle("%name%");
- picmeasurements(%%);
- """
- return self.repl(s)
- def drawCode(self):
- s = self.jlinkstr("bboxmeasuredpic(%%)") + """
- drawmeasuredpic(%%);
- draw bboxmeasuredpic(%%);
- draw (((0,0)--(15,0)--(15,5)--(0,5)--cycle) shifted %%.nw);
- """
- return self.repl(s)
-
-
-class simpleEl(namedEl):
- def __init__(self, var, s, l):
- print "mp simple element:",self, s,l
- self.var = var or s
- self.name = s
- self.docontents(l)
-
-# XXX underlining
-class mpseqobject(simpleEl):
- def setupCode(self):
- s = """
- picture %%.titl, %%.pict;
- picture %%.ghost.pict;
- %%.titl = classTitle("%name%");
- %%.pict = %%.titl;
- addto %%.pict doublepath bbox %%.titl;
- %%.ghost.pict = %%.titl;
- picmeasurements(%%);
- picmeasurements(%%.ghost);
- xpart(%%.c) = xpart(%%.ghost.c);
- """
- return self.repl(s)
- def drawCode(self):
- s = """
- if not known(ypart(%%.c)):
- ypart(%%.c) = ypart(%%.ghost.c);
- fi
- drawmeasuredpic(%%);
- """
- return self.repl(s)
-
-
-
-
-class mpcomponent(simpleEl):
- def setupCode(self):
- s = """
- picture %%.titl, %%.pict;
- %%.titl = classTitle("%name%");
- %%.pict = %%.titl;
- addto %%.pict doublepath bbox %%.titl;
-
- picmeasurements(%%);
- """
- return self.repl(s)
-
-class mpinterface(simpleEl):
- def setupCode(self):
- s = """
- picture %%.titl, %%.pict, %%.intlabel.pict;
- %%.pict = nullpicture;
- addto %%.pict doublepath (((0,1)..(1,0)..(0,-1)..(-1,0)..cycle)
scaled 5);
- %%.intlabel.pict = classTitle("%name%");
-
- picmeasurements(%%);
- picmeasurements(%%.intlabel);
- """
- return self.repl(s)
- def drawCode(self):
- s = """
- drawmeasuredpic(%%);
- if not known %%.intlabel.c:
- %%.intlabel.nw = %%.se;
- fi
- drawmeasuredpic(%%.intlabel);
- """
- return self.repl(s)
-
-class mpnary(simpleEl):
- def setupCode(self):
- s = """
- picture %%.pict;
- %%.pict = naryassoc;
- picmeasurements(%%);
- """
- return self.repl(s)
- def drawCode(self):
- s = """
- drawmeasuredpic(%%);
- """
- return self.repl(s)
-
-class mpbigpackage(simpleEl):
- def setupCode(self):
- s = """
- picture %%.titl.pict;
- %%.titl.pict = classTitle("%name%");
- addto %%.titl.pict doublepath (bbox %%.titl.pict) withpen
currentpen;
-
- unknownpicmeasurements(%%);
- picmeasurements(%%.titl);
- %%.titl.sw = %%.nw;
- """
- return self.repl(s)
- def drawCode(self):
- s = self.jlinkstr("bboxmeasuredpic(%%)") + """
- fixmeasuredpic(%%);
- draw bboxmeasuredpic(%%);
- drawmeasuredpic(%%.titl);
- """
- return self.repl(s)
-
-
-
-
-class mpqual(namedEl):
- def __init__(self, var, s, l):
- self.var = var
- self.name = "q"
- self.fields = []
- self.docontents(l)
- def handleContained(self, el):
- if el[0] == "fields":
- self.fields = el[1:]
- else:
- namedEl.handleContained(self, el)
- def setupCode(self):
- s = """
- picture %%.pict;
- %%.pict = stackStrings(defaultfont, 1, FIELDS);
- addto %%.pict doublepath bbox(%%.pict) ;
- picmeasurements(%%);
- """
- s = s.replace("FIELDS", ", ".join(
- [ '"'+m[0]+'"' for m in self.fields ] ))
- return self.repl(s)
-
-class mpassoc(namedEl):
- class end(namedEl):
- def __init__(self, var, list):
- self.var = var
- self.name = ""
- self.obj = list.pop(0)
- self.type = ""
- self.role = " "
- self.multi = " "
- while len(list) > 0:
- el = list.pop(0)
- if el == "-":
- return
- elif el == "aggreg" or el == "compos":
- self.type = el
- else:
- mat = re.match("^multi\((.*)\)$", el)
- if mat:
- self.multi = mat.group(1)
- continue
- mat = re.match("^role\((.*)\)$", el)
- if mat:
- self.role = mat.group(1)
- continue
- assert 0, "Invalid assoc adorn "+el
- def setupCode(self):
- s = """
- picture %%.multi, %%.role;
- path %%.p;
- %%.multi = adornmentName("MULTI");
- %%.role = adornmentName("ROLE");
- """
- s = s.replace("MULTI", self.multi).replace("ROLE", self.role)
- return self.repl(s)
- def drawCode(self):
- s = """
- %sassoc(%%.p, %%.multi, %%.role);
- """
- s = self.repl(s) % self.type;
- return s
-
-
- def __init__(self, var, s, l):
- self.var = var or randomVar()
- self.name = ""
- self.mems = s.split()
-
- self.a = self.end(self.var+".a", self.mems)
- self.mems.reverse()
- self.b = self.end(self.var+".b", self.mems)
-
- def setupCode(self):
- s = """
- path %%.p;
- """ + self.a.setupCode() + self.b.setupCode()
- return self.repl(s)
- def drawCode(self):
- s = """
- if not known %%.p:
- %%.p = backuppath(START, END);
- show %%.p;
- else:
- %%.p := clipmeasuredpath(START, END, %%.p);
- fi
- %%.a.p = subpath(0,0.5*length(%%.p)) of %%.p;
- %%.b.p = subpath(length(%%.p),0.5*length(%%.p)) of %%.p;
- """ + self.a.drawCode() + self.b.drawCode()
- return self.repl(s).replace("START", self.a.obj).replace("END",
self.b.obj)
-
-
-class simpleRel(namedEl):
- def __init__(self, var, s, l):
- self.var = var or randomVar()
- self.name = ""
- ends = s.split()
- assert len(ends) == 2
- self.start = ends[0]
- self.end = ends[1]
- def setupCode(self):
- s = """
- path %%.p;
- """
- return self.repl(s)
- def pathCode(self):
- s = """
- if not known %%.p:
- %%.p = backuppath(START, END);
- show %%.p;
- else:
- %%.p := clipmeasuredpath(START, END, %%.p);
- fi
- """
- return self.repl(s).replace("START", self.start).replace("END",
self.end)
-
-class mpsupply(simpleRel):
- def drawCode(self):
- return self.pathCode() + self.repl(" draw %%.p; ")
-
-class mpuse(simpleRel):
- def drawCode(self):
- return self.pathCode() + self.repl(" drawarrow %%.p dashed evenly; ")
-
-class mprealize(simpleRel):
- def drawCode(self):
- return self.pathCode() + self.repl(" realize(%%.p); ")
-
-class mpinherit(simpleRel):
- def drawCode(self):
- return self.pathCode() + self.repl(" inherit(%%.p); ")
-
-class mpdep(simpleRel):
- def __init__(self, var, s, l):
- (m,s) = matchRemove('^\s*"(\w*)"\s*', s)
- self.stereo = m.group(1)
- simpleRel.__init__(self, var, s, l)
- def drawCode(self):
- return self.pathCode() + self.repl(' dep(%%.p, "%stereo%"); ')
-
-curList = None
-
-class mplist:
- def __init__(self, l):
- global curList;
- curList = self
- self.extras = []
- self.list = filter(None, [self.parseElement(i) for i in l])
- self.list.extend(self.extras)
- def addContainedElement(self, containerName, e):
- s = e[0]
- (w,s) = matchRemove("^\s*(\w+)\s*", s)
- key = w.group(1)
- type = self.getType(key)
- print "Internal: ", type
- element = type(None, containerName + " " + s, e[1:])
- self.extras.append(element)
-
- def parseElement(self, e):
- s = e[0]
- name = None
- (m,s) = matchRemove("^\s*(\w+)\s*=\s*", s)
- if m: name = m.group(1)
- (w,s) = matchRemove("^\s*(\w+)\s*", s)
- key = w.group(1)
- if key == "jlinkpackage":
- global jlinkpackage
- jlinkpackage = s
- return None
- type = self.getType(key)
- print type
- return type(name, s, e[1:])
-
- def getType(self,key):
- if key == "class": type = mpclass
- elif key == "qual": type = mpqual
- elif key == "component": type = mpcomponent
- elif key == "interface": type = mpinterface
- elif key == "assoc": type = mpassoc
- elif key == "naryassoc": type = mpnary
- elif key == "supply": type = mpsupply
- elif key == "use": type = mpuse
- elif key == "dep": type = mpdep
- elif key == "package": type = mppackage
- elif key == "inherit": type = mpinherit
- elif key == "realize": type = mprealize
- elif key == "bigpackage": type = mpbigpackage
- elif key == "seqobject": type = mpseqobject
- elif key == "sequence": type = mpsequence
- else:
- assert 0, "Unknown key! "+key
- return type
- def setupCode(self):
- "The code to set up the metapost objects for user geometry code"
- return "\n".join([e.setupCode() for e in self.list]) + "\n"
- def drawCode(self):
- "The code to draw the objects after the user code"
- code = "\n".join([e.drawCode() for e in self.list]) + "\n"
- code += """
- showjlinksize("bbox", (bbox currentpicture));
- """
- return code
-
-class jlink:
- def __init__(self, els):
- self.name = re.match('^"(.*)"$', els[0]).group(1)
- self.corners = [float(e) for e in els[1:]]
- print "JLINK INIT: ",self.name
- def mapCorners(self, mapper):
- print "UnMapped: ", self.corners
- self.corners = [int(e) for e in (
- mapper(self.corners[0], self.corners[1]) +
- mapper(self.corners[2], self.corners[3])
- )]
- print "Mapped: ", self.corners
- def imgmapanchor(self):
- ts = self.name.split(".")
- if re.search("html", ts[-1]):
- target = self.name
- elif re.match("^[a-z]", ts[-1]):
- target = ("../javadoc/" + "/".join(ts)
- + "/package-summary.html#package_description")
- else:
- target = ("../javadoc/" + "/".join(ts)
- + ".html")
- return """<A href="%s" shape="rect" coords="%s" target="_top">%s</A>"""
% (
- target, ",".join(["%s"%c for c in self.corners]), self.name
- )
-
-
-def roundDown(x):
- return int(float(x) - 5)
-def roundUp(x):
- return int(float(x) + 5)
-
-class psbbox:
- def __init__(self, els):
- self.x=(roundDown(els[0]), roundUp(els[2]))
- self.y=(roundUp(els[1]), roundDown(els[3]))
- self.scale = 1 # 1 point = 1 pixel
- self.w = self.scale*(self.x[1]-self.x[0])
- self.h = self.scale*(self.y[0]-self.y[1])
- def mapPoint(self, x, y):
- return (self.scale * (x - self.x[0]),
- self.h - self.scale * (y - self.y[1])); # reverse y
- def pstopnm(self, scale):
- dpi = 72.0
- return ["%s"%r for r in [ "-llx", self.x[0]/dpi, "-lly", self.y[1]/dpi,
- "-urx", self.x[1]/dpi, "-ury", self.y[0]/dpi,
- "-xsize", self.w * scale, "-ysize", self.h * scale,
- "-xborder", 0, "-yborder", 0]]
-
-
-def run(prefix):
- s = open(prefix+".uml").read()
-
- l = parseIndented(s)
- m = mplist(l)
-
- open(prefix+".gen1", "w").write(m.setupCode())
- open(prefix+".gen2", "w").write(m.drawCode())
- open(prefix+".gen3", "w").write("""
-
- prologues := 1;
- input umlhelper.mp
-
- beginfig(1)
-
- input %(prefix)s.gen1
- input %(prefix)s.mp
- input %(prefix)s.gen2
- endfig
- end
- """ % locals())
-
-
- assert not os.spawnlp(os.P_WAIT,
- "/usr/bin/mpost", "/usr/bin/mpost", prefix+".gen3")
-
- log = open(prefix+".log").read()
- print "LINKS"
- links = []
-
- log = log.replace("\n","") # mpost splits lines awkwardly in the log.
-
- for link in re.findall("JLINKRECT\((.*?)\)", log):
- els = link.split(",")
- if els[0] == "\"bbox\"":
- bbox = els
- else:
- links.append(jlink(els))
- print links
- print "BBOX", bbox
- bbox = psbbox(bbox[1:])
- for link in links: link.mapCorners(bbox.mapPoint)
-
- list = bbox.pstopnm(4)
- print "PSTOPNM: ", list
- cmd = ("pstopnm -verbose "+" ".join(list)+" <"+prefix+""".1 | pnmscale
-reduce 4 |
- pnmtopng >"""+prefix+".png")
- print "Command:",cmd
- os.system(cmd)
-
- htmlcode = """<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
- "http://www.w3.org/TR/html4/strict.dtd">
- <HTML>
- <HEAD>
- <TITLE>Autogenerated UML imagemap</TITLE>
- </HEAD>
- <BODY>
- <P>
- %(prefix)s<BR>
- <OBJECT data="%(filename)s" type="image/png" usemap="#map1">
- <MAP name="map1">
- <P>
- The UML diagram as PNG. Links us to
- %(links)s
- </MAP>
- </OBJECT>
- </BODY>
- </HTML>
- """ % { "prefix": prefix,
- "filename": prefix+".png",
- "links": " ".join([l.imgmapanchor() for l in links]) }
- open(prefix+".html", "w").write(htmlcode)
-
-
-
-# run("core")
-# run("pp")
+from umltool import *
for prefix in sys.argv[1:]:
run(prefix)
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Gzz-commits] gzz/metacode uml.py umltool.py,
Asko Soukka <=