2013-06-16 10:06:21 +03:00
|
|
|
#!/usr/bin/env python2
|
|
|
|
|
2013-06-10 22:43:03 +03:00
|
|
|
import re
|
2013-06-03 23:19:06 +03:00
|
|
|
import os
|
|
|
|
import os.path
|
|
|
|
import sys
|
|
|
|
|
2013-06-10 22:43:03 +03:00
|
|
|
PREPROCESS_RE = re.compile("^\s*#")
|
2013-06-14 23:20:45 +03:00
|
|
|
INCLUDE_RE = re.compile('^\s*#include\s*"([-\w]+)"')
|
2013-06-10 22:43:03 +03:00
|
|
|
|
2013-06-03 23:19:06 +03:00
|
|
|
class Templates (object):
|
2013-06-04 01:22:54 +03:00
|
|
|
def __init__(self, templatedirs, extension):
|
2013-06-03 23:19:06 +03:00
|
|
|
self.extension = extension
|
|
|
|
self.cached_templates = {}
|
2013-06-04 01:22:54 +03:00
|
|
|
self.templatedirs = templatedirs
|
2013-06-03 23:19:06 +03:00
|
|
|
|
|
|
|
def get(self, name):
|
|
|
|
if name in self.cached_templates:
|
|
|
|
return self.cached_templates[name]
|
2013-06-04 01:22:54 +03:00
|
|
|
for templatedir in self.templatedirs:
|
|
|
|
if self.has_template_in(templatedir, name):
|
|
|
|
return self.get_in(templatedir, name)
|
2013-06-10 23:15:54 +03:00
|
|
|
elif self.has_template_in(templatedir, name, 'DEFAULT', 'txt'):
|
|
|
|
return self.get_in(templatedir, name, 'DEFAULT', 'txt')
|
2013-06-04 23:32:03 +03:00
|
|
|
return ""
|
2013-06-04 01:22:54 +03:00
|
|
|
|
2013-06-10 23:15:54 +03:00
|
|
|
def has_template_in(self, templatedir, name, subdir=None, extension=None):
|
2013-06-04 01:22:54 +03:00
|
|
|
# FIXME better test
|
2013-06-10 23:15:54 +03:00
|
|
|
return os.path.exists(self.get_template_filename(templatedir, name,
|
|
|
|
subdir,
|
|
|
|
extension))
|
2013-06-04 01:22:54 +03:00
|
|
|
|
2013-06-10 23:15:54 +03:00
|
|
|
def get_in(self, templatedir, name, subdir=None, extension=None):
|
|
|
|
filename = self.get_template_filename(templatedir, name, subdir, extension)
|
2013-06-03 23:19:06 +03:00
|
|
|
f = open(filename, "r")
|
2013-06-10 22:43:03 +03:00
|
|
|
template = self.read_template(f);
|
2013-06-03 23:19:06 +03:00
|
|
|
f.close()
|
|
|
|
self.cached_templates[name] = template
|
|
|
|
return template
|
|
|
|
|
2013-06-10 22:43:03 +03:00
|
|
|
def read_template(self, f):
|
|
|
|
res = ""
|
|
|
|
for line in f.readlines():
|
|
|
|
if PREPROCESS_RE.match(line):
|
|
|
|
res += self.preprocessline(line)
|
|
|
|
else:
|
|
|
|
res += line
|
|
|
|
return res
|
|
|
|
|
|
|
|
def preprocessline(self, line):
|
|
|
|
m = INCLUDE_RE.match(line)
|
|
|
|
if m:
|
|
|
|
return self.get(m.group(1))
|
|
|
|
else:
|
|
|
|
raise Exception("Bad preprocessor line '%s' in template." % line)
|
|
|
|
|
2013-06-10 23:15:54 +03:00
|
|
|
def get_template_filename(self, templatedir, name, subdir=None, extension=None):
|
|
|
|
if not subdir:
|
|
|
|
subdir = self.extension
|
|
|
|
if not extension:
|
|
|
|
extension = self.extension
|
|
|
|
return os.path.join(templatedir, subdir, name + "." + extension)
|
2013-06-16 10:06:21 +03:00
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
|
templates = Templates(['templates'], sys.argv[1])
|
|
|
|
print templates.get(sys.argv[2])
|