terom@5: terom@5: """ terom@5: HTML output terom@5: """ terom@5: terom@5: import os.path terom@5: terom@13: def urljoin (*parts) : terom@13: url = "" terom@13: terom@13: for part in parts : terom@13: if part : terom@13: if url : terom@13: url += "/" + part terom@13: else : terom@13: url += part terom@13: terom@13: return url terom@13: terom@22: class BaseFormatter (object) : terom@22: """ terom@22: Trivial HTML template formatter. terom@22: """ terom@22: terom@22: def __init__ (self, basedir, encoding = 'utf-8') : terom@22: """ terom@22: basedir - directory containing the required .html files terom@22: encoding - unicode encoding of file content (default: utf-8) terom@22: """ terom@22: terom@22: self.basedir = os.path.abspath(basedir) terom@22: self.encoding = encoding terom@22: terom@22: def render (self, name, **vars) : terom@22: """ terom@22: Format and return given template. terom@22: terom@22: name - basename of template without .html terom@22: **vars - template context terom@22: terom@22: The template is rendered and returned as unicode. terom@22: """ terom@22: terom@22: path = os.path.join(self.basedir, name) + '.html' terom@22: terom@22: # read contents terom@22: data = open(path).read().decode(self.encoding) terom@22: terom@22: # format terom@22: return data % vars terom@22: terom@22: terom@22: # XXX: legacy terom@22: class Formatter (BaseFormatter) : terom@22: terom@5: TEMPLATE_DIR = 'etc/templates' terom@5: terom@5: IMG_URL = '%(prefix)s?t=%(target)s&s=%(style)&i=%(interval)s' terom@5: TARGET_URL = '%(prefix)s?t=%(target)s' terom@5: terom@5: def __init__ (self, template_dir=TEMPLATE_DIR, url_prefix='', img_url=IMG_URL, target_url=TARGET_URL) : terom@22: BaseFormatter.__init__(self, template_dir, 'utf-8') terom@22: terom@5: self.url_prefix = url_prefix terom@5: self.img_url = img_url terom@5: self.target_url = target_url terom@5: terom@5: def page (self, content) : terom@5: """ terom@5: Format page contents terom@5: """ terom@5: terom@25: return self.render('layout', terom@25: title = 'MRTG', terom@25: breadcrumb = '', # XXX: not supported terom@25: content = content terom@25: ) terom@5: terom@5: def fmt_img_url (self, style, interval, target) : terom@5: return self.img_url % dict( terom@5: prefix = self.url_prefix, terom@11: target = target, terom@5: style = style, terom@5: interval = interval, terom@5: ) terom@5: terom@5: def fmt_target_url (self, target) : terom@5: return self.target_url % dict( terom@5: prefix = self.url_prefix, terom@11: target = target, terom@5: ) terom@5: terom@25: def overview (self, dirname, targets) : terom@5: """ terom@11: Format target listing for given list of (target, title) pairs terom@5: """ terom@5: terom@22: return self.page(self.render('overview', terom@25: dir = dirname, terom@25: overview_subdirs = '', # XXX: not supported terom@25: overview_graphs = '\n'.join( terom@22: self.render('overview-target', terom@11: title = title, terom@5: daily_overview_img = self.fmt_img_url('overview', 'daily', target), terom@5: target_url = self.fmt_target_url(target), terom@5: terom@11: ) for target, title in targets terom@25: ), terom@5: )) terom@5: terom@11: def target (self, target, title) : terom@5: """ terom@5: Format a specific target terom@5: """ terom@5: terom@22: return self.page(self.render('target', terom@11: title = title, terom@5: daily_img = self.fmt_img_url('detail', 'daily', target), terom@5: weekly_img = self.fmt_img_url('detail', 'weekly', target), terom@5: yearly_img = self.fmt_img_url('detail', 'yearly', target), terom@5: )) terom@5: