From 996268e6b3b851fdf68b31cacd66a5e43d4a0eee Mon Sep 17 00:00:00 2001 From: LenAnderson Date: Thu, 20 Jun 2024 09:12:43 -0400 Subject: [PATCH] add matchProvider and valueProvider to autocomplete options --- public/scripts/autocomplete/AutoComplete.js | 12 +++++++++--- public/scripts/autocomplete/AutoCompleteOption.js | 6 +++++- .../SlashCommandEnumAutoCompleteOption.js | 2 +- .../scripts/slash-commands/SlashCommandEnumValue.js | 9 ++++++++- 4 files changed, 23 insertions(+), 6 deletions(-) diff --git a/public/scripts/autocomplete/AutoComplete.js b/public/scripts/autocomplete/AutoComplete.js index 1d3da947f..34d1a452e 100644 --- a/public/scripts/autocomplete/AutoComplete.js +++ b/public/scripts/autocomplete/AutoComplete.js @@ -194,6 +194,11 @@ export class AutoComplete { * @returns The option. */ fuzzyScore(option) { + // might have been matched by the options matchProvider function instead + if (!this.fuzzyRegex.test(option.name)) { + option.score = new AutoCompleteFuzzyScore(Number.MAX_SAFE_INTEGER, -1); + return option; + } const parts = this.fuzzyRegex.exec(option.name).slice(1, -1); let start = null; let consecutive = []; @@ -344,7 +349,7 @@ export class AutoComplete { this.result = this.effectiveParserResult.optionList // filter the list of options by the partial name according to the matching type - .filter(it => this.isReplaceable || it.name == '' ? matchers[this.matchType](it.name) : it.name.toLowerCase() == this.name) + .filter(it => this.isReplaceable || it.name == '' ? (it.matchProvider ? it.matchProvider(this.name) : matchers[this.matchType](it.name)) : it.name.toLowerCase() == this.name) // remove aliases .filter((it,idx,list) => list.findIndex(opt=>opt.value == it.value) == idx); @@ -362,10 +367,11 @@ export class AutoComplete { // build element option.dom = this.makeItem(option); // update replacer and add quotes if necessary + const optionName = option.valueProvider ? option.valueProvider(this.name) : option.name; if (this.effectiveParserResult.canBeQuoted) { - option.replacer = option.name.includes(' ') || this.startQuote || this.endQuote ? `"${option.name}"` : `${option.name}`; + option.replacer = optionName.includes(' ') || this.startQuote || this.endQuote ? `"${optionName}"` : `${optionName}`; } else { - option.replacer = option.name; + option.replacer = optionName; } // calculate fuzzy score if matching is fuzzy if (this.matchType == 'fuzzy') this.fuzzyScore(option); diff --git a/public/scripts/autocomplete/AutoCompleteOption.js b/public/scripts/autocomplete/AutoCompleteOption.js index 7a12d74b2..e371b0951 100644 --- a/public/scripts/autocomplete/AutoCompleteOption.js +++ b/public/scripts/autocomplete/AutoCompleteOption.js @@ -11,6 +11,8 @@ export class AutoCompleteOption { /**@type {AutoCompleteFuzzyScore}*/ score; /**@type {string}*/ replacer; /**@type {HTMLElement}*/ dom; + /**@type {(input:string)=>boolean}*/ matchProvider; + /**@type {(input:string)=>string}*/ valueProvider; /** @@ -25,10 +27,12 @@ export class AutoCompleteOption { /** * @param {string} name */ - constructor(name, typeIcon = ' ', type = '') { + constructor(name, typeIcon = ' ', type = '', matchProvider = null, valueProvider = null) { this.name = name; this.typeIcon = typeIcon; this.type = type; + this.matchProvider = matchProvider; + this.valueProvider = valueProvider; } diff --git a/public/scripts/slash-commands/SlashCommandEnumAutoCompleteOption.js b/public/scripts/slash-commands/SlashCommandEnumAutoCompleteOption.js index 748454b11..fe387e8ca 100644 --- a/public/scripts/slash-commands/SlashCommandEnumAutoCompleteOption.js +++ b/public/scripts/slash-commands/SlashCommandEnumAutoCompleteOption.js @@ -13,7 +13,7 @@ export class SlashCommandEnumAutoCompleteOption extends AutoCompleteOption { * @param {SlashCommandEnumValue} enumValue */ constructor(cmd, enumValue) { - super(enumValue.value, enumValue.typeIcon, enumValue.type); + super(enumValue.value, enumValue.typeIcon, enumValue.type, enumValue.matchProvider, enumValue.valueProvider); this.cmd = cmd; this.enumValue = enumValue; } diff --git a/public/scripts/slash-commands/SlashCommandEnumValue.js b/public/scripts/slash-commands/SlashCommandEnumValue.js index 1fa610c56..dd658069a 100644 --- a/public/scripts/slash-commands/SlashCommandEnumValue.js +++ b/public/scripts/slash-commands/SlashCommandEnumValue.js @@ -1,14 +1,21 @@ +import { SlashCommandExecutor } from './SlashCommandExecutor.js'; +import { SlashCommandScope } from './SlashCommandScope.js'; + export class SlashCommandEnumValue { /**@type {string}*/ value; /**@type {string}*/ description; /**@type {string}*/ type = 'enum'; /**@type {string}*/ typeIcon = '◊'; + /**@type {(input:string)=>boolean}*/ matchProvider; + /**@type {(input:string)=>string}*/ valueProvider; - constructor(value, description = null, type = 'enum', typeIcon = '◊') { + constructor(value, description = null, type = 'enum', typeIcon = '◊', matchProvider, valueProvider) { this.value = value; this.description = description; this.type = type; this.typeIcon = typeIcon; + this.matchProvider = matchProvider; + this.valueProvider = valueProvider; } toString() {