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: