Source code for monty.string
"""
Useful additional string functions.
"""
import sys
[docs]def remove_non_ascii(s):
"""
Remove non-ascii characters in a file. Needed when support for non-ASCII
is not available.
Args:
s (str): Input string
Returns:
String with all non-ascii characters removed.
"""
return "".join(i for i in s if ord(i) < 128)
[docs]def unicode2str(s):
"""
Forces a unicode to a string in Python 2, but transparently handles
Python 3.
Args:
s (str/unicode): Input string / unicode.
Returns:
str in Python 2. Unchanged otherwise.
"""
return s.encode("utf-8") if sys.version_info.major < 3 else s
[docs]def is_string(s):
"""True if s behaves like a string (duck typing test)."""
try:
s + " "
return True
except TypeError:
return False
[docs]def list_strings(arg):
"""
Always return a list of strings, given a string or list of strings as
input.
:Examples:
>>> list_strings('A single string')
['A single string']
>>> list_strings(['A single string in a list'])
['A single string in a list']
>>> list_strings(['A','list','of','strings'])
['A', 'list', 'of', 'strings']
"""
if is_string(arg):
return [arg]
return arg
[docs]def marquee(text="", width=78, mark="*"):
"""
Return the input string centered in a 'marquee'.
Args:
text (str): Input string
width (int): Width of final output string.
mark (str): Character used to fill string.
:Examples:
>>> marquee('A test', width=40)
'**************** A test ****************'
>>> marquee('A test', width=40, mark='-')
'---------------- A test ----------------'
marquee('A test',40, ' ')
' A test '
"""
if not text:
return (mark * width)[:width]
nmark = (width - len(text) - 2) // len(mark) // 2
nmark = max(nmark, 0)
marks = mark * nmark
return "%s %s %s" % (marks, text, marks)
[docs]def boxed(msg, ch="=", pad=5):
"""
Returns a string in a box
Args:
msg: Input string.
ch: Character used to form the box.
pad: Number of characters ch added before and after msg.
>>> print(boxed("hello", ch="*", pad=2))
***********
** hello **
***********
"""
if pad > 0:
msg = pad * ch + " " + msg.strip() + " " + pad * ch
return "\n".join(
[
len(msg) * ch,
msg,
len(msg) * ch,
]
)
[docs]def make_banner(s, width=78, mark="*"):
"""
:param s: String
:param width: Width of banner. Defaults to 78.
:param mark: The mark used to create the banner.
:return: Banner string.
"""
banner = marquee(s, width=width, mark=mark)
return "\n" + len(banner) * mark + "\n" + banner + "\n" + len(banner) * mark
[docs]def indent(lines, amount, ch=" "):
"""
Indent the lines in a string by padding each one with proper number of pad
characters
"""
padding = amount * ch
return padding + ("\n" + padding).join(lines.split("\n"))