diff --git a/docs/configuration.md b/docs/configuration.md index c42b04d..d293d50 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -1264,11 +1264,12 @@ What now? [Bangs](https://duckduckgo.com/bangs). They're shortcuts that allow yo  ##### Properties for each bang -| Name | Type | Required | -| ---- | ---- | -------- | -| title | string | no | -| shortcut | string | yes | -| url | string | yes | +| Name | Type | Required | Default | +| ---- | ---- | -------- | ------- | +| title | string | no | | +| shortcut | string | yes | | +| url | string | yes | | +| regex | string | no | | ###### `title` Optional title that will appear on the right side of the search bar when the query starts with the associated shortcut. @@ -1292,6 +1293,41 @@ url: https://store.steampowered.com/search/?term={QUERY} url: https://www.amazon.com/s?k={QUERY} ``` +###### `regex` +Optional regular expression that extracts multiple values from the query. If provided, the regex is applied to the query after removing the bang shortcut. + +Example: + +```yaml +- title: Google Translate + shortcut: "!tl" + regex: "^(\\w+):(\\w+)\\s+(.+)$" + url: "https://translate.google.com/?sl={QUERY}&tl={QUERY}&text={QUERY}&op=translate" +``` + +Typing + +``` +!tl en:fr hello world +``` + +would result in final URL being + +``` +https://translate.google.com/?sl=en&tl=fr&text=hello%20world&op=translate +``` +and + +``` +!tl auto:en bonjour le monde +``` + +would result in final URL being + +``` +https://translate.google.com/?sl=auto&tl=en&text=bonjour%20le%20monde&op=translate +``` + ### Group Group multiple widgets into one using tabs. Widgets are defined using a `widgets` property exactly as you would on a page column. The only limitation is that you cannot place a group widget or a split column widget within a group widget. diff --git a/internal/glance/static/js/page.js b/internal/glance/static/js/page.js index 0212a4f..af6b4af 100644 --- a/internal/glance/static/js/page.js +++ b/internal/glance/static/js/page.js @@ -134,6 +134,14 @@ function setupSearchBoxes() { if (currentBang != null) { query = input.slice(currentBang.dataset.shortcut.length + 1); searchUrlTemplate = currentBang.dataset.url; + const regexString = currentBang.dataset.regex; + const match = regexString && query.match(new RegExp(regexString)); + if (match) { + query = match.at(-1); + match.slice(1, -1).forEach((m) => { + searchUrlTemplate = searchUrlTemplate.replace("!QUERY!", encodeURIComponent(m)); + }); + } } else { query = input; searchUrlTemplate = defaultSearchUrl; diff --git a/internal/glance/templates/search.html b/internal/glance/templates/search.html index ae981c6..7ee4b38 100644 --- a/internal/glance/templates/search.html +++ b/internal/glance/templates/search.html @@ -6,7 +6,7 @@