Skip to content

Commit 2c6d01e

Browse files
committed
Add advanced options per search engine
Currently supports stripping the protocol and disabling url encoding (fixes #57)
1 parent db961d9 commit 2c6d01e

File tree

10 files changed

+127
-53
lines changed

10 files changed

+127
-53
lines changed

CHANGES.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
# Changelog
22

3+
## v4.3.0
4+
5+
- Add advanced options per search engine:
6+
- Do not encode image URL
7+
- Strip protocol from image URL
8+
39
## v4.2.1
410

511
- Fix browser check

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "reverse-image-search",
33
"description": "Reverse Image Search",
4-
"version": "4.2.1",
4+
"version": "4.3.0",
55
"author": "Brawl345",
66
"license": "Unlicense",
77
"repository": {

public/_locales/de/messages.json

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,12 @@
7575
}
7676
}
7777
},
78+
"doNotEncodeUrlLabel": {
79+
"message": "URL nicht enkodieren"
80+
},
81+
"stripProtocolLabel": {
82+
"message": "Protokoll aus Bilder-URL entfernen"
83+
},
7884
"restoreDefaultSearchProviders": {
7985
"message": "Standard wiederherstellen"
8086
},

public/_locales/en/messages.json

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,12 @@
7575
}
7676
}
7777
},
78+
"doNotEncodeUrlLabel": {
79+
"message": "Do not encode URL"
80+
},
81+
"stripProtocolLabel": {
82+
"message": "Remove protocol from image URL"
83+
},
7884
"restoreDefaultSearchProviders": {
7985
"message": "Restore default"
8086
},

public/manifest.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
"name": "__MSG_extensionName__",
55
"description": "__MSG_extensionDescription__",
66
"author": "Andreas Bielawski",
7-
"version": "4.2.1",
7+
"version": "4.3.0",
88
"icons": {
99
"16": "icons/16.png",
1010
"32": "icons/32.png",

source/options/components/Provider.svelte

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
<script lang="ts">
2-
import { fly } from 'svelte/transition';
2+
import { fly, slide } from 'svelte/transition';
33
import type { StorageProvider } from '../../types';
44
import { base64EncodeIcon, getMessage, isFirefox } from "../../utils";
55
import { options } from '../stores/options-store';
66
77
export let index: number;
88
export let provider: StorageProvider;
99
10+
let showAdvanced = false;
1011
let errorMsg: string | null = null;
1112
1213
const hideAlert = () => {
@@ -123,6 +124,14 @@
123124
pattern="https?:\/\/.*%s.*"
124125
bind:value={provider.url}
125126
/>
127+
<button
128+
class="btn btn-sm"
129+
class:btn-outline-secondary={!showAdvanced}
130+
class:btn-secondary={showAdvanced}
131+
type="button"
132+
on:click={() => showAdvanced = !showAdvanced}
133+
>⚙
134+
</button>
126135
<button
127136
class="btn btn-sm btn-outline-danger"
128137
type="button"
@@ -131,6 +140,28 @@
131140
</button>
132141
</fieldset>
133142

143+
<div class:mt-2={showAdvanced}>
144+
{#if showAdvanced}
145+
<div class="row" transition:slide>
146+
<div class="col">
147+
<div class="form-check form-check-inline">
148+
<label class="form-check-label">
149+
<input bind:checked={provider.doNotEncodeUrl} class="form-check-input" type="checkbox" name="doNotEncodeUrl">
150+
{getMessage('doNotEncodeUrlLabel')}
151+
</label>
152+
</div>
153+
154+
<div class="form-check form-check-inline">
155+
<label class="form-check-label">
156+
<input bind:checked={provider.stripProtocol} class="form-check-input" type="checkbox" name="stripProtocol">
157+
{getMessage('stripProtocolLabel')}
158+
</label>
159+
</div>
160+
</div>
161+
</div>
162+
{/if}
163+
</div>
164+
134165
{#if errorMsg !== null}
135166
<div class="row mt-3" transition:fly>
136167
<div class="col">

source/options/stores/options-store.ts

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { writable } from 'svelte/store';
2-
import { defaultOptions, getOptions } from '../../storage';
2+
import { defaultOptions, getOptions, newProvider } from '../../storage';
33
import type { Options, StorageProvider } from '../../types';
44
import { arraymove, getLowerIndex, getUpperIndex } from '../../utils.js';
55

@@ -16,16 +16,7 @@ const createStore = () => {
1616
addProvider: () =>
1717
update((previous) => ({
1818
...previous,
19-
storageProviders: [
20-
...previous.storageProviders,
21-
{
22-
i: previous.storageProviders.length,
23-
name: '',
24-
icon: 'icons/other.png',
25-
url: '',
26-
selected: true,
27-
},
28-
],
19+
storageProviders: [...previous.storageProviders, { ...newProvider }],
2920
})),
3021
removeProvider: (indexToRemove: number) =>
3122
update((previous) => ({

source/service-worker/service-worker-functions.ts

Lines changed: 44 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { getOptions } from '../storage';
2-
import type { CreatePropertiesWithIcon, Options } from '../types';
2+
import type { CreatePropertiesWithIcon } from '../types';
33
import { getMessage, isNullish } from '../utils';
44

55
const PARENT_ID = 'Image-Reverse-Search';
@@ -85,46 +85,53 @@ export const onReverseSearch: (
8585
return;
8686
}
8787

88-
const options = await getOptions();
88+
const { openTabAt, openInBackground, storageProviders } = await getOptions();
8989

90-
const providerUrls = [];
90+
const activeProviders = storageProviders.filter((provider) =>
91+
menuItemId === OPEN_ALL_ID
92+
? provider.selected
93+
: provider.name === menuItemId,
94+
);
9195

92-
if (menuItemId === 'openAll') {
93-
for (const provider of options.storageProviders) {
94-
if (provider.selected) {
95-
providerUrls.push(provider.url);
96-
}
96+
if (menuItemId === OPEN_ALL_ID) {
97+
// Reverse because we open them by tab index
98+
activeProviders.reverse();
99+
}
100+
101+
const newTabIndex = await (async () => {
102+
switch (openTabAt) {
103+
case 'right':
104+
return tab.index + 1;
105+
case 'left':
106+
return tab.index;
107+
default:
108+
return chrome.tabs
109+
.query({ currentWindow: true })
110+
.then((tabs) => tabs.length)
111+
.catch(() => tab.index);
97112
}
98-
/* Reverse because we open them by tab index */
99-
providerUrls.reverse();
100-
} else {
101-
for (const providerId of options.storageProviders) {
102-
if (providerId.name === menuItemId) {
103-
providerUrls.push(providerId.url);
113+
})();
114+
115+
await Promise.all(
116+
activeProviders.map((provider) => {
117+
let imgSrcUrl = srcUrl;
118+
if (provider.stripProtocol) {
119+
imgSrcUrl = imgSrcUrl.replace(/^https?:\/\//, '');
104120
}
105-
}
106-
}
107121

108-
let newTabIndex: number;
109-
110-
if (options.openTabAt === 'right') {
111-
newTabIndex = tab.index + 1;
112-
} else if (options.openTabAt === 'left') {
113-
newTabIndex = tab.index;
114-
} else {
115-
/* end */
116-
newTabIndex = await chrome.tabs
117-
.query({ currentWindow: true })
118-
.then((tabs) => tabs.length)
119-
.catch(() => tab.index);
120-
}
122+
let providerUrl = provider.url;
123+
if (!provider.doNotEncodeUrl) {
124+
providerUrl = providerUrl.replace('%s', encodeURIComponent(imgSrcUrl));
125+
} else {
126+
providerUrl = providerUrl.replace('%s', imgSrcUrl);
127+
}
121128

122-
for (const providerUrl of providerUrls) {
123-
void chrome.tabs.create({
124-
url: providerUrl.replace('%s', encodeURIComponent(srcUrl)),
125-
active: !options.openInBackground,
126-
index: newTabIndex,
127-
openerTabId: tab.id,
128-
});
129-
}
129+
return chrome.tabs.create({
130+
url: providerUrl,
131+
active: !openInBackground,
132+
index: newTabIndex,
133+
openerTabId: tab.id,
134+
});
135+
}),
136+
);
130137
};

source/storage.ts

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,13 @@
1-
import type { Options } from './types';
1+
import type { Options, StorageProvider } from './types';
2+
3+
export const newProvider: StorageProvider = {
4+
name: '',
5+
icon: 'icons/other.png',
6+
url: '',
7+
selected: true,
8+
doNotEncodeUrl: false,
9+
stripProtocol: false,
10+
};
211

312
export const defaultOptions: Options = Object.freeze({
413
openInBackground: false,
@@ -12,48 +21,64 @@ export const defaultOptions: Options = Object.freeze({
1221
icon: 'icons/google.png',
1322
url: 'https://lens.google.com/uploadbyurl?url=%s',
1423
selected: true,
24+
doNotEncodeUrl: false,
25+
stripProtocol: false,
1526
},
1627
{
1728
name: 'IQDB',
1829
icon: 'icons/iqdb.png',
1930
url: 'https://iqdb.org/?url=%s',
2031
selected: false,
32+
doNotEncodeUrl: false,
33+
stripProtocol: false,
2134
},
2235
{
2336
name: 'TinEye',
2437
icon: 'icons/tineye.png',
2538
url: 'https://www.tineye.com/search?url=%s',
2639
selected: false,
40+
doNotEncodeUrl: false,
41+
stripProtocol: false,
2742
},
2843
{
2944
name: 'Bing',
3045
icon: 'icons/bing.png',
3146
url: 'https://www.bing.com/images/searchbyimage?FORM=IRSBIQ&cbir=sbi&imgurl=%s',
3247
selected: false,
48+
doNotEncodeUrl: false,
49+
stripProtocol: false,
3350
},
3451
{
3552
name: 'Yandex',
3653
icon: 'icons/yandex.png',
3754
url: 'https://yandex.com/images/search?url=%s&rpt=imageview',
3855
selected: false,
56+
doNotEncodeUrl: false,
57+
stripProtocol: false,
3958
},
4059
{
4160
name: 'Яндекс',
4261
icon: 'icons/yandexru.png',
4362
url: 'https://yandex.ru/images/search?url=%s&rpt=imageview',
4463
selected: false,
64+
doNotEncodeUrl: false,
65+
stripProtocol: false,
4566
},
4667
{
4768
name: 'Baidu',
4869
icon: 'icons/baidu.png',
4970
url: 'https://image.baidu.com/n/pc_search?queryImageUrl=%s',
5071
selected: false,
72+
doNotEncodeUrl: false,
73+
stripProtocol: false,
5174
},
5275
{
5376
name: 'SauceNAO',
5477
icon: 'icons/saucenao.png',
5578
url: 'https://saucenao.com/search.php?db=999&url=%s',
5679
selected: false,
80+
doNotEncodeUrl: false,
81+
stripProtocol: false,
5782
},
5883
],
5984
});

source/types.d.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
1-
interface StorageProvider {
1+
export interface StorageProvider {
22
name: string;
33
icon: string;
44
url: string;
55
selected: boolean;
6+
stripProtocol: boolean;
7+
doNotEncodeUrl: boolean;
68
}
79

810
export interface Options {

0 commit comments

Comments
 (0)