Mercurial > hg
annotate mercurial/templatefilters.py @ 42018:0e6422942c84
perf: pass limits as a function argument
The function applying the limit has no access to the configuration. Therefore,
some higher layer will have to pass it as argument.
We do this in an independent change to clarify the next change.
author | Pierre-Yves David <pierre-yves.david@octobus.net> |
---|---|
date | Sat, 16 Mar 2019 19:11:19 +0000 |
parents | 4df7c4b70e03 |
children | 2372284d9457 |
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 | 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 ( |
41997
4df7c4b70e03
templatefilters: add {x|cbor} filter for custom CBOR output
Yuya Nishihara <yuya@tcha.org>
parents:
40029
diff
changeset
|
26 cborutil, |
37084
f0b6fbea00cf
stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
36921
diff
changeset
|
27 dateutil, |
f0b6fbea00cf
stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
36921
diff
changeset
|
28 stringutil, |
f0b6fbea00cf
stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
36921
diff
changeset
|
29 ) |
5976
9f1e6ab76069
templates: move filters to their own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
30 |
28883
032c4c2f802a
pycompat: switch to util.urlreq/util.urlerr for py3 compat
timeless <timeless@mozdev.org>
parents:
28693
diff
changeset
|
31 urlerr = util.urlerr |
032c4c2f802a
pycompat: switch to util.urlreq/util.urlerr for py3 compat
timeless <timeless@mozdev.org>
parents:
28693
diff
changeset
|
32 urlreq = util.urlreq |
032c4c2f802a
pycompat: switch to util.urlreq/util.urlerr for py3 compat
timeless <timeless@mozdev.org>
parents:
28693
diff
changeset
|
33 |
32126
e37fd5be0fed
py3: alias long to int on Python 3
Pulkit Goyal <7895pulkit@gmail.com>
parents:
32039
diff
changeset
|
34 if pycompat.ispy3: |
e37fd5be0fed
py3: alias long to int on Python 3
Pulkit Goyal <7895pulkit@gmail.com>
parents:
32039
diff
changeset
|
35 long = int |
e37fd5be0fed
py3: alias long to int on Python 3
Pulkit Goyal <7895pulkit@gmail.com>
parents:
32039
diff
changeset
|
36 |
28693
11f623b5668f
templatefilters: use templatefilter to mark a function as template filter
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
28692
diff
changeset
|
37 # 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
|
38 # fn(obj) |
11f623b5668f
templatefilters: use templatefilter to mark a function as template filter
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
28692
diff
changeset
|
39 # with: |
11f623b5668f
templatefilters: use templatefilter to mark a function as template filter
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
28692
diff
changeset
|
40 # 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
|
41 filters = {} |
11f623b5668f
templatefilters: use templatefilter to mark a function as template filter
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
28692
diff
changeset
|
42 |
11f623b5668f
templatefilters: use templatefilter to mark a function as template filter
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
28692
diff
changeset
|
43 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
|
44 |
37223
08e042f0a67c
templatefilters: declare input type as bytes where appropriate
Yuya Nishihara <yuya@tcha.org>
parents:
37222
diff
changeset
|
45 @templatefilter('addbreaks', intype=bytes) |
13588
b8b881f3f3a7
templatefilters: sort function definitions
Patrick Mezard <pmezard@gmail.com>
parents:
13587
diff
changeset
|
46 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
|
47 """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
|
48 every line except the last. |
264f292a0c6f
templatefilters: move doc from templates.txt to docstrings
Patrick Mezard <pmezard@gmail.com>
parents:
13590
diff
changeset
|
49 """ |
13588
b8b881f3f3a7
templatefilters: sort function definitions
Patrick Mezard <pmezard@gmail.com>
parents:
13587
diff
changeset
|
50 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
|
51 |
19736
f08e542ce918
templatefilters: add short format for age formatting
David Soria Parra <dsp@experimentalworks.net>
parents:
19467
diff
changeset
|
52 agescales = [("year", 3600 * 24 * 365, 'Y'), |
f08e542ce918
templatefilters: add short format for age formatting
David Soria Parra <dsp@experimentalworks.net>
parents:
19467
diff
changeset
|
53 ("month", 3600 * 24 * 30, 'M'), |
f08e542ce918
templatefilters: add short format for age formatting
David Soria Parra <dsp@experimentalworks.net>
parents:
19467
diff
changeset
|
54 ("week", 3600 * 24 * 7, 'W'), |
f08e542ce918
templatefilters: add short format for age formatting
David Soria Parra <dsp@experimentalworks.net>
parents:
19467
diff
changeset
|
55 ("day", 3600 * 24, 'd'), |
f08e542ce918
templatefilters: add short format for age formatting
David Soria Parra <dsp@experimentalworks.net>
parents:
19467
diff
changeset
|
56 ("hour", 3600, 'h'), |
f08e542ce918
templatefilters: add short format for age formatting
David Soria Parra <dsp@experimentalworks.net>
parents:
19467
diff
changeset
|
57 ("minute", 60, 'm'), |
f08e542ce918
templatefilters: add short format for age formatting
David Soria Parra <dsp@experimentalworks.net>
parents:
19467
diff
changeset
|
58 ("second", 1, 's')] |
5976
9f1e6ab76069
templates: move filters to their own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
59 |
37227
9bcf096a2da2
templatefilters: declare input type as date where appropriate
Yuya Nishihara <yuya@tcha.org>
parents:
37223
diff
changeset
|
60 @templatefilter('age', intype=templateutil.date) |
19736
f08e542ce918
templatefilters: add short format for age formatting
David Soria Parra <dsp@experimentalworks.net>
parents:
19467
diff
changeset
|
61 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
|
62 """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
|
63 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
|
64 """ |
5976
9f1e6ab76069
templates: move filters to their own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
65 |
9f1e6ab76069
templates: move filters to their own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
66 def plural(t, c): |
9f1e6ab76069
templates: move filters to their own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
67 if c == 1: |
9f1e6ab76069
templates: move filters to their own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
68 return t |
9f1e6ab76069
templates: move filters to their own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
69 return t + "s" |
19736
f08e542ce918
templatefilters: add short format for age formatting
David Soria Parra <dsp@experimentalworks.net>
parents:
19467
diff
changeset
|
70 def fmt(t, c, a): |
f08e542ce918
templatefilters: add short format for age formatting
David Soria Parra <dsp@experimentalworks.net>
parents:
19467
diff
changeset
|
71 if abbrev: |
f08e542ce918
templatefilters: add short format for age formatting
David Soria Parra <dsp@experimentalworks.net>
parents:
19467
diff
changeset
|
72 return "%d%s" % (c, a) |
5976
9f1e6ab76069
templates: move filters to their own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
73 return "%d %s" % (c, plural(t, c)) |
9f1e6ab76069
templates: move filters to their own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
74 |
9f1e6ab76069
templates: move filters to their own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
75 now = time.time() |
9f1e6ab76069
templates: move filters to their own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
76 then = date[0] |
13666
c49cddce0a81
templates: provide granularity for future values for age filter
timeless <timeless@gmail.com>
parents:
13593
diff
changeset
|
77 future = False |
7682
9c8bbae02e9c
templater: fix age filter to state the obvious on future timestamps
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
6691
diff
changeset
|
78 if then > now: |
13666
c49cddce0a81
templates: provide granularity for future values for age filter
timeless <timeless@gmail.com>
parents:
13593
diff
changeset
|
79 future = True |
c49cddce0a81
templates: provide granularity for future values for age filter
timeless <timeless@gmail.com>
parents:
13593
diff
changeset
|
80 delta = max(1, int(then - now)) |
c49cddce0a81
templates: provide granularity for future values for age filter
timeless <timeless@gmail.com>
parents:
13593
diff
changeset
|
81 if delta > agescales[0][1] * 30: |
c49cddce0a81
templates: provide granularity for future values for age filter
timeless <timeless@gmail.com>
parents:
13593
diff
changeset
|
82 return 'in the distant future' |
c49cddce0a81
templates: provide granularity for future values for age filter
timeless <timeless@gmail.com>
parents:
13593
diff
changeset
|
83 else: |
c49cddce0a81
templates: provide granularity for future values for age filter
timeless <timeless@gmail.com>
parents:
13593
diff
changeset
|
84 delta = max(1, int(now - then)) |
c49cddce0a81
templates: provide granularity for future values for age filter
timeless <timeless@gmail.com>
parents:
13593
diff
changeset
|
85 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
|
86 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
|
87 |
19736
f08e542ce918
templatefilters: add short format for age formatting
David Soria Parra <dsp@experimentalworks.net>
parents:
19467
diff
changeset
|
88 for t, s, a in agescales: |
9029
0001e49f1c11
compat: use // for integer division
Alejandro Santos <alejolp@alejolp.com>
parents:
8697
diff
changeset
|
89 n = delta // s |
5976
9f1e6ab76069
templates: move filters to their own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
90 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
|
91 if future: |
19736
f08e542ce918
templatefilters: add short format for age formatting
David Soria Parra <dsp@experimentalworks.net>
parents:
19467
diff
changeset
|
92 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
|
93 return '%s ago' % fmt(t, n, a) |
5976
9f1e6ab76069
templates: move filters to their own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
94 |
37223
08e042f0a67c
templatefilters: declare input type as bytes where appropriate
Yuya Nishihara <yuya@tcha.org>
parents:
37222
diff
changeset
|
95 @templatefilter('basename', intype=bytes) |
13590
1a752dcfe062
templatefilters: wrap all filters in dedicated functions
Patrick Mezard <pmezard@gmail.com>
parents:
13589
diff
changeset
|
96 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
|
97 """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
|
98 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
|
99 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
|
100 """ |
13590
1a752dcfe062
templatefilters: wrap all filters in dedicated functions
Patrick Mezard <pmezard@gmail.com>
parents:
13589
diff
changeset
|
101 return os.path.basename(path) |
1a752dcfe062
templatefilters: wrap all filters in dedicated functions
Patrick Mezard <pmezard@gmail.com>
parents:
13589
diff
changeset
|
102 |
41997
4df7c4b70e03
templatefilters: add {x|cbor} filter for custom CBOR output
Yuya Nishihara <yuya@tcha.org>
parents:
40029
diff
changeset
|
103 @templatefilter('cbor') |
4df7c4b70e03
templatefilters: add {x|cbor} filter for custom CBOR output
Yuya Nishihara <yuya@tcha.org>
parents:
40029
diff
changeset
|
104 def cbor(obj): |
4df7c4b70e03
templatefilters: add {x|cbor} filter for custom CBOR output
Yuya Nishihara <yuya@tcha.org>
parents:
40029
diff
changeset
|
105 """Any object. Serializes the object to CBOR bytes.""" |
4df7c4b70e03
templatefilters: add {x|cbor} filter for custom CBOR output
Yuya Nishihara <yuya@tcha.org>
parents:
40029
diff
changeset
|
106 return b''.join(cborutil.streamencode(obj)) |
4df7c4b70e03
templatefilters: add {x|cbor} filter for custom CBOR output
Yuya Nishihara <yuya@tcha.org>
parents:
40029
diff
changeset
|
107 |
38304
fabfbbf4dee2
templatefilters: rename commonprefix to commondir
Martin von Zweigbergk <martinvonz@google.com>
parents:
38300
diff
changeset
|
108 @templatefilter('commondir') |
fabfbbf4dee2
templatefilters: rename commonprefix to commondir
Martin von Zweigbergk <martinvonz@google.com>
parents:
38300
diff
changeset
|
109 def commondir(filelist): |
38201
56dd15178190
templatefilters: add commonprefix
Joerg Sonnenberger <joerg@bec.de>
parents:
38024
diff
changeset
|
110 """List of text. Treats each list item as file name with / |
56dd15178190
templatefilters: add commonprefix
Joerg Sonnenberger <joerg@bec.de>
parents:
38024
diff
changeset
|
111 as path separator and returns the longest common directory |
56dd15178190
templatefilters: add commonprefix
Joerg Sonnenberger <joerg@bec.de>
parents:
38024
diff
changeset
|
112 prefix shared by all list items. |
56dd15178190
templatefilters: add commonprefix
Joerg Sonnenberger <joerg@bec.de>
parents:
38024
diff
changeset
|
113 Returns the empty string if no common prefix exists. |
56dd15178190
templatefilters: add commonprefix
Joerg Sonnenberger <joerg@bec.de>
parents:
38024
diff
changeset
|
114 |
56dd15178190
templatefilters: add commonprefix
Joerg Sonnenberger <joerg@bec.de>
parents:
38024
diff
changeset
|
115 The list items are not normalized, i.e. "foo/../bar" is handled as |
56dd15178190
templatefilters: add commonprefix
Joerg Sonnenberger <joerg@bec.de>
parents:
38024
diff
changeset
|
116 file "bar" in the directory "foo/..". Leading slashes are ignored. |
56dd15178190
templatefilters: add commonprefix
Joerg Sonnenberger <joerg@bec.de>
parents:
38024
diff
changeset
|
117 |
56dd15178190
templatefilters: add commonprefix
Joerg Sonnenberger <joerg@bec.de>
parents:
38024
diff
changeset
|
118 For example, ["foo/bar/baz", "foo/baz/bar"] becomes "foo" and |
56dd15178190
templatefilters: add commonprefix
Joerg Sonnenberger <joerg@bec.de>
parents:
38024
diff
changeset
|
119 ["foo/bar", "baz"] becomes "". |
56dd15178190
templatefilters: add commonprefix
Joerg Sonnenberger <joerg@bec.de>
parents:
38024
diff
changeset
|
120 """ |
56dd15178190
templatefilters: add commonprefix
Joerg Sonnenberger <joerg@bec.de>
parents:
38024
diff
changeset
|
121 def common(a, b): |
56dd15178190
templatefilters: add commonprefix
Joerg Sonnenberger <joerg@bec.de>
parents:
38024
diff
changeset
|
122 if len(a) > len(b): |
56dd15178190
templatefilters: add commonprefix
Joerg Sonnenberger <joerg@bec.de>
parents:
38024
diff
changeset
|
123 a = b[:len(a)] |
56dd15178190
templatefilters: add commonprefix
Joerg Sonnenberger <joerg@bec.de>
parents:
38024
diff
changeset
|
124 elif len(b) > len(a): |
56dd15178190
templatefilters: add commonprefix
Joerg Sonnenberger <joerg@bec.de>
parents:
38024
diff
changeset
|
125 b = b[:len(a)] |
56dd15178190
templatefilters: add commonprefix
Joerg Sonnenberger <joerg@bec.de>
parents:
38024
diff
changeset
|
126 if a == b: |
56dd15178190
templatefilters: add commonprefix
Joerg Sonnenberger <joerg@bec.de>
parents:
38024
diff
changeset
|
127 return a |
38783
e7aa113b14f7
global: use pycompat.xrange()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
38304
diff
changeset
|
128 for i in pycompat.xrange(len(a)): |
38201
56dd15178190
templatefilters: add commonprefix
Joerg Sonnenberger <joerg@bec.de>
parents:
38024
diff
changeset
|
129 if a[i] != b[i]: |
56dd15178190
templatefilters: add commonprefix
Joerg Sonnenberger <joerg@bec.de>
parents:
38024
diff
changeset
|
130 return a[:i] |
56dd15178190
templatefilters: add commonprefix
Joerg Sonnenberger <joerg@bec.de>
parents:
38024
diff
changeset
|
131 return a |
56dd15178190
templatefilters: add commonprefix
Joerg Sonnenberger <joerg@bec.de>
parents:
38024
diff
changeset
|
132 try: |
56dd15178190
templatefilters: add commonprefix
Joerg Sonnenberger <joerg@bec.de>
parents:
38024
diff
changeset
|
133 if not filelist: |
56dd15178190
templatefilters: add commonprefix
Joerg Sonnenberger <joerg@bec.de>
parents:
38024
diff
changeset
|
134 return "" |
56dd15178190
templatefilters: add commonprefix
Joerg Sonnenberger <joerg@bec.de>
parents:
38024
diff
changeset
|
135 dirlist = [f.lstrip('/').split('/')[:-1] for f in filelist] |
56dd15178190
templatefilters: add commonprefix
Joerg Sonnenberger <joerg@bec.de>
parents:
38024
diff
changeset
|
136 if len(dirlist) == 1: |
56dd15178190
templatefilters: add commonprefix
Joerg Sonnenberger <joerg@bec.de>
parents:
38024
diff
changeset
|
137 return '/'.join(dirlist[0]) |
56dd15178190
templatefilters: add commonprefix
Joerg Sonnenberger <joerg@bec.de>
parents:
38024
diff
changeset
|
138 a = min(dirlist) |
56dd15178190
templatefilters: add commonprefix
Joerg Sonnenberger <joerg@bec.de>
parents:
38024
diff
changeset
|
139 b = max(dirlist) |
56dd15178190
templatefilters: add commonprefix
Joerg Sonnenberger <joerg@bec.de>
parents:
38024
diff
changeset
|
140 # The common prefix of a and b is shared with all |
56dd15178190
templatefilters: add commonprefix
Joerg Sonnenberger <joerg@bec.de>
parents:
38024
diff
changeset
|
141 # elements of the list since Python sorts lexicographical |
56dd15178190
templatefilters: add commonprefix
Joerg Sonnenberger <joerg@bec.de>
parents:
38024
diff
changeset
|
142 # and [1, x] after [1]. |
56dd15178190
templatefilters: add commonprefix
Joerg Sonnenberger <joerg@bec.de>
parents:
38024
diff
changeset
|
143 return '/'.join(common(a, b)) |
56dd15178190
templatefilters: add commonprefix
Joerg Sonnenberger <joerg@bec.de>
parents:
38024
diff
changeset
|
144 except TypeError: |
56dd15178190
templatefilters: add commonprefix
Joerg Sonnenberger <joerg@bec.de>
parents:
38024
diff
changeset
|
145 raise error.ParseError(_('argument is not a list of text')) |
56dd15178190
templatefilters: add commonprefix
Joerg Sonnenberger <joerg@bec.de>
parents:
38024
diff
changeset
|
146 |
28693
11f623b5668f
templatefilters: use templatefilter to mark a function as template filter
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
28692
diff
changeset
|
147 @templatefilter('count') |
22668
13e3f07d74a3
templater: add count template filter, plus tests
Anton Shestakov <engored@ya.ru>
parents:
21873
diff
changeset
|
148 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
|
149 """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
|
150 try: |
05db42732fce
templatefilters: handle TypeError by count()
Yuya Nishihara <yuya@tcha.org>
parents:
37227
diff
changeset
|
151 return len(i) |
05db42732fce
templatefilters: handle TypeError by count()
Yuya Nishihara <yuya@tcha.org>
parents:
37227
diff
changeset
|
152 except TypeError: |
05db42732fce
templatefilters: handle TypeError by count()
Yuya Nishihara <yuya@tcha.org>
parents:
37227
diff
changeset
|
153 raise error.ParseError(_('not countable')) |
22668
13e3f07d74a3
templater: add count template filter, plus tests
Anton Shestakov <engored@ya.ru>
parents:
21873
diff
changeset
|
154 |
37223
08e042f0a67c
templatefilters: declare input type as bytes where appropriate
Yuya Nishihara <yuya@tcha.org>
parents:
37222
diff
changeset
|
155 @templatefilter('dirname', intype=bytes) |
36246
9ee10b3284da
templatefilters: add dirname() filter
Yuya Nishihara <yuya@tcha.org>
parents:
35751
diff
changeset
|
156 def dirname(path): |
9ee10b3284da
templatefilters: add dirname() filter
Yuya Nishihara <yuya@tcha.org>
parents:
35751
diff
changeset
|
157 """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
|
158 component of the path after splitting by the path separator. |
9ee10b3284da
templatefilters: add dirname() filter
Yuya Nishihara <yuya@tcha.org>
parents:
35751
diff
changeset
|
159 """ |
9ee10b3284da
templatefilters: add dirname() filter
Yuya Nishihara <yuya@tcha.org>
parents:
35751
diff
changeset
|
160 return os.path.dirname(path) |
9ee10b3284da
templatefilters: add dirname() filter
Yuya Nishihara <yuya@tcha.org>
parents:
35751
diff
changeset
|
161 |
37223
08e042f0a67c
templatefilters: declare input type as bytes where appropriate
Yuya Nishihara <yuya@tcha.org>
parents:
37222
diff
changeset
|
162 @templatefilter('domain', intype=bytes) |
13588
b8b881f3f3a7
templatefilters: sort function definitions
Patrick Mezard <pmezard@gmail.com>
parents:
13587
diff
changeset
|
163 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
|
164 """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
|
165 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
|
166 <user@example.com>`` becomes ``example.com``. |
264f292a0c6f
templatefilters: move doc from templates.txt to docstrings
Patrick Mezard <pmezard@gmail.com>
parents:
13590
diff
changeset
|
167 """ |
13588
b8b881f3f3a7
templatefilters: sort function definitions
Patrick Mezard <pmezard@gmail.com>
parents:
13587
diff
changeset
|
168 f = author.find('@') |
b8b881f3f3a7
templatefilters: sort function definitions
Patrick Mezard <pmezard@gmail.com>
parents:
13587
diff
changeset
|
169 if f == -1: |
b8b881f3f3a7
templatefilters: sort function definitions
Patrick Mezard <pmezard@gmail.com>
parents:
13587
diff
changeset
|
170 return '' |
b8b881f3f3a7
templatefilters: sort function definitions
Patrick Mezard <pmezard@gmail.com>
parents:
13587
diff
changeset
|
171 author = author[f + 1:] |
b8b881f3f3a7
templatefilters: sort function definitions
Patrick Mezard <pmezard@gmail.com>
parents:
13587
diff
changeset
|
172 f = author.find('>') |
b8b881f3f3a7
templatefilters: sort function definitions
Patrick Mezard <pmezard@gmail.com>
parents:
13587
diff
changeset
|
173 if f >= 0: |
b8b881f3f3a7
templatefilters: sort function definitions
Patrick Mezard <pmezard@gmail.com>
parents:
13587
diff
changeset
|
174 author = author[:f] |
b8b881f3f3a7
templatefilters: sort function definitions
Patrick Mezard <pmezard@gmail.com>
parents:
13587
diff
changeset
|
175 return author |
b8b881f3f3a7
templatefilters: sort function definitions
Patrick Mezard <pmezard@gmail.com>
parents:
13587
diff
changeset
|
176 |
37223
08e042f0a67c
templatefilters: declare input type as bytes where appropriate
Yuya Nishihara <yuya@tcha.org>
parents:
37222
diff
changeset
|
177 @templatefilter('email', intype=bytes) |
13590
1a752dcfe062
templatefilters: wrap all filters in dedicated functions
Patrick Mezard <pmezard@gmail.com>
parents:
13589
diff
changeset
|
178 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
|
179 """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
|
180 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
|
181 ``user@example.com``. |
264f292a0c6f
templatefilters: move doc from templates.txt to docstrings
Patrick Mezard <pmezard@gmail.com>
parents:
13590
diff
changeset
|
182 """ |
37084
f0b6fbea00cf
stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
36921
diff
changeset
|
183 return stringutil.email(text) |
13590
1a752dcfe062
templatefilters: wrap all filters in dedicated functions
Patrick Mezard <pmezard@gmail.com>
parents:
13589
diff
changeset
|
184 |
37223
08e042f0a67c
templatefilters: declare input type as bytes where appropriate
Yuya Nishihara <yuya@tcha.org>
parents:
37222
diff
changeset
|
185 @templatefilter('escape', intype=bytes) |
13590
1a752dcfe062
templatefilters: wrap all filters in dedicated functions
Patrick Mezard <pmezard@gmail.com>
parents:
13589
diff
changeset
|
186 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
|
187 """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
|
188 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
|
189 """ |
34695
e178fcaa3933
python3: use our bytes-only version of cgi.escape everywhere
Augie Fackler <augie@google.com>
parents:
34131
diff
changeset
|
190 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
|
191 |
5976
9f1e6ab76069
templates: move filters to their own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
192 para_re = None |
9f1e6ab76069
templates: move filters to their own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
193 space_re = None |
9f1e6ab76069
templates: move filters to their own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
194 |
19872
681f7b9213a4
check-code: check for spaces around = for named parameters
Mads Kiilerich <madski@unity3d.com>
parents:
19736
diff
changeset
|
195 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
|
196 '''fill many paragraphs with optional indentation.''' |
5976
9f1e6ab76069
templates: move filters to their own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
197 global para_re, space_re |
9f1e6ab76069
templates: move filters to their own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
198 if para_re is None: |
9f1e6ab76069
templates: move filters to their own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
199 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
|
200 space_re = re.compile(br' +') |
5976
9f1e6ab76069
templates: move filters to their own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
201 |
9f1e6ab76069
templates: move filters to their own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
202 def findparas(): |
9f1e6ab76069
templates: move filters to their own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
203 start = 0 |
9f1e6ab76069
templates: move filters to their own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
204 while True: |
9f1e6ab76069
templates: move filters to their own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
205 m = para_re.search(text, start) |
9f1e6ab76069
templates: move filters to their own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
206 if not m: |
36497
b2e54b257832
templatefilters: use encoding.unifromlocal/unitolocal() for py3 compatibility
Yuya Nishihara <yuya@tcha.org>
parents:
36246
diff
changeset
|
207 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
|
208 w = len(uctext) |
40029
e2697acd9381
cleanup: some Yoda conditions, this patch removes
Martin von Zweigbergk <martinvonz@google.com>
parents:
38783
diff
changeset
|
209 while w > 0 and uctext[w - 1].isspace(): |
10282
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10263
diff
changeset
|
210 w -= 1 |
36497
b2e54b257832
templatefilters: use encoding.unifromlocal/unitolocal() for py3 compatibility
Yuya Nishihara <yuya@tcha.org>
parents:
36246
diff
changeset
|
211 yield (encoding.unitolocal(uctext[:w]), |
b2e54b257832
templatefilters: use encoding.unifromlocal/unitolocal() for py3 compatibility
Yuya Nishihara <yuya@tcha.org>
parents:
36246
diff
changeset
|
212 encoding.unitolocal(uctext[w:])) |
5976
9f1e6ab76069
templates: move filters to their own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
213 break |
9f1e6ab76069
templates: move filters to their own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
214 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
|
215 start = m.end(1) |
9f1e6ab76069
templates: move filters to their own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
216 |
37084
f0b6fbea00cf
stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
36921
diff
changeset
|
217 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
|
218 stringutil.wrap(para, width)), |
f0b6fbea00cf
stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
36921
diff
changeset
|
219 width, initindent, hangindent) + rest |
5976
9f1e6ab76069
templates: move filters to their own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
220 for para, rest in findparas()]) |
9f1e6ab76069
templates: move filters to their own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
221 |
37223
08e042f0a67c
templatefilters: declare input type as bytes where appropriate
Yuya Nishihara <yuya@tcha.org>
parents:
37222
diff
changeset
|
222 @templatefilter('fill68', intype=bytes) |
13590
1a752dcfe062
templatefilters: wrap all filters in dedicated functions
Patrick Mezard <pmezard@gmail.com>
parents:
13589
diff
changeset
|
223 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
|
224 """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
|
225 return fill(text, 68) |
1a752dcfe062
templatefilters: wrap all filters in dedicated functions
Patrick Mezard <pmezard@gmail.com>
parents:
13589
diff
changeset
|
226 |
37223
08e042f0a67c
templatefilters: declare input type as bytes where appropriate
Yuya Nishihara <yuya@tcha.org>
parents:
37222
diff
changeset
|
227 @templatefilter('fill76', intype=bytes) |
13590
1a752dcfe062
templatefilters: wrap all filters in dedicated functions
Patrick Mezard <pmezard@gmail.com>
parents:
13589
diff
changeset
|
228 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
|
229 """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
|
230 return fill(text, 76) |
1a752dcfe062
templatefilters: wrap all filters in dedicated functions
Patrick Mezard <pmezard@gmail.com>
parents:
13589
diff
changeset
|
231 |
37223
08e042f0a67c
templatefilters: declare input type as bytes where appropriate
Yuya Nishihara <yuya@tcha.org>
parents:
37222
diff
changeset
|
232 @templatefilter('firstline', intype=bytes) |
5976
9f1e6ab76069
templates: move filters to their own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
233 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
|
234 """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
|
235 try: |
9136
31177742f54a
for calls expecting bool args, pass bool instead of int
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
9029
diff
changeset
|
236 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
|
237 except IndexError: |
9f1e6ab76069
templates: move filters to their own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
238 return '' |
9f1e6ab76069
templates: move filters to their own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
239 |
37223
08e042f0a67c
templatefilters: declare input type as bytes where appropriate
Yuya Nishihara <yuya@tcha.org>
parents:
37222
diff
changeset
|
240 @templatefilter('hex', intype=bytes) |
13590
1a752dcfe062
templatefilters: wrap all filters in dedicated functions
Patrick Mezard <pmezard@gmail.com>
parents:
13589
diff
changeset
|
241 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
|
242 """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
|
243 its long hexadecimal representation. |
264f292a0c6f
templatefilters: move doc from templates.txt to docstrings
Patrick Mezard <pmezard@gmail.com>
parents:
13590
diff
changeset
|
244 """ |
13590
1a752dcfe062
templatefilters: wrap all filters in dedicated functions
Patrick Mezard <pmezard@gmail.com>
parents:
13589
diff
changeset
|
245 return node.hex(text) |
1a752dcfe062
templatefilters: wrap all filters in dedicated functions
Patrick Mezard <pmezard@gmail.com>
parents:
13589
diff
changeset
|
246 |
37227
9bcf096a2da2
templatefilters: declare input type as date where appropriate
Yuya Nishihara <yuya@tcha.org>
parents:
37223
diff
changeset
|
247 @templatefilter('hgdate', intype=templateutil.date) |
13590
1a752dcfe062
templatefilters: wrap all filters in dedicated functions
Patrick Mezard <pmezard@gmail.com>
parents:
13589
diff
changeset
|
248 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
|
249 """Date. Returns the date as a pair of numbers: "1157407993 |
38300
74b4a54002ec
templatefilters: undeprecate hgdate
Yuya Nishihara <yuya@tcha.org>
parents:
38287
diff
changeset
|
250 25200" (Unix timestamp, timezone offset). |
13591
264f292a0c6f
templatefilters: move doc from templates.txt to docstrings
Patrick Mezard <pmezard@gmail.com>
parents:
13590
diff
changeset
|
251 """ |
13590
1a752dcfe062
templatefilters: wrap all filters in dedicated functions
Patrick Mezard <pmezard@gmail.com>
parents:
13589
diff
changeset
|
252 return "%d %d" % text |
1a752dcfe062
templatefilters: wrap all filters in dedicated functions
Patrick Mezard <pmezard@gmail.com>
parents:
13589
diff
changeset
|
253 |
37227
9bcf096a2da2
templatefilters: declare input type as date where appropriate
Yuya Nishihara <yuya@tcha.org>
parents:
37223
diff
changeset
|
254 @templatefilter('isodate', intype=templateutil.date) |
13590
1a752dcfe062
templatefilters: wrap all filters in dedicated functions
Patrick Mezard <pmezard@gmail.com>
parents:
13589
diff
changeset
|
255 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
|
256 """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
|
257 +0200". |
264f292a0c6f
templatefilters: move doc from templates.txt to docstrings
Patrick Mezard <pmezard@gmail.com>
parents:
13590
diff
changeset
|
258 """ |
36607
c6061cadb400
util: extract all date-related utils in utils/dateutil module
Boris Feld <boris.feld@octobus.net>
parents:
36573
diff
changeset
|
259 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
|
260 |
37227
9bcf096a2da2
templatefilters: declare input type as date where appropriate
Yuya Nishihara <yuya@tcha.org>
parents:
37223
diff
changeset
|
261 @templatefilter('isodatesec', intype=templateutil.date) |
13590
1a752dcfe062
templatefilters: wrap all filters in dedicated functions
Patrick Mezard <pmezard@gmail.com>
parents:
13589
diff
changeset
|
262 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
|
263 """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
|
264 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
|
265 filter. |
264f292a0c6f
templatefilters: move doc from templates.txt to docstrings
Patrick Mezard <pmezard@gmail.com>
parents:
13590
diff
changeset
|
266 """ |
36607
c6061cadb400
util: extract all date-related utils in utils/dateutil module
Boris Feld <boris.feld@octobus.net>
parents:
36573
diff
changeset
|
267 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
|
268 |
5976
9f1e6ab76069
templates: move filters to their own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
269 def indent(text, prefix): |
9f1e6ab76069
templates: move filters to their own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
270 '''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
|
271 lines = text.splitlines() |
9f1e6ab76069
templates: move filters to their own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
272 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
|
273 endswithnewline = text[-1:] == '\n' |
5976
9f1e6ab76069
templates: move filters to their own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
274 def indenter(): |
38783
e7aa113b14f7
global: use pycompat.xrange()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
38304
diff
changeset
|
275 for i in pycompat.xrange(num_lines): |
5976
9f1e6ab76069
templates: move filters to their own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
276 l = lines[i] |
9f1e6ab76069
templates: move filters to their own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
277 if i and l.strip(): |
9f1e6ab76069
templates: move filters to their own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
278 yield prefix |
9f1e6ab76069
templates: move filters to their own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
279 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
|
280 if i < num_lines - 1 or endswithnewline: |
5976
9f1e6ab76069
templates: move filters to their own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
281 yield '\n' |
9f1e6ab76069
templates: move filters to their own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
282 return "".join(indenter()) |
9f1e6ab76069
templates: move filters to their own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
283 |
28693
11f623b5668f
templatefilters: use templatefilter to mark a function as template filter
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
28692
diff
changeset
|
284 @templatefilter('json') |
31782
654e9a1c8a6c
formatter: use templatefilters.json()
Yuya Nishihara <yuya@tcha.org>
parents:
31781
diff
changeset
|
285 def json(obj, paranoid=True): |
37948
a25513263075
templatefilters: document the json filter
Yuya Nishihara <yuya@tcha.org>
parents:
37230
diff
changeset
|
286 """Any object. Serializes the object to a JSON formatted text.""" |
31780
8d9eafe01111
templatefilters: unroll handling of None/False/True
Yuya Nishihara <yuya@tcha.org>
parents:
31779
diff
changeset
|
287 if obj is None: |
8d9eafe01111
templatefilters: unroll handling of None/False/True
Yuya Nishihara <yuya@tcha.org>
parents:
31779
diff
changeset
|
288 return 'null' |
8d9eafe01111
templatefilters: unroll handling of None/False/True
Yuya Nishihara <yuya@tcha.org>
parents:
31779
diff
changeset
|
289 elif obj is False: |
8d9eafe01111
templatefilters: unroll handling of None/False/True
Yuya Nishihara <yuya@tcha.org>
parents:
31779
diff
changeset
|
290 return 'false' |
8d9eafe01111
templatefilters: unroll handling of None/False/True
Yuya Nishihara <yuya@tcha.org>
parents:
31779
diff
changeset
|
291 elif obj is True: |
8d9eafe01111
templatefilters: unroll handling of None/False/True
Yuya Nishihara <yuya@tcha.org>
parents:
31779
diff
changeset
|
292 return 'true' |
31728
35eb8f112c88
templatefilter: add support for 'long' to json()
Matt Harbison <matt_harbison@yahoo.com>
parents:
31451
diff
changeset
|
293 elif isinstance(obj, (int, long, float)): |
32127
964e7427a691
py3: use pycompat.bytestr() instead of str()
Pulkit Goyal <7895pulkit@gmail.com>
parents:
32126
diff
changeset
|
294 return pycompat.bytestr(obj) |
32128
c3342c177211
py3: replace str with bytes in isinstance()
Pulkit Goyal <7895pulkit@gmail.com>
parents:
32127
diff
changeset
|
295 elif isinstance(obj, bytes): |
31782
654e9a1c8a6c
formatter: use templatefilters.json()
Yuya Nishihara <yuya@tcha.org>
parents:
31781
diff
changeset
|
296 return '"%s"' % encoding.jsonescape(obj, paranoid=paranoid) |
38024
f5a1aa8c6987
json: reject unicode on py2 as well
Martin von Zweigbergk <martinvonz@google.com>
parents:
37948
diff
changeset
|
297 elif isinstance(obj, type(u'')): |
34837
4fdc4adbc838
templatefilters: defend against evil unicode strs in json filter
Augie Fackler <augie@google.com>
parents:
34695
diff
changeset
|
298 raise error.ProgrammingError( |
38024
f5a1aa8c6987
json: reject unicode on py2 as well
Martin von Zweigbergk <martinvonz@google.com>
parents:
37948
diff
changeset
|
299 'Mercurial only does output with bytes: %r' % obj) |
14967
376091a4ad23
templatefilters: use safehasattr instead of hasattr
Augie Fackler <durin42@gmail.com>
parents:
14944
diff
changeset
|
300 elif util.safehasattr(obj, 'keys'): |
32743
f924dd043974
json: pass formatting options recursively
Yuya Nishihara <yuya@tcha.org>
parents:
32742
diff
changeset
|
301 out = ['"%s": %s' % (encoding.jsonescape(k, paranoid=paranoid), |
f924dd043974
json: pass formatting options recursively
Yuya Nishihara <yuya@tcha.org>
parents:
32742
diff
changeset
|
302 json(v, paranoid)) |
31781
47925b63be70
templatefilters: use list comprehension in json()
Yuya Nishihara <yuya@tcha.org>
parents:
31780
diff
changeset
|
303 for k, v in sorted(obj.iteritems())] |
6691
0dba955c2636
add graph page to hgweb
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
6319
diff
changeset
|
304 return '{' + ', '.join(out) + '}' |
14944
e2c413bde8a5
globally: use safehasattr(x, '__iter__') instead of hasattr(x, '__iter__')
Augie Fackler <durin42@gmail.com>
parents:
14318
diff
changeset
|
305 elif util.safehasattr(obj, '__iter__'): |
32743
f924dd043974
json: pass formatting options recursively
Yuya Nishihara <yuya@tcha.org>
parents:
32742
diff
changeset
|
306 out = [json(i, paranoid) for i in obj] |
6691
0dba955c2636
add graph page to hgweb
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
6319
diff
changeset
|
307 return '[' + ', '.join(out) + ']' |
37230
63144f33c8bb
templatefilters: raise ProgrammingError if unencodable type passed to json()
Yuya Nishihara <yuya@tcha.org>
parents:
37229
diff
changeset
|
308 raise error.ProgrammingError('cannot encode %r' % obj) |
6691
0dba955c2636
add graph page to hgweb
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
6319
diff
changeset
|
309 |
37223
08e042f0a67c
templatefilters: declare input type as bytes where appropriate
Yuya Nishihara <yuya@tcha.org>
parents:
37222
diff
changeset
|
310 @templatefilter('lower', intype=bytes) |
24566
6abce80e6cbf
templatefilters: add "upper" and "lower" for case conversion
Yuya Nishihara <yuya@tcha.org>
parents:
23708
diff
changeset
|
311 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
|
312 """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
|
313 return encoding.lower(text) |
6abce80e6cbf
templatefilters: add "upper" and "lower" for case conversion
Yuya Nishihara <yuya@tcha.org>
parents:
23708
diff
changeset
|
314 |
37223
08e042f0a67c
templatefilters: declare input type as bytes where appropriate
Yuya Nishihara <yuya@tcha.org>
parents:
37222
diff
changeset
|
315 @templatefilter('nonempty', intype=bytes) |
36552
a185b1af207c
templatefilters: stop using str as a variable name
Pulkit Goyal <7895pulkit@gmail.com>
parents:
36498
diff
changeset
|
316 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
|
317 """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
|
318 return text or "(none)" |
13588
b8b881f3f3a7
templatefilters: sort function definitions
Patrick Mezard <pmezard@gmail.com>
parents:
13587
diff
changeset
|
319 |
37223
08e042f0a67c
templatefilters: declare input type as bytes where appropriate
Yuya Nishihara <yuya@tcha.org>
parents:
37222
diff
changeset
|
320 @templatefilter('obfuscate', intype=bytes) |
13588
b8b881f3f3a7
templatefilters: sort function definitions
Patrick Mezard <pmezard@gmail.com>
parents:
13587
diff
changeset
|
321 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
|
322 """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
|
323 XML entities. |
264f292a0c6f
templatefilters: move doc from templates.txt to docstrings
Patrick Mezard <pmezard@gmail.com>
parents:
13590
diff
changeset
|
324 """ |
36563
9d71bd25554b
templatefilters: convert arguments to sysstrs for unicode() ctor
Augie Fackler <augie@google.com>
parents:
36552
diff
changeset
|
325 text = unicode(text, pycompat.sysstr(encoding.encoding), r'replace') |
13588
b8b881f3f3a7
templatefilters: sort function definitions
Patrick Mezard <pmezard@gmail.com>
parents:
13587
diff
changeset
|
326 return ''.join(['&#%d;' % ord(c) for c in text]) |
b8b881f3f3a7
templatefilters: sort function definitions
Patrick Mezard <pmezard@gmail.com>
parents:
13587
diff
changeset
|
327 |
37223
08e042f0a67c
templatefilters: declare input type as bytes where appropriate
Yuya Nishihara <yuya@tcha.org>
parents:
37222
diff
changeset
|
328 @templatefilter('permissions', intype=bytes) |
13588
b8b881f3f3a7
templatefilters: sort function definitions
Patrick Mezard <pmezard@gmail.com>
parents:
13587
diff
changeset
|
329 def permissions(flags): |
b8b881f3f3a7
templatefilters: sort function definitions
Patrick Mezard <pmezard@gmail.com>
parents:
13587
diff
changeset
|
330 if "l" in flags: |
b8b881f3f3a7
templatefilters: sort function definitions
Patrick Mezard <pmezard@gmail.com>
parents:
13587
diff
changeset
|
331 return "lrwxrwxrwx" |
b8b881f3f3a7
templatefilters: sort function definitions
Patrick Mezard <pmezard@gmail.com>
parents:
13587
diff
changeset
|
332 if "x" in flags: |
b8b881f3f3a7
templatefilters: sort function definitions
Patrick Mezard <pmezard@gmail.com>
parents:
13587
diff
changeset
|
333 return "-rwxr-xr-x" |
b8b881f3f3a7
templatefilters: sort function definitions
Patrick Mezard <pmezard@gmail.com>
parents:
13587
diff
changeset
|
334 return "-rw-r--r--" |
b8b881f3f3a7
templatefilters: sort function definitions
Patrick Mezard <pmezard@gmail.com>
parents:
13587
diff
changeset
|
335 |
37223
08e042f0a67c
templatefilters: declare input type as bytes where appropriate
Yuya Nishihara <yuya@tcha.org>
parents:
37222
diff
changeset
|
336 @templatefilter('person', intype=bytes) |
13588
b8b881f3f3a7
templatefilters: sort function definitions
Patrick Mezard <pmezard@gmail.com>
parents:
13587
diff
changeset
|
337 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
|
338 """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
|
339 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
|
340 """ |
37155
fb7140f1d09d
stringutil: move person function from templatefilters
Connor Sheehan <sheehan@mozilla.com>
parents:
37084
diff
changeset
|
341 return stringutil.person(author) |
13588
b8b881f3f3a7
templatefilters: sort function definitions
Patrick Mezard <pmezard@gmail.com>
parents:
13587
diff
changeset
|
342 |
37223
08e042f0a67c
templatefilters: declare input type as bytes where appropriate
Yuya Nishihara <yuya@tcha.org>
parents:
37222
diff
changeset
|
343 @templatefilter('revescape', intype=bytes) |
25778
3a33412792f1
templates: introduce revescape filter for escaping symbolic revisions
Anton Shestakov <av6@dwimlabs.net>
parents:
25000
diff
changeset
|
344 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
|
345 """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
|
346 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
|
347 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
|
348 """ |
28883
032c4c2f802a
pycompat: switch to util.urlreq/util.urlerr for py3 compat
timeless <timeless@mozdev.org>
parents:
28693
diff
changeset
|
349 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
|
350 |
37227
9bcf096a2da2
templatefilters: declare input type as date where appropriate
Yuya Nishihara <yuya@tcha.org>
parents:
37223
diff
changeset
|
351 @templatefilter('rfc3339date', intype=templateutil.date) |
13590
1a752dcfe062
templatefilters: wrap all filters in dedicated functions
Patrick Mezard <pmezard@gmail.com>
parents:
13589
diff
changeset
|
352 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
|
353 """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
|
354 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
|
355 """ |
36607
c6061cadb400
util: extract all date-related utils in utils/dateutil module
Boris Feld <boris.feld@octobus.net>
parents:
36573
diff
changeset
|
356 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
|
357 |
37227
9bcf096a2da2
templatefilters: declare input type as date where appropriate
Yuya Nishihara <yuya@tcha.org>
parents:
37223
diff
changeset
|
358 @templatefilter('rfc822date', intype=templateutil.date) |
13590
1a752dcfe062
templatefilters: wrap all filters in dedicated functions
Patrick Mezard <pmezard@gmail.com>
parents:
13589
diff
changeset
|
359 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
|
360 """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
|
361 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
|
362 """ |
36607
c6061cadb400
util: extract all date-related utils in utils/dateutil module
Boris Feld <boris.feld@octobus.net>
parents:
36573
diff
changeset
|
363 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
|
364 |
37223
08e042f0a67c
templatefilters: declare input type as bytes where appropriate
Yuya Nishihara <yuya@tcha.org>
parents:
37222
diff
changeset
|
365 @templatefilter('short', intype=bytes) |
13590
1a752dcfe062
templatefilters: wrap all filters in dedicated functions
Patrick Mezard <pmezard@gmail.com>
parents:
13589
diff
changeset
|
366 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
|
367 """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
|
368 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
|
369 """ |
13590
1a752dcfe062
templatefilters: wrap all filters in dedicated functions
Patrick Mezard <pmezard@gmail.com>
parents:
13589
diff
changeset
|
370 return text[:12] |
1a752dcfe062
templatefilters: wrap all filters in dedicated functions
Patrick Mezard <pmezard@gmail.com>
parents:
13589
diff
changeset
|
371 |
37223
08e042f0a67c
templatefilters: declare input type as bytes where appropriate
Yuya Nishihara <yuya@tcha.org>
parents:
37222
diff
changeset
|
372 @templatefilter('shortbisect', intype=bytes) |
36830
71f189941791
templatefilters: inline hbisect.shortlabel()
Yuya Nishihara <yuya@tcha.org>
parents:
36607
diff
changeset
|
373 def shortbisect(label): |
71f189941791
templatefilters: inline hbisect.shortlabel()
Yuya Nishihara <yuya@tcha.org>
parents:
36607
diff
changeset
|
374 """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
|
375 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
|
376 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
|
377 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
|
378 """ |
36830
71f189941791
templatefilters: inline hbisect.shortlabel()
Yuya Nishihara <yuya@tcha.org>
parents:
36607
diff
changeset
|
379 if label: |
36831
82af07e1ae16
py3: fix slicing of bisect label in templatefilters.shortbisect()
Yuya Nishihara <yuya@tcha.org>
parents:
36830
diff
changeset
|
380 return label[0:1].upper() |
36830
71f189941791
templatefilters: inline hbisect.shortlabel()
Yuya Nishihara <yuya@tcha.org>
parents:
36607
diff
changeset
|
381 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
|
382 |
37227
9bcf096a2da2
templatefilters: declare input type as date where appropriate
Yuya Nishihara <yuya@tcha.org>
parents:
37223
diff
changeset
|
383 @templatefilter('shortdate', intype=templateutil.date) |
13590
1a752dcfe062
templatefilters: wrap all filters in dedicated functions
Patrick Mezard <pmezard@gmail.com>
parents:
13589
diff
changeset
|
384 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
|
385 """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
|
386 return dateutil.shortdate(text) |
13590
1a752dcfe062
templatefilters: wrap all filters in dedicated functions
Patrick Mezard <pmezard@gmail.com>
parents:
13589
diff
changeset
|
387 |
37223
08e042f0a67c
templatefilters: declare input type as bytes where appropriate
Yuya Nishihara <yuya@tcha.org>
parents:
37222
diff
changeset
|
388 @templatefilter('slashpath', intype=bytes) |
35444
dad8a5071b0a
templatefilters: add slashpath() to convert path separator to slash
Yuya Nishihara <yuya@tcha.org>
parents:
34837
diff
changeset
|
389 def slashpath(path): |
dad8a5071b0a
templatefilters: add slashpath() to convert path separator to slash
Yuya Nishihara <yuya@tcha.org>
parents:
34837
diff
changeset
|
390 """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
|
391 return util.pconvert(path) |
dad8a5071b0a
templatefilters: add slashpath() to convert path separator to slash
Yuya Nishihara <yuya@tcha.org>
parents:
34837
diff
changeset
|
392 |
37223
08e042f0a67c
templatefilters: declare input type as bytes where appropriate
Yuya Nishihara <yuya@tcha.org>
parents:
37222
diff
changeset
|
393 @templatefilter('splitlines', intype=bytes) |
21820
cce404b0c918
templatefilter: add splitlines function
Ryan McElroy <rmcelroy@fb.com>
parents:
19886
diff
changeset
|
394 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
|
395 """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
|
396 return templateutil.hybridlist(text.splitlines(), name='line') |
21820
cce404b0c918
templatefilter: add splitlines function
Ryan McElroy <rmcelroy@fb.com>
parents:
19886
diff
changeset
|
397 |
37223
08e042f0a67c
templatefilters: declare input type as bytes where appropriate
Yuya Nishihara <yuya@tcha.org>
parents:
37222
diff
changeset
|
398 @templatefilter('stringescape', intype=bytes) |
13590
1a752dcfe062
templatefilters: wrap all filters in dedicated functions
Patrick Mezard <pmezard@gmail.com>
parents:
13589
diff
changeset
|
399 def stringescape(text): |
37084
f0b6fbea00cf
stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
36921
diff
changeset
|
400 return stringutil.escapestr(text) |
13590
1a752dcfe062
templatefilters: wrap all filters in dedicated functions
Patrick Mezard <pmezard@gmail.com>
parents:
13589
diff
changeset
|
401 |
37222
54355c243042
templatefilters: allow declaration of input data type
Yuya Nishihara <yuya@tcha.org>
parents:
37155
diff
changeset
|
402 @templatefilter('stringify', intype=bytes) |
13588
b8b881f3f3a7
templatefilters: sort function definitions
Patrick Mezard <pmezard@gmail.com>
parents:
13587
diff
changeset
|
403 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
|
404 """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
|
405 text and concatenating them. |
264f292a0c6f
templatefilters: move doc from templates.txt to docstrings
Patrick Mezard <pmezard@gmail.com>
parents:
13590
diff
changeset
|
406 """ |
37222
54355c243042
templatefilters: allow declaration of input data type
Yuya Nishihara <yuya@tcha.org>
parents:
37155
diff
changeset
|
407 return thing # coerced by the intype |
13588
b8b881f3f3a7
templatefilters: sort function definitions
Patrick Mezard <pmezard@gmail.com>
parents:
13587
diff
changeset
|
408 |
37223
08e042f0a67c
templatefilters: declare input type as bytes where appropriate
Yuya Nishihara <yuya@tcha.org>
parents:
37222
diff
changeset
|
409 @templatefilter('stripdir', intype=bytes) |
8158
1bef3656d9fe
templatefilters: add new stripdir filter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
8014
diff
changeset
|
410 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
|
411 """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
|
412 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
|
413 """ |
8158
1bef3656d9fe
templatefilters: add new stripdir filter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
8014
diff
changeset
|
414 dir = os.path.dirname(text) |
1bef3656d9fe
templatefilters: add new stripdir filter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
8014
diff
changeset
|
415 if dir == "": |
1bef3656d9fe
templatefilters: add new stripdir filter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
8014
diff
changeset
|
416 return os.path.basename(text) |
1bef3656d9fe
templatefilters: add new stripdir filter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
8014
diff
changeset
|
417 else: |
1bef3656d9fe
templatefilters: add new stripdir filter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
8014
diff
changeset
|
418 return dir |
1bef3656d9fe
templatefilters: add new stripdir filter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
8014
diff
changeset
|
419 |
37223
08e042f0a67c
templatefilters: declare input type as bytes where appropriate
Yuya Nishihara <yuya@tcha.org>
parents:
37222
diff
changeset
|
420 @templatefilter('tabindent', intype=bytes) |
13590
1a752dcfe062
templatefilters: wrap all filters in dedicated functions
Patrick Mezard <pmezard@gmail.com>
parents:
13589
diff
changeset
|
421 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
|
422 """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
|
423 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
|
424 """ |
13590
1a752dcfe062
templatefilters: wrap all filters in dedicated functions
Patrick Mezard <pmezard@gmail.com>
parents:
13589
diff
changeset
|
425 return indent(text, '\t') |
1a752dcfe062
templatefilters: wrap all filters in dedicated functions
Patrick Mezard <pmezard@gmail.com>
parents:
13589
diff
changeset
|
426 |
37223
08e042f0a67c
templatefilters: declare input type as bytes where appropriate
Yuya Nishihara <yuya@tcha.org>
parents:
37222
diff
changeset
|
427 @templatefilter('upper', intype=bytes) |
24566
6abce80e6cbf
templatefilters: add "upper" and "lower" for case conversion
Yuya Nishihara <yuya@tcha.org>
parents:
23708
diff
changeset
|
428 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
|
429 """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
|
430 return encoding.upper(text) |
6abce80e6cbf
templatefilters: add "upper" and "lower" for case conversion
Yuya Nishihara <yuya@tcha.org>
parents:
23708
diff
changeset
|
431 |
37223
08e042f0a67c
templatefilters: declare input type as bytes where appropriate
Yuya Nishihara <yuya@tcha.org>
parents:
37222
diff
changeset
|
432 @templatefilter('urlescape', intype=bytes) |
13590
1a752dcfe062
templatefilters: wrap all filters in dedicated functions
Patrick Mezard <pmezard@gmail.com>
parents:
13589
diff
changeset
|
433 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
|
434 """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
|
435 "foo bar" becomes "foo%20bar". |
264f292a0c6f
templatefilters: move doc from templates.txt to docstrings
Patrick Mezard <pmezard@gmail.com>
parents:
13590
diff
changeset
|
436 """ |
28883
032c4c2f802a
pycompat: switch to util.urlreq/util.urlerr for py3 compat
timeless <timeless@mozdev.org>
parents:
28693
diff
changeset
|
437 return urlreq.quote(text) |
13590
1a752dcfe062
templatefilters: wrap all filters in dedicated functions
Patrick Mezard <pmezard@gmail.com>
parents:
13589
diff
changeset
|
438 |
37223
08e042f0a67c
templatefilters: declare input type as bytes where appropriate
Yuya Nishihara <yuya@tcha.org>
parents:
37222
diff
changeset
|
439 @templatefilter('user', intype=bytes) |
13590
1a752dcfe062
templatefilters: wrap all filters in dedicated functions
Patrick Mezard <pmezard@gmail.com>
parents:
13589
diff
changeset
|
440 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
|
441 """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
|
442 address.""" |
37084
f0b6fbea00cf
stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
36921
diff
changeset
|
443 return stringutil.shortuser(text) |
13590
1a752dcfe062
templatefilters: wrap all filters in dedicated functions
Patrick Mezard <pmezard@gmail.com>
parents:
13589
diff
changeset
|
444 |
37223
08e042f0a67c
templatefilters: declare input type as bytes where appropriate
Yuya Nishihara <yuya@tcha.org>
parents:
37222
diff
changeset
|
445 @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
|
446 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
|
447 """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
|
448 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
|
449 |
37223
08e042f0a67c
templatefilters: declare input type as bytes where appropriate
Yuya Nishihara <yuya@tcha.org>
parents:
37222
diff
changeset
|
450 @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
|
451 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
|
452 """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
|
453 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
|
454 |
37223
08e042f0a67c
templatefilters: declare input type as bytes where appropriate
Yuya Nishihara <yuya@tcha.org>
parents:
37222
diff
changeset
|
455 @templatefilter('xmlescape', intype=bytes) |
13588
b8b881f3f3a7
templatefilters: sort function definitions
Patrick Mezard <pmezard@gmail.com>
parents:
13587
diff
changeset
|
456 def xmlescape(text): |
b8b881f3f3a7
templatefilters: sort function definitions
Patrick Mezard <pmezard@gmail.com>
parents:
13587
diff
changeset
|
457 text = (text |
b8b881f3f3a7
templatefilters: sort function definitions
Patrick Mezard <pmezard@gmail.com>
parents:
13587
diff
changeset
|
458 .replace('&', '&') |
b8b881f3f3a7
templatefilters: sort function definitions
Patrick Mezard <pmezard@gmail.com>
parents:
13587
diff
changeset
|
459 .replace('<', '<') |
b8b881f3f3a7
templatefilters: sort function definitions
Patrick Mezard <pmezard@gmail.com>
parents:
13587
diff
changeset
|
460 .replace('>', '>') |
b8b881f3f3a7
templatefilters: sort function definitions
Patrick Mezard <pmezard@gmail.com>
parents:
13587
diff
changeset
|
461 .replace('"', '"') |
b8b881f3f3a7
templatefilters: sort function definitions
Patrick Mezard <pmezard@gmail.com>
parents:
13587
diff
changeset
|
462 .replace("'", ''')) # ' invalid in HTML |
b8b881f3f3a7
templatefilters: sort function definitions
Patrick Mezard <pmezard@gmail.com>
parents:
13587
diff
changeset
|
463 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
|
464 |
18627
4e949b8e0930
hgweb: add websub template filter
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
17772
diff
changeset
|
465 def websub(text, websubtable): |
4e949b8e0930
hgweb: add websub template filter
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
17772
diff
changeset
|
466 """: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
|
467 expression replacements defined in the websub section. |
4e949b8e0930
hgweb: add websub template filter
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
17772
diff
changeset
|
468 """ |
4e949b8e0930
hgweb: add websub template filter
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
17772
diff
changeset
|
469 if websubtable: |
4e949b8e0930
hgweb: add websub template filter
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
17772
diff
changeset
|
470 for regexp, format in websubtable: |
4e949b8e0930
hgweb: add websub template filter
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
17772
diff
changeset
|
471 text = regexp.sub(format, text) |
4e949b8e0930
hgweb: add websub template filter
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
17772
diff
changeset
|
472 return text |
4e949b8e0930
hgweb: add websub template filter
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
17772
diff
changeset
|
473 |
28692
6b3b958daf03
registrar: add templatefilter to mark a function as template filter (API)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
28213
diff
changeset
|
474 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
|
475 """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
|
476 """ |
6b3b958daf03
registrar: add templatefilter to mark a function as template filter (API)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
28213
diff
changeset
|
477 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
|
478 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
|
479 |
13591
264f292a0c6f
templatefilters: move doc from templates.txt to docstrings
Patrick Mezard <pmezard@gmail.com>
parents:
13590
diff
changeset
|
480 # 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
|
481 i18nfunctions = filters.values() |