diff options
author | Hypnoes <hypnoes@qq.com> | 2018-01-21 22:21:14 +0800 |
---|---|---|
committer | Hypnoes <hypnoes@qq.com> | 2018-01-21 22:21:14 +0800 |
commit | a50435acb1c57be89368ee2936c9a3205c50b605 (patch) | |
tree | 3e3875568eca754d0dd74b5c5c6ba3932d235ed3 | |
parent | 1a6601bc40eb14498bb1a60ca9187939b9eec102 (diff) | |
download | ansicolor-a50435acb1c57be89368ee2936c9a3205c50b605.tar.gz |
SUPPORT NEW FEATURES:
add new function get_code_v2;
add new function colorize_v2;
support blink text;
support underline text;
update test_color.py
-rw-r--r-- | .gitignore | 2 | ||||
-rw-r--r-- | ansicolor/ansicolor.py | 60 | ||||
-rw-r--r-- | tests/test_colors.py | 53 |
3 files changed, 115 insertions, 0 deletions
@@ -5,3 +5,5 @@ build/ dist/ docs/_build/ + +.vscode/ diff --git a/ansicolor/ansicolor.py b/ansicolor/ansicolor.py index 5975e65..877330e 100644 --- a/ansicolor/ansicolor.py +++ b/ansicolor/ansicolor.py @@ -18,8 +18,10 @@ __all__ = [ # noqa 'yellow', 'colorize', + 'colorize_v2', 'wrap_string', 'get_code', + 'get_code_v2', 'highlight_string', 'get_highlighter', @@ -454,3 +456,61 @@ def write_err(s): """ write_to(sys.stderr, s) + +def get_code_v2(color, bold=False, reverse=False, underline=False, blink=False): + """ + Returns the escape code for styling with the given color, + in bold and/or reverse. + :param color: The color to use. + :type color: :class:`Colors` class + :param bool bold: Whether to mark up in bold. + :param bool underline: Whether to mark up in underline. + :param bool blink: Whether to mark up in blink. + :param bool reverse: Whether to mark up in reverse video. + :rtype: string + """ + + if _disabled: + return "" + + fmt = '0' + l = [] + if bold: l.append('1') + if underline: l.append('4') + if blink: l.append('5') + if reverse: l.append('7') + if len(l) != 0: + fmt = ';'.join(l) + + color = (color is not None) and ';3%s' % color.id or '' + + return '\033[' + fmt + color + 'm' + +def colorize_v2(s, color, bold=False, reverse=False, underline=False, blink=False, + start=None, end=None): + """ + Colorize a string with the color given. + :param string s: The string to colorize. + :param color: The color to use. + :type color: :class:`Colors` class + :param bool bold: Whether to mark up in bold. + :param bool reverse: Whether to mark up in reverse video. + :param bool blink: Whether to mark up in blink. + :param bool reverse: Whether to mark up in reverse video. + :param int start: Index at which to start coloring. + :param int end: Index at which to end coloring. + :rtype: string + """ + + start = start if start else 0 + end = end if end else len(s) + + before = s[:start] + between = s[start:end] + after = s[end:] + + return ("%s%s%s%s%s" % (before, + get_code_v2(color, bold=bold, reverse=reverse), + between, + get_code_v2(None), + after)) diff --git a/tests/test_colors.py b/tests/test_colors.py index e586520..7bcaf2f 100644 --- a/tests/test_colors.py +++ b/tests/test_colors.py @@ -8,6 +8,8 @@ from ansicolor import justify_formatted from ansicolor import red from ansicolor import strip_escapes from ansicolor import wrap_string +from ansicolor import get_code_v2 +from ansicolor import colorize_v2 def test_codes(): @@ -100,3 +102,54 @@ def test_justify_formatted(): assert justify_formatted( red("hi"), rjust, 10 ) == " " + red("hi") + + +def test_codes_v2(): + # reset code + assert '\033[0m' == get_code_v2(None) + + # plain color codes + assert '\033[0;30m' == get_code_v2(Colors.Black) + assert '\033[0;31m' == get_code_v2(Colors.Red) + assert '\033[0;32m' == get_code_v2(Colors.Green) + assert '\033[0;33m' == get_code_v2(Colors.Yellow) + assert '\033[0;34m' == get_code_v2(Colors.Blue) + assert '\033[0;35m' == get_code_v2(Colors.Magenta) + assert '\033[0;36m' == get_code_v2(Colors.Cyan) + assert '\033[0;37m' == get_code_v2(Colors.White) + + # bold, underline, blink, reverse color + assert '\033[1;31m' == get_code_v2(Colors.Red, bold=True) + assert '\033[4;31m' == get_code_v2(Colors.Red, underline=True) + assert '\033[5;31m' == get_code_v2(Colors.Red, blink=True) + assert '\033[7;31m' == get_code_v2(Colors.Red, reverse=True) + + # mixed color + assert '\033[1;4;31m' == get_code_v2(Colors.Red, bold=True, underline=True) + assert '\033[1;5;31m' == get_code_v2(Colors.Red, bold=True, blink=True) + assert '\033[1;7;31m' == get_code_v2(Colors.Red, bold=True, reverse=True) + + assert '\033[4;5;31m' == get_code_v2(Colors.Red, underline=True, blink=True) + assert '\033[4;7;31m' == get_code_v2(Colors.Red, underline=True, reverse=True) + + assert '\033[5;7;31m' == get_code_v2(Colors.Red, blink=True, reverse=True) + + assert '\033[1;4;5;31m' == get_code_v2(Colors.Red, bold=True, underline=True, blink=True) + assert '\033[1;4;7;31m' == get_code_v2(Colors.Red, bold=True, underline=True, reverse=True) + assert '\033[1;5;7;31m' == get_code_v2(Colors.Red, bold=True, blink=True, reverse=True) + assert '\033[1;4;5;7;31m' == get_code_v2(Colors.Red, bold=True, underline=True, blink=True, reverse=True) + +def test_colorize_v2(): + assert ( + get_code(Colors.Red) + + "Hi there" + + get_code(None) + ) == colorize("Hi there", Colors.Red) + + assert ( + "H" + + get_code(Colors.Red) + + "i ther" + + get_code(None) + + "e" + ) == colorize("Hi there", Colors.Red, start=1, end=7) |