Mercurial > public > mercurial-scm > hg
diff mercurial/templater.py @ 5976:9f1e6ab76069
templates: move filters to their own module
This eliminates just about all Mercurial dependencies in templater.py
author | Matt Mackall <mpm@selenic.com> |
---|---|
date | Thu, 31 Jan 2008 14:44:19 -0600 |
parents | 75d9fe70c654 |
children | d2713d902524 |
line wrap: on
line diff
--- a/mercurial/templater.py Thu Jan 31 14:44:19 2008 -0600 +++ b/mercurial/templater.py Thu Jan 31 14:44:19 2008 -0600 @@ -6,7 +6,7 @@ # of the GNU General Public License, incorporated herein by reference. from i18n import _ -import cgi, re, sys, os, time, urllib, util, textwrap +import re, sys, os def parsestring(s, quoted=True): '''parse a string using simple c-like syntax. @@ -122,157 +122,6 @@ v = self.filters[f](v) yield v -agescales = [("second", 1), - ("minute", 60), - ("hour", 3600), - ("day", 3600 * 24), - ("week", 3600 * 24 * 7), - ("month", 3600 * 24 * 30), - ("year", 3600 * 24 * 365)] - -agescales.reverse() - -def age(date): - '''turn a (timestamp, tzoff) tuple into an age string.''' - - def plural(t, c): - if c == 1: - return t - return t + "s" - def fmt(t, c): - return "%d %s" % (c, plural(t, c)) - - now = time.time() - then = date[0] - delta = max(1, int(now - then)) - - for t, s in agescales: - n = delta / s - if n >= 2 or s == 1: - return fmt(t, n) - -def stringify(thing): - '''turn nested template iterator into string.''' - if hasattr(thing, '__iter__'): - return "".join([stringify(t) for t in thing if t is not None]) - return str(thing) - -para_re = None -space_re = None - -def fill(text, width): - '''fill many paragraphs.''' - global para_re, space_re - if para_re is None: - para_re = re.compile('(\n\n|\n\\s*[-*]\\s*)', re.M) - space_re = re.compile(r' +') - - def findparas(): - start = 0 - while True: - m = para_re.search(text, start) - if not m: - w = len(text) - while w > start and text[w-1].isspace(): w -= 1 - yield text[start:w], text[w:] - break - yield text[start:m.start(0)], m.group(1) - start = m.end(1) - - return "".join([space_re.sub(' ', textwrap.fill(para, width)) + rest - for para, rest in findparas()]) - -def firstline(text): - '''return the first line of text''' - try: - return text.splitlines(1)[0].rstrip('\r\n') - except IndexError: - return '' - -def isodate(date): - '''turn a (timestamp, tzoff) tuple into an iso 8631 date and time.''' - return util.datestr(date, format='%Y-%m-%d %H:%M') - -def hgdate(date): - '''turn a (timestamp, tzoff) tuple into an hg cset timestamp.''' - return "%d %d" % date - -def nl2br(text): - '''replace raw newlines with xhtml line breaks.''' - return text.replace('\n', '<br/>\n') - -def obfuscate(text): - text = unicode(text, util._encoding, 'replace') - return ''.join(['&#%d;' % ord(c) for c in text]) - -def domain(author): - '''get domain of author, or empty string if none.''' - f = author.find('@') - if f == -1: return '' - author = author[f+1:] - f = author.find('>') - if f >= 0: author = author[:f] - return author - -def person(author): - '''get name of author, or else username.''' - f = author.find('<') - if f == -1: return util.shortuser(author) - return author[:f].rstrip() - -def shortdate(date): - '''turn (timestamp, tzoff) tuple into iso 8631 date.''' - return util.datestr(date, format='%Y-%m-%d', timezone=False) - -def indent(text, prefix): - '''indent each non-empty line of text after first with prefix.''' - lines = text.splitlines() - num_lines = len(lines) - def indenter(): - for i in xrange(num_lines): - l = lines[i] - if i and l.strip(): - yield prefix - yield l - if i < num_lines - 1 or text.endswith('\n'): - yield '\n' - return "".join(indenter()) - -def permissions(flags): - if "l" in flags: - return "lrwxrwxrwx" - if "x" in flags: - return "-rwxr-xr-x" - return "-rw-r--r--" - -common_filters = { - "addbreaks": nl2br, - "basename": os.path.basename, - "age": age, - "date": lambda x: util.datestr(x), - "domain": domain, - "email": util.email, - "escape": lambda x: cgi.escape(x, True), - "fill68": lambda x: fill(x, width=68), - "fill76": lambda x: fill(x, width=76), - "firstline": firstline, - "tabindent": lambda x: indent(x, '\t'), - "hgdate": hgdate, - "isodate": isodate, - "obfuscate": obfuscate, - "permissions": permissions, - "person": person, - "rfc822date": lambda x: util.datestr(x, "%a, %d %b %Y %H:%M:%S"), - "rfc3339date": lambda x: util.datestr(x, "%Y-%m-%dT%H:%M:%S", True, "%+03d:%02d"), - "short": lambda x: x[:12], - "shortdate": shortdate, - "stringify": stringify, - "strip": lambda x: x.strip(), - "urlescape": lambda x: urllib.quote(x), - "user": lambda x: util.shortuser(x), - "stringescape": lambda x: x.encode('string_escape'), - } - def templatepath(name=None): '''return location of template file or directory (if no name). returns None if not found.''' @@ -289,3 +138,9 @@ if (name and os.path.exists(p)) or os.path.isdir(p): return os.path.normpath(p) +def stringify(thing): + '''turn nested template iterator into string.''' + if hasattr(thing, '__iter__'): + return "".join([stringify(t) for t in thing if t is not None]) + return str(thing) +