annotate mercurial/templatefilters.py @ 37449:a0d71618074f

revlog: detect pseudo file nodeids to raise WdirUnsupported exception Again, I'm not sure if this is the right thing, but adding a few more pseudo hashes wouldn't be any worse than the current state. Differential Revision: https://phab.mercurial-scm.org/D2942
author Yuya Nishihara <yuya@tcha.org>
date Sun, 25 Mar 2018 18:34:07 +0900
parents 63144f33c8bb
children a25513263075
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
32740
ae0ebe93ac70 templatefilers: correct filename in header comment
Yuya Nishihara <yuya@tcha.org>
parents: 32128
diff changeset
1 # templatefilters.py - common template expansion filters
5976
9f1e6ab76069 templates: move filters to their own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
2 #
9f1e6ab76069 templates: move filters to their own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
3 # Copyright 2005-2008 Matt Mackall <mpm@selenic.com>
9f1e6ab76069 templates: move filters to their own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
4 #
8225
46293a0c7e9f updated license to be explicit about GPL version 2
Martin Geisler <mg@lazybytes.net>
parents: 8158
diff changeset
5 # This software may be used and distributed according to the terms of the
10263
25e572394f5c Update license to GPLv2+
Matt Mackall <mpm@selenic.com>
parents: 9722
diff changeset
6 # GNU General Public License version 2 or any later version.
5976
9f1e6ab76069 templates: move filters to their own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
7
25983
1245049da5f3 templatefilters: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25778
diff changeset
8 from __future__ import absolute_import
1245049da5f3 templatefilters: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25778
diff changeset
9
1245049da5f3 templatefilters: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25778
diff changeset
10 import os
1245049da5f3 templatefilters: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25778
diff changeset
11 import re
1245049da5f3 templatefilters: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25778
diff changeset
12 import time
1245049da5f3 templatefilters: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25778
diff changeset
13
37229
05db42732fce templatefilters: handle TypeError by count()
Yuya Nishihara <yuya@tcha.org>
parents: 37227
diff changeset
14 from .i18n import _
25983
1245049da5f3 templatefilters: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25778
diff changeset
15 from . import (
1245049da5f3 templatefilters: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25778
diff changeset
16 encoding,
34837
4fdc4adbc838 templatefilters: defend against evil unicode strs in json filter
Augie Fackler <augie@google.com>
parents: 34695
diff changeset
17 error,
25983
1245049da5f3 templatefilters: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25778
diff changeset
18 node,
32126
e37fd5be0fed py3: alias long to int on Python 3
Pulkit Goyal <7895pulkit@gmail.com>
parents: 32039
diff changeset
19 pycompat,
28693
11f623b5668f templatefilters: use templatefilter to mark a function as template filter
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28692
diff changeset
20 registrar,
36920
6ff6e1d6b5b8 templater: move stringify() to templateutil module
Yuya Nishihara <yuya@tcha.org>
parents: 36831
diff changeset
21 templateutil,
34695
e178fcaa3933 python3: use our bytes-only version of cgi.escape everywhere
Augie Fackler <augie@google.com>
parents: 34131
diff changeset
22 url,
25983
1245049da5f3 templatefilters: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25778
diff changeset
23 util,
1245049da5f3 templatefilters: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25778
diff changeset
24 )
37084
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36921
diff changeset
25 from .utils import (
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36921
diff changeset
26 dateutil,
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36921
diff changeset
27 stringutil,
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36921
diff changeset
28 )
5976
9f1e6ab76069 templates: move filters to their own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
29
28883
032c4c2f802a pycompat: switch to util.urlreq/util.urlerr for py3 compat
timeless <timeless@mozdev.org>
parents: 28693
diff changeset
30 urlerr = util.urlerr
032c4c2f802a pycompat: switch to util.urlreq/util.urlerr for py3 compat
timeless <timeless@mozdev.org>
parents: 28693
diff changeset
31 urlreq = util.urlreq
032c4c2f802a pycompat: switch to util.urlreq/util.urlerr for py3 compat
timeless <timeless@mozdev.org>
parents: 28693
diff changeset
32
32126
e37fd5be0fed py3: alias long to int on Python 3
Pulkit Goyal <7895pulkit@gmail.com>
parents: 32039
diff changeset
33 if pycompat.ispy3:
e37fd5be0fed py3: alias long to int on Python 3
Pulkit Goyal <7895pulkit@gmail.com>
parents: 32039
diff changeset
34 long = int
e37fd5be0fed py3: alias long to int on Python 3
Pulkit Goyal <7895pulkit@gmail.com>
parents: 32039
diff changeset
35
28693
11f623b5668f templatefilters: use templatefilter to mark a function as template filter
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28692
diff changeset
36 # filters are callables like:
11f623b5668f templatefilters: use templatefilter to mark a function as template filter
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28692
diff changeset
37 # fn(obj)
11f623b5668f templatefilters: use templatefilter to mark a function as template filter
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28692
diff changeset
38 # with:
11f623b5668f templatefilters: use templatefilter to mark a function as template filter
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28692
diff changeset
39 # obj - object to be filtered (text, date, list and so on)
11f623b5668f templatefilters: use templatefilter to mark a function as template filter
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28692
diff changeset
40 filters = {}
11f623b5668f templatefilters: use templatefilter to mark a function as template filter
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28692
diff changeset
41
11f623b5668f templatefilters: use templatefilter to mark a function as template filter
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28692
diff changeset
42 templatefilter = registrar.templatefilter(filters)
11f623b5668f templatefilters: use templatefilter to mark a function as template filter
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28692
diff changeset
43
37223
08e042f0a67c templatefilters: declare input type as bytes where appropriate
Yuya Nishihara <yuya@tcha.org>
parents: 37222
diff changeset
44 @templatefilter('addbreaks', intype=bytes)
13588
b8b881f3f3a7 templatefilters: sort function definitions
Patrick Mezard <pmezard@gmail.com>
parents: 13587
diff changeset
45 def addbreaks(text):
28693
11f623b5668f templatefilters: use templatefilter to mark a function as template filter
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28692
diff changeset
46 """Any text. Add an XHTML "<br />" tag before the end of
13591
264f292a0c6f templatefilters: move doc from templates.txt to docstrings
Patrick Mezard <pmezard@gmail.com>
parents: 13590
diff changeset
47 every line except the last.
264f292a0c6f templatefilters: move doc from templates.txt to docstrings
Patrick Mezard <pmezard@gmail.com>
parents: 13590
diff changeset
48 """
13588
b8b881f3f3a7 templatefilters: sort function definitions
Patrick Mezard <pmezard@gmail.com>
parents: 13587
diff changeset
49 return text.replace('\n', '<br/>\n')
8360
acc202b71619 templater: provide the standard template filters by default
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8234
diff changeset
50
19736
f08e542ce918 templatefilters: add short format for age formatting
David Soria Parra <dsp@experimentalworks.net>
parents: 19467
diff changeset
51 agescales = [("year", 3600 * 24 * 365, 'Y'),
f08e542ce918 templatefilters: add short format for age formatting
David Soria Parra <dsp@experimentalworks.net>
parents: 19467
diff changeset
52 ("month", 3600 * 24 * 30, 'M'),
f08e542ce918 templatefilters: add short format for age formatting
David Soria Parra <dsp@experimentalworks.net>
parents: 19467
diff changeset
53 ("week", 3600 * 24 * 7, 'W'),
f08e542ce918 templatefilters: add short format for age formatting
David Soria Parra <dsp@experimentalworks.net>
parents: 19467
diff changeset
54 ("day", 3600 * 24, 'd'),
f08e542ce918 templatefilters: add short format for age formatting
David Soria Parra <dsp@experimentalworks.net>
parents: 19467
diff changeset
55 ("hour", 3600, 'h'),
f08e542ce918 templatefilters: add short format for age formatting
David Soria Parra <dsp@experimentalworks.net>
parents: 19467
diff changeset
56 ("minute", 60, 'm'),
f08e542ce918 templatefilters: add short format for age formatting
David Soria Parra <dsp@experimentalworks.net>
parents: 19467
diff changeset
57 ("second", 1, 's')]
5976
9f1e6ab76069 templates: move filters to their own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
58
37227
9bcf096a2da2 templatefilters: declare input type as date where appropriate
Yuya Nishihara <yuya@tcha.org>
parents: 37223
diff changeset
59 @templatefilter('age', intype=templateutil.date)
19736
f08e542ce918 templatefilters: add short format for age formatting
David Soria Parra <dsp@experimentalworks.net>
parents: 19467
diff changeset
60 def age(date, abbrev=False):
28693
11f623b5668f templatefilters: use templatefilter to mark a function as template filter
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28692
diff changeset
61 """Date. Returns a human-readable date/time difference between the
13591
264f292a0c6f templatefilters: move doc from templates.txt to docstrings
Patrick Mezard <pmezard@gmail.com>
parents: 13590
diff changeset
62 given date/time and the current date/time.
264f292a0c6f templatefilters: move doc from templates.txt to docstrings
Patrick Mezard <pmezard@gmail.com>
parents: 13590
diff changeset
63 """
5976
9f1e6ab76069 templates: move filters to their own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
64
9f1e6ab76069 templates: move filters to their own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
65 def plural(t, c):
9f1e6ab76069 templates: move filters to their own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
66 if c == 1:
9f1e6ab76069 templates: move filters to their own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
67 return t
9f1e6ab76069 templates: move filters to their own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
68 return t + "s"
19736
f08e542ce918 templatefilters: add short format for age formatting
David Soria Parra <dsp@experimentalworks.net>
parents: 19467
diff changeset
69 def fmt(t, c, a):
f08e542ce918 templatefilters: add short format for age formatting
David Soria Parra <dsp@experimentalworks.net>
parents: 19467
diff changeset
70 if abbrev:
f08e542ce918 templatefilters: add short format for age formatting
David Soria Parra <dsp@experimentalworks.net>
parents: 19467
diff changeset
71 return "%d%s" % (c, a)
5976
9f1e6ab76069 templates: move filters to their own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
72 return "%d %s" % (c, plural(t, c))
9f1e6ab76069 templates: move filters to their own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
73
9f1e6ab76069 templates: move filters to their own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
74 now = time.time()
9f1e6ab76069 templates: move filters to their own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
75 then = date[0]
13666
c49cddce0a81 templates: provide granularity for future values for age filter
timeless <timeless@gmail.com>
parents: 13593
diff changeset
76 future = False
7682
9c8bbae02e9c templater: fix age filter to state the obvious on future timestamps
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6691
diff changeset
77 if then > now:
13666
c49cddce0a81 templates: provide granularity for future values for age filter
timeless <timeless@gmail.com>
parents: 13593
diff changeset
78 future = True
c49cddce0a81 templates: provide granularity for future values for age filter
timeless <timeless@gmail.com>
parents: 13593
diff changeset
79 delta = max(1, int(then - now))
c49cddce0a81 templates: provide granularity for future values for age filter
timeless <timeless@gmail.com>
parents: 13593
diff changeset
80 if delta > agescales[0][1] * 30:
c49cddce0a81 templates: provide granularity for future values for age filter
timeless <timeless@gmail.com>
parents: 13593
diff changeset
81 return 'in the distant future'
c49cddce0a81 templates: provide granularity for future values for age filter
timeless <timeless@gmail.com>
parents: 13593
diff changeset
82 else:
c49cddce0a81 templates: provide granularity for future values for age filter
timeless <timeless@gmail.com>
parents: 13593
diff changeset
83 delta = max(1, int(now - then))
c49cddce0a81 templates: provide granularity for future values for age filter
timeless <timeless@gmail.com>
parents: 13593
diff changeset
84 if delta > agescales[0][1] * 2:
36607
c6061cadb400 util: extract all date-related utils in utils/dateutil module
Boris Feld <boris.feld@octobus.net>
parents: 36573
diff changeset
85 return dateutil.shortdate(date)
9722
4d9dea174b84 templater: readable dates older than 24 months revert to ISO8601 (issue1006)
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9721
diff changeset
86
19736
f08e542ce918 templatefilters: add short format for age formatting
David Soria Parra <dsp@experimentalworks.net>
parents: 19467
diff changeset
87 for t, s, a in agescales:
9029
0001e49f1c11 compat: use // for integer division
Alejandro Santos <alejolp@alejolp.com>
parents: 8697
diff changeset
88 n = delta // s
5976
9f1e6ab76069 templates: move filters to their own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
89 if n >= 2 or s == 1:
13666
c49cddce0a81 templates: provide granularity for future values for age filter
timeless <timeless@gmail.com>
parents: 13593
diff changeset
90 if future:
19736
f08e542ce918 templatefilters: add short format for age formatting
David Soria Parra <dsp@experimentalworks.net>
parents: 19467
diff changeset
91 return '%s from now' % fmt(t, n, a)
f08e542ce918 templatefilters: add short format for age formatting
David Soria Parra <dsp@experimentalworks.net>
parents: 19467
diff changeset
92 return '%s ago' % fmt(t, n, a)
5976
9f1e6ab76069 templates: move filters to their own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
93
37223
08e042f0a67c templatefilters: declare input type as bytes where appropriate
Yuya Nishihara <yuya@tcha.org>
parents: 37222
diff changeset
94 @templatefilter('basename', intype=bytes)
13590
1a752dcfe062 templatefilters: wrap all filters in dedicated functions
Patrick Mezard <pmezard@gmail.com>
parents: 13589
diff changeset
95 def basename(path):
28693
11f623b5668f templatefilters: use templatefilter to mark a function as template filter
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28692
diff changeset
96 """Any text. Treats the text as a path, and returns the last
35539
d1aae6d4efc5 templatefilters: fix doc of basename()
Yuya Nishihara <yuya@tcha.org>
parents: 34837
diff changeset
97 component of the path after splitting by the path separator.
d1aae6d4efc5 templatefilters: fix doc of basename()
Yuya Nishihara <yuya@tcha.org>
parents: 34837
diff changeset
98 For example, "foo/bar/baz" becomes "baz" and "foo/bar//" becomes "".
13591
264f292a0c6f templatefilters: move doc from templates.txt to docstrings
Patrick Mezard <pmezard@gmail.com>
parents: 13590
diff changeset
99 """
13590
1a752dcfe062 templatefilters: wrap all filters in dedicated functions
Patrick Mezard <pmezard@gmail.com>
parents: 13589
diff changeset
100 return os.path.basename(path)
1a752dcfe062 templatefilters: wrap all filters in dedicated functions
Patrick Mezard <pmezard@gmail.com>
parents: 13589
diff changeset
101
28693
11f623b5668f templatefilters: use templatefilter to mark a function as template filter
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28692
diff changeset
102 @templatefilter('count')
22668
13e3f07d74a3 templater: add count template filter, plus tests
Anton Shestakov <engored@ya.ru>
parents: 21873
diff changeset
103 def count(i):
28693
11f623b5668f templatefilters: use templatefilter to mark a function as template filter
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28692
diff changeset
104 """List or text. Returns the length as an integer."""
37229
05db42732fce templatefilters: handle TypeError by count()
Yuya Nishihara <yuya@tcha.org>
parents: 37227
diff changeset
105 try:
05db42732fce templatefilters: handle TypeError by count()
Yuya Nishihara <yuya@tcha.org>
parents: 37227
diff changeset
106 return len(i)
05db42732fce templatefilters: handle TypeError by count()
Yuya Nishihara <yuya@tcha.org>
parents: 37227
diff changeset
107 except TypeError:
05db42732fce templatefilters: handle TypeError by count()
Yuya Nishihara <yuya@tcha.org>
parents: 37227
diff changeset
108 raise error.ParseError(_('not countable'))
22668
13e3f07d74a3 templater: add count template filter, plus tests
Anton Shestakov <engored@ya.ru>
parents: 21873
diff changeset
109
37223
08e042f0a67c templatefilters: declare input type as bytes where appropriate
Yuya Nishihara <yuya@tcha.org>
parents: 37222
diff changeset
110 @templatefilter('dirname', intype=bytes)
36246
9ee10b3284da templatefilters: add dirname() filter
Yuya Nishihara <yuya@tcha.org>
parents: 35751
diff changeset
111 def dirname(path):
9ee10b3284da templatefilters: add dirname() filter
Yuya Nishihara <yuya@tcha.org>
parents: 35751
diff changeset
112 """Any text. Treats the text as a path, and strips the last
9ee10b3284da templatefilters: add dirname() filter
Yuya Nishihara <yuya@tcha.org>
parents: 35751
diff changeset
113 component of the path after splitting by the path separator.
9ee10b3284da templatefilters: add dirname() filter
Yuya Nishihara <yuya@tcha.org>
parents: 35751
diff changeset
114 """
9ee10b3284da templatefilters: add dirname() filter
Yuya Nishihara <yuya@tcha.org>
parents: 35751
diff changeset
115 return os.path.dirname(path)
9ee10b3284da templatefilters: add dirname() filter
Yuya Nishihara <yuya@tcha.org>
parents: 35751
diff changeset
116
37223
08e042f0a67c templatefilters: declare input type as bytes where appropriate
Yuya Nishihara <yuya@tcha.org>
parents: 37222
diff changeset
117 @templatefilter('domain', intype=bytes)
13588
b8b881f3f3a7 templatefilters: sort function definitions
Patrick Mezard <pmezard@gmail.com>
parents: 13587
diff changeset
118 def domain(author):
28693
11f623b5668f templatefilters: use templatefilter to mark a function as template filter
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28692
diff changeset
119 """Any text. Finds the first string that looks like an email
13591
264f292a0c6f templatefilters: move doc from templates.txt to docstrings
Patrick Mezard <pmezard@gmail.com>
parents: 13590
diff changeset
120 address, and extracts just the domain component. Example: ``User
264f292a0c6f templatefilters: move doc from templates.txt to docstrings
Patrick Mezard <pmezard@gmail.com>
parents: 13590
diff changeset
121 <user@example.com>`` becomes ``example.com``.
264f292a0c6f templatefilters: move doc from templates.txt to docstrings
Patrick Mezard <pmezard@gmail.com>
parents: 13590
diff changeset
122 """
13588
b8b881f3f3a7 templatefilters: sort function definitions
Patrick Mezard <pmezard@gmail.com>
parents: 13587
diff changeset
123 f = author.find('@')
b8b881f3f3a7 templatefilters: sort function definitions
Patrick Mezard <pmezard@gmail.com>
parents: 13587
diff changeset
124 if f == -1:
b8b881f3f3a7 templatefilters: sort function definitions
Patrick Mezard <pmezard@gmail.com>
parents: 13587
diff changeset
125 return ''
b8b881f3f3a7 templatefilters: sort function definitions
Patrick Mezard <pmezard@gmail.com>
parents: 13587
diff changeset
126 author = author[f + 1:]
b8b881f3f3a7 templatefilters: sort function definitions
Patrick Mezard <pmezard@gmail.com>
parents: 13587
diff changeset
127 f = author.find('>')
b8b881f3f3a7 templatefilters: sort function definitions
Patrick Mezard <pmezard@gmail.com>
parents: 13587
diff changeset
128 if f >= 0:
b8b881f3f3a7 templatefilters: sort function definitions
Patrick Mezard <pmezard@gmail.com>
parents: 13587
diff changeset
129 author = author[:f]
b8b881f3f3a7 templatefilters: sort function definitions
Patrick Mezard <pmezard@gmail.com>
parents: 13587
diff changeset
130 return author
b8b881f3f3a7 templatefilters: sort function definitions
Patrick Mezard <pmezard@gmail.com>
parents: 13587
diff changeset
131
37223
08e042f0a67c templatefilters: declare input type as bytes where appropriate
Yuya Nishihara <yuya@tcha.org>
parents: 37222
diff changeset
132 @templatefilter('email', intype=bytes)
13590
1a752dcfe062 templatefilters: wrap all filters in dedicated functions
Patrick Mezard <pmezard@gmail.com>
parents: 13589
diff changeset
133 def email(text):
28693
11f623b5668f templatefilters: use templatefilter to mark a function as template filter
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28692
diff changeset
134 """Any text. Extracts the first string that looks like an email
13591
264f292a0c6f templatefilters: move doc from templates.txt to docstrings
Patrick Mezard <pmezard@gmail.com>
parents: 13590
diff changeset
135 address. Example: ``User <user@example.com>`` becomes
264f292a0c6f templatefilters: move doc from templates.txt to docstrings
Patrick Mezard <pmezard@gmail.com>
parents: 13590
diff changeset
136 ``user@example.com``.
264f292a0c6f templatefilters: move doc from templates.txt to docstrings
Patrick Mezard <pmezard@gmail.com>
parents: 13590
diff changeset
137 """
37084
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36921
diff changeset
138 return stringutil.email(text)
13590
1a752dcfe062 templatefilters: wrap all filters in dedicated functions
Patrick Mezard <pmezard@gmail.com>
parents: 13589
diff changeset
139
37223
08e042f0a67c templatefilters: declare input type as bytes where appropriate
Yuya Nishihara <yuya@tcha.org>
parents: 37222
diff changeset
140 @templatefilter('escape', intype=bytes)
13590
1a752dcfe062 templatefilters: wrap all filters in dedicated functions
Patrick Mezard <pmezard@gmail.com>
parents: 13589
diff changeset
141 def escape(text):
28693
11f623b5668f templatefilters: use templatefilter to mark a function as template filter
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28692
diff changeset
142 """Any text. Replaces the special XML/XHTML characters "&", "<"
17772
823a7d79ef82 hgweb: make the escape filter remove null characters (issue2567)
Siddharth Agarwal <sid0@fb.com>
parents: 17755
diff changeset
143 and ">" with XML entities, and filters out NUL characters.
13591
264f292a0c6f templatefilters: move doc from templates.txt to docstrings
Patrick Mezard <pmezard@gmail.com>
parents: 13590
diff changeset
144 """
34695
e178fcaa3933 python3: use our bytes-only version of cgi.escape everywhere
Augie Fackler <augie@google.com>
parents: 34131
diff changeset
145 return url.escape(text.replace('\0', ''), True)
13590
1a752dcfe062 templatefilters: wrap all filters in dedicated functions
Patrick Mezard <pmezard@gmail.com>
parents: 13589
diff changeset
146
5976
9f1e6ab76069 templates: move filters to their own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
147 para_re = None
9f1e6ab76069 templates: move filters to their own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
148 space_re = None
9f1e6ab76069 templates: move filters to their own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
149
19872
681f7b9213a4 check-code: check for spaces around = for named parameters
Mads Kiilerich <madski@unity3d.com>
parents: 19736
diff changeset
150 def fill(text, width, initindent='', hangindent=''):
19228
889807c79384 templater: add indentation arguments to the fill function
Sean Farley <sean.michael.farley@gmail.com>
parents: 19227
diff changeset
151 '''fill many paragraphs with optional indentation.'''
5976
9f1e6ab76069 templates: move filters to their own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
152 global para_re, space_re
9f1e6ab76069 templates: move filters to their own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
153 if para_re is None:
9f1e6ab76069 templates: move filters to their own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
154 para_re = re.compile('(\n\n|\n\\s*[-*]\\s*)', re.M)
36498
b546181ae451 py3: make regexp literal bytes in templatefilters.py
Yuya Nishihara <yuya@tcha.org>
parents: 36497
diff changeset
155 space_re = re.compile(br' +')
5976
9f1e6ab76069 templates: move filters to their own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
156
9f1e6ab76069 templates: move filters to their own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
157 def findparas():
9f1e6ab76069 templates: move filters to their own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
158 start = 0
9f1e6ab76069 templates: move filters to their own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
159 while True:
9f1e6ab76069 templates: move filters to their own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
160 m = para_re.search(text, start)
9f1e6ab76069 templates: move filters to their own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
161 if not m:
36497
b2e54b257832 templatefilters: use encoding.unifromlocal/unitolocal() for py3 compatibility
Yuya Nishihara <yuya@tcha.org>
parents: 36246
diff changeset
162 uctext = encoding.unifromlocal(text[start:])
11297
d320e70442a5 replace Python standard textwrap by MBCS sensitive one for i18n text
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 10787
diff changeset
163 w = len(uctext)
d320e70442a5 replace Python standard textwrap by MBCS sensitive one for i18n text
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 10787
diff changeset
164 while 0 < w and uctext[w - 1].isspace():
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10263
diff changeset
165 w -= 1
36497
b2e54b257832 templatefilters: use encoding.unifromlocal/unitolocal() for py3 compatibility
Yuya Nishihara <yuya@tcha.org>
parents: 36246
diff changeset
166 yield (encoding.unitolocal(uctext[:w]),
b2e54b257832 templatefilters: use encoding.unifromlocal/unitolocal() for py3 compatibility
Yuya Nishihara <yuya@tcha.org>
parents: 36246
diff changeset
167 encoding.unitolocal(uctext[w:]))
5976
9f1e6ab76069 templates: move filters to their own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
168 break
9f1e6ab76069 templates: move filters to their own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
169 yield text[start:m.start(0)], m.group(1)
9f1e6ab76069 templates: move filters to their own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
170 start = m.end(1)
9f1e6ab76069 templates: move filters to their own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
171
37084
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36921
diff changeset
172 return "".join([stringutil.wrap(space_re.sub(' ',
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36921
diff changeset
173 stringutil.wrap(para, width)),
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36921
diff changeset
174 width, initindent, hangindent) + rest
5976
9f1e6ab76069 templates: move filters to their own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
175 for para, rest in findparas()])
9f1e6ab76069 templates: move filters to their own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
176
37223
08e042f0a67c templatefilters: declare input type as bytes where appropriate
Yuya Nishihara <yuya@tcha.org>
parents: 37222
diff changeset
177 @templatefilter('fill68', intype=bytes)
13590
1a752dcfe062 templatefilters: wrap all filters in dedicated functions
Patrick Mezard <pmezard@gmail.com>
parents: 13589
diff changeset
178 def fill68(text):
28693
11f623b5668f templatefilters: use templatefilter to mark a function as template filter
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28692
diff changeset
179 """Any text. Wraps the text to fit in 68 columns."""
13590
1a752dcfe062 templatefilters: wrap all filters in dedicated functions
Patrick Mezard <pmezard@gmail.com>
parents: 13589
diff changeset
180 return fill(text, 68)
1a752dcfe062 templatefilters: wrap all filters in dedicated functions
Patrick Mezard <pmezard@gmail.com>
parents: 13589
diff changeset
181
37223
08e042f0a67c templatefilters: declare input type as bytes where appropriate
Yuya Nishihara <yuya@tcha.org>
parents: 37222
diff changeset
182 @templatefilter('fill76', intype=bytes)
13590
1a752dcfe062 templatefilters: wrap all filters in dedicated functions
Patrick Mezard <pmezard@gmail.com>
parents: 13589
diff changeset
183 def fill76(text):
28693
11f623b5668f templatefilters: use templatefilter to mark a function as template filter
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28692
diff changeset
184 """Any text. Wraps the text to fit in 76 columns."""
13590
1a752dcfe062 templatefilters: wrap all filters in dedicated functions
Patrick Mezard <pmezard@gmail.com>
parents: 13589
diff changeset
185 return fill(text, 76)
1a752dcfe062 templatefilters: wrap all filters in dedicated functions
Patrick Mezard <pmezard@gmail.com>
parents: 13589
diff changeset
186
37223
08e042f0a67c templatefilters: declare input type as bytes where appropriate
Yuya Nishihara <yuya@tcha.org>
parents: 37222
diff changeset
187 @templatefilter('firstline', intype=bytes)
5976
9f1e6ab76069 templates: move filters to their own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
188 def firstline(text):
28693
11f623b5668f templatefilters: use templatefilter to mark a function as template filter
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28692
diff changeset
189 """Any text. Returns the first line of text."""
5976
9f1e6ab76069 templates: move filters to their own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
190 try:
9136
31177742f54a for calls expecting bool args, pass bool instead of int
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 9029
diff changeset
191 return text.splitlines(True)[0].rstrip('\r\n')
5976
9f1e6ab76069 templates: move filters to their own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
192 except IndexError:
9f1e6ab76069 templates: move filters to their own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
193 return ''
9f1e6ab76069 templates: move filters to their own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
194
37223
08e042f0a67c templatefilters: declare input type as bytes where appropriate
Yuya Nishihara <yuya@tcha.org>
parents: 37222
diff changeset
195 @templatefilter('hex', intype=bytes)
13590
1a752dcfe062 templatefilters: wrap all filters in dedicated functions
Patrick Mezard <pmezard@gmail.com>
parents: 13589
diff changeset
196 def hexfilter(text):
28693
11f623b5668f templatefilters: use templatefilter to mark a function as template filter
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28692
diff changeset
197 """Any text. Convert a binary Mercurial node identifier into
13591
264f292a0c6f templatefilters: move doc from templates.txt to docstrings
Patrick Mezard <pmezard@gmail.com>
parents: 13590
diff changeset
198 its long hexadecimal representation.
264f292a0c6f templatefilters: move doc from templates.txt to docstrings
Patrick Mezard <pmezard@gmail.com>
parents: 13590
diff changeset
199 """
13590
1a752dcfe062 templatefilters: wrap all filters in dedicated functions
Patrick Mezard <pmezard@gmail.com>
parents: 13589
diff changeset
200 return node.hex(text)
1a752dcfe062 templatefilters: wrap all filters in dedicated functions
Patrick Mezard <pmezard@gmail.com>
parents: 13589
diff changeset
201
37227
9bcf096a2da2 templatefilters: declare input type as date where appropriate
Yuya Nishihara <yuya@tcha.org>
parents: 37223
diff changeset
202 @templatefilter('hgdate', intype=templateutil.date)
13590
1a752dcfe062 templatefilters: wrap all filters in dedicated functions
Patrick Mezard <pmezard@gmail.com>
parents: 13589
diff changeset
203 def hgdate(text):
28693
11f623b5668f templatefilters: use templatefilter to mark a function as template filter
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28692
diff changeset
204 """Date. Returns the date as a pair of numbers: "1157407993
13591
264f292a0c6f templatefilters: move doc from templates.txt to docstrings
Patrick Mezard <pmezard@gmail.com>
parents: 13590
diff changeset
205 25200" (Unix timestamp, timezone offset).
264f292a0c6f templatefilters: move doc from templates.txt to docstrings
Patrick Mezard <pmezard@gmail.com>
parents: 13590
diff changeset
206 """
13590
1a752dcfe062 templatefilters: wrap all filters in dedicated functions
Patrick Mezard <pmezard@gmail.com>
parents: 13589
diff changeset
207 return "%d %d" % text
1a752dcfe062 templatefilters: wrap all filters in dedicated functions
Patrick Mezard <pmezard@gmail.com>
parents: 13589
diff changeset
208
37227
9bcf096a2da2 templatefilters: declare input type as date where appropriate
Yuya Nishihara <yuya@tcha.org>
parents: 37223
diff changeset
209 @templatefilter('isodate', intype=templateutil.date)
13590
1a752dcfe062 templatefilters: wrap all filters in dedicated functions
Patrick Mezard <pmezard@gmail.com>
parents: 13589
diff changeset
210 def isodate(text):
28693
11f623b5668f templatefilters: use templatefilter to mark a function as template filter
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28692
diff changeset
211 """Date. Returns the date in ISO 8601 format: "2009-08-18 13:00
13591
264f292a0c6f templatefilters: move doc from templates.txt to docstrings
Patrick Mezard <pmezard@gmail.com>
parents: 13590
diff changeset
212 +0200".
264f292a0c6f templatefilters: move doc from templates.txt to docstrings
Patrick Mezard <pmezard@gmail.com>
parents: 13590
diff changeset
213 """
36607
c6061cadb400 util: extract all date-related utils in utils/dateutil module
Boris Feld <boris.feld@octobus.net>
parents: 36573
diff changeset
214 return dateutil.datestr(text, '%Y-%m-%d %H:%M %1%2')
13590
1a752dcfe062 templatefilters: wrap all filters in dedicated functions
Patrick Mezard <pmezard@gmail.com>
parents: 13589
diff changeset
215
37227
9bcf096a2da2 templatefilters: declare input type as date where appropriate
Yuya Nishihara <yuya@tcha.org>
parents: 37223
diff changeset
216 @templatefilter('isodatesec', intype=templateutil.date)
13590
1a752dcfe062 templatefilters: wrap all filters in dedicated functions
Patrick Mezard <pmezard@gmail.com>
parents: 13589
diff changeset
217 def isodatesec(text):
28693
11f623b5668f templatefilters: use templatefilter to mark a function as template filter
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28692
diff changeset
218 """Date. Returns the date in ISO 8601 format, including
13591
264f292a0c6f templatefilters: move doc from templates.txt to docstrings
Patrick Mezard <pmezard@gmail.com>
parents: 13590
diff changeset
219 seconds: "2009-08-18 13:00:13 +0200". See also the rfc3339date
264f292a0c6f templatefilters: move doc from templates.txt to docstrings
Patrick Mezard <pmezard@gmail.com>
parents: 13590
diff changeset
220 filter.
264f292a0c6f templatefilters: move doc from templates.txt to docstrings
Patrick Mezard <pmezard@gmail.com>
parents: 13590
diff changeset
221 """
36607
c6061cadb400 util: extract all date-related utils in utils/dateutil module
Boris Feld <boris.feld@octobus.net>
parents: 36573
diff changeset
222 return dateutil.datestr(text, '%Y-%m-%d %H:%M:%S %1%2')
13590
1a752dcfe062 templatefilters: wrap all filters in dedicated functions
Patrick Mezard <pmezard@gmail.com>
parents: 13589
diff changeset
223
5976
9f1e6ab76069 templates: move filters to their own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
224 def indent(text, prefix):
9f1e6ab76069 templates: move filters to their own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
225 '''indent each non-empty line of text after first with prefix.'''
9f1e6ab76069 templates: move filters to their own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
226 lines = text.splitlines()
9f1e6ab76069 templates: move filters to their own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
227 num_lines = len(lines)
9387
20ed9909dbd9 templatefilters: indent: do not compute text.endswith('\n') in each iteration
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 9136
diff changeset
228 endswithnewline = text[-1:] == '\n'
5976
9f1e6ab76069 templates: move filters to their own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
229 def indenter():
9f1e6ab76069 templates: move filters to their own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
230 for i in xrange(num_lines):
9f1e6ab76069 templates: move filters to their own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
231 l = lines[i]
9f1e6ab76069 templates: move filters to their own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
232 if i and l.strip():
9f1e6ab76069 templates: move filters to their own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
233 yield prefix
9f1e6ab76069 templates: move filters to their own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
234 yield l
9387
20ed9909dbd9 templatefilters: indent: do not compute text.endswith('\n') in each iteration
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 9136
diff changeset
235 if i < num_lines - 1 or endswithnewline:
5976
9f1e6ab76069 templates: move filters to their own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
236 yield '\n'
9f1e6ab76069 templates: move filters to their own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
237 return "".join(indenter())
9f1e6ab76069 templates: move filters to their own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
238
28693
11f623b5668f templatefilters: use templatefilter to mark a function as template filter
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28692
diff changeset
239 @templatefilter('json')
31782
654e9a1c8a6c formatter: use templatefilters.json()
Yuya Nishihara <yuya@tcha.org>
parents: 31781
diff changeset
240 def json(obj, paranoid=True):
31780
8d9eafe01111 templatefilters: unroll handling of None/False/True
Yuya Nishihara <yuya@tcha.org>
parents: 31779
diff changeset
241 if obj is None:
8d9eafe01111 templatefilters: unroll handling of None/False/True
Yuya Nishihara <yuya@tcha.org>
parents: 31779
diff changeset
242 return 'null'
8d9eafe01111 templatefilters: unroll handling of None/False/True
Yuya Nishihara <yuya@tcha.org>
parents: 31779
diff changeset
243 elif obj is False:
8d9eafe01111 templatefilters: unroll handling of None/False/True
Yuya Nishihara <yuya@tcha.org>
parents: 31779
diff changeset
244 return 'false'
8d9eafe01111 templatefilters: unroll handling of None/False/True
Yuya Nishihara <yuya@tcha.org>
parents: 31779
diff changeset
245 elif obj is True:
8d9eafe01111 templatefilters: unroll handling of None/False/True
Yuya Nishihara <yuya@tcha.org>
parents: 31779
diff changeset
246 return 'true'
31728
35eb8f112c88 templatefilter: add support for 'long' to json()
Matt Harbison <matt_harbison@yahoo.com>
parents: 31451
diff changeset
247 elif isinstance(obj, (int, long, float)):
32127
964e7427a691 py3: use pycompat.bytestr() instead of str()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 32126
diff changeset
248 return pycompat.bytestr(obj)
32128
c3342c177211 py3: replace str with bytes in isinstance()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 32127
diff changeset
249 elif isinstance(obj, bytes):
31782
654e9a1c8a6c formatter: use templatefilters.json()
Yuya Nishihara <yuya@tcha.org>
parents: 31781
diff changeset
250 return '"%s"' % encoding.jsonescape(obj, paranoid=paranoid)
34837
4fdc4adbc838 templatefilters: defend against evil unicode strs in json filter
Augie Fackler <augie@google.com>
parents: 34695
diff changeset
251 elif isinstance(obj, str):
4fdc4adbc838 templatefilters: defend against evil unicode strs in json filter
Augie Fackler <augie@google.com>
parents: 34695
diff changeset
252 # This branch is unreachable on Python 2, because bytes == str
4fdc4adbc838 templatefilters: defend against evil unicode strs in json filter
Augie Fackler <augie@google.com>
parents: 34695
diff changeset
253 # and we'll return in the next-earlier block in the elif
4fdc4adbc838 templatefilters: defend against evil unicode strs in json filter
Augie Fackler <augie@google.com>
parents: 34695
diff changeset
254 # ladder. On Python 3, this helps us catch bugs before they
4fdc4adbc838 templatefilters: defend against evil unicode strs in json filter
Augie Fackler <augie@google.com>
parents: 34695
diff changeset
255 # hurt someone.
4fdc4adbc838 templatefilters: defend against evil unicode strs in json filter
Augie Fackler <augie@google.com>
parents: 34695
diff changeset
256 raise error.ProgrammingError(
4fdc4adbc838 templatefilters: defend against evil unicode strs in json filter
Augie Fackler <augie@google.com>
parents: 34695
diff changeset
257 'Mercurial only does output with bytes on Python 3: %r' % obj)
14967
376091a4ad23 templatefilters: use safehasattr instead of hasattr
Augie Fackler <durin42@gmail.com>
parents: 14944
diff changeset
258 elif util.safehasattr(obj, 'keys'):
32743
f924dd043974 json: pass formatting options recursively
Yuya Nishihara <yuya@tcha.org>
parents: 32742
diff changeset
259 out = ['"%s": %s' % (encoding.jsonescape(k, paranoid=paranoid),
f924dd043974 json: pass formatting options recursively
Yuya Nishihara <yuya@tcha.org>
parents: 32742
diff changeset
260 json(v, paranoid))
31781
47925b63be70 templatefilters: use list comprehension in json()
Yuya Nishihara <yuya@tcha.org>
parents: 31780
diff changeset
261 for k, v in sorted(obj.iteritems())]
6691
0dba955c2636 add graph page to hgweb
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6319
diff changeset
262 return '{' + ', '.join(out) + '}'
14944
e2c413bde8a5 globally: use safehasattr(x, '__iter__') instead of hasattr(x, '__iter__')
Augie Fackler <durin42@gmail.com>
parents: 14318
diff changeset
263 elif util.safehasattr(obj, '__iter__'):
32743
f924dd043974 json: pass formatting options recursively
Yuya Nishihara <yuya@tcha.org>
parents: 32742
diff changeset
264 out = [json(i, paranoid) for i in obj]
6691
0dba955c2636 add graph page to hgweb
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6319
diff changeset
265 return '[' + ', '.join(out) + ']'
37230
63144f33c8bb templatefilters: raise ProgrammingError if unencodable type passed to json()
Yuya Nishihara <yuya@tcha.org>
parents: 37229
diff changeset
266 raise error.ProgrammingError('cannot encode %r' % obj)
6691
0dba955c2636 add graph page to hgweb
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6319
diff changeset
267
37223
08e042f0a67c templatefilters: declare input type as bytes where appropriate
Yuya Nishihara <yuya@tcha.org>
parents: 37222
diff changeset
268 @templatefilter('lower', intype=bytes)
24566
6abce80e6cbf templatefilters: add "upper" and "lower" for case conversion
Yuya Nishihara <yuya@tcha.org>
parents: 23708
diff changeset
269 def lower(text):
28693
11f623b5668f templatefilters: use templatefilter to mark a function as template filter
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28692
diff changeset
270 """Any text. Converts the text to lowercase."""
24566
6abce80e6cbf templatefilters: add "upper" and "lower" for case conversion
Yuya Nishihara <yuya@tcha.org>
parents: 23708
diff changeset
271 return encoding.lower(text)
6abce80e6cbf templatefilters: add "upper" and "lower" for case conversion
Yuya Nishihara <yuya@tcha.org>
parents: 23708
diff changeset
272
37223
08e042f0a67c templatefilters: declare input type as bytes where appropriate
Yuya Nishihara <yuya@tcha.org>
parents: 37222
diff changeset
273 @templatefilter('nonempty', intype=bytes)
36552
a185b1af207c templatefilters: stop using str as a variable name
Pulkit Goyal <7895pulkit@gmail.com>
parents: 36498
diff changeset
274 def nonempty(text):
28693
11f623b5668f templatefilters: use templatefilter to mark a function as template filter
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28692
diff changeset
275 """Any text. Returns '(none)' if the string is empty."""
36552
a185b1af207c templatefilters: stop using str as a variable name
Pulkit Goyal <7895pulkit@gmail.com>
parents: 36498
diff changeset
276 return text or "(none)"
13588
b8b881f3f3a7 templatefilters: sort function definitions
Patrick Mezard <pmezard@gmail.com>
parents: 13587
diff changeset
277
37223
08e042f0a67c templatefilters: declare input type as bytes where appropriate
Yuya Nishihara <yuya@tcha.org>
parents: 37222
diff changeset
278 @templatefilter('obfuscate', intype=bytes)
13588
b8b881f3f3a7 templatefilters: sort function definitions
Patrick Mezard <pmezard@gmail.com>
parents: 13587
diff changeset
279 def obfuscate(text):
28693
11f623b5668f templatefilters: use templatefilter to mark a function as template filter
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28692
diff changeset
280 """Any text. Returns the input text rendered as a sequence of
13591
264f292a0c6f templatefilters: move doc from templates.txt to docstrings
Patrick Mezard <pmezard@gmail.com>
parents: 13590
diff changeset
281 XML entities.
264f292a0c6f templatefilters: move doc from templates.txt to docstrings
Patrick Mezard <pmezard@gmail.com>
parents: 13590
diff changeset
282 """
36563
9d71bd25554b templatefilters: convert arguments to sysstrs for unicode() ctor
Augie Fackler <augie@google.com>
parents: 36552
diff changeset
283 text = unicode(text, pycompat.sysstr(encoding.encoding), r'replace')
13588
b8b881f3f3a7 templatefilters: sort function definitions
Patrick Mezard <pmezard@gmail.com>
parents: 13587
diff changeset
284 return ''.join(['&#%d;' % ord(c) for c in text])
b8b881f3f3a7 templatefilters: sort function definitions
Patrick Mezard <pmezard@gmail.com>
parents: 13587
diff changeset
285
37223
08e042f0a67c templatefilters: declare input type as bytes where appropriate
Yuya Nishihara <yuya@tcha.org>
parents: 37222
diff changeset
286 @templatefilter('permissions', intype=bytes)
13588
b8b881f3f3a7 templatefilters: sort function definitions
Patrick Mezard <pmezard@gmail.com>
parents: 13587
diff changeset
287 def permissions(flags):
b8b881f3f3a7 templatefilters: sort function definitions
Patrick Mezard <pmezard@gmail.com>
parents: 13587
diff changeset
288 if "l" in flags:
b8b881f3f3a7 templatefilters: sort function definitions
Patrick Mezard <pmezard@gmail.com>
parents: 13587
diff changeset
289 return "lrwxrwxrwx"
b8b881f3f3a7 templatefilters: sort function definitions
Patrick Mezard <pmezard@gmail.com>
parents: 13587
diff changeset
290 if "x" in flags:
b8b881f3f3a7 templatefilters: sort function definitions
Patrick Mezard <pmezard@gmail.com>
parents: 13587
diff changeset
291 return "-rwxr-xr-x"
b8b881f3f3a7 templatefilters: sort function definitions
Patrick Mezard <pmezard@gmail.com>
parents: 13587
diff changeset
292 return "-rw-r--r--"
b8b881f3f3a7 templatefilters: sort function definitions
Patrick Mezard <pmezard@gmail.com>
parents: 13587
diff changeset
293
37223
08e042f0a67c templatefilters: declare input type as bytes where appropriate
Yuya Nishihara <yuya@tcha.org>
parents: 37222
diff changeset
294 @templatefilter('person', intype=bytes)
13588
b8b881f3f3a7 templatefilters: sort function definitions
Patrick Mezard <pmezard@gmail.com>
parents: 13587
diff changeset
295 def person(author):
28693
11f623b5668f templatefilters: use templatefilter to mark a function as template filter
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28692
diff changeset
296 """Any text. Returns the name before an email address,
16235
eb39bbda167b templates/filters: strip quotes from {author|person}
"Yann E. MORIN" <yann.morin.1998@free.fr>
parents: 15155
diff changeset
297 interpreting it as per RFC 5322.
eb39bbda167b templates/filters: strip quotes from {author|person}
"Yann E. MORIN" <yann.morin.1998@free.fr>
parents: 15155
diff changeset
298 """
37155
fb7140f1d09d stringutil: move person function from templatefilters
Connor Sheehan <sheehan@mozilla.com>
parents: 37084
diff changeset
299 return stringutil.person(author)
13588
b8b881f3f3a7 templatefilters: sort function definitions
Patrick Mezard <pmezard@gmail.com>
parents: 13587
diff changeset
300
37223
08e042f0a67c templatefilters: declare input type as bytes where appropriate
Yuya Nishihara <yuya@tcha.org>
parents: 37222
diff changeset
301 @templatefilter('revescape', intype=bytes)
25778
3a33412792f1 templates: introduce revescape filter for escaping symbolic revisions
Anton Shestakov <av6@dwimlabs.net>
parents: 25000
diff changeset
302 def revescape(text):
28693
11f623b5668f templatefilters: use templatefilter to mark a function as template filter
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28692
diff changeset
303 """Any text. Escapes all "special" characters, except @.
25778
3a33412792f1 templates: introduce revescape filter for escaping symbolic revisions
Anton Shestakov <av6@dwimlabs.net>
parents: 25000
diff changeset
304 Forward slashes are escaped twice to prevent web servers from prematurely
3a33412792f1 templates: introduce revescape filter for escaping symbolic revisions
Anton Shestakov <av6@dwimlabs.net>
parents: 25000
diff changeset
305 unescaping them. For example, "@foo bar/baz" becomes "@foo%20bar%252Fbaz".
3a33412792f1 templates: introduce revescape filter for escaping symbolic revisions
Anton Shestakov <av6@dwimlabs.net>
parents: 25000
diff changeset
306 """
28883
032c4c2f802a pycompat: switch to util.urlreq/util.urlerr for py3 compat
timeless <timeless@mozdev.org>
parents: 28693
diff changeset
307 return urlreq.quote(text, safe='/@').replace('/', '%252F')
25778
3a33412792f1 templates: introduce revescape filter for escaping symbolic revisions
Anton Shestakov <av6@dwimlabs.net>
parents: 25000
diff changeset
308
37227
9bcf096a2da2 templatefilters: declare input type as date where appropriate
Yuya Nishihara <yuya@tcha.org>
parents: 37223
diff changeset
309 @templatefilter('rfc3339date', intype=templateutil.date)
13590
1a752dcfe062 templatefilters: wrap all filters in dedicated functions
Patrick Mezard <pmezard@gmail.com>
parents: 13589
diff changeset
310 def rfc3339date(text):
28693
11f623b5668f templatefilters: use templatefilter to mark a function as template filter
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28692
diff changeset
311 """Date. Returns a date using the Internet date format
13591
264f292a0c6f templatefilters: move doc from templates.txt to docstrings
Patrick Mezard <pmezard@gmail.com>
parents: 13590
diff changeset
312 specified in RFC 3339: "2009-08-18T13:00:13+02:00".
264f292a0c6f templatefilters: move doc from templates.txt to docstrings
Patrick Mezard <pmezard@gmail.com>
parents: 13590
diff changeset
313 """
36607
c6061cadb400 util: extract all date-related utils in utils/dateutil module
Boris Feld <boris.feld@octobus.net>
parents: 36573
diff changeset
314 return dateutil.datestr(text, "%Y-%m-%dT%H:%M:%S%1:%2")
13590
1a752dcfe062 templatefilters: wrap all filters in dedicated functions
Patrick Mezard <pmezard@gmail.com>
parents: 13589
diff changeset
315
37227
9bcf096a2da2 templatefilters: declare input type as date where appropriate
Yuya Nishihara <yuya@tcha.org>
parents: 37223
diff changeset
316 @templatefilter('rfc822date', intype=templateutil.date)
13590
1a752dcfe062 templatefilters: wrap all filters in dedicated functions
Patrick Mezard <pmezard@gmail.com>
parents: 13589
diff changeset
317 def rfc822date(text):
28693
11f623b5668f templatefilters: use templatefilter to mark a function as template filter
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28692
diff changeset
318 """Date. Returns a date using the same format used in email
13591
264f292a0c6f templatefilters: move doc from templates.txt to docstrings
Patrick Mezard <pmezard@gmail.com>
parents: 13590
diff changeset
319 headers: "Tue, 18 Aug 2009 13:00:13 +0200".
264f292a0c6f templatefilters: move doc from templates.txt to docstrings
Patrick Mezard <pmezard@gmail.com>
parents: 13590
diff changeset
320 """
36607
c6061cadb400 util: extract all date-related utils in utils/dateutil module
Boris Feld <boris.feld@octobus.net>
parents: 36573
diff changeset
321 return dateutil.datestr(text, "%a, %d %b %Y %H:%M:%S %1%2")
13590
1a752dcfe062 templatefilters: wrap all filters in dedicated functions
Patrick Mezard <pmezard@gmail.com>
parents: 13589
diff changeset
322
37223
08e042f0a67c templatefilters: declare input type as bytes where appropriate
Yuya Nishihara <yuya@tcha.org>
parents: 37222
diff changeset
323 @templatefilter('short', intype=bytes)
13590
1a752dcfe062 templatefilters: wrap all filters in dedicated functions
Patrick Mezard <pmezard@gmail.com>
parents: 13589
diff changeset
324 def short(text):
28693
11f623b5668f templatefilters: use templatefilter to mark a function as template filter
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28692
diff changeset
325 """Changeset hash. Returns the short form of a changeset hash,
13591
264f292a0c6f templatefilters: move doc from templates.txt to docstrings
Patrick Mezard <pmezard@gmail.com>
parents: 13590
diff changeset
326 i.e. a 12 hexadecimal digit string.
264f292a0c6f templatefilters: move doc from templates.txt to docstrings
Patrick Mezard <pmezard@gmail.com>
parents: 13590
diff changeset
327 """
13590
1a752dcfe062 templatefilters: wrap all filters in dedicated functions
Patrick Mezard <pmezard@gmail.com>
parents: 13589
diff changeset
328 return text[:12]
1a752dcfe062 templatefilters: wrap all filters in dedicated functions
Patrick Mezard <pmezard@gmail.com>
parents: 13589
diff changeset
329
37223
08e042f0a67c templatefilters: declare input type as bytes where appropriate
Yuya Nishihara <yuya@tcha.org>
parents: 37222
diff changeset
330 @templatefilter('shortbisect', intype=bytes)
36830
71f189941791 templatefilters: inline hbisect.shortlabel()
Yuya Nishihara <yuya@tcha.org>
parents: 36607
diff changeset
331 def shortbisect(label):
71f189941791 templatefilters: inline hbisect.shortlabel()
Yuya Nishihara <yuya@tcha.org>
parents: 36607
diff changeset
332 """Any text. Treats `label` as a bisection status, and
15155
f4a8d754cd0a templates: add 'bisect' keyword to return a cset's bisect status
"Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
parents: 14967
diff changeset
333 returns a single-character representing the status (G: good, B: bad,
f4a8d754cd0a templates: add 'bisect' keyword to return a cset's bisect status
"Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
parents: 14967
diff changeset
334 S: skipped, U: untested, I: ignored). Returns single space if `text`
f4a8d754cd0a templates: add 'bisect' keyword to return a cset's bisect status
"Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
parents: 14967
diff changeset
335 is not a valid bisection status.
f4a8d754cd0a templates: add 'bisect' keyword to return a cset's bisect status
"Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
parents: 14967
diff changeset
336 """
36830
71f189941791 templatefilters: inline hbisect.shortlabel()
Yuya Nishihara <yuya@tcha.org>
parents: 36607
diff changeset
337 if label:
36831
82af07e1ae16 py3: fix slicing of bisect label in templatefilters.shortbisect()
Yuya Nishihara <yuya@tcha.org>
parents: 36830
diff changeset
338 return label[0:1].upper()
36830
71f189941791 templatefilters: inline hbisect.shortlabel()
Yuya Nishihara <yuya@tcha.org>
parents: 36607
diff changeset
339 return ' '
15155
f4a8d754cd0a templates: add 'bisect' keyword to return a cset's bisect status
"Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
parents: 14967
diff changeset
340
37227
9bcf096a2da2 templatefilters: declare input type as date where appropriate
Yuya Nishihara <yuya@tcha.org>
parents: 37223
diff changeset
341 @templatefilter('shortdate', intype=templateutil.date)
13590
1a752dcfe062 templatefilters: wrap all filters in dedicated functions
Patrick Mezard <pmezard@gmail.com>
parents: 13589
diff changeset
342 def shortdate(text):
28693
11f623b5668f templatefilters: use templatefilter to mark a function as template filter
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28692
diff changeset
343 """Date. Returns a date like "2006-09-18"."""
36607
c6061cadb400 util: extract all date-related utils in utils/dateutil module
Boris Feld <boris.feld@octobus.net>
parents: 36573
diff changeset
344 return dateutil.shortdate(text)
13590
1a752dcfe062 templatefilters: wrap all filters in dedicated functions
Patrick Mezard <pmezard@gmail.com>
parents: 13589
diff changeset
345
37223
08e042f0a67c templatefilters: declare input type as bytes where appropriate
Yuya Nishihara <yuya@tcha.org>
parents: 37222
diff changeset
346 @templatefilter('slashpath', intype=bytes)
35444
dad8a5071b0a templatefilters: add slashpath() to convert path separator to slash
Yuya Nishihara <yuya@tcha.org>
parents: 34837
diff changeset
347 def slashpath(path):
dad8a5071b0a templatefilters: add slashpath() to convert path separator to slash
Yuya Nishihara <yuya@tcha.org>
parents: 34837
diff changeset
348 """Any text. Replaces the native path separator with slash."""
dad8a5071b0a templatefilters: add slashpath() to convert path separator to slash
Yuya Nishihara <yuya@tcha.org>
parents: 34837
diff changeset
349 return util.pconvert(path)
dad8a5071b0a templatefilters: add slashpath() to convert path separator to slash
Yuya Nishihara <yuya@tcha.org>
parents: 34837
diff changeset
350
37223
08e042f0a67c templatefilters: declare input type as bytes where appropriate
Yuya Nishihara <yuya@tcha.org>
parents: 37222
diff changeset
351 @templatefilter('splitlines', intype=bytes)
21820
cce404b0c918 templatefilter: add splitlines function
Ryan McElroy <rmcelroy@fb.com>
parents: 19886
diff changeset
352 def splitlines(text):
28693
11f623b5668f templatefilters: use templatefilter to mark a function as template filter
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28692
diff changeset
353 """Any text. Split text into a list of lines."""
36921
32f9b7e3f056 templater: move hybrid class and functions to templateutil module
Yuya Nishihara <yuya@tcha.org>
parents: 36920
diff changeset
354 return templateutil.hybridlist(text.splitlines(), name='line')
21820
cce404b0c918 templatefilter: add splitlines function
Ryan McElroy <rmcelroy@fb.com>
parents: 19886
diff changeset
355
37223
08e042f0a67c templatefilters: declare input type as bytes where appropriate
Yuya Nishihara <yuya@tcha.org>
parents: 37222
diff changeset
356 @templatefilter('stringescape', intype=bytes)
13590
1a752dcfe062 templatefilters: wrap all filters in dedicated functions
Patrick Mezard <pmezard@gmail.com>
parents: 13589
diff changeset
357 def stringescape(text):
37084
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36921
diff changeset
358 return stringutil.escapestr(text)
13590
1a752dcfe062 templatefilters: wrap all filters in dedicated functions
Patrick Mezard <pmezard@gmail.com>
parents: 13589
diff changeset
359
37222
54355c243042 templatefilters: allow declaration of input data type
Yuya Nishihara <yuya@tcha.org>
parents: 37155
diff changeset
360 @templatefilter('stringify', intype=bytes)
13588
b8b881f3f3a7 templatefilters: sort function definitions
Patrick Mezard <pmezard@gmail.com>
parents: 13587
diff changeset
361 def stringify(thing):
28693
11f623b5668f templatefilters: use templatefilter to mark a function as template filter
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28692
diff changeset
362 """Any type. Turns the value into text by converting values into
13591
264f292a0c6f templatefilters: move doc from templates.txt to docstrings
Patrick Mezard <pmezard@gmail.com>
parents: 13590
diff changeset
363 text and concatenating them.
264f292a0c6f templatefilters: move doc from templates.txt to docstrings
Patrick Mezard <pmezard@gmail.com>
parents: 13590
diff changeset
364 """
37222
54355c243042 templatefilters: allow declaration of input data type
Yuya Nishihara <yuya@tcha.org>
parents: 37155
diff changeset
365 return thing # coerced by the intype
13588
b8b881f3f3a7 templatefilters: sort function definitions
Patrick Mezard <pmezard@gmail.com>
parents: 13587
diff changeset
366
37223
08e042f0a67c templatefilters: declare input type as bytes where appropriate
Yuya Nishihara <yuya@tcha.org>
parents: 37222
diff changeset
367 @templatefilter('stripdir', intype=bytes)
8158
1bef3656d9fe templatefilters: add new stripdir filter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents: 8014
diff changeset
368 def stripdir(text):
28693
11f623b5668f templatefilters: use templatefilter to mark a function as template filter
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28692
diff changeset
369 """Treat the text as path and strip a directory level, if
13591
264f292a0c6f templatefilters: move doc from templates.txt to docstrings
Patrick Mezard <pmezard@gmail.com>
parents: 13590
diff changeset
370 possible. For example, "foo" and "foo/bar" becomes "foo".
264f292a0c6f templatefilters: move doc from templates.txt to docstrings
Patrick Mezard <pmezard@gmail.com>
parents: 13590
diff changeset
371 """
8158
1bef3656d9fe templatefilters: add new stripdir filter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents: 8014
diff changeset
372 dir = os.path.dirname(text)
1bef3656d9fe templatefilters: add new stripdir filter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents: 8014
diff changeset
373 if dir == "":
1bef3656d9fe templatefilters: add new stripdir filter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents: 8014
diff changeset
374 return os.path.basename(text)
1bef3656d9fe templatefilters: add new stripdir filter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents: 8014
diff changeset
375 else:
1bef3656d9fe templatefilters: add new stripdir filter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents: 8014
diff changeset
376 return dir
1bef3656d9fe templatefilters: add new stripdir filter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents: 8014
diff changeset
377
37223
08e042f0a67c templatefilters: declare input type as bytes where appropriate
Yuya Nishihara <yuya@tcha.org>
parents: 37222
diff changeset
378 @templatefilter('tabindent', intype=bytes)
13590
1a752dcfe062 templatefilters: wrap all filters in dedicated functions
Patrick Mezard <pmezard@gmail.com>
parents: 13589
diff changeset
379 def tabindent(text):
28693
11f623b5668f templatefilters: use templatefilter to mark a function as template filter
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28692
diff changeset
380 """Any text. Returns the text, with every non-empty line
19467
1afe5d3939db template: fix tabindent docstring (issue2880)
Matt Mackall <mpm@selenic.com>
parents: 19228
diff changeset
381 except the first starting with a tab character.
13591
264f292a0c6f templatefilters: move doc from templates.txt to docstrings
Patrick Mezard <pmezard@gmail.com>
parents: 13590
diff changeset
382 """
13590
1a752dcfe062 templatefilters: wrap all filters in dedicated functions
Patrick Mezard <pmezard@gmail.com>
parents: 13589
diff changeset
383 return indent(text, '\t')
1a752dcfe062 templatefilters: wrap all filters in dedicated functions
Patrick Mezard <pmezard@gmail.com>
parents: 13589
diff changeset
384
37223
08e042f0a67c templatefilters: declare input type as bytes where appropriate
Yuya Nishihara <yuya@tcha.org>
parents: 37222
diff changeset
385 @templatefilter('upper', intype=bytes)
24566
6abce80e6cbf templatefilters: add "upper" and "lower" for case conversion
Yuya Nishihara <yuya@tcha.org>
parents: 23708
diff changeset
386 def upper(text):
28693
11f623b5668f templatefilters: use templatefilter to mark a function as template filter
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28692
diff changeset
387 """Any text. Converts the text to uppercase."""
24566
6abce80e6cbf templatefilters: add "upper" and "lower" for case conversion
Yuya Nishihara <yuya@tcha.org>
parents: 23708
diff changeset
388 return encoding.upper(text)
6abce80e6cbf templatefilters: add "upper" and "lower" for case conversion
Yuya Nishihara <yuya@tcha.org>
parents: 23708
diff changeset
389
37223
08e042f0a67c templatefilters: declare input type as bytes where appropriate
Yuya Nishihara <yuya@tcha.org>
parents: 37222
diff changeset
390 @templatefilter('urlescape', intype=bytes)
13590
1a752dcfe062 templatefilters: wrap all filters in dedicated functions
Patrick Mezard <pmezard@gmail.com>
parents: 13589
diff changeset
391 def urlescape(text):
28693
11f623b5668f templatefilters: use templatefilter to mark a function as template filter
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28692
diff changeset
392 """Any text. Escapes all "special" characters. For example,
13591
264f292a0c6f templatefilters: move doc from templates.txt to docstrings
Patrick Mezard <pmezard@gmail.com>
parents: 13590
diff changeset
393 "foo bar" becomes "foo%20bar".
264f292a0c6f templatefilters: move doc from templates.txt to docstrings
Patrick Mezard <pmezard@gmail.com>
parents: 13590
diff changeset
394 """
28883
032c4c2f802a pycompat: switch to util.urlreq/util.urlerr for py3 compat
timeless <timeless@mozdev.org>
parents: 28693
diff changeset
395 return urlreq.quote(text)
13590
1a752dcfe062 templatefilters: wrap all filters in dedicated functions
Patrick Mezard <pmezard@gmail.com>
parents: 13589
diff changeset
396
37223
08e042f0a67c templatefilters: declare input type as bytes where appropriate
Yuya Nishihara <yuya@tcha.org>
parents: 37222
diff changeset
397 @templatefilter('user', intype=bytes)
13590
1a752dcfe062 templatefilters: wrap all filters in dedicated functions
Patrick Mezard <pmezard@gmail.com>
parents: 13589
diff changeset
398 def userfilter(text):
28693
11f623b5668f templatefilters: use templatefilter to mark a function as template filter
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28692
diff changeset
399 """Any text. Returns a short representation of a user name or email
16360
e5788269741a templates/filters: extracting the user portion of an email address
Matteo Capobianco <m.capobianco@gmail.com>
parents: 16251
diff changeset
400 address."""
37084
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36921
diff changeset
401 return stringutil.shortuser(text)
13590
1a752dcfe062 templatefilters: wrap all filters in dedicated functions
Patrick Mezard <pmezard@gmail.com>
parents: 13589
diff changeset
402
37223
08e042f0a67c templatefilters: declare input type as bytes where appropriate
Yuya Nishihara <yuya@tcha.org>
parents: 37222
diff changeset
403 @templatefilter('emailuser', intype=bytes)
16360
e5788269741a templates/filters: extracting the user portion of an email address
Matteo Capobianco <m.capobianco@gmail.com>
parents: 16251
diff changeset
404 def emailuser(text):
28693
11f623b5668f templatefilters: use templatefilter to mark a function as template filter
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28692
diff changeset
405 """Any text. Returns the user portion of an email address."""
37084
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36921
diff changeset
406 return stringutil.emailuser(text)
16360
e5788269741a templates/filters: extracting the user portion of an email address
Matteo Capobianco <m.capobianco@gmail.com>
parents: 16251
diff changeset
407
37223
08e042f0a67c templatefilters: declare input type as bytes where appropriate
Yuya Nishihara <yuya@tcha.org>
parents: 37222
diff changeset
408 @templatefilter('utf8', intype=bytes)
28209
8ddf893560fa templatefilters: add "utf8" to get utf-8 bytes from local-encoding text
Yuya Nishihara <yuya@tcha.org>
parents: 28208
diff changeset
409 def utf8(text):
28693
11f623b5668f templatefilters: use templatefilter to mark a function as template filter
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28692
diff changeset
410 """Any text. Converts from the local character encoding to UTF-8."""
28209
8ddf893560fa templatefilters: add "utf8" to get utf-8 bytes from local-encoding text
Yuya Nishihara <yuya@tcha.org>
parents: 28208
diff changeset
411 return encoding.fromlocal(text)
8ddf893560fa templatefilters: add "utf8" to get utf-8 bytes from local-encoding text
Yuya Nishihara <yuya@tcha.org>
parents: 28208
diff changeset
412
37223
08e042f0a67c templatefilters: declare input type as bytes where appropriate
Yuya Nishihara <yuya@tcha.org>
parents: 37222
diff changeset
413 @templatefilter('xmlescape', intype=bytes)
13588
b8b881f3f3a7 templatefilters: sort function definitions
Patrick Mezard <pmezard@gmail.com>
parents: 13587
diff changeset
414 def xmlescape(text):
b8b881f3f3a7 templatefilters: sort function definitions
Patrick Mezard <pmezard@gmail.com>
parents: 13587
diff changeset
415 text = (text
b8b881f3f3a7 templatefilters: sort function definitions
Patrick Mezard <pmezard@gmail.com>
parents: 13587
diff changeset
416 .replace('&', '&amp;')
b8b881f3f3a7 templatefilters: sort function definitions
Patrick Mezard <pmezard@gmail.com>
parents: 13587
diff changeset
417 .replace('<', '&lt;')
b8b881f3f3a7 templatefilters: sort function definitions
Patrick Mezard <pmezard@gmail.com>
parents: 13587
diff changeset
418 .replace('>', '&gt;')
b8b881f3f3a7 templatefilters: sort function definitions
Patrick Mezard <pmezard@gmail.com>
parents: 13587
diff changeset
419 .replace('"', '&quot;')
b8b881f3f3a7 templatefilters: sort function definitions
Patrick Mezard <pmezard@gmail.com>
parents: 13587
diff changeset
420 .replace("'", '&#39;')) # &apos; invalid in HTML
b8b881f3f3a7 templatefilters: sort function definitions
Patrick Mezard <pmezard@gmail.com>
parents: 13587
diff changeset
421 return re.sub('[\x00-\x08\x0B\x0C\x0E-\x1F]', ' ', text)
8234
27dbe534397b templatefilters: add "nonempty" template filter
Rocco Rutte <pdmef@gmx.net>
parents: 8225
diff changeset
422
18627
4e949b8e0930 hgweb: add websub template filter
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 17772
diff changeset
423 def websub(text, websubtable):
4e949b8e0930 hgweb: add websub template filter
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 17772
diff changeset
424 """:websub: Any text. Only applies to hgweb. Applies the regular
4e949b8e0930 hgweb: add websub template filter
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 17772
diff changeset
425 expression replacements defined in the websub section.
4e949b8e0930 hgweb: add websub template filter
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 17772
diff changeset
426 """
4e949b8e0930 hgweb: add websub template filter
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 17772
diff changeset
427 if websubtable:
4e949b8e0930 hgweb: add websub template filter
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 17772
diff changeset
428 for regexp, format in websubtable:
4e949b8e0930 hgweb: add websub template filter
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 17772
diff changeset
429 text = regexp.sub(format, text)
4e949b8e0930 hgweb: add websub template filter
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 17772
diff changeset
430 return text
4e949b8e0930 hgweb: add websub template filter
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 17772
diff changeset
431
28692
6b3b958daf03 registrar: add templatefilter to mark a function as template filter (API)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28213
diff changeset
432 def loadfilter(ui, extname, registrarobj):
6b3b958daf03 registrar: add templatefilter to mark a function as template filter (API)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28213
diff changeset
433 """Load template filter from specified registrarobj
6b3b958daf03 registrar: add templatefilter to mark a function as template filter (API)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28213
diff changeset
434 """
6b3b958daf03 registrar: add templatefilter to mark a function as template filter (API)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28213
diff changeset
435 for name, func in registrarobj._table.iteritems():
6b3b958daf03 registrar: add templatefilter to mark a function as template filter (API)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28213
diff changeset
436 filters[name] = func
6b3b958daf03 registrar: add templatefilter to mark a function as template filter (API)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28213
diff changeset
437
13591
264f292a0c6f templatefilters: move doc from templates.txt to docstrings
Patrick Mezard <pmezard@gmail.com>
parents: 13590
diff changeset
438 # tell hggettext to extract docstrings from these functions:
264f292a0c6f templatefilters: move doc from templates.txt to docstrings
Patrick Mezard <pmezard@gmail.com>
parents: 13590
diff changeset
439 i18nfunctions = filters.values()