summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore2
-rw-r--r--ansicolor/ansicolor.py60
-rw-r--r--tests/test_colors.py53
3 files changed, 115 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
index ca50944..4be52a0 100644
--- a/.gitignore
+++ b/.gitignore
@@ -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)