From 6255b26fd2dc471dfe37844f41dd1644d99fb315 Mon Sep 17 00:00:00 2001 From: Eric Amodio Date: Tue, 29 Aug 2017 22:47:12 -0400 Subject: [PATCH] Fixes #135 - Full-width chars break gutter annotations --- .../gutterBlameAnnotationProvider.ts | 2 +- src/system/string.ts | 20 +++++++++++++++++-- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/src/annotations/gutterBlameAnnotationProvider.ts b/src/annotations/gutterBlameAnnotationProvider.ts index 02d2001..3dd708b 100644 --- a/src/annotations/gutterBlameAnnotationProvider.ts +++ b/src/annotations/gutterBlameAnnotationProvider.ts @@ -61,7 +61,7 @@ export class GutterBlameAnnotationProvider extends BlameAnnotationProviderBase { gutter.renderOptions = { ...gutter.renderOptions }; gutter.renderOptions.before = { ...gutter.renderOptions.before, - ...{ contentText: GlyphChars.Space.repeat(gutter.renderOptions!.before!.contentText!.length) } + ...{ contentText: GlyphChars.Space.repeat(Strings.getWidth(gutter.renderOptions!.before!.contentText!)) } }; if (separateLines) { diff --git a/src/system/string.ts b/src/system/string.ts index 18b8b42..c8b5d11 100644 --- a/src/system/string.ts +++ b/src/system/string.ts @@ -102,7 +102,23 @@ export namespace Strings { } export function truncate(s: string, truncateTo?: number) { - if (!s || truncateTo === undefined || getWidth(s) <= truncateTo) return s; - return `${s.substring(0, truncateTo - 1)}\u2026`; + if (!s || truncateTo === undefined) return s; + + const len = getWidth(s); + if (len <= truncateTo) return s; + if (len === s.length) return `${s.substring(0, truncateTo - 1)}\u2026`; + + // Skip ahead to start as far as we can by assuming all the double-width characters won't be truncated + let chars = Math.floor(truncateTo / (len / s.length)); + let count = getWidth(s.substring(0, chars)); + while (count < truncateTo) { + count += getWidth(s[chars++]); + } + + if (count > truncateTo) { + chars--; + } + + return `${s.substring(0, chars)}\u2026`; } } \ No newline at end of file