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