diff options
-rw-r--r-- | htmlchangelog.py | 60 | ||||
-rw-r--r-- | templates/block.html | 8 | ||||
-rw-r--r-- | templates/cl.html | 21 |
3 files changed, 89 insertions, 0 deletions
diff --git a/htmlchangelog.py b/htmlchangelog.py new file mode 100644 index 0000000..4c13bdc --- /dev/null +++ b/htmlchangelog.py @@ -0,0 +1,60 @@ +# vim: set fileencoding=utf-8 : + +import re +import cgi +from genshi.template import TemplateLoader +import debian_bundle.changelog +import vcsbrowsers + +_TEMPLATEDIR='templates/' + +class HTMLChangelogFilter(object): + commit_id_re = re.compile(r"(?P<s>\s+\*\s+\[)" + +r"(?P<commitid>[a-fA-F0-9]{7,})" + +r"(?P<e>\]\s+.*)") + + def __init__(self, vcsbrowser=None): + self.vcsbrowser=vcsbrowser + + def vcs_commit_filter(self, changes): + body = [] + for line in changes: + line = cgi.escape(line) + m = self.commit_id_re.match(line) + if m: + commitid = m.group('commitid') + link = '<a href="%s">%s</a>' % (self.vcsbrowser.commit(commitid), commitid) + body.append(m.group("s") + link + m.group("e")) + else: + body.append(line) + return "\n".join(body) + + def markup_block(self, block): + if self.vcsbrowser: + block.body = self.vcs_commit_filter(block.changes()) + else: + block.body = cgi.escape("\n".join(block.changes())) + return block + + +class HTMLChangelog(debian_bundle.changelog.Changelog): + def __init__(self, file=None, max_blocks=None, allow_empty_author=False, strict=True, templatedir=_TEMPLATEDIR, vcsbrowser=None): + debian_bundle.changelog.Changelog.__init__(self, file=file, max_blocks=max_blocks, + allow_empty_author=allow_empty_author, + strict=strict) + self.templatedir = templatedir + loader = TemplateLoader(self.templatedir) + self.html_tmpl = loader.load('cl.html') + self.block_tmpl = loader.load('block.html') + self.filter = HTMLChangelogFilter(vcsbrowser=vcsbrowser) + + def markup_block(self, block): + return self.block_tmpl.generate(block=self.filter.markup_block(block)) + + def stream(self): + title = u"Changelog for %s (%s)" % (self.get_package(), self.get_version()) + return self.html_tmpl.generate(title=title, blocks=self._blocks, markup_block=self.markup_block) + + def __str__(self): + return self.stream().render('xhtml', doctype='xhtml-strict') + diff --git a/templates/block.html b/templates/block.html new file mode 100644 index 0000000..1e06b7d --- /dev/null +++ b/templates/block.html @@ -0,0 +1,8 @@ +<div xmlns="http://www.w3.org/1999/xhtml" + xmlns:py="http://genshi.edgewall.org/"> +<h3>${block.package} (${block._raw_version}) ${block.distributions}; urgency=${block.urgency}${block.urgency_comment}</h3> +<pre>${Markup(block.body)}</pre> +<p py:if="not block._no_trailer"> + -- ${block.author} ${block._trailer_separator} ${block.date} +</p> +</div> diff --git a/templates/cl.html b/templates/cl.html new file mode 100644 index 0000000..293862f --- /dev/null +++ b/templates/cl.html @@ -0,0 +1,21 @@ +<html xmlns="http://www.w3.org/1999/xhtml" + xmlns:py="http://genshi.edgewall.org/"> + <head> + <title>$title</title> + </head> + <body class="index"> + <div id="header"> + <h1>$title</h1> + </div> + + <py:for each="block in blocks"> + ${markup_block(block)} + </py:for> + + <div id="footer"> + <hr/> + <p>Genrated via <a href="/cl2vcs">cl2vcs</a> -- © 2008 Guido Günther <a href="mailto:agx@sigxcpu.org"><agx@sigxcpu.org></a></p> + </div> + </body> +</html> + |