search: add prefix for app search

This commit is contained in:
end-4
2025-10-10 23:33:21 +02:00
parent 8541dd3178
commit fe19cea6c9
3 changed files with 50 additions and 14 deletions
@@ -315,6 +315,7 @@ Singleton {
property JsonObject prefix: JsonObject { property JsonObject prefix: JsonObject {
property bool showDefaultActionsWithoutPrefix: true property bool showDefaultActionsWithoutPrefix: true
property string action: "/" property string action: "/"
property string app: ">"
property string clipboard: ";" property string clipboard: ";"
property string emojis: ":" property string emojis: ":"
property string math: "=" property string math: "="
@@ -257,4 +257,32 @@ Singleton {
} }
return false; return false;
} }
/**
* Removes the given prefix from the string if present.
* @param { string } str
* @param { string } prefix
* @returns { string }
*/
function cleanPrefix(str, prefix) {
if (str.startsWith(prefix)) {
return str.slice(prefix.length);
}
return str;
}
/**
* Removes the first matching prefix from the string if present.
* @param { string } str
* @param { string[] } prefixes
* @returns { string }
*/
function cleanOnePrefix(str, prefixes) {
for (let i = 0; i < prefixes.length; ++i) {
if (str.startsWith(prefixes[i])) {
return str.slice(prefixes[i].length);
}
}
return str;
}
} }
@@ -327,7 +327,7 @@ Item { // Wrapper
///////////// Special cases /////////////// ///////////// Special cases ///////////////
if (root.searchingText.startsWith(Config.options.search.prefix.clipboard)) { if (root.searchingText.startsWith(Config.options.search.prefix.clipboard)) {
// Clipboard // Clipboard
const searchString = root.searchingText.slice(Config.options.search.prefix.clipboard.length); const searchString = StringUtils.cleanPrefix(root.searchingText, Config.options.search.prefix.clipboard);
return Cliphist.fuzzyQuery(searchString).map((entry, index, array) => { return Cliphist.fuzzyQuery(searchString).map((entry, index, array) => {
const mightBlurImage = Cliphist.entryIsImage(entry) && root.clipboardWorkSafetyActive; const mightBlurImage = Cliphist.entryIsImage(entry) && root.clipboardWorkSafetyActive;
let shouldBlurImage = mightBlurImage; let shouldBlurImage = mightBlurImage;
@@ -365,7 +365,7 @@ Item { // Wrapper
} }
else if (root.searchingText.startsWith(Config.options.search.prefix.emojis)) { else if (root.searchingText.startsWith(Config.options.search.prefix.emojis)) {
// Clipboard // Clipboard
const searchString = root.searchingText.slice(Config.options.search.prefix.emojis.length); const searchString = StringUtils.cleanPrefix(root.searchingText, Config.options.search.prefix.emojis);
return Emojis.fuzzyQuery(searchString).map(entry => { return Emojis.fuzzyQuery(searchString).map(entry => {
return { return {
cliphistRawString: entry, cliphistRawString: entry,
@@ -392,14 +392,20 @@ Item { // Wrapper
Quickshell.clipboardText = root.mathResult; Quickshell.clipboardText = root.mathResult;
} }
}; };
const appResultObjects = AppSearch.fuzzyQuery(StringUtils.cleanPrefix(root.searchingText, Config.options.search.prefix.app)).map(entry => {
entry.clickActionName = Translation.tr("Launch");
entry.type = Translation.tr("App");
return entry;
})
const commandResultObject = { const commandResultObject = {
name: searchingText.replace("file://", ""), name: StringUtils.cleanPrefix(root.searchingText, Config.options.search.prefix.shellCommand).replace("file://", ""),
clickActionName: Translation.tr("Run"), clickActionName: Translation.tr("Run"),
type: Translation.tr("Run command"), type: Translation.tr("Run command"),
fontType: "monospace", fontType: "monospace",
materialSymbol: 'terminal', materialSymbol: 'terminal',
execute: () => { execute: () => {
let cleanedCommand = root.searchingText.replace("file://", ""); let cleanedCommand = root.searchingText.replace("file://", "");
cleanedCommand = StringUtils.cleanPrefix(cleanedCommand, Config.options.search.prefix.shellCommand);
if (cleanedCommand.startsWith(Config.options.search.prefix.shellCommand)) { if (cleanedCommand.startsWith(Config.options.search.prefix.shellCommand)) {
cleanedCommand = cleanedCommand.slice(Config.options.search.prefix.shellCommand.length); cleanedCommand = cleanedCommand.slice(Config.options.search.prefix.shellCommand.length);
} }
@@ -407,15 +413,12 @@ Item { // Wrapper
} }
}; };
const webSearchResultObject = { const webSearchResultObject = {
name: root.searchingText, name: StringUtils.cleanPrefix(root.searchingText, Config.options.search.prefix.webSearch),
clickActionName: Translation.tr("Search"), clickActionName: Translation.tr("Search"),
type: Translation.tr("Search the web"), type: Translation.tr("Search the web"),
materialSymbol: 'travel_explore', materialSymbol: 'travel_explore',
execute: () => { execute: () => {
let query = root.searchingText; let query = StringUtils.cleanPrefix(root.searchingText, Config.options.search.prefix.webSearch);
if (query.startsWith(Config.options.search.prefix.webSearch)) {
query = query.slice(Config.options.search.prefix.webSearch.length);
}
let url = Config.options.search.engineBaseUrl + query; let url = Config.options.search.engineBaseUrl + query;
for (let site of Config.options.search.excludedSites) { for (let site of Config.options.search.excludedSites) {
url += ` -site:${site}`; url += ` -site:${site}`;
@@ -454,11 +457,7 @@ Item { // Wrapper
} }
//////////////// Apps ////////////////// //////////////// Apps //////////////////
result = result.concat(AppSearch.fuzzyQuery(root.searchingText).map(entry => { result = result.concat(appResultObjects);
entry.clickActionName = Translation.tr("Launch");
entry.type = Translation.tr("App");
return entry;
}));
////////// Launcher actions //////////// ////////// Launcher actions ////////////
result = result.concat(launcherActionObjects); result = result.concat(launcherActionObjects);
@@ -480,7 +479,15 @@ Item { // Wrapper
anchors.left: parent?.left anchors.left: parent?.left
anchors.right: parent?.right anchors.right: parent?.right
entry: modelData entry: modelData
query: root.searchingText.startsWith(Config.options.search.prefix.clipboard) ? root.searchingText.slice(Config.options.search.prefix.clipboard.length) : root.searchingText query: StringUtils.cleanOnePrefix(root.searchingText, [
Config.options.search.prefix.action,
Config.options.search.prefix.app,
Config.options.search.prefix.clipboard,
Config.options.search.prefix.emojis,
Config.options.search.prefix.math,
Config.options.search.prefix.shellCommand,
Config.options.search.prefix.webSearch
])
} }
} }
} }