arch/private_dot_config/DankMaterialShell/plugins/webSearch/WebSearch.qml
lew 809b12203c Add .config/DankMaterialShell/firefox.css
Add .config/DankMaterialShell/plugin_settings.json
Add .config/DankMaterialShell/plugins/calculator/CalculatorLauncher.qml
Add .config/DankMaterialShell/plugins/calculator/CalculatorSettings.qml
Add .config/DankMaterialShell/plugins/calculator/README.md
Add .config/DankMaterialShell/plugins/calculator/calculator.js
Add .config/DankMaterialShell/plugins/calculator/.git/HEAD
Add .config/DankMaterialShell/plugins/calculator/.git/config
Add .config/DankMaterialShell/plugins/calculator/.git/index
Add .config/DankMaterialShell/plugins/calculator/.git/objects/info/.keep
Add .config/DankMaterialShell/plugins/calculator/.git/objects/pack/pack-67f644835e660794f65c9273e46788b0c3da57cf.idx
Add .config/DankMaterialShell/plugins/calculator/.git/objects/pack/pack-67f644835e660794f65c9273e46788b0c3da57cf.rev
Add .config/DankMaterialShell/plugins/calculator/.git/objects/pack/pack-67f644835e660794f65c9273e46788b0c3da57cf.pack
Add .config/DankMaterialShell/plugins/calculator/.git/refs/heads/main
Add .config/DankMaterialShell/plugins/calculator/.git/refs/remotes/origin/main
Add .config/DankMaterialShell/plugins/calculator/.git/refs/remotes/origin/qalc
Add .config/DankMaterialShell/plugins/calculator/.git/refs/tags/.keep
Add .config/DankMaterialShell/plugins/calculator/plugin.json
Add .config/DankMaterialShell/plugins/calculator/screenshot.png
Add .config/DankMaterialShell/plugins/calculator/test_precision.js
Add .config/DankMaterialShell/plugins/calculator/test_single.js
Add .config/DankMaterialShell/plugins/commandRunner/CommandRunner.qml
Add .config/DankMaterialShell/plugins/commandRunner/CommandRunnerSettings.qml
Add .config/DankMaterialShell/plugins/commandRunner/LICENSE
Add .config/DankMaterialShell/plugins/commandRunner/README.md
Add .config/DankMaterialShell/plugins/commandRunner/.git/HEAD
Add .config/DankMaterialShell/plugins/commandRunner/.git/config
Add .config/DankMaterialShell/plugins/commandRunner/.git/index
Add .config/DankMaterialShell/plugins/commandRunner/.git/objects/info/.keep
Add .config/DankMaterialShell/plugins/commandRunner/.git/objects/pack/pack-5a720f795fd2994ef506cd867d86ca7df8a25a31.idx
Add .config/DankMaterialShell/plugins/commandRunner/.git/objects/pack/pack-5a720f795fd2994ef506cd867d86ca7df8a25a31.rev
Add .config/DankMaterialShell/plugins/commandRunner/.git/objects/pack/pack-5a720f795fd2994ef506cd867d86ca7df8a25a31.pack
Add .config/DankMaterialShell/plugins/commandRunner/.git/refs/heads/main
Add .config/DankMaterialShell/plugins/commandRunner/.git/refs/remotes/origin/main
Add .config/DankMaterialShell/plugins/commandRunner/.git/refs/tags/.keep
Add .config/DankMaterialShell/plugins/commandRunner/plugin.json
Add .config/DankMaterialShell/plugins/commandRunner/screenshot.png
Add .config/DankMaterialShell/plugins/dankActions.meta
Add .config/DankMaterialShell/plugins/.repos/0026f1eba8dedaec/DankActions/DankActionsSettings.qml
Add .config/DankMaterialShell/plugins/.repos/0026f1eba8dedaec/DankActions/DankActionsWidget.qml
Add .config/DankMaterialShell/plugins/.repos/0026f1eba8dedaec/DankActions/plugin.json
Add .config/DankMaterialShell/plugins/.repos/0026f1eba8dedaec/DankBatteryAlerts/DankBatteryAlerts.qml
Add .config/DankMaterialShell/plugins/.repos/0026f1eba8dedaec/DankBatteryAlerts/DankBatteryAlertsSettings.qml
Add .config/DankMaterialShell/plugins/.repos/0026f1eba8dedaec/DankBatteryAlerts/plugin.json
Add .config/DankMaterialShell/plugins/.repos/0026f1eba8dedaec/DankHooks/DankHooks.qml
Add .config/DankMaterialShell/plugins/.repos/0026f1eba8dedaec/DankHooks/DankHooksSettings.qml
Add .config/DankMaterialShell/plugins/.repos/0026f1eba8dedaec/DankHooks/README.md
Add .config/DankMaterialShell/plugins/.repos/0026f1eba8dedaec/DankHooks/plugin.json
Add .config/DankMaterialShell/plugins/.repos/0026f1eba8dedaec/DankPomodoroTimer/DankPomodoroSettings.qml
Add .config/DankMaterialShell/plugins/.repos/0026f1eba8dedaec/DankPomodoroTimer/DankPomodoroWidget.qml
Add .config/DankMaterialShell/plugins/.repos/0026f1eba8dedaec/DankPomodoroTimer/plugin.json
Add .config/DankMaterialShell/plugins/.repos/0026f1eba8dedaec/LICENSE
Add .config/DankMaterialShell/plugins/.repos/0026f1eba8dedaec/README.md
Add .config/DankMaterialShell/plugins/.repos/0026f1eba8dedaec/.git/HEAD
Add .config/DankMaterialShell/plugins/.repos/0026f1eba8dedaec/.git/config
Add .config/DankMaterialShell/plugins/.repos/0026f1eba8dedaec/.git/index
Add .config/DankMaterialShell/plugins/.repos/0026f1eba8dedaec/.git/objects/info/.keep
Add .config/DankMaterialShell/plugins/.repos/0026f1eba8dedaec/.git/objects/pack/pack-3221a15c022ef4a7bb6bf2c47e40068b66b3588b.idx
Add .config/DankMaterialShell/plugins/.repos/0026f1eba8dedaec/.git/objects/pack/pack-3221a15c022ef4a7bb6bf2c47e40068b66b3588b.rev
Add .config/DankMaterialShell/plugins/.repos/0026f1eba8dedaec/.git/objects/pack/pack-3221a15c022ef4a7bb6bf2c47e40068b66b3588b.pack
Add .config/DankMaterialShell/plugins/.repos/0026f1eba8dedaec/.git/refs/heads/master
Add .config/DankMaterialShell/plugins/.repos/0026f1eba8dedaec/.git/refs/remotes/origin/master
Add .config/DankMaterialShell/plugins/.repos/0026f1eba8dedaec/.git/refs/tags/.keep
Add .config/DankMaterialShell/plugins/.repos/0026f1eba8dedaec/.gitignore
Add .config/DankMaterialShell/plugins/emojiLauncher/EmojiLauncher.qml
Add .config/DankMaterialShell/plugins/emojiLauncher/EmojiLauncherSettings.qml
Add .config/DankMaterialShell/plugins/emojiLauncher/LICENSE
Add .config/DankMaterialShell/plugins/emojiLauncher/README.md
Add .config/DankMaterialShell/plugins/emojiLauncher/catalog.js
Add .config/DankMaterialShell/plugins/emojiLauncher/data/emojis.txt
Add .config/DankMaterialShell/plugins/emojiLauncher/data/math.txt
Add .config/DankMaterialShell/plugins/emojiLauncher/data/nerdfont.txt
Add .config/DankMaterialShell/plugins/emojiLauncher/.git/HEAD
Add .config/DankMaterialShell/plugins/emojiLauncher/.git/config
Add .config/DankMaterialShell/plugins/emojiLauncher/.git/index
Add .config/DankMaterialShell/plugins/emojiLauncher/.git/objects/info/.keep
Add .config/DankMaterialShell/plugins/emojiLauncher/.git/objects/pack/pack-e04a5b1ea381dc3a792b8bf08cf70e735b195c0d.idx
Add .config/DankMaterialShell/plugins/emojiLauncher/.git/objects/pack/pack-e04a5b1ea381dc3a792b8bf08cf70e735b195c0d.rev
Add .config/DankMaterialShell/plugins/emojiLauncher/.git/objects/pack/pack-e04a5b1ea381dc3a792b8bf08cf70e735b195c0d.pack
Add .config/DankMaterialShell/plugins/emojiLauncher/.git/refs/heads/main
Add .config/DankMaterialShell/plugins/emojiLauncher/.git/refs/remotes/origin/main
Add .config/DankMaterialShell/plugins/emojiLauncher/.git/refs/tags/.keep
Add .config/DankMaterialShell/plugins/emojiLauncher/plugin.json
Add .config/DankMaterialShell/plugins/emojiLauncher/screenshot.png
Add .config/DankMaterialShell/plugins/emojiLauncher/scripts/generate_catalog.py
Add .config/DankMaterialShell/plugins/dankActions
Add .config/DankMaterialShell/plugins/webSearch/LICENSE
Add .config/DankMaterialShell/plugins/webSearch/README.md
Add .config/DankMaterialShell/plugins/webSearch/WebSearch.qml
Add .config/DankMaterialShell/plugins/webSearch/WebSearchSettings.qml
Add .config/DankMaterialShell/plugins/webSearch/.git/HEAD
Add .config/DankMaterialShell/plugins/webSearch/.git/config
Add .config/DankMaterialShell/plugins/webSearch/.git/index
Add .config/DankMaterialShell/plugins/webSearch/.git/objects/info/.keep
Add .config/DankMaterialShell/plugins/webSearch/.git/objects/pack/pack-6a60c736f418e5b4b1f0505f66c1e2a371d46fed.idx
Add .config/DankMaterialShell/plugins/webSearch/.git/objects/pack/pack-6a60c736f418e5b4b1f0505f66c1e2a371d46fed.rev
Add .config/DankMaterialShell/plugins/webSearch/.git/objects/pack/pack-6a60c736f418e5b4b1f0505f66c1e2a371d46fed.pack
Add .config/DankMaterialShell/plugins/webSearch/.git/refs/heads/main
Add .config/DankMaterialShell/plugins/webSearch/.git/refs/remotes/origin/main
Add .config/DankMaterialShell/plugins/webSearch/.git/refs/tags/.keep
Add .config/DankMaterialShell/plugins/webSearch/plugin.json
Add .config/DankMaterialShell/plugins/webSearch/screenshot.png
Add .config/DankMaterialShell/settings.json
2025-12-12 05:12:42 +00:00

352 lines
11 KiB
QML

import QtQuick
import Quickshell
import qs.Services
Item {
id: root
property var pluginService: null
property string trigger: "?"
property var searchEngines: []
property string defaultEngine: "google"
signal itemsChanged()
property var builtInEngines: [
{
id: "google",
name: "Google",
icon: "material:travel_explore",
url: "https://www.google.com/search?q=%s",
keywords: ["google", "search"]
},
{
id: "duckduckgo",
name: "DuckDuckGo",
icon: "material:shield",
url: "https://duckduckgo.com/?q=%s",
keywords: ["ddg", "duckduckgo", "privacy"]
},
{
id: "brave",
name: "Brave Search",
icon: "material:security",
url: "https://search.brave.com/search?q=%s",
keywords: ["brave", "privacy"]
},
{
id: "bing",
name: "Bing",
icon: "material:language",
url: "https://www.bing.com/search?q=%s",
keywords: ["bing", "microsoft"]
},
{
id: "youtube",
name: "YouTube",
icon: "material:youtube_activity",
url: "https://www.youtube.com/results?search_query=%s",
keywords: ["youtube", "video", "yt"]
},
{
id: "github",
name: "GitHub",
icon: "unicode:",
url: "https://github.com/search?q=%s",
keywords: ["github", "code", "git"]
},
{
id: "stackoverflow",
name: "Stack Overflow",
icon: "unicode:",
url: "https://stackoverflow.com/search?q=%s",
keywords: ["stackoverflow", "stack", "coding"]
},
{
id: "reddit",
name: "Reddit",
icon: "unicode:",
url: "https://www.reddit.com/search?q=%s",
keywords: ["reddit"]
},
{
id: "wikipedia",
name: "Wikipedia",
icon: "material:menu_book",
url: "https://en.wikipedia.org/wiki/Special:Search?search=%s",
keywords: ["wikipedia", "wiki"]
},
{
id: "amazon",
name: "Amazon",
icon: "material:shopping_cart",
url: "https://www.amazon.com/s?k=%s",
keywords: ["amazon", "shop", "shopping"]
},
{
id: "ebay",
name: "eBay",
icon: "material:local_mall",
url: "https://www.ebay.com/sch/i.html?_nkw=%s",
keywords: ["ebay", "shop", "auction"]
},
{
id: "maps",
name: "Google Maps",
icon: "material:map",
url: "https://www.google.com/maps/search/%s",
keywords: ["maps", "location", "directions"]
},
{
id: "images",
name: "Google Images",
icon: "material:photo_library",
url: "https://www.google.com/search?tbm=isch&q=%s",
keywords: ["images", "pictures", "photos"]
},
{
id: "twitter",
name: "Twitter/X",
icon: "unicode:",
url: "https://twitter.com/search?q=%s",
keywords: ["twitter", "x", "social"]
},
{
id: "linkedin",
name: "LinkedIn",
icon: "unicode:",
url: "https://www.linkedin.com/search/results/all/?keywords=%s",
keywords: ["linkedin", "job", "professional"]
},
{
id: "imdb",
name: "IMDb",
icon: "unicode:",
url: "https://www.imdb.com/find?q=%s",
keywords: ["imdb", "movies", "tv"]
},
{
id: "translate",
name: "Google Translate",
icon: "material:g_translate",
url: "https://translate.google.com/?text=%s",
keywords: ["translate", "translation"]
},
{
id: "archlinux",
name: "Arch Linux Wiki",
icon: "material:terminal",
url: "https://wiki.archlinux.org/index.php?search=%s",
keywords: ["arch", "linux", "packages"]
},
{
id: "aur",
name: "AUR",
icon: "unicode:",
url: "https://aur.archlinux.org/packages?K=%s",
keywords: ["aur", "arch", "packages"]
},
{
id: "npmjs",
name: "npm",
icon: "unicode:",
url: "https://www.npmjs.com/search?q=%s",
keywords: ["npm", "node", "javascript"]
},
{
id: "pypi",
name: "PyPI",
icon: "unicode:",
url: "https://pypi.org/search/?q=%s",
keywords: ["pypi", "python", "pip"]
},
{
id: "crates",
name: "crates.io",
icon: "material:inventory_2",
url: "https://crates.io/search?q=%s",
keywords: ["crates", "rust", "cargo"]
},
{
id: "mdn",
name: "MDN Web Docs",
icon: "material:code_blocks",
url: "https://developer.mozilla.org/en-US/search?q=%s",
keywords: ["mdn", "mozilla", "web", "docs"]
}
]
Component.onCompleted: {
loadSettings()
}
onPluginServiceChanged: {
if (pluginService) {
loadSettings()
}
}
function loadSettings() {
if (pluginService) {
trigger = pluginService.loadPluginData("webSearch", "trigger", "?")
defaultEngine = pluginService.loadPluginData("webSearch", "defaultEngine", "google")
searchEngines = pluginService.loadPluginData("webSearch", "searchEngines", [])
}
}
function getItems(query) {
const items = []
const allEngines = builtInEngines.concat(searchEngines)
if (!query || query.trim().length === 0) {
items.push({
name: "Type a search query",
icon: "unicode:🔍",
comment: "Search the web with your default engine (" + getEngineName(defaultEngine) + ")",
action: "noop",
categories: ["Web Search"]
})
for (let i = 0; i < allEngines.length; i++) {
const engine = allEngines[i]
items.push({
name: engine.name,
icon: engine.icon || "unicode:🔍",
comment: engine.keywords ? engine.keywords.join(", ") : "Search engine",
action: "noop",
categories: ["Web Search"]
})
}
return items
}
let matchedEngineId = null
let searchQuery = query.trim()
let fallbackQuery = query.trim()
for (let i = 0; i < allEngines.length; i++) {
const engine = allEngines[i]
if (engine.keywords) {
for (let k = 0; k < engine.keywords.length; k++) {
const keyword = engine.keywords[k]
if (searchQuery.toLowerCase().startsWith(keyword + " ")) {
matchedEngineId = engine.id
searchQuery = searchQuery.substring(keyword.length + 1).trim()
break
}
}
if (matchedEngineId) break
}
}
const primaryEngineId = matchedEngineId || defaultEngine
const primaryEngineObj = allEngines.find(e => e.id === primaryEngineId)
if (primaryEngineObj) {
items.push({
name: "Search with " + primaryEngineObj.name + ": " + searchQuery,
icon: primaryEngineObj.icon || "unicode:🔍",
comment: "Open in browser",
action: "search:" + primaryEngineId + ":" + searchQuery,
categories: ["Web Search"]
})
}
for (let i = 0; i < allEngines.length; i++) {
const engine = allEngines[i]
if (engine.id !== primaryEngineId) {
items.push({
name: "Search with " + engine.name + ": " + (matchedEngineId ? fallbackQuery : searchQuery),
icon: engine.icon || "material:search",
comment: "Open in browser",
action: "search:" + engine.id + ":" + (matchedEngineId ? fallbackQuery : searchQuery),
categories: ["Web Search"]
})
}
}
return items
}
function executeItem(item) {
if (!item || !item.action) {
console.warn("WebSearch: Invalid item or action")
return
}
console.log("WebSearch: Executing item:", item.name, "with action:", item.action)
const actionParts = item.action.split(":")
const actionType = actionParts[0]
switch (actionType) {
case "noop":
return
case "search":
performSearch(actionParts)
break
default:
console.warn("WebSearch: Unknown action type:", actionType)
showToast("Unknown action: " + actionType)
}
}
function performSearch(actionParts) {
const engineId = actionParts[1]
const query = actionParts.slice(2).join(":")
const allEngines = builtInEngines.concat(searchEngines)
const engine = allEngines.find(e => e.id === engineId)
if (engine) {
const encodedQuery = encodeQuery(query)
const url = engine.url.replace("%s", encodedQuery)
Quickshell.execDetached(["xdg-open", url])
showToast("Searching " + engine.name + " for: " + query)
} else {
console.warn("WebSearch: Engine not found:", engineId)
showToast("Search engine not found: " + engineId)
}
}
function showToast(message) {
if (typeof ToastService !== "undefined") {
ToastService.showInfo("Web Search", message)
} else {
console.log("WebSearch Toast:", message)
}
}
function getEngineName(engineId) {
const allEngines = builtInEngines.concat(searchEngines)
const engine = allEngines.find(e => e.id === engineId)
return engine ? engine.name : "Unknown"
}
function encodeQuery(str) {
return str.replace(/ /g, "+")
}
onTriggerChanged: {
if (pluginService) {
pluginService.savePluginData("webSearch", "trigger", trigger)
}
itemsChanged()
}
onDefaultEngineChanged: {
if (pluginService) {
pluginService.savePluginData("webSearch", "defaultEngine", defaultEngine)
}
itemsChanged()
}
onSearchEnginesChanged: {
if (pluginService) {
pluginService.savePluginData("webSearch", "searchEngines", searchEngines)
}
itemsChanged()
}
}