--- 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)
+