Skip to content

Commit eef29cf

Browse files
authored
fix: improve ietf doc string urlization. Fixes ietf-tools#3828. (ietf-tools#3831)
* fix: improve ietf doc string urlization. Fixes ietf-tools#3828. * fix: dont urlize names immediately after - or /. Avoids urizing in the middle of urls. * fix: cover some additional corners when urlifying document names. * chore: remove unnecessary code complication
1 parent 23fdf61 commit eef29cf

File tree

2 files changed

+73
-3
lines changed

2 files changed

+73
-3
lines changed

ietf/doc/templatetags/ietf_filters.py

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -185,15 +185,44 @@ def rfceditor_info_url(rfcnum : str):
185185
"""Link to the RFC editor info page for an RFC"""
186186
return urljoin(settings.RFC_EDITOR_INFO_BASE_URL, f'rfc{rfcnum}')
187187

188+
def link_non_charter_doc_match(match):
189+
if len(match[3])==2 and match[3].isdigit():
190+
return f'<a href="/doc/{match[2][:-1]}/{match[3]}/">{match[0]}</a>'
191+
else:
192+
return f'<a href="/doc/{match[2]}{match[3]}/">{match[0]}</a>'
193+
188194
@register.filter(name='urlize_ietf_docs', is_safe=True, needs_autoescape=True)
189195
def urlize_ietf_docs(string, autoescape=None):
190196
"""
191197
Make occurrences of RFC NNNN and draft-foo-bar links to /doc/.
192198
"""
193199
if autoescape and not isinstance(string, SafeData):
194200
string = escape(string)
201+
exp1 = r"\b(charter-(?:[\d\w\.+]+-)*)(\d\d-\d\d)(\.txt)?\b"
202+
exp2 = r"\b(charter-(?:[\d\w\.+]+-)*)(\d\d)(\.txt)?\b"
203+
if re.search(exp1, string):
204+
string = re.sub(
205+
exp1,
206+
lambda x: f'<a href="/doc/{x[1][:-1]}/{x[2]}/">{x[0]}</a>',
207+
string,
208+
flags=re.IGNORECASE | re.ASCII,
209+
)
210+
elif re.search(exp2, string):
211+
string = re.sub(
212+
exp2,
213+
lambda x: f'<a href="/doc/{x[1][:-1]}/{x[2]}/">{x[0]}</a>',
214+
string,
215+
flags=re.IGNORECASE | re.ASCII,
216+
)
217+
string = re.sub(
218+
r"\b(?<![/-])(((?:draft-|bofreq-|conflict-review-|status-change-)(?:[\d\w\.+]+-)*)([\d\w\.+]+?)(\.txt)?)\b",
219+
link_non_charter_doc_match,
220+
string,
221+
flags=re.IGNORECASE | re.ASCII,
222+
)
195223
string = re.sub(
196-
r"\b((RFC|BCP|STD|FYI|(?:draft-|bofreq-|conflict-review-|status-change-|charter-)[-\d\w.+]+)\s*0*(\d+))\b",
224+
# r"\b((RFC|BCP|STD|FYI|(?:draft-|bofreq-|conflict-review-|status-change-|charter-)[-\d\w.+]+)\s*0*(\d+))\b",
225+
r"\b(?<!-)((RFC|BCP|STD|FYI)\s*0*(\d+))\b",
197226
lambda x: f'<a href="/doc/{x[2].strip().lower()}{x[3]}/">{x[1]}</a>',
198227
string,
199228
flags=re.IGNORECASE | re.ASCII,

ietf/doc/templatetags/tests_ietf_filters.py

Lines changed: 43 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
1+
# Copyright The IETF Trust 2022, All Rights Reserved
2+
13
from ietf.doc.templatetags.ietf_filters import urlize_ietf_docs
24
from ietf.utils.test_utils import TestCase
35

6+
import debug # pyflakes: ignore
47
# TODO: most other filters need test cases, too
58

69

@@ -18,10 +21,48 @@ def test_urlize_ietf_docs(self):
1821
("Rfc 02119", '<a href="/doc/rfc2119/">Rfc 02119</a>'),
1922
("draft-abc-123", '<a href="/doc/draft-abc-123/">draft-abc-123</a>'),
2023
(
21-
"draft-ietf-rfc9999-bis-01",
22-
'<a href="/doc/draft-ietf-rfc9999-bis-01/">draft-ietf-rfc9999-bis-01</a>',
24+
"draft-ietf-rfc9999-bis-01.txt",
25+
'<a href="/doc/draft-ietf-rfc9999-bis/01/">draft-ietf-rfc9999-bis-01.txt</a>',
26+
),
27+
(
28+
"foo RFC 9999 draft-ietf-rfc9999-bis-01 bar",
29+
'foo <a href="/doc/rfc9999/">RFC 9999</a> <a href="/doc/draft-ietf-rfc9999-bis/01/">draft-ietf-rfc9999-bis-01</a> bar',
30+
),
31+
(
32+
"New version available: <b>draft-bryan-sipping-p2p-03.txt</b>",
33+
'New version available: <b><a href="/doc/draft-bryan-sipping-p2p/03/">draft-bryan-sipping-p2p-03.txt</a></b>',
34+
),
35+
(
36+
"New version available: <b>charter-ietf-6man-04.txt</b>",
37+
'New version available: <b><a href="/doc/charter-ietf-6man/04/">charter-ietf-6man-04.txt</a></b>'
2338
),
39+
(
40+
"New version available: <b>charter-ietf-6man-03-07.txt</b>",
41+
'New version available: <b><a href="/doc/charter-ietf-6man/03-07/">charter-ietf-6man-03-07.txt</a></b>'
42+
),
43+
(
44+
"repository https://github.com/tlswg/draft-ietf-tls-ticketrequest",
45+
'repository https://github.com/tlswg/draft-ietf-tls-ticketrequest'
46+
),
47+
(
48+
"draft-madanapalli-nd-over-802.16-problems",
49+
'<a href="/doc/draft-madanapalli-nd-over-802.16-problems/">draft-madanapalli-nd-over-802.16-problems</a>'
50+
),
51+
(
52+
"draft-madanapalli-nd-over-802.16-problems-02.txt",
53+
'<a href="/doc/draft-madanapalli-nd-over-802.16-problems/02/">draft-madanapalli-nd-over-802.16-problems-02.txt</a>'
54+
)
2455
]
56+
57+
# Some edge cases scraped from existing old draft names
58+
for name in [
59+
# "draft-odell-8+8", # This fails since + matches the right side of \b
60+
# "draft-durand-gse+", # same failure
61+
"draft-kim-xcast+-few-2-few",
62+
#"draft-ietf-pem-ansix9.17", # Fails because of not being greedy with . before txt
63+
]:
64+
cases.append((name,f'<a href="/doc/{name}/">{name}</a>'))
2565

2666
for input, output in cases:
67+
#debug.show("(urlize_ietf_docs(input),output)")
2768
self.assertEqual(urlize_ietf_docs(input), output)

0 commit comments

Comments
 (0)