#!/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()