runefix-core
๐ฏ A Rust core library that fixes terminal and Markdown misalignment caused by CJK and emoji widths.
English | ็ฎไฝไธญๆ | ๆฅๆฌ่ช
โจ Overview
runefix-core
is a Unicode-based display width engine that provides precise character width calculation, designed for:
- Terminal CLI alignment
- Markdown table rendering
- TUI layout engines
- Rich text editor rendering
Its goal is to solve a decades-long problem: misaligned characters in terminal and UI environments due to inconsistent Unicode width handling. This includes:
- CJK characters (Chinese, Japanese, Korean), Kana, and Hangul syllables
- Emoji (base, composite, and flag sequences)
- Fullwidth punctuation and multilingual symbols
- Grapheme cluster boundary cases
โ Key Features
- โ Precise width detection for emoji, CJK ideographs, Kana, Hangul, fullwidth symbols
- โ
Unicode grapheme support via [
graphemes()
], compliant with [UAX #29] - โ
Custom atom segmentation via [
atoms()
], optimized for TUI/terminal layout - โ Width-aware formatting tools: truncate, wrap, split, measure
- โ
Runtime layout strategies with [
WidthPolicy
] (terminal, markdown, compact) - โ
Trait extensions for
char
andstr
:.rune_width()
,.display_width()
, etc. - โ Zero dependencies, minimal build, embeddable in any CLI, TUI, or renderer
- โ Fully reproducible width tables, auto-generated from char-table
๐งฌ Atom Segmentation
โจ A runefix-specific alternative to Unicode graphemes
Unlike standard Unicode grapheme clusters (graphemes()
), atoms()
segments a string into layout-affecting units โ which directly map to visual space in terminal or TUI environments.
This segmentation is width-driven, optimized for rendering purposes:
- Groups zero-width marks (e.g. ZWJ, variation selectors) with their base
- Preserves emoji ZWJ sequences and CJK characters as atomic layout units
- Ignores linguistic rules and focuses purely on what affects layout
use atoms;
let parts = atoms;
assert_eq!;
This function is useful for:
- Rendering-width inspection
- Debugging layout behavior
- Fine-grained control in TUI/CLI apps
Tips: ๐ง For Unicode-compliant grapheme segmentation, use [graphemes()
].
๐งฉ Runtime Layout Policies
๐ง Enabling Policies (opt-in)
๐งช
--features policy
required
By default, runefix-core
uses the terminal layout policy, where both emoji and CJK characters occupy 2 columns.
You can optionally enable runtime policies to adapt to other rendering environments:
# Cargo.toml
= { = "0.1", = ["policy"] }
Then:
use ;
let policy = markdown;
let width = new.apply.display_width;
assert_eq!; // markdown prefers emoji width = 1
โน๏ธ Note: Some advanced methods (like .truncate_by_width(...)
) may require intermediate bindings due to borrowing rules of &str
. See with_policy.rs
for idiomatic usage.
๐ง Built-in Policies
Policy | Emoji | CJK | Variant | Use case |
---|---|---|---|---|
terminal() |
2 | 2 | 2 | Default. Best for terminal apps |
markdown() |
1 | 2 | 2 | GitHub / Typora / table renderers |
compact() |
1 | 1 | 1 | Logs, status bars, tight layouts |
You can also override policies dynamically at runtime for your renderer.
๐ Quick Example
use RuneDisplayWidth;
๐ท Real-World Examples
For a full demo of grapheme-aware alignment and terminal behavior, see examples/text_align.rs.
It showcases:
- Naive centering using
.chars().count()
โ - Fixed centering using
runefix_core::RuneDisplayWidth
โ - Screenshot comparisons across terminals
๐ Read more in examples/README.md
๐ฆ Installation
Add the following to your Cargo.toml
:
# Stable release (recommended)
= "0.1"
See crates.io for the latest version.
๐ Use Cases
- ๐ฅ๏ธ Terminal alignment (CLI box drawing, tables)
- ๐งพ Markdown renderers (accurate width handling in table cells)
- ๐ TUI layout engines (React-style terminal UIs)
- ๐ Editors and terminal emulators (accurate text wrapping)
- ๐งฉ Width testing tools, playgrounds, and visualization platforms
๐ Dataset Sources
This crate relies on structured, versioned datasets from char-table, including:
emoji_base.json
,emoji_zwj.json
cjk_unified.json
,japanese_kana.json
,korean_syllables.json
fullwidth_variants.json
,fullwidth_punctuations.json
All datasets are reproducible, regularly updated, and aligned with the latest Unicode releases.
๐ ๏ธ Project Status
Module | Status |
---|---|
CJK width detection | โ Completed |
Emoji width support | โ Completed |
Grapheme cluster | โ Completed |
๐ CHANGELOG
See CHANGELOG.md for version history.
๐ License
MIT OR Apache-2.0
ยฉ 2025 Pokeya Z. Chen / Runefix Labs
๐ฃ Project Affiliation
This project is maintained by the runefix-labs organization. It serves as the core engine for the runefix suite โ a multi-language, cross-platform solution for Unicode width handling.
๐ Contact
GitHub: github.com/runefix-labs
Author: pokeyaro
Email: pokeya.mystic@gmail.com