115 lines
4.2 KiB
Python
Executable file
115 lines
4.2 KiB
Python
Executable file
""" formatting.py - handy functions for formatting text
|
|
this file contains code from the following URL:
|
|
<http://code.djangoproject.com/svn/django/trunk/django/utils/text.py>
|
|
"""
|
|
|
|
import re
|
|
|
|
|
|
def capitalize_first(line):
|
|
"""
|
|
capitalises the first letter of words
|
|
(keeps other letters intact)
|
|
"""
|
|
return ' '.join([s[0].upper() + s[1:] for s in line.split(' ')])
|
|
|
|
|
|
def multiword_replace(text, wordDic):
|
|
"""
|
|
take a text and replace words that match a key in a dictionary with
|
|
the associated value, return the changed text
|
|
"""
|
|
rc = re.compile('|'.join(map(re.escape, wordDic)))
|
|
|
|
def translate(match):
|
|
return wordDic[match.group(0)]
|
|
return rc.sub(translate, text)
|
|
|
|
|
|
# from <http://stackoverflow.com/questions/250357/smart-truncate-in-python>
|
|
def truncate_str(content, length=100, suffix='...'):
|
|
"Truncates a string after a certain number of chars."
|
|
if len(content) <= length:
|
|
return content
|
|
else:
|
|
return content[:length].rsplit(' ', 1)[0] + suffix
|
|
|
|
|
|
# ALL CODE BELOW THIS LINE IS COVERED BY THE FOLLOWING AGREEMENT:
|
|
|
|
# Copyright (c) Django Software Foundation and individual contributors.
|
|
# All rights reserved.
|
|
#
|
|
# Redistribution and use in source and binary forms, with or without
|
|
# modification, are permitted provided that the following conditions are met:
|
|
#
|
|
# 1. Redistributions of source code must retain the above copyright notice,
|
|
# this list of conditions and the following disclaimer.
|
|
#
|
|
# 2. Redistributions in binary form must reproduce the above copyright
|
|
# notice, this list of conditions and the following disclaimer in the
|
|
# documentation and/or other materials provided with the distribution.
|
|
#
|
|
# 3. Neither the name of Django nor the names of its contributors may be used
|
|
# to endorse or promote products derived from this software without
|
|
# specific prior written permission.
|
|
#
|
|
#THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"AND
|
|
#ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
#WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
#DISCLAIMED.IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
|
#ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
#(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
|
#LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
|
#ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
#(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
#SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
|
|
# Expression to match some_token and some_token="with spaces" (and similarly
|
|
# for single-quoted strings).
|
|
|
|
split_re = re.compile(r"""((?:[^\s'"]*(?:(?:"(?:[^"\\]|\\.)*" | '(?:[""" \
|
|
r"""^'\\]|\\.)*')[^\s'"]*)+) | \S+)""", re.VERBOSE)
|
|
|
|
|
|
def smart_split(text):
|
|
r"""
|
|
Generator that splits a string by spaces, leaving quoted phrases together.
|
|
Supports both single and double quotes, and supports escaping quotes with
|
|
backslashes. In the output, strings will keep their initial and trailing
|
|
quote marks and escaped quotes will remain escaped (the results can then
|
|
be further processed with unescape_string_literal()).
|
|
|
|
>>> list(smart_split(r'This is "a person\'s" test.'))
|
|
[u'This', u'is', u'"a person\\\'s"', u'test.']
|
|
>>> list(smart_split(r"Another 'person\'s' test."))
|
|
[u'Another', u"'person\\'s'", u'test.']
|
|
>>> list(smart_split(r'A "\"funky\" style" test.'))
|
|
[u'A', u'"\\"funky\\" style"', u'test.']
|
|
"""
|
|
for bit in split_re.finditer(text):
|
|
yield bit.group(0)
|
|
|
|
|
|
def get_text_list(list_, last_word='or'):
|
|
"""
|
|
>>> get_text_list(['a', 'b', 'c', 'd'])
|
|
u'a, b, c or d'
|
|
>>> get_text_list(['a', 'b', 'c'], 'and')
|
|
u'a, b and c'
|
|
>>> get_text_list(['a', 'b'], 'and')
|
|
u'a and b'
|
|
>>> get_text_list(['a'])
|
|
u'a'
|
|
>>> get_text_list([])
|
|
u''
|
|
"""
|
|
if len(list_) == 0:
|
|
return ''
|
|
if len(list_) == 1:
|
|
return list_[0]
|
|
return '%s %s %s' % (
|
|
# Translators: This string is used as a separator between list elements
|
|
(', ').join([i for i in list_][:-1]),
|
|
last_word, list_[-1])
|