##// END OF EJS Templates
templatefilters: sort function definitions
Patrick Mezard -
r13588:b8b881f3 default
parent child Browse files
Show More
@@ -8,11 +8,9 b''
8 8 import cgi, re, os, time, urllib
9 9 import encoding, node, util
10 10
11 def stringify(thing):
12 '''turn nested template iterator into string.'''
13 if hasattr(thing, '__iter__') and not isinstance(thing, str):
14 return "".join([stringify(t) for t in thing if t is not None])
15 return str(thing)
11 def addbreaks(text):
12 '''replace raw newlines with xhtml line breaks.'''
13 return text.replace('\n', '<br/>\n')
16 14
17 15 agescales = [("year", 3600 * 24 * 365),
18 16 ("month", 3600 * 24 * 30),
@@ -46,6 +44,17 b' def age(date):'
46 44 if n >= 2 or s == 1:
47 45 return '%s ago' % fmt(t, n)
48 46
47 def domain(author):
48 '''get domain of author, or empty string if none.'''
49 f = author.find('@')
50 if f == -1:
51 return ''
52 author = author[f + 1:]
53 f = author.find('>')
54 if f >= 0:
55 author = author[:f]
56 return author
57
49 58 para_re = None
50 59 space_re = None
51 60
@@ -81,34 +90,6 b' def firstline(text):'
81 90 except IndexError:
82 91 return ''
83 92
84 def addbreaks(text):
85 '''replace raw newlines with xhtml line breaks.'''
86 return text.replace('\n', '<br/>\n')
87
88 def obfuscate(text):
89 text = unicode(text, encoding.encoding, 'replace')
90 return ''.join(['&#%d;' % ord(c) for c in text])
91
92 def domain(author):
93 '''get domain of author, or empty string if none.'''
94 f = author.find('@')
95 if f == -1:
96 return ''
97 author = author[f + 1:]
98 f = author.find('>')
99 if f >= 0:
100 author = author[:f]
101 return author
102
103 def person(author):
104 '''get name of author, or else username.'''
105 if not '@' in author:
106 return author
107 f = author.find('<')
108 if f == -1:
109 return util.shortuser(author)
110 return author[:f].rstrip()
111
112 93 def indent(text, prefix):
113 94 '''indent each non-empty line of text after first with prefix.'''
114 95 lines = text.splitlines()
@@ -124,38 +105,6 b' def indent(text, prefix):'
124 105 yield '\n'
125 106 return "".join(indenter())
126 107
127 def permissions(flags):
128 if "l" in flags:
129 return "lrwxrwxrwx"
130 if "x" in flags:
131 return "-rwxr-xr-x"
132 return "-rw-r--r--"
133
134 def xmlescape(text):
135 text = (text
136 .replace('&', '&amp;')
137 .replace('<', '&lt;')
138 .replace('>', '&gt;')
139 .replace('"', '&quot;')
140 .replace("'", '&#39;')) # &apos; invalid in HTML
141 return re.sub('[\x00-\x08\x0B\x0C\x0E-\x1F]', ' ', text)
142
143 def uescape(c):
144 if ord(c) < 0x80:
145 return c
146 else:
147 return '\\u%04x' % ord(c)
148
149 _escapes = [
150 ('\\', '\\\\'), ('"', '\\"'), ('\t', '\\t'), ('\n', '\\n'),
151 ('\r', '\\r'), ('\f', '\\f'), ('\b', '\\b'),
152 ]
153
154 def jsonescape(s):
155 for k, v in _escapes:
156 s = s.replace(k, v)
157 return ''.join(uescape(c) for c in s)
158
159 108 def json(obj):
160 109 if obj is None or obj is False or obj is True:
161 110 return {None: 'null', False: 'false', True: 'true'}[obj]
@@ -180,6 +129,51 b' def json(obj):'
180 129 else:
181 130 raise TypeError('cannot encode type %s' % obj.__class__.__name__)
182 131
132 def uescape(c):
133 if ord(c) < 0x80:
134 return c
135 else:
136 return '\\u%04x' % ord(c)
137
138 _escapes = [
139 ('\\', '\\\\'), ('"', '\\"'), ('\t', '\\t'), ('\n', '\\n'),
140 ('\r', '\\r'), ('\f', '\\f'), ('\b', '\\b'),
141 ]
142
143 def jsonescape(s):
144 for k, v in _escapes:
145 s = s.replace(k, v)
146 return ''.join(uescape(c) for c in s)
147
148 def nonempty(str):
149 return str or "(none)"
150
151 def obfuscate(text):
152 text = unicode(text, encoding.encoding, 'replace')
153 return ''.join(['&#%d;' % ord(c) for c in text])
154
155 def permissions(flags):
156 if "l" in flags:
157 return "lrwxrwxrwx"
158 if "x" in flags:
159 return "-rwxr-xr-x"
160 return "-rw-r--r--"
161
162 def person(author):
163 '''get name of author, or else username.'''
164 if not '@' in author:
165 return author
166 f = author.find('<')
167 if f == -1:
168 return util.shortuser(author)
169 return author[:f].rstrip()
170
171 def stringify(thing):
172 '''turn nested template iterator into string.'''
173 if hasattr(thing, '__iter__') and not isinstance(thing, str):
174 return "".join([stringify(t) for t in thing if t is not None])
175 return str(thing)
176
183 177 def stripdir(text):
184 178 '''Treat the text as path and strip a directory level, if possible.'''
185 179 dir = os.path.dirname(text)
@@ -188,8 +182,14 b' def stripdir(text):'
188 182 else:
189 183 return dir
190 184
191 def nonempty(str):
192 return str or "(none)"
185 def xmlescape(text):
186 text = (text
187 .replace('&', '&amp;')
188 .replace('<', '&lt;')
189 .replace('>', '&gt;')
190 .replace('"', '&quot;')
191 .replace("'", '&#39;')) # &apos; invalid in HTML
192 return re.sub('[\x00-\x08\x0B\x0C\x0E-\x1F]', ' ', text)
193 193
194 194 filters = {
195 195 "addbreaks": addbreaks,
General Comments 0
You need to be logged in to leave comments. Login now