diff options
Diffstat (limited to 'src/jinja2/filters.py')
-rw-r--r-- | src/jinja2/filters.py | 39 |
1 files changed, 36 insertions, 3 deletions
diff --git a/src/jinja2/filters.py b/src/jinja2/filters.py index 7a554a0..0d1639f 100644 --- a/src/jinja2/filters.py +++ b/src/jinja2/filters.py @@ -20,6 +20,7 @@ from .utils import urlize _word_re = re.compile(r"\w+") _word_beginning_split_re = re.compile(r"([-\s({\[<]+)") +_uri_scheme_re = re.compile(r"^([\w\.\+-]{2,}:(/){0,2})$") def contextfilter(f): @@ -569,7 +570,13 @@ def do_pprint(value): @evalcontextfilter def do_urlize( - eval_ctx, value, trim_url_limit=None, nofollow=False, target=None, rel=None + eval_ctx, + value, + trim_url_limit=None, + nofollow=False, + target=None, + rel=None, + extra_uri_schemes=None, ): """Converts URLs in plain text into clickable links. @@ -589,18 +596,44 @@ def do_urlize( {{ mytext|urlize(40, target='_blank') }} + If *extra_uri_schemes* are added then links will be generated for those + in addition to http(s): and mailto: schemes. + + .. sourcecode:: jinja + + {{ mytext|urlize(extra_uri_schemes=['tel:', 'ftp://']) }} + links are generated for tel and ftp. + .. versionchanged:: 2.8 The ``target`` parameter was added. + + .. versionchanged:: 3.0 + The ``extra_uri_schemes`` parameter was added. """ policies = eval_ctx.environment.policies + rel = set((rel or "").split() or []) if nofollow: rel.add("nofollow") rel.update((policies["urlize.rel"] or "").split()) + rel = " ".join(sorted(rel)) or None + if target is None: target = policies["urlize.target"] - rel = " ".join(sorted(rel)) or None - rv = urlize(value, trim_url_limit, rel=rel, target=target) + + if extra_uri_schemes is None: + extra_uri_schemes = policies["urlize.extra_uri_schemes"] or [] + for uri_scheme in extra_uri_schemes: + if _uri_scheme_re.fullmatch(uri_scheme) is None: + raise FilterArgumentError(f"{uri_scheme} is not a valid URI scheme prefix.") + + rv = urlize( + value, + trim_url_limit, + rel=rel, + target=target, + extra_uri_schemes=extra_uri_schemes, + ) if eval_ctx.autoescape: rv = Markup(rv) return rv |