We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN ISSUE ---
rich_text: tel schema
When providing email links using the mailto schema in richtext description like `[Email us!](mailto:mail@weandus.com)`, resulting in [Email us!](mailto:mail@weandus.com), Pretix creates the correct `<a>` tag. However, users also use their mobile phone. It would be awesome to also be able to use the `tel` schema like `[Call us!](tel:+1-202-555-0102)`. At the moment, pretix just creates an `<a>` tag without an `href`, so the Telephone app is not opened.

--- END ISSUE ---

Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
--- BEGIN FILES ---
Path: `src/pretix/base/templatetags/rich_text.py`
Content:
```
1 import urllib.parse
2 
3 import bleach
4 import markdown
5 from bleach import DEFAULT_CALLBACKS
6 from django import template
7 from django.conf import settings
8 from django.core import signing
9 from django.urls import reverse
10 from django.utils.http import is_safe_url
11 from django.utils.safestring import mark_safe
12 
13 register = template.Library()
14 
15 ALLOWED_TAGS = [
16     'a',
17     'abbr',
18     'acronym',
19     'b',
20     'blockquote',
21     'br',
22     'code',
23     'em',
24     'i',
25     'li',
26     'ol',
27     'strong',
28     'ul',
29     'p',
30     'table',
31     'tbody',
32     'thead',
33     'tr',
34     'td',
35     'th',
36     'div',
37     'span',
38     'hr',
39     'h1',
40     'h2',
41     'h3',
42     'h4',
43     'h5',
44     'h6',
45     'pre',
46     # Update doc/user/markdown.rst if you change this!
47 ]
48 
49 ALLOWED_ATTRIBUTES = {
50     'a': ['href', 'title'],
51     'abbr': ['title'],
52     'acronym': ['title'],
53     'table': ['width'],
54     'td': ['width', 'align'],
55     'div': ['class'],
56     'p': ['class'],
57     'span': ['class'],
58     # Update doc/user/markdown.rst if you change this!
59 }
60 
61 
62 def safelink_callback(attrs, new=False):
63     url = attrs.get((None, 'href'), '/')
64     if not is_safe_url(url) and not url.startswith('mailto:'):
65         signer = signing.Signer(salt='safe-redirect')
66         attrs[None, 'href'] = reverse('redirect') + '?url=' + urllib.parse.quote(signer.sign(url))
67         attrs[None, 'target'] = '_blank'
68         attrs[None, 'rel'] = 'noopener'
69     return attrs
70 
71 
72 def abslink_callback(attrs, new=False):
73     attrs[None, 'href'] = urllib.parse.urljoin(settings.SITE_URL, attrs.get((None, 'href'), '/'))
74     attrs[None, 'target'] = '_blank'
75     attrs[None, 'rel'] = 'noopener'
76     return attrs
77 
78 
79 def markdown_compile(source):
80     return bleach.clean(
81         markdown.markdown(
82             source,
83             extensions=[
84                 'markdown.extensions.sane_lists',
85                 # 'markdown.extensions.nl2br',  # TODO: Enable, but check backwards-compatibility issues e.g. with mails
86             ]
87         ),
88         tags=ALLOWED_TAGS,
89         attributes=ALLOWED_ATTRIBUTES
90     )
91 
92 
93 @register.filter
94 def rich_text(text: str, **kwargs):
95     """
96     Processes markdown and cleans HTML in a text input.
97     """
98     text = str(text)
99     body_md = bleach.linkify(
100         markdown_compile(text),
101         callbacks=DEFAULT_CALLBACKS + ([safelink_callback] if kwargs.get('safelinks', True) else [abslink_callback])
102     )
103     return mark_safe(body_md)
104
```
--- END FILES ---

Please first localize the bug based on the issue statement, and then generate a patch according to the `git diff` format fenced by three backticks.

Here is an example:

```diff
diff --git a/examples/server_async.py b/examples/server_async.py
--- a/examples/server_async.py
+++ b/examples/server_async.py
@@ -313,4 +313,4 @@
 
 
 if __name__ == "__main__":
-    asyncio.run(run_async_server("."), debug=True)
+    asyncio.run(run_async_server(), debug=True)
diff --git a/examples/server_sync.py b/examples/server_sync.py
--- a/examples/server_sync.py
+++ b/examples/server_sync.py
@@ -313,5 +313,5 @@
 
 
 if __name__ == "__main__":
-    server = run_sync_server(".")
+    server = run_sync_server()
     server.shutdown()

```

diff --git a/src/pretix/base/templatetags/rich_text.py b/src/pretix/base/templatetags/rich_text.py
--- a/src/pretix/base/templatetags/rich_text.py
+++ b/src/pretix/base/templatetags/rich_text.py
@@ -58,6 +58,8 @@
     # Update doc/user/markdown.rst if you change this!
 }
 
+ALLOWED_PROTOCOLS = ['http', 'https', 'mailto', 'tel']
+
 
 def safelink_callback(attrs, new=False):
     url = attrs.get((None, 'href'), '/')
@@ -86,7 +88,8 @@
             ]
         ),
         tags=ALLOWED_TAGS,
-        attributes=ALLOWED_ATTRIBUTES
+        attributes=ALLOWED_ATTRIBUTES,
+        protocols=ALLOWED_PROTOCOLS,
     )

{"golden_diff": "diff --git a/src/pretix/base/templatetags/rich_text.py b/src/pretix/base/templatetags/rich_text.py\n--- a/src/pretix/base/templatetags/rich_text.py\n+++ b/src/pretix/base/templatetags/rich_text.py\n@@ -58,6 +58,8 @@\n     # Update doc/user/markdown.rst if you change this!\n }\n \n+ALLOWED_PROTOCOLS = ['http', 'https', 'mailto', 'tel']\n+\n \n def safelink_callback(attrs, new=False):\n     url = attrs.get((None, 'href'), '/')\n@@ -86,7 +88,8 @@\n             ]\n         ),\n         tags=ALLOWED_TAGS,\n-        attributes=ALLOWED_ATTRIBUTES\n+        attributes=ALLOWED_ATTRIBUTES,\n+        protocols=ALLOWED_PROTOCOLS,\n     )\n", "issue": "rich_text: tel schema\nWhen providing email links using the mailto schema in richtext description like `[Email us!](mailto:mail@weandus.com)`, resulting in [Email us!](mailto:mail@weandus.com), Pretix creates the correct `<a>` tag. However, users also use their mobile phone. It would be awesome to also be able to use the `tel` schema like `[Call us!](tel:+1-202-555-0102)`. At the moment, pretix just creates an `<a>` tag without an `href`, so the Telephone app is not opened.\n", "before_files": [{"content": "import urllib.parse\n\nimport bleach\nimport markdown\nfrom bleach import DEFAULT_CALLBACKS\nfrom django import template\nfrom django.conf import settings\nfrom django.core import signing\nfrom django.urls import reverse\nfrom django.utils.http import is_safe_url\nfrom django.utils.safestring import mark_safe\n\nregister = template.Library()\n\nALLOWED_TAGS = [\n    'a',\n    'abbr',\n    'acronym',\n    'b',\n    'blockquote',\n    'br',\n    'code',\n    'em',\n    'i',\n    'li',\n    'ol',\n    'strong',\n    'ul',\n    'p',\n    'table',\n    'tbody',\n    'thead',\n    'tr',\n    'td',\n    'th',\n    'div',\n    'span',\n    'hr',\n    'h1',\n    'h2',\n    'h3',\n    'h4',\n    'h5',\n    'h6',\n    'pre',\n    # Update doc/user/markdown.rst if you change this!\n]\n\nALLOWED_ATTRIBUTES = {\n    'a': ['href', 'title'],\n    'abbr': ['title'],\n    'acronym': ['title'],\n    'table': ['width'],\n    'td': ['width', 'align'],\n    'div': ['class'],\n    'p': ['class'],\n    'span': ['class'],\n    # Update doc/user/markdown.rst if you change this!\n}\n\n\ndef safelink_callback(attrs, new=False):\n    url = attrs.get((None, 'href'), '/')\n    if not is_safe_url(url) and not url.startswith('mailto:'):\n        signer = signing.Signer(salt='safe-redirect')\n        attrs[None, 'href'] = reverse('redirect') + '?url=' + urllib.parse.quote(signer.sign(url))\n        attrs[None, 'target'] = '_blank'\n        attrs[None, 'rel'] = 'noopener'\n    return attrs\n\n\ndef abslink_callback(attrs, new=False):\n    attrs[None, 'href'] = urllib.parse.urljoin(settings.SITE_URL, attrs.get((None, 'href'), '/'))\n    attrs[None, 'target'] = '_blank'\n    attrs[None, 'rel'] = 'noopener'\n    return attrs\n\n\ndef markdown_compile(source):\n    return bleach.clean(\n        markdown.markdown(\n            source,\n            extensions=[\n                'markdown.extensions.sane_lists',\n                # 'markdown.extensions.nl2br',  # TODO: Enable, but check backwards-compatibility issues e.g. with mails\n            ]\n        ),\n        tags=ALLOWED_TAGS,\n        attributes=ALLOWED_ATTRIBUTES\n    )\n\n\n@register.filter\ndef rich_text(text: str, **kwargs):\n    \"\"\"\n    Processes markdown and cleans HTML in a text input.\n    \"\"\"\n    text = str(text)\n    body_md = bleach.linkify(\n        markdown_compile(text),\n        callbacks=DEFAULT_CALLBACKS + ([safelink_callback] if kwargs.get('safelinks', True) else [abslink_callback])\n    )\n    return mark_safe(body_md)\n", "path": "src/pretix/base/templatetags/rich_text.py"}], "after_files": [{"content": "import urllib.parse\n\nimport bleach\nimport markdown\nfrom bleach import DEFAULT_CALLBACKS\nfrom django import template\nfrom django.conf import settings\nfrom django.core import signing\nfrom django.urls import reverse\nfrom django.utils.http import is_safe_url\nfrom django.utils.safestring import mark_safe\n\nregister = template.Library()\n\nALLOWED_TAGS = [\n    'a',\n    'abbr',\n    'acronym',\n    'b',\n    'blockquote',\n    'br',\n    'code',\n    'em',\n    'i',\n    'li',\n    'ol',\n    'strong',\n    'ul',\n    'p',\n    'table',\n    'tbody',\n    'thead',\n    'tr',\n    'td',\n    'th',\n    'div',\n    'span',\n    'hr',\n    'h1',\n    'h2',\n    'h3',\n    'h4',\n    'h5',\n    'h6',\n    'pre',\n    # Update doc/user/markdown.rst if you change this!\n]\n\nALLOWED_ATTRIBUTES = {\n    'a': ['href', 'title'],\n    'abbr': ['title'],\n    'acronym': ['title'],\n    'table': ['width'],\n    'td': ['width', 'align'],\n    'div': ['class'],\n    'p': ['class'],\n    'span': ['class'],\n    # Update doc/user/markdown.rst if you change this!\n}\n\nALLOWED_PROTOCOLS = ['http', 'https', 'mailto', 'tel']\n\n\ndef safelink_callback(attrs, new=False):\n    url = attrs.get((None, 'href'), '/')\n    if not is_safe_url(url) and not url.startswith('mailto:'):\n        signer = signing.Signer(salt='safe-redirect')\n        attrs[None, 'href'] = reverse('redirect') + '?url=' + urllib.parse.quote(signer.sign(url))\n        attrs[None, 'target'] = '_blank'\n        attrs[None, 'rel'] = 'noopener'\n    return attrs\n\n\ndef abslink_callback(attrs, new=False):\n    attrs[None, 'href'] = urllib.parse.urljoin(settings.SITE_URL, attrs.get((None, 'href'), '/'))\n    attrs[None, 'target'] = '_blank'\n    attrs[None, 'rel'] = 'noopener'\n    return attrs\n\n\ndef markdown_compile(source):\n    return bleach.clean(\n        markdown.markdown(\n            source,\n            extensions=[\n                'markdown.extensions.sane_lists',\n                # 'markdown.extensions.nl2br',  # TODO: Enable, but check backwards-compatibility issues e.g. with mails\n            ]\n        ),\n        tags=ALLOWED_TAGS,\n        attributes=ALLOWED_ATTRIBUTES,\n        protocols=ALLOWED_PROTOCOLS,\n    )\n\n\n@register.filter\ndef rich_text(text: str, **kwargs):\n    \"\"\"\n    Processes markdown and cleans HTML in a text input.\n    \"\"\"\n    text = str(text)\n    body_md = bleach.linkify(\n        markdown_compile(text),\n        callbacks=DEFAULT_CALLBACKS + ([safelink_callback] if kwargs.get('safelinks', True) else [abslink_callback])\n    )\n    return mark_safe(body_md)\n", "path": "src/pretix/base/templatetags/rich_text.py"}]}