#escaping #ansi #grapheme #unicode #source-string #text #text-color

print-positions

提供基于可见打印位置的精确长度算术的字符串分段的库,支持图形集群和ANSI转义序列

5个版本

0.6.1 2023年2月20日
0.6.0 2023年2月19日
0.5.2 2023年2月18日
0.5.1 2023年2月18日
0.5.0 2023年2月17日

#827 in 文本处理

Download history 2068/week @ 2024-03-14 2316/week @ 2024-03-21 2228/week @ 2024-03-28 2663/week @ 2024-04-04 2489/week @ 2024-04-11 1975/week @ 2024-04-18 2350/week @ 2024-04-25 2245/week @ 2024-05-02 2117/week @ 2024-05-09 1973/week @ 2024-05-16 1739/week @ 2024-05-23 1936/week @ 2024-05-30 1485/week @ 2024-06-06 1355/week @ 2024-06-13 1600/week @ 2024-06-20 1277/week @ 2024-06-27

5,961 每月下载量
11 个crates中(通过 nu-command)使用

MIT/Apache

25KB
347

Build and test

Crate print_positions

返回组成“打印位置”的字符切片的迭代器,而不是源字符串的单独字符。

print_positionsprint_position_indices 函数提供了返回“打印位置”的迭代器。

打印位置是对 UAX#29 扩展图形集群 的一种推广。像图形一样,它在屏幕上渲染时占据一个“字符”。
但是,它也可能包含影响颜色或强度渲染的 ANSI转义代码

示例

use print_positions::print_positions;

// content is e with dieresis, displayed in green with a color reset at the end.  
// Looks like 1 character on the screen.  See example "padding" to print one out.
let content = ["\u{1b}[30;42m", "\u{0065}", "\u{0308}", "\u{1b}[0m"].join("");

let print_positions:Vec<_> = print_positions(&content).collect();
assert_eq!(content.len(), 15);          // content is 15 chars long
assert_eq!(print_positions.len(), 1);   // but only 1 print position

理由

在布局固定宽度屏幕应用程序时,知道一块内容将消耗多少可见列很有用。但内容中的字节或字符数通常更大,由UTF8编码、Unicode组合字符和零宽度连接符以及ANSI兼容设备和应用程序的文本颜色和强调指定的控制代码和转义序列所膨胀。

print_position迭代器考虑了这些因素并简化了算术:内容在屏幕上将消耗的列数是迭代器返回的打印位置切片数。

已知问题

  • 没有计算光标移动
    ANSI控制字符和序列都被假定在屏幕上不占用空间。
    这在退格、制表符、换行符、CUP、CUU、CUD等情况下可能是一个错误。欢迎PR或简单的改进建议!

依赖关系

~555KB