18 lines
633 B
TypeScript
18 lines
633 B
TypeScript
// 角色行用的字串片段與寬度計算(與 jsc-mod 外掛各自獨立,不互相依賴)
|
|
export type Seg = { text: string; color?: string; dim?: boolean; bold?: boolean }
|
|
|
|
export function bar(p: number, cells = 5): string {
|
|
const n = Math.max(0, Math.min(cells, Math.round((p / 100) * cells)))
|
|
return '▰'.repeat(n) + '▱'.repeat(cells - n)
|
|
}
|
|
|
|
const WIDE = /[ᄀ-ᅟ⺀-가-힣豈-︰-﹏-⦆¢-₩]/
|
|
|
|
export function width(s: string): number {
|
|
let w = 0
|
|
for (const ch of s) w += WIDE.test(ch) ? 2 : 1
|
|
return w
|
|
}
|
|
|
|
export const lineWidth = (segs: Seg[]) => segs.reduce((w, s) => w + width(s.text), 0)
|