ansi-align
A Rust library for aligning text with proper support for ANSI escape sequences and Unicode characters.
Features
- ANSI-aware alignment: Correctly handles text containing ANSI escape sequences (colors, formatting)
- Unicode support: Properly calculates display width for Unicode characters including CJK characters
- Multiple alignment options: Left, center, and right alignment
- Customizable: Configure split strings and padding characters
- Performance optimized: Single-pass processing with efficient memory usage
- Type-safe: Uses a
Widthtype for display width values
Installation
Add this to your Cargo.toml:
[]
= "0.1.0"
Quick Start
use ;
// Basic alignment (defaults to center)
let text = "hello\nworld";
let centered = ansi_align;
// Specific alignment functions
let left_aligned = left;
let centered = center;
let right_aligned = right;
Advanced Usage
Custom Options
use ;
let text = "line1|line2|line3";
let options = new
.with_split // Custom line separator
.with_pad; // Custom padding character
let result = ansi_align_with_options;
// Result: "..line1|..line2|..line3"
ANSI Escape Sequences
The library correctly handles ANSI escape sequences by ignoring them during width calculation:
use center;
let colored_text = "\x1b[31mred\x1b[0m\n\x1b[32mgreen text\x1b[0m";
let aligned = center;
// ANSI codes are preserved but don't affect alignment
Unicode Characters
Wide Unicode characters (like CJK) are handled correctly:
use center;
let unicode_text = "古\n古古古";
let aligned = center;
// Properly accounts for double-width characters
API Reference
Core Functions
ansi_align(text: &str) -> String- Center align text (default)ansi_align_with_options(text: &str, opts: AlignOptions) -> String- Align with custom optionsleft(text: &str) -> String- Left align (no-op, returns original)center(text: &str) -> String- Center align textright(text: &str) -> String- Right align text
Types
Alignment
Width
A type-safe wrapper for display width values:
let width = new;
let value = width.get; // Returns usize
AlignOptions
Configuration for alignment behavior:
Builder methods:
AlignOptions::new(align: Alignment)- Create with alignment.with_split(split: impl Into<String>)- Set custom line separator.with_pad(pad: char)- Set custom padding character
Performance
- Left alignment: Optimized as a no-op, returns input unchanged
- Single pass: Text is processed once for optimal performance
- Efficient padding: Uses optimized string creation for different padding sizes
- Memory conscious: Minimal allocations with capacity pre-calculation
CLI Tool
The crate includes a beautiful CLI tool for interactive text alignment:
# Run the demo to see all features
# Align text from command line
# Read from stdin
|
# Read from file
# Custom separator
CLI Features
- 🎨 Beautiful output with optional colorful borders
- 📁 Multiple input sources: command line, stdin, or file
- 🌈 ANSI color preservation in aligned output
- 🌏 Unicode support including CJK characters
- ⚙️ Customizable padding characters and line separators
- 📋 Interactive demo showing all capabilities
Examples
Simple Menu Alignment
use center;
let menu = "Home\nAbout Us\nContact\nServices";
let aligned_menu = center;
println!;
Code Block Alignment
use right;
let code = "if x:\n return y\nelse:\n return z";
let aligned_code = right;
println!;
Custom Separator and Padding
use ;
let data = "Name|Age|City";
let options = new
.with_split
.with_pad;
let result = ansi_align_with_options;
License
Licensed under either of
- Apache License, Version 2.0 (LICENSE-APACHE)
- MIT license (LICENSE-MIT)
at your option.