format_links: parse punctuation inside brackets

Also, consolidate all punctuation tests into a single table-driven one.
This commit is contained in:
Adeodato Simó 2023-11-02 21:59:34 -03:00
parent 7d13cbb10b
commit 954a02126e
No known key found for this signature in database
GPG key ID: CDF447845F1A986F
2 changed files with 24 additions and 19 deletions

View file

@ -421,25 +421,24 @@ http://www.fish.com/"""
)
def test_format_links_punctuation(self, *_):
"""dont take trailing punctuation into account pls"""
url = "http://www.fish.com/"
self.assertEqual(
views.status.format_links(f"{url}."),
f'<a href="{url}">www.fish.com/</a>.',
)
self.assertEqual(
views.status.format_links(f"{url}!?!"),
f'<a href="{url}">www.fish.com/</a>!?!',
)
def test_format_links_punctuation_parens(self, *_):
"""ignore trailing punctuation and brackets combined"""
# Period at the end, wrapped in brackets.
url = "http://www.fish.com"
self.assertEqual(
views.status.format_links(f"({url})."),
f'(<a href="{url}">www.fish.com</a>).',
)
"""test many combinations of brackets, URLs, and punctuation"""
url = "https://bookwyrm.social"
html = f'<a href="{url}">bookwyrm.social</a>'
test_table = [
("punct", f"text and {url}.", f"text and {html}."),
("multi_punct", f"text, then {url}?...", f"text, then {html}?..."),
("bracket_punct", f"here ({url}).", f"here ({html})."),
("punct_bracket", f"there [{url}?]", f"there [{html}?]"),
("punct_bracket_punct", f"not here? ({url}!).", f"not here? ({html}!)."),
(
"multi_punct_bracket",
f"not there ({url}...);",
f"not there ({html}...);",
),
]
for desc, text, output in test_table:
with self.subTest(desc=desc):
self.assertEqual(views.status.format_links(text), output)
def test_format_links_special_chars(self, *_):
"""find and format urls into a tags"""

View file

@ -333,6 +333,12 @@ def _unwrap(text):
# Split out wrapping chars.
suffix = text[-1] + suffix
prefix, text = text[:1], text[1:-1]
break # Nested wrappers not supported atm.
if punct.search(text):
# Move inner punctuation to suffix segment.
text, inner_punct, _ = punct.split(text)
suffix = inner_punct + suffix
return prefix, text, suffix