pyansistring is a library for string color styling using ANSI escape sequences. The base class inherits from Python's str. You can split, join, or slice the string while preserving the styling.
- Preservation of the str methods.
- Support for 4-, 8-, and 24-bit (True Color) color modes.
- Per-word coloring.
- Left, right, and center alignment without problems caused by string length.
- Support for multiple SGR (Select Graphic Rendition) parameters.
- Support for both the traditional ";" and the modern ":" SGR parameter separators.
- Automated coloring functionality, e.g., rainbow text.
For a more comprehensive list of what's been done so far, see the TODO section.
Inspired by rich and colorama Python libraries.
- Python 3.10 or higher
- Git (for local installation)
You can install the package via pip:
pip install pyansistring # or pip3 install pyansistringOr locally via git:
- Clone the repository
git clone https://github.com/l1asis/pyansistring
- Navigate to the cloned directory
cd pyansistring - Change git remote url to avoid accidental pushes to base project
git remote set-url origin github_username/repo_name # Verify the changes git remote -v - (Optional) Create and activate a virtual environment
python -m venv venv # On Windows .\venv\Scripts\activate # On Unix or MacOS source venv/bin/activate
- Install the package
pip install .
from pyansistring.pyansistring import ANSIString
from pyansistring.constants import SGR, Foreground, Background, UnderlineModetext = ANSIString("Hello, World!")
print(text)print(
ANSIString("Hello, World!")
.fg_4b(Foreground.YELLOW)
.bg_4b(Background.BLUE)
.fm(SGR.BOLD)
)print(
ANSIString("Hello, World!")
.fg_4b(Foreground.YELLOW, (0, 5), (7, 12)) # "Hello" and "World"
.bg_4b(Background.BLUE, (7, 12)) # "World"
.fm(SGR.BOLD, (7, 12)) # "World"
)print(
ANSIString("Hello, World!")
.fg_4b_w(Foreground.YELLOW, "Hello", "World")
.bg_4b_w(Background.BLUE, "World")
.fm_w(SGR.BOLD, "Hello", "World")
)print(
ANSIString("Hello, World!")
.fm(SGR.BOLD)
.fm(SGR.UNDERLINE)
)print(
ANSIString("Hello, World!")
.fg_4b(Foreground.YELLOW)
.bg_4b(Background.BLUE)
)print(
ANSIString("Hello, World!")
.fg_8b(11) # Bright Yellow
.bg_8b(4) # Blue
.ul_8b(74) # Muted Sky Blue
)print(
ANSIString("Hello, World!")
.fg_24b(255, 255, 0) # Bright Yellow
.bg_24b(0, 0, 238) # Blue
.ul_24b(135, 175, 215) # Light Steel Blue
)print(
ANSIString("Hello, World!")
.bg_24b(255, 255, 255) # White
.ul_24b(255, 0, 0) # Red
.fm(UnderlineMode.DOUBLE)
)styled = ANSIString("Hello, World!").fg_4b(Foreground.MAGENTA)
print(len(styled) == len("Hello, World!"))
# True (logical length ignores ANSI)
print(len(styled.styled_text) == len("Hello, World!"))
# False (includes ANSI codes)
print(styled.actual_length == len("Hello, World!"))
# False (includes ANSI codes)
print(styled.plain)
# "Hello, World!"from fontTools.ttLib import TTFont
styled = ANSIString("Hello, World!").fg_4b(Foreground.MAGENTA)
styled.to_svg(
font=TTFont("path/to/font.ttf"),
font_size_px=16,
output_file="hello_world.svg"
)ANSIString conversion to SVG path (for better compatibility when font is not guaranteed to be present):
from fontTools.ttLib import TTFont
styled = ANSIString("Hello, World!").fg_4b(Foreground.MAGENTA)
styled.to_svg(
font=TTFont("path/to/font.ttf"),
font_size_px=16,
convert_text_to_path=True,
output_file="hello_world_path.svg"
)Note: The convert_text_to_path parameter does not affect the visual appearance of the generated SVG. It only changes how the text is represented within the SVG file. But, it does not support bold and italic styles or underlines at the moment.
print(
ANSIString("Hello, World! This is rainbow text!")
.rainbow(fg=True)
)print(
ANSIString("Hello, World! This is multicolor text!")
.multicolor((
"r=0:|g=0:|b=255: $ " # Start with blue
"b>0:repeat(auto) # " # Decrease blue
"r>255:repeat(auto) | " # Increase green and combine with...
"g>255:repeat(auto) " # Increase red
" &*" # Cycle & Start without apply flags
))
)Contributions are what make the open source community such an amazing place to learn, inspire, and create. Any contributions you make are greatly appreciated.
If you have a suggestion that would make this better, please fork the repo and create a pull request. You can also simply open an issue with the tag "enhancement". Don't forget to give the project a star! Thanks again!
- Fork the Project
- Create your Feature Branch (
git checkout -b feature/AmazingFeature) - Commit your Changes (
git commit -m 'Add some AmazingFeature') - Push to the Branch (
git push origin feature/AmazingFeature) - Open a Pull Request
P.S. I would love to see your arts made with pyansistring in the arts.py file, with proper attribution, of course!
Distributed under the MIT License. See LICENSE for more information.
