def do_urlimagize(text, trim_url_limit=MAX_URL_LENGTH, nofollow=False, autoescape=False): """ Converts any URLs in text into clickable links. Works on http://, https://, www. links and links ending in .org, .net or .com. Links can have trailing punctuation (periods, commas, close-parens) and leading punctuation (opening parens) and it'll still do the right thing. If trim_url_limit is not None, the URLs in link text longer than this limit will truncated to trim_url_limit-3 characters and appended with an elipsis. If nofollow is True, the URLs in link text will get a rel="nofollow" attribute. If autoescape is True, the link text and URLs will get autoescaped. """ trim_url = lambda x, limit=trim_url_limit: limit is not None and (len(x) > limit and ('%s...' % x[:max(0, limit - 3)])) or x safe_input = isinstance(text, SafeData) words = word_split_re.split(force_unicode(text)) nofollow_attr = nofollow and ' rel="nofollow"' or '' for i, word in enumerate(words): match = None if '.' in word or '@' in word or ':' in word: match = punctuation_re.match(word) if match: lead, middle, trail = match.groups() # Make URL we want to point to. url = None if middle.startswith('http://') or middle.startswith('https://'): url = urlquote(middle, safe='/&=:;#?+*') elif middle.startswith('www.') or ('@' not in middle and \ middle and middle[0] in string.ascii_letters + string.digits and \ (middle.endswith('.org') or middle.endswith('.net') or middle.endswith('.com'))): url = urlquote('http://%s' % middle, safe='/&=:;#?+*') elif '@' in middle and not ':' in middle and simple_email_re.match(middle): url = 'mailto:%s' % middle nofollow_attr = '' # Make link. if url: trimmed = trim_url(middle) if autoescape and not safe_input: lead, trail = escape(lead), escape(trail) url, trimmed = escape(url), escape(trimmed) if is_image(url): middle = '<a href="%s"><img class="image-inside-review" src="%s" alt="" /></a>' % (url, url) else: middle = '<a href="%s"%s>%s</a>' % (url, nofollow_attr, trimmed) words[i] = mark_safe('%s%s%s' % (lead, middle, trail)) else: if safe_input: words[i] = mark_safe(word) elif autoescape: words[i] = escape(word) elif safe_input: words[i] = mark_safe(word) elif autoescape: words[i] = escape(word) return u''.join(words)
def urlized_words(text): from django.utils.html import word_split_re, punctuation_re from django.utils.http import urlquote for word in word_split_re.split(text): if '.' in word or ':' in word: match = punctuation_re.match(word) lead, middle, trail = match.groups() if any(middle.startswith(scheme) for scheme in ('http://', 'https://')): yield replacement_text_for_url(urlquote(middle, safe='/&=:;#?+*')) continue yield word
def urlized_words(text): from django.utils.html import word_split_re, punctuation_re from django.utils.http import urlquote for word in word_split_re.split(text): if '.' in word or ':' in word: match = punctuation_re.match(word) lead, middle, trail = match.groups() if any( middle.startswith(scheme) for scheme in ('http://', 'https://')): yield replacement_text_for_url( urlquote(middle, safe='/&=:;#?+*')) continue yield word
def urlify_markdown(text): """ Converts any URLs in text into markdown links. Works on http://, https://, www. links and links ending in .org, .net or .com. Links can have trailing punctuation (periods, commas, close-parens) and leading punctuation (opening parens) and it'll still do the right thing. """ safe_input = isinstance(text, SafeData) words = word_split_re.split(force_unicode(text)) for i, word in enumerate(words): match = None if '.' in word or '@' in word or ':' in word: match = punctuation_re.match(word) if match: lead, middle, trail = match.groups() # Make URL we want to point to. url = None if middle.startswith('http://') or middle.startswith('https://'): url = urlquote(middle, safe='/&=:;#?+*') elif middle.startswith('www.') or ('@' not in middle and \ middle and middle[0] in string.ascii_letters + string.digits and \ (middle.endswith('.org') or middle.endswith('.net') or middle.endswith('.com'))): url = urlquote('http://%s' % middle, safe='/&=:;#?+*') elif '@' in middle and not ':' in middle and simple_email_re.match( middle): url = 'mailto:%s' % middle nofollow_attr = '' # Make link. if url: words[i] = mark_safe('%s<%s>%s' % (lead, url, trail)) else: if safe_input: words[i] = mark_safe(word) elif safe_input: words[i] = mark_safe(word) return u''.join(words)
def urlify_markdown(text): """ Converts any URLs in text into markdown links. Works on http://, https://, www. links and links ending in .org, .net or .com. Links can have trailing punctuation (periods, commas, close-parens) and leading punctuation (opening parens) and it'll still do the right thing. """ safe_input = isinstance(text, SafeData) words = word_split_re.split(force_unicode(text)) for i, word in enumerate(words): match = None if '.' in word or '@' in word or ':' in word: match = punctuation_re.match(word) if match: lead, middle, trail = match.groups() # Make URL we want to point to. url = None if middle.startswith('http://') or middle.startswith('https://'): url = urlquote(middle, safe='/&=:;#?+*') elif middle.startswith('www.') or ('@' not in middle and \ middle and middle[0] in string.ascii_letters + string.digits and \ (middle.endswith('.org') or middle.endswith('.net') or middle.endswith('.com'))): url = urlquote('http://%s' % middle, safe='/&=:;#?+*') elif '@' in middle and not ':' in middle and simple_email_re.match(middle): url = 'mailto:%s' % middle nofollow_attr = '' # Make link. if url: words[i] = mark_safe('%s<%s>%s' % (lead, url, trail)) else: if safe_input: words[i] = mark_safe(word) elif safe_input: words[i] = mark_safe(word) return u''.join(words)
def do_urlimagize(text, trim_url_limit=MAX_URL_LENGTH, nofollow=False, autoescape=False): """ Converts any URLs in text into clickable links. Works on http://, https://, www. links and links ending in .org, .net or .com. Links can have trailing punctuation (periods, commas, close-parens) and leading punctuation (opening parens) and it'll still do the right thing. If trim_url_limit is not None, the URLs in link text longer than this limit will truncated to trim_url_limit-3 characters and appended with an elipsis. If nofollow is True, the URLs in link text will get a rel="nofollow" attribute. If autoescape is True, the link text and URLs will get autoescaped. """ trim_url = ( lambda x, limit=trim_url_limit: limit is not None and (len(x) > limit and ("%s..." % x[: max(0, limit - 3)])) or x ) safe_input = isinstance(text, SafeData) words = word_split_re.split(force_unicode(text)) nofollow_attr = nofollow and ' rel="nofollow"' or "" for i, word in enumerate(words): match = None if "." in word or "@" in word or ":" in word: match = punctuation_re.match(word) if match: lead, middle, trail = match.groups() # Make URL we want to point to. url = None if middle.startswith("http://") or middle.startswith("https://"): url = urlquote(middle, safe="/&=:;#?+*") elif middle.startswith("www.") or ( "@" not in middle and middle and middle[0] in string.ascii_letters + string.digits and (middle.endswith(".org") or middle.endswith(".net") or middle.endswith(".com")) ): url = urlquote("http://%s" % middle, safe="/&=:;#?+*") elif "@" in middle and not ":" in middle and simple_email_re.match(middle): url = "mailto:%s" % middle nofollow_attr = "" # Make link. if url: trimmed = trim_url(middle) if autoescape and not safe_input: lead, trail = escape(lead), escape(trail) url, trimmed = escape(url), escape(trimmed) if is_image(url): middle = '<a href="%s"><img class="image-inside-review" src="%s" alt="" /></a>' % (url, url) else: middle = '<a href="%s"%s>%s</a>' % (url, nofollow_attr, trimmed) words[i] = mark_safe("%s%s%s" % (lead, middle, trail)) else: if safe_input: words[i] = mark_safe(word) elif autoescape: words[i] = escape(word) elif safe_input: words[i] = mark_safe(word) elif autoescape: words[i] = escape(word) return u"".join(words)
def imgurlize(text, trim_url_limit=None, nofollow=False, autoescape=False, imgclass=''): """ Converts any URLs in text into clickable links. Works on http://, https://, www. links and links ending in .org, .net or .com. Links can have trailing punctuation (periods, commas, close-parens) and leading punctuation (opening parens) and it'll still do the right thing. If trim_url_limit is not None, the URLs in link text longer than this limit will truncated to trim_url_limit-3 characters and appended with an elipsis. If nofollow is True, the URLs in link text will get a rel="nofollow" attribute. If autoescape is True, the link text and URLs will get autoescaped. """ trim_url = lambda x, limit=trim_url_limit: limit is not None and (len(x) > limit and ('%s...' % x[:max(0, limit - 3)])) or x safe_input = isinstance(text, SafeData) words = word_split_re.split(force_unicode(text)) nofollow_attr = nofollow and ' rel="nofollow"' or '' for i, word in enumerate(words): match = None if '.' in word or '@' in word or ':' in word: match = punctuation_re.match(word) if match: lead, middle, trail = match.groups() # Make URL we want to point to. url = None if middle.startswith('http://') or middle.startswith('https://'): url = urlquote(middle, safe='/&=:;#?+*') elif middle.startswith('www.') or ('@' not in middle and \ middle and middle[0] in string.ascii_letters + string.digits and \ (middle.endswith('.org') or middle.endswith('.net') or middle.endswith('.com'))): url = urlquote('http://%s' % middle, safe='/&=:;#?+*') is_youtube = is_img = is_vimeo = None if url: is_youtube = is_youtube_url(url) is_img = is_img_url(url) is_vimeo = is_vimeo_url(url) if url and (is_img or is_youtube or is_vimeo): trimmed = trim_url(middle) if autoescape and not safe_input: lead, trail = escape(lead), escape(trail) url, trimmed = escape(url), escape(trimmed) if is_img: middle = '<a href="%s"><img class="%s" src="%s" alt=""/></a>' % (url, imgclass, url) elif is_youtube: template = ''' <object width="480" height="385"> <param name="movie" value="http://www.youtube.com/v/%(key)s?fs=1&hl=ru_RU"></param> <param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/%(key)s?fs=1&hl=ru_RU" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"></embed></object> <noscript>%(url)s</noscript> ''' url = '<a href="%s"%s>%s</a>' % (url, nofollow_attr, trimmed) middle = template%{'url':url, 'key':is_youtube} elif is_vimeo: template = ''' <object width="480" height="385"> <param name="allowfullscreen" value="true" /> <param name="allowscriptaccess" value="always" /> <param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=%(key)s&server=vimeo.com&show_title=1&show_byline=1&show_portrait=1&color=00ADEF&fullscreen=1&autoplay=0&loop=0" /> <embed src="http://vimeo.com/moogaloop.swf?clip_id=%(key)s&server=vimeo.com&show_title=1&show_byline=1&show_portrait=1&color=00ADEF&fullscreen=1&autoplay=0&loop=0" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="480" height="385"></embed></object> <noscript>%(url)s</noscript> ''' url = '<a href="%s"%s>%s</a>' % (url, nofollow_attr, trimmed) middle = template%{'url': url, 'key':is_vimeo} words[i] = mark_safe('%s%s%s' % (lead, middle, trail)) else: if safe_input: words[i] = mark_safe(word) elif autoescape: words[i] = escape(word) elif safe_input: words[i] = mark_safe(word) elif autoescape: words[i] = escape(word) return u''.join(words)