python-hserver/hserver/templates/templatemodule.py

90 lines
2.0 KiB
Python

import os
import os.path
import hserver
class TemplateModule:
def __init__(self,path,parent=None):
self.__path = path
self.__parent = parent
self.__children = {}
self.__altchildren = {}
self.__load()
def __load(self):
if not os.path.exists( self.__path ):
return
l = os.listdir( self.__path )
for fn in l:
p = "%s/%s" % (self.__path, fn)
o = None
if os.path.isdir( p ):
o = TemplateModule( p, self)
elif (os.path.isfile( p )):
o = hserver.Template( template=fn, base=self.__path, provider=self)
if not o is None:
self.__children[ fn ] = o
self.__altchildren[ self.transform(fn) ] = o
def transform(self,name):
if not name[0].isalpha():
name = "_%s" % (name,)
return name.replace(".","_")
def __getattr__(self,name):
if not ((name in self.__children) or (name in self.__altchildren)):
self.__load()
if name in self.__children:
return self.__children[name]
if name in self.__altchildren:
return self.__altchildren[name]
if not self.__parent is None:
return self.__parent.__getattr__(name)
raise AttributeError("%s not found in %s" % (name,self))
def __getitem__(self,name):
if not ((name in self.__children) or (name in self.__altchildren)):
self.__load()
if name in self.__children:
return self.__children[name]
if name in self.__altchildren:
return self.__altchildren[name]
if not self.__parent is None:
return self.__parent.__getitem__(name)
raise IndexError("%s not found in %s" % (name,self))
def __contains__(self,name):
if not ((name in self.__children) or (name in self.__altchildren)):
self.__load()
return (name in self.__children) or (name in self.__altchildren)
def provide(self,name):
s = name.split("/")
if len(s) > 1:
return self[s[0]].provide("/".join(s[1:]))
return self[s[0]]
def __str__(self):
cl = []
for c in self.__children:
cl.append( c )
return "<TemplateModule (%s)>" % (", ".join(cl))