diff --git a/django/utils/html.py b/django/utils/html.py index cb4757818e0..c439e9114c5 100644 --- a/django/utils/html.py +++ b/django/utils/html.py @@ -250,17 +250,22 @@ class Urlizer: If autoescape is True, autoescape the link text and URLs. """ - self.trim_url_limit = trim_url_limit - self.nofollow = nofollow - self.autoescape = autoescape - self.safe_input = isinstance(text, SafeData) + safe_input = isinstance(text, SafeData) words = self.word_split_re.split(str(text)) return ''.join([ - self.handle_word(word) for word in words + self.handle_word( + word, + safe_input=safe_input, + trim_url_limit=trim_url_limit, + nofollow=nofollow, + autoescape=autoescape, + ) for word in words ]) - def handle_word(self, word): + def handle_word( + self, word, safe_input, trim_url_limit=None, nofollow=False, autoescape=False, + ): if '.' in word or '@' in word or ':' in word: # lead: Punctuation trimmed from the beginning of the word. # middle: State of the word. @@ -268,7 +273,7 @@ class Urlizer: lead, middle, trail = self.trim_punctuation(word) # Make URL we want to point to. url = None - nofollow_attr = ' rel="nofollow"' if self.nofollow else '' + nofollow_attr = ' rel="nofollow"' if nofollow else '' if self.simple_url_re.match(middle): url = smart_urlquote(html.unescape(middle)) elif self.simple_url_2_re.match(middle): @@ -283,8 +288,8 @@ class Urlizer: nofollow_attr = '' # Make link. if url: - trimmed = self.trim_url(middle) - if self.autoescape and not self.safe_input: + trimmed = self.trim_url(middle, trim_url_limit=trim_url_limit) + if autoescape and not safe_input: lead, trail = escape(lead), escape(trail) trimmed = escape(trimmed) middle = self.url_template.format( @@ -294,20 +299,20 @@ class Urlizer: ) return mark_safe(f'{lead}{middle}{trail}') else: - if self.safe_input: + if safe_input: return mark_safe(word) - elif self.autoescape: + elif autoescape: return escape(word) - elif self.safe_input: + elif safe_input: return mark_safe(word) - elif self.autoescape: + elif autoescape: return escape(word) return word - def trim_url(self, x): - if self.trim_url_limit is None or len(x) <= self.trim_url_limit: + def trim_url(self, x, trim_url_limit): + if trim_url_limit is None or len(x) <= trim_url_limit: return x - return '%s…' % x[:max(0, self.trim_url_limit - 1)] + return '%s…' % x[:max(0, trim_url_limit - 1)] def trim_punctuation(self, word): """