UNPKG

codess

Version:

vscode代码片段管理器,通过 本地包(本地某个文件夹) 或官网的 远程包(代码片段集合) 生成本地项目的 vscode 代码片段配置。

105 lines (104 loc) 4.05 kB
"use strict"; 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; }