From eef29cf35d60a5cc2a1967857741dfec4fb833d0 Mon Sep 17 00:00:00 2001 From: Robert Sparks Date: Fri, 15 Apr 2022 15:43:32 -0500 Subject: [PATCH] fix: improve ietf doc string urlization. Fixes #3828. (#3831) * fix: improve ietf doc string urlization. Fixes #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 --- ietf/doc/templatetags/ietf_filters.py | 31 +++++++++++++- ietf/doc/templatetags/tests_ietf_filters.py | 45 ++++++++++++++++++++- 2 files changed, 73 insertions(+), 3 deletions(-) diff --git a/ietf/doc/templatetags/ietf_filters.py b/ietf/doc/templatetags/ietf_filters.py index 43f6717b5..8238c9c29 100644 --- a/ietf/doc/templatetags/ietf_filters.py +++ b/ietf/doc/templatetags/ietf_filters.py @@ -185,6 +185,12 @@ def rfceditor_info_url(rfcnum : str): """Link to the RFC editor info page for an RFC""" return urljoin(settings.RFC_EDITOR_INFO_BASE_URL, f'rfc{rfcnum}') +def link_non_charter_doc_match(match): + if len(match[3])==2 and match[3].isdigit(): + return f'{match[0]}' + else: + return f'{match[0]}' + @register.filter(name='urlize_ietf_docs', is_safe=True, needs_autoescape=True) def urlize_ietf_docs(string, autoescape=None): """ @@ -192,8 +198,31 @@ def urlize_ietf_docs(string, autoescape=None): """ if autoescape and not isinstance(string, SafeData): string = escape(string) + exp1 = r"\b(charter-(?:[\d\w\.+]+-)*)(\d\d-\d\d)(\.txt)?\b" + exp2 = r"\b(charter-(?:[\d\w\.+]+-)*)(\d\d)(\.txt)?\b" + if re.search(exp1, string): + string = re.sub( + exp1, + lambda x: f'{x[0]}', + string, + flags=re.IGNORECASE | re.ASCII, + ) + elif re.search(exp2, string): + string = re.sub( + exp2, + lambda x: f'{x[0]}', + string, + flags=re.IGNORECASE | re.ASCII, + ) string = re.sub( - r"\b((RFC|BCP|STD|FYI|(?:draft-|bofreq-|conflict-review-|status-change-|charter-)[-\d\w.+]+)\s*0*(\d+))\b", + r"\b(?{x[1]}', string, flags=re.IGNORECASE | re.ASCII, diff --git a/ietf/doc/templatetags/tests_ietf_filters.py b/ietf/doc/templatetags/tests_ietf_filters.py index 3db85f5f7..cd363d113 100644 --- a/ietf/doc/templatetags/tests_ietf_filters.py +++ b/ietf/doc/templatetags/tests_ietf_filters.py @@ -1,6 +1,9 @@ +# Copyright The IETF Trust 2022, All Rights Reserved + from ietf.doc.templatetags.ietf_filters import urlize_ietf_docs from ietf.utils.test_utils import TestCase +import debug # pyflakes: ignore # TODO: most other filters need test cases, too @@ -18,10 +21,48 @@ class IetfFiltersTests(TestCase): ("Rfc 02119", 'Rfc 02119'), ("draft-abc-123", 'draft-abc-123'), ( - "draft-ietf-rfc9999-bis-01", - 'draft-ietf-rfc9999-bis-01', + "draft-ietf-rfc9999-bis-01.txt", + 'draft-ietf-rfc9999-bis-01.txt', ), + ( + "foo RFC 9999 draft-ietf-rfc9999-bis-01 bar", + 'foo RFC 9999 draft-ietf-rfc9999-bis-01 bar', + ), + ( + "New version available: draft-bryan-sipping-p2p-03.txt", + 'New version available: draft-bryan-sipping-p2p-03.txt', + ), + ( + "New version available: charter-ietf-6man-04.txt", + 'New version available: charter-ietf-6man-04.txt' + ), + ( + "New version available: charter-ietf-6man-03-07.txt", + 'New version available: charter-ietf-6man-03-07.txt' + ), + ( + "repository https://github.com/tlswg/draft-ietf-tls-ticketrequest", + 'repository https://github.com/tlswg/draft-ietf-tls-ticketrequest' + ), + ( + "draft-madanapalli-nd-over-802.16-problems", + 'draft-madanapalli-nd-over-802.16-problems' + ), + ( + "draft-madanapalli-nd-over-802.16-problems-02.txt", + 'draft-madanapalli-nd-over-802.16-problems-02.txt' + ) ] + + # Some edge cases scraped from existing old draft names + for name in [ + # "draft-odell-8+8", # This fails since + matches the right side of \b + # "draft-durand-gse+", # same failure + "draft-kim-xcast+-few-2-few", + #"draft-ietf-pem-ansix9.17", # Fails because of not being greedy with . before txt + ]: + cases.append((name,f'{name}')) for input, output in cases: + #debug.show("(urlize_ietf_docs(input),output)") self.assertEqual(urlize_ietf_docs(input), output)