createdoc.py
changeset 72 e7b44716a564
child 73 f2f247a5b6c9
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/createdoc.py	Tue Dec 06 19:46:00 2011 +0100
@@ -0,0 +1,128 @@
+#!/usr/bin/env python2.7
+# -*- coding: utf-8 -*- 
+
+from genshi.template import TemplateLoader
+
+loader = TemplateLoader('doc/tmpl', auto_reload=True)
+
+import re
+import inspect
+from iro.user import User
+
+
+user_methods = dict(inspect.getmembers(User(None,None)))
+
+class Link():
+    def __init__(self,name,title):
+        self.name=name
+        self.title=title
+
+    def getLink(self):
+        return self.name
+
+    def __getitem__(self,name):
+        if name == "link":
+            return self.getLink()
+        return AttributeError(name)
+
+class Site(Link):
+    pass
+
+
+class Keyword():
+    def __init__(self,name,typ,description):
+        self.name=name
+        self.typ=typ
+        self.description=description
+
+def section(text):
+    ret={}
+    li=[]
+    kw=None
+    for line in text.split("\n"):
+        if re.match("^\s*$",line):
+            continue
+
+        if line[0] not in (" ","\t"):
+            if kw:
+                ret[kw.name]=kw
+                li.append(kw)
+            l=re.match(r"^(?P<name>[a-zA-Z0-9-_.]*)\[(?P<typ>[a-zA-Z0-9-_]*)\]:(?P<d>.*)$",line)
+            kw=Keyword(name=l.group("name"),typ=l.group("typ"),description=l.group("d"))
+        else:
+            kw.description+="\n"+line.strip()
+    if kw:
+        ret[kw.name]=kw
+        li.append(kw)
+    return ret,li
+
+
+
+def keywords(f):
+    doc=f.__doc__
+    kwds=re.search("Keywords:\n(?P<keywords>(?P<whitespace>\s*)(.+\n)*)\n",doc)
+    k=kwds.group("keywords")
+    #get rid of beginning whitespaces
+    k=re.sub(re.compile(r"^"+kwds.group("whitespace"),re.M),"",k)
+    return section(k)
+
+def ret(f):
+    doc=f.__doc__
+    kwds=re.search("Return:\n(?P<ret>(?P<whitespace>\s*)(.+\n)*)\n",doc)
+    k=kwds.group("ret")
+    #get rid of beginning whitespaces
+    k=re.sub(re.compile(r"^"+kwds.group("whitespace"),re.M),"",k)
+    return section(k)
+
+
+
+class Arg():
+    def __init__(self,name,f):
+        self.name=name
+        k,_ = keywords(f)
+        kwd=k[name]
+        self.typ=kwd.typ
+        self.description=kwd.description
+
+        
+
+class Method(Link):
+    def __init__(self,name,title):
+        Link.__init__(self,name,title)
+        m=user_methods[name]
+        self.description = m.__doc__.split("\n")[0]
+        a=inspect.getargspec(m)
+        self.args=[Arg(a,m) for a in a.args if a is not "self"]
+        _, self.rets=ret(m)
+
+
+def main():
+    sites=[Site("index.html","Iro"),
+           Site("current.html","API Documentation"),
+           Site("new.html","geplante API Documentation"),
+           Site("impressum.html","Impressum"),
+           ]
+
+    methods=[
+            Method("startSMS","StartSMS"),
+            Method("startFAX","StartFAX"),
+            Method("startMail","StartMail"),
+            
+            Method("status","Status"),
+            Method("stop","Stop"),
+            
+            Method("getProvider","GetProvider"),
+            Method("getDefaultProvider","GetDefaultProvider"),
+            ]
+    for site in sites:
+        print("generiere %s" % site.name)
+        tmpl = loader.load(site.name)
+        def a(s):
+            if s == site:
+                return {"class":"menu active"}
+        stream = tmpl.generate(sites=sites,active=a,methods=methods)
+        with open('doc/'+site.name, "w") as g:
+            g.write(stream.render('html', doctype='html'))
+
+if __name__ == '__main__':
+    main()