codess
Version:
vscode代码片段管理器,通过 本地包(本地某个文件夹) 或官网的 远程包(代码片段集合) 生成本地项目的 vscode 代码片段配置。
105 lines (104 loc) • 4.05 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.filterSnippets = filterSnippets;
exports.compareAnything = compareAnything;
exports.compareByPrefix = compareByPrefix;
exports.compareFileNames = compareFileNames;
const matchesFuzzy_1 = require("../vscode/matchesFuzzy");
const lazy_1 = require("../vscode/lazy");
const ArrayUtils_1 = require("../yayaluoya-tool/ArrayUtils");
function filterSnippets(query, language, snippets) {
let languages = ArrayUtils_1.ArrayUtils.arraify(language).filter(Boolean);
const normalizedSearchValue = query.toLowerCase();
return snippets
.filter((_) => {
var _a;
if (languages.length <= 0) {
return true;
}
let scopes = (_a = _.scope) === null || _a === void 0 ? void 0 : _a.split(',').map((_) => _.trim()).filter(Boolean);
if (!scopes || scopes.length <= 0) {
return true;
}
return scopes.some((_) => languages.includes(_));
})
.map((_) => {
var _a;
return {
labelHighlights: (_a = (0, matchesFuzzy_1.matchesFuzzy)(query, ArrayUtils_1.ArrayUtils.arraify(_.prefix).join(''), true)) !== null && _a !== void 0 ? _a : undefined,
descriptionHighlights: undefined,
detailHighlights: undefined,
snippet: _,
};
})
.filter((_) => _.labelHighlights || _.descriptionHighlights || _.detailHighlights)
.sort((a, b) => {
return compareEntries(a, b, normalizedSearchValue);
});
}
function compareEntries(itemA, itemB, lookFor) {
const labelHighlightsA = itemA.labelHighlights || [];
const labelHighlightsB = itemB.labelHighlights || [];
if (labelHighlightsA.length && !labelHighlightsB.length) {
return -1;
}
if (!labelHighlightsA.length && labelHighlightsB.length) {
return 1;
}
if (labelHighlightsA.length === 0 && labelHighlightsB.length === 0) {
return 0;
}
return compareAnything(ArrayUtils_1.ArrayUtils.arraify(itemA.snippet.prefix).join(''), ArrayUtils_1.ArrayUtils.arraify(itemB.snippet.prefix).join(''), lookFor);
}
function compareAnything(one, other, lookFor) {
const elementAName = one.toLowerCase();
const elementBName = other.toLowerCase();
const prefixCompare = compareByPrefix(one, other, lookFor);
if (prefixCompare) {
return prefixCompare;
}
const elementASuffixMatch = elementAName.endsWith(lookFor);
const elementBSuffixMatch = elementBName.endsWith(lookFor);
if (elementASuffixMatch !== elementBSuffixMatch) {
return elementASuffixMatch ? -1 : 1;
}
const r = compareFileNames(elementAName, elementBName);
if (r !== 0) {
return r;
}
return elementAName.localeCompare(elementBName);
}
function compareByPrefix(one, other, lookFor) {
const elementAName = one.toLowerCase();
const elementBName = other.toLowerCase();
const elementAPrefixMatch = elementAName.startsWith(lookFor);
const elementBPrefixMatch = elementBName.startsWith(lookFor);
if (elementAPrefixMatch !== elementBPrefixMatch) {
return elementAPrefixMatch ? -1 : 1;
}
else if (elementAPrefixMatch && elementBPrefixMatch) {
if (elementAName.length < elementBName.length) {
return -1;
}
if (elementAName.length > elementBName.length) {
return 1;
}
}
return 0;
}
const intlFileNameCollatorBaseNumeric = new lazy_1.Lazy(() => {
const collator = new Intl.Collator(undefined, { numeric: true, sensitivity: 'base' });
return {
collator,
collatorIsNumeric: collator.resolvedOptions().numeric,
};
});
function compareFileNames(one, other, caseSensitive = false) {
const a = one || '';
const b = other || '';
const result = intlFileNameCollatorBaseNumeric.value.collator.compare(a, b);
if (intlFileNameCollatorBaseNumeric.value.collatorIsNumeric && result === 0 && a !== b) {
return a < b ? -1 : 1;
}
return result;
}