def escape(cls, s): """Escape the string. Works like :func:`escape` with the difference that for subclasses of :class:`Markup` this function would return the correct subclass. """ rv = escape(s) if rv.__class__ is not cls: return cls(rv) return rv
def generate_lorem_ipsum(n=5, html=True, min=20, max=100): """Generate some lorem impsum for the template.""" from vendor.jinja2.constants import LOREM_IPSUM_WORDS from random import choice, random, randrange words = LOREM_IPSUM_WORDS.split() result = [] for _ in xrange(n): next_capitalized = True last_comma = last_fullstop = 0 word = None last = None p = [] # each paragraph contains out of 20 to 100 words. for idx, _ in enumerate(xrange(randrange(min, max))): while True: word = choice(words) if word != last: last = word break if next_capitalized: word = word.capitalize() next_capitalized = False # add commas if idx - randrange(3, 8) > last_comma: last_comma = idx last_fullstop += 2 word += "," # add end of sentences if idx - randrange(10, 20) > last_fullstop: last_comma = last_fullstop = idx word += "." next_capitalized = True p.append(word) # ensure that the paragraph ends with a dot. p = u" ".join(p) if p.endswith(","): p = p[:-1] + "." elif not p.endswith("."): p += "." result.append(p) if not html: return u"\n\n".join(result) return Markup(u"\n".join(u"<p>%s</p>" % escape(x) for x in result))
def urlize(text, trim_url_limit=None, nofollow=False): """Converts any URLs in text into clickable links. Works on http://, https:// and www. links. 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 will be limited to trim_url_limit characters. If nofollow is True, the URLs in link text will get a rel="nofollow" attribute. """ trim_url = ( lambda x, limit=trim_url_limit: limit is not None and (x[:limit] + (len(x) >= limit and "..." or "")) or x ) words = _word_split_re.split(unicode(escape(text))) nofollow_attr = nofollow and ' rel="nofollow"' or "" for i, word in enumerate(words): match = _punctuation_re.match(word) if match: lead, middle, trail = match.groups() if middle.startswith("www.") or ( "@" not in middle and not middle.startswith("http://") and len(middle) > 0 and middle[0] in _letters + _digits and (middle.endswith(".org") or middle.endswith(".net") or middle.endswith(".com")) ): middle = '<a href="http://%s"%s>%s</a>' % (middle, nofollow_attr, trim_url(middle)) if middle.startswith("http://") or middle.startswith("https://"): middle = '<a href="%s"%s>%s</a>' % (middle, nofollow_attr, trim_url(middle)) if "@" in middle and not middle.startswith("www.") and not ":" in middle and _simple_email_re.match(middle): middle = '<a href="mailto:%s">%s</a>' % (middle, middle) if lead + middle + trail != word: words[i] = lead + middle + trail return u"".join(words)
def _escape_argspec(obj, iterable): """Helper for various string-wrapped functions.""" for key, value in iterable: if hasattr(value, "__html__") or isinstance(value, basestring): obj[key] = escape(value) return obj
def __radd__(self, other): if hasattr(other, "__html__") or isinstance(other, basestring): return self.__class__(unicode(escape(other)) + unicode(self)) return NotImplemented