mirror of
https://github.com/ckaczor/vscode-gitlens.git
synced 2026-01-17 01:35:37 -05:00
Major refactor/rework -- many new features and breaking changes
Adds all-new, beautiful, highly customizable and themeable, file blame annotations Adds all-new configurability and themeability to the current line blame annotations Adds all-new configurability to the status bar blame information Adds all-new configurability over which commands are added to which menus via the `gitlens.advanced.menus` setting Adds better configurability over where Git code lens will be shown -- both by default and per language Adds an all-new `changes` (diff) hover annotation to the current line - provides instant access to the line's previous version Adds `Toggle Line Blame Annotations` command (`gitlens.toggleLineBlame`) - toggles the current line blame annotations on and off Adds `Show Line Blame Annotations` command (`gitlens.showLineBlame`) - shows the current line blame annotations Adds `Toggle File Blame Annotations` command (`gitlens.toggleFileBlame`) - toggles the file blame annotations on and off Adds `Show File Blame Annotations` command (`gitlens.showFileBlame`) - shows the file blame annotations Adds `Open File in Remote` command (`gitlens.openFileInRemote`) to the `editor/title` context menu Adds `Open Repo in Remote` command (`gitlens.openRepoInRemote`) to the `editor/title` context menu Changes the position of the `Open File in Remote` command (`gitlens.openFileInRemote`) in the context menus - now in the `navigation` group Changes the `Toggle Git Code Lens` command (`gitlens.toggleCodeLens`) to always toggle the Git code lens on and off Removes the on-demand `trailing` file blame annotations -- didn't work out and just ended up with a ton of visual noise Removes `Toggle Blame Annotations` command (`gitlens.toggleBlame`) - replaced by the `Toggle File Blame Annotations` command (`gitlens.toggleFileBlame`) Removes `Show Blame Annotations` command (`gitlens.showBlame`) - replaced by the `Show File Blame Annotations` command (`gitlens.showFileBlame`)
This commit is contained in:
@@ -1,8 +1,84 @@
|
||||
'use strict';
|
||||
import { Objects } from './object';
|
||||
const _escapeRegExp = require('lodash.escaperegexp');
|
||||
|
||||
export namespace Strings {
|
||||
export function escapeRegExp(s: string): string {
|
||||
return _escapeRegExp(s);
|
||||
}
|
||||
|
||||
const TokenRegex = /\$\{([^|]*?)(?:\|(\d+)(\-|\?)?)?\}/g;
|
||||
const TokenSanitizeRegex = /\$\{(\w*?)(?:\W|\d)*?\}/g;
|
||||
|
||||
export interface ITokenOptions {
|
||||
padDirection: 'left' | 'right';
|
||||
truncateTo: number | undefined;
|
||||
collapseWhitespace: boolean;
|
||||
}
|
||||
|
||||
export function getTokensFromTemplate(template: string) {
|
||||
const tokens: { key: string, options: ITokenOptions }[] = [];
|
||||
|
||||
let match = TokenRegex.exec(template);
|
||||
while (match != null) {
|
||||
const truncateTo = match[2];
|
||||
const option = match[3];
|
||||
tokens.push({
|
||||
key: match[1],
|
||||
options: {
|
||||
truncateTo: truncateTo == null ? undefined : parseInt(truncateTo, 10),
|
||||
padDirection: option === '-' ? 'left' : 'right',
|
||||
collapseWhitespace: option === '?'
|
||||
}
|
||||
});
|
||||
match = TokenRegex.exec(template);
|
||||
}
|
||||
|
||||
return tokens;
|
||||
}
|
||||
|
||||
export function interpolate(template: string, tokens: { [key: string]: any }): string {
|
||||
return new Function(...Object.keys(tokens), `return \`${template}\`;`)(...Objects.values(tokens));
|
||||
}
|
||||
|
||||
export function interpolateLazy(template: string, context: object): string {
|
||||
template = template.replace(TokenSanitizeRegex, '$${c.$1}');
|
||||
return new Function('c', `return \`${template}\`;`)(context);
|
||||
}
|
||||
|
||||
export function padLeft(s: string, padTo: number, padding: string = '\u00a0') {
|
||||
const diff = padTo - s.length;
|
||||
return (diff <= 0) ? s : '\u00a0'.repeat(diff) + s;
|
||||
}
|
||||
|
||||
export function padLeftOrTruncate(s: string, max: number, padding?: string) {
|
||||
if (s.length < max) return padLeft(s, max, padding);
|
||||
if (s.length > max) return truncate(s, max);
|
||||
return s;
|
||||
}
|
||||
|
||||
export function padRight(s: string, padTo: number, padding: string = '\u00a0') {
|
||||
const diff = padTo - s.length;
|
||||
return (diff <= 0) ? s : s + '\u00a0'.repeat(diff);
|
||||
}
|
||||
|
||||
export function padOrTruncate(s: string, max: number, padding?: string) {
|
||||
const left = max < 0;
|
||||
max = Math.abs(max);
|
||||
|
||||
if (s.length < max) return left ? padLeft(s, max, padding) : padRight(s, max, padding);
|
||||
if (s.length > max) return truncate(s, max);
|
||||
return s;
|
||||
}
|
||||
|
||||
export function padRightOrTruncate(s: string, max: number, padding?: string) {
|
||||
if (s.length < max) return padRight(s, max, padding);
|
||||
if (s.length > max) return truncate(s, max);
|
||||
return s;
|
||||
}
|
||||
|
||||
export function truncate(s: string, truncateTo?: number) {
|
||||
if (!s || truncateTo === undefined || s.length <= truncateTo) return s;
|
||||
return `${s.substring(0, truncateTo - 1)}\u2026`;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user