pragma Singleton pragma ComponentBehavior: Bound import "root:/modules/common/functions/fuzzysort.js" as Fuzzy import "root:/modules/common/functions/levendist.js" as Levendist import "root:/modules/common" import QtQuick import Quickshell import Quickshell.Io /** * Emojis. */ Singleton { id: root property string emojiScriptPath: `${Directories.config}/hypr/hyprland/scripts/fuzzel-emoji.sh` property string lineBeforeData: "### DATA ###" property list list readonly property var preparedEntries: list.map(a => ({ name: Fuzzy.prepare(`${a}`), entry: a })) function fuzzyQuery(search: string): var { if (root.sloppySearch) { const results = entries.slice(0, 100).map(str => ({ entry: str, score: Levendist.computeTextMatchScore(str.toLowerCase(), search.toLowerCase()) })).filter(item => item.score > root.scoreThreshold) .sort((a, b) => b.score - a.score) return results .map(item => item.entry) } return Fuzzy.go(search, preparedEntries, { all: true, key: "name" }).map(r => { return r.obj.entry }); } function load() { emojiFileView.reload() } function updateEmojis(fileContent) { const lines = fileContent.split("\n") const dataIndex = lines.indexOf(root.lineBeforeData) if (dataIndex === -1) { console.warn("No data section found in emoji script file.") return } const emojis = lines.slice(dataIndex + 1).filter(line => line.trim() !== "") root.list = emojis.map(line => line.trim()) } FileView { id: emojiFileView path: Qt.resolvedUrl(root.emojiScriptPath) onLoadedChanged: { const fileContent = emojiFileView.text() root.updateEmojis(fileContent) } } }