tty-text
Deprecated! Please use tty-text-size or tty-detect to get terminal text's size.
API
- detectShortText(text, callback)
- detechEach(text, callback)
- detectEachNumbers(numbers, callback)
- size(textOrNumber, [ambsize])
注意
- 不支持获取 \t, \n, \v, \f, \r 的长度,因为它们的长度不固定
- Windows 下部分字符的长度不准备,比如字符
U+25CB
,U+25C7
,在 Windows 下是 2,但在 Mac 下是 1,但它又不是模糊字体 - Windows 下不支持 detect 相关的方法,直接用 size 去获取缓存好的字符的长度吧
Other bonus
- isCombiningMarkChar(codePoint)
- isAmbiguousEastAsianChar(codePoint)
- isSurrogatePairsChar(codePoint)
- codePointSize(codePoint)
Usage
注意
- 在调用 text 或 words 时,不能并行执行,否则前面的会影响到后面的结果
- 在回调没有执行完成之前,不要用 console.log 或 console.error 来输出任何内容
var tt = ; // 获取字符串在命令行上显示的长度(不支持大量的文字,如超过一整个屏幕)// 注意:使用前尽量 clear 下屏幕内容,因为如果不 clear,通过命令得到的当前行数总是最后一行// 这样很容易影响长度的计算tt; // 计算字符串中每个字符的长度,支持所有 Unicode 字符// 使用了 punycode 库tt; ttsize'some text'; // => 9 ttsize96; // => 1
Example
var tt = ; var text = 'en\u0303中💩\u2661'; tt;
扩展知识
- 装饰符号
e.g: n\u0303 => ñ
像这种由两个字符组成的字符串的长度只有 1,其中 \u0303
只是装饰符号,它的长度是 0。
在英文里叫它 Combining Marks
- Astral Symbols
e.g: \uD83D\uDCA9 => 💩
JS 表示 x0000 - xFFFF 之前的字符只需要使用一个字节就行,但 Unicode 总共有 x10FFFF 个字符, 所以要表示超过了 xFFFF 的字符,在 ES5 之前就采用了 Surrogate Pairs 的表示法, 而它会导致你在用 string.length 时得到 2,而它实际只是一个字符而已。
所以在 ES6 中可以采用 \u{1F4A9}
这种统一的写法
- 东亚模糊字体
\u2661 => ♡
英文里叫它 East Asian Ambiguous Character Width
每个终端上都可以配置 ”是否将此类字体设置成 Double 宽度“,所以此类字体在不同的终端上宽度可能也会不一样。
链接
- East Asian Width 文档 数据
- ANSI escape code
- ASCII 控制字符
- JavaScript Unicode