diff options
author | silverwind <me@silverwind.io> | 2024-07-07 17:32:30 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-07-07 15:32:30 +0000 |
commit | 5791a73e75b630db3cade3e606c45eb8d8a641cb (patch) | |
tree | 3042132ac6f486723ff2ae42245a5b8a09d98c72 /web_src/js/utils/match.ts | |
parent | 5115c278ff8f3f8beebb172ce20a939a10476dfd (diff) | |
download | gitea-5791a73e75b630db3cade3e606c45eb8d8a641cb.tar.gz gitea-5791a73e75b630db3cade3e606c45eb8d8a641cb.zip |
Convert frontend code to typescript (#31559)
None of the frontend js/ts files was touched besides these two commands
(edit: no longer true, I touched one file in
https://github.com/go-gitea/gitea/pull/31559/commits/61105d0618e285d97e95044bfb64415f364a4526
because of a deprecation that was not showing before the rename).
`tsc` currently reports 778 errors, so I have disabled it in CI as
planned.
Everything appears to work fine.
Diffstat (limited to 'web_src/js/utils/match.ts')
-rw-r--r-- | web_src/js/utils/match.ts | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/web_src/js/utils/match.ts b/web_src/js/utils/match.ts new file mode 100644 index 0000000000..17fdfed113 --- /dev/null +++ b/web_src/js/utils/match.ts @@ -0,0 +1,43 @@ +import emojis from '../../../assets/emoji.json'; + +const maxMatches = 6; + +function sortAndReduce(map) { + const sortedMap = new Map(Array.from(map.entries()).sort((a, b) => a[1] - b[1])); + return Array.from(sortedMap.keys()).slice(0, maxMatches); +} + +export function matchEmoji(queryText) { + const query = queryText.toLowerCase().replaceAll('_', ' '); + if (!query) return emojis.slice(0, maxMatches).map((e) => e.aliases[0]); + + // results is a map of weights, lower is better + const results = new Map(); + for (const {aliases} of emojis) { + const mainAlias = aliases[0]; + for (const [aliasIndex, alias] of aliases.entries()) { + const index = alias.replaceAll('_', ' ').indexOf(query); + if (index === -1) continue; + const existing = results.get(mainAlias); + const rankedIndex = index + aliasIndex; + results.set(mainAlias, existing ? existing - rankedIndex : rankedIndex); + } + } + + return sortAndReduce(results); +} + +export function matchMention(queryText) { + const query = queryText.toLowerCase(); + + // results is a map of weights, lower is better + const results = new Map(); + for (const obj of window.config.mentionValues ?? []) { + const index = obj.key.toLowerCase().indexOf(query); + if (index === -1) continue; + const existing = results.get(obj); + results.set(obj, existing ? existing - index : index); + } + + return sortAndReduce(results); +} |