aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--htmlchangelog.py60
-rw-r--r--templates/block.html8
-rw-r--r--templates/cl.html21
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">&lt;agx@sigxcpu.org&gt;</a></p>
+ </div>
+ </body>
+</html>
+