Adding new search filtering experience

For search engines, non-indie wiki results are now disabled, and a button to the indie wiki is inserted above it. The option to completely hide non-indie results is still available as an option.
pull/271/head
Kevin Payravi 2023-10-16 01:47:02 -04:00
parent 67dab25f83
commit 7c091198ca
8 changed files with 351 additions and 226 deletions

View File

@ -68,13 +68,11 @@ function insertCSS() {
color: white !important; color: white !important;
mix-blend-mode: difference !important; mix-blend-mode: difference !important;
} }
.iwb-notice a { .iwb-notice a {
text-decoration: underline !important; text-decoration: underline !important;
color: white !important; color: white !important;
mix-blend-mode: difference !important; mix-blend-mode: difference !important;
} }
.iwb-notice button { .iwb-notice button {
cursor: pointer !important; cursor: pointer !important;
display: inline-block !important; display: inline-block !important;
@ -88,17 +86,64 @@ function insertCSS() {
mix-blend-mode: difference !important; mix-blend-mode: difference !important;
text-align: left !important; text-align: left !important;
} }
.iwb-hide { .iwb-hide {
display: none !important; display: none !important;
} }
.iwb-show { .iwb-show {
display: block !important; display: block !important;
} }
.iwb-notice button:hover { .iwb-notice button:hover {
outline: 1px solid !important; outline: 1px solid !important;
} }
.iwb-new-link {
display: inline-block;
font-size: 12px !important;
text-decoration: none;
padding-left: 5px;
position: relative;
}
.iwb-new-link:hover {
text-decoration: none;
z-index: 9999999;
}
.iwb-new-link button {
cursor: pointer;
color: white;
background: #005799;
border: 0px solid #fff;
border-radius: 10px;
padding: 5px 10px;
margin: .5em 0 .2em 0;
font-size: 1.2em;
width: fit-content;
}
.iwb-new-link button:hover {
background: #00467a;
}
.iwb-new-link button * {
vertical-align: middle;
}
.iwb-new-link div:first-of-type {
display: inline-block;
background: white;
border-radius: 16px;
margin-right: 10px;
width: fit-content;
height: fit-content;
line-height: 12px;
padding: 5px;
}
.iwb-new-link img {
width: 12px;
}
.iwb-disavow > *:not(.iwb-new-link) {
opacity: 60%;
pointer-events: none;
cursor: default;
}
.iwb-disavow > a:not(.iwb-new-link), .iwb-disavow > *:not(.iwb-new-link) a, .iwb-disavow > *:not(.iwb-new-link) a * {
text-decoration: line-through !important;
}
` `
style = document.createElement('style'); style = document.createElement('style');
style.textContent = styleString; style.textContent = styleString;
@ -116,6 +161,188 @@ function escapeRegex(string) {
return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
} }
function redirectSearchResults(searchResultContainer, site, link) {
let countFiltered = 0;
// Build new URL:
let article = link.split(site['origin_base_url'] + site['origin_content_path'])[1]?.split('#')[0].split('?')[0].split('&')[0];
let newURL = '';
if (article) {
let searchParams = '';
switch (site['destination_platform']) {
case 'mediawiki':
searchParams = 'Special:Search/' + site['destination_content_prefix'] + article;
break;
case 'doku':
searchParams = 'start?do=search&q=' + article;
break;
}
newURL = 'https://' + site["destination_base_url"] + site["destination_content_path"] + searchParams;
} else {
newURL = 'https://' + site["destination_base_url"];
}
if (searchResultContainer && !searchResultContainer.classList.contains('iwb-detected')) {
searchResultContainer.classList.add('iwb-detected');
var indieResultLink = document.createElement('a');
indieResultLink.href = newURL;
indieResultLink.classList.add('iwb-new-link');
var indieResultButton = document.createElement('button');
var indieResultFaviconContainer = document.createElement('div');
var indieResultFavicon = document.createElement('img');
indieResultFavicon.alt = '';
indieResultFavicon.width = '12';
indieResultFavicon.height = '12';
indieResultFavicon.src = chrome.runtime.getURL('favicons/' + site.lang.toLowerCase() + '/' + site.destination_icon);
indieResultFaviconContainer.append(indieResultFavicon);
var indieResultText = document.createElement('span');
if (article) {
indieResultText.innerText = 'Look up "' + decodeURIComponent(decodeURIComponent(article.replaceAll('_', ' '))) + '" on ' + site.destination;
} else {
indieResultText.innerText = 'Visit ' + site.destination + ' instead';
}
indieResultButton.append(indieResultFaviconContainer);
indieResultButton.append(indieResultText);
indieResultLink.appendChild(indieResultButton);
searchResultContainer.prepend(indieResultLink);
searchResultContainer.classList.add('iwb-disavow');
countFiltered++;
}
return countFiltered;
}
function hideSearchResults(searchResultContainer, searchEngine, site) {
let countFiltered = 0;
// Insert search result removal notice
if (!filteredWikis.includes(site.lang + ' ' + site.origin_group)) {
filteredWikis.push(site.lang + ' ' + site.origin_group);
let elementId = stringToId(site.lang + '-' + site.origin_group);
hiddenWikisRevealed[elementId] = false;
let searchRemovalNotice = document.createElement('aside');
searchRemovalNotice.id = 'iwb-notice-' + elementId;
searchRemovalNotice.classList.add('iwb-notice');
let searchRemovalNoticeLink = document.createElement('a');
searchRemovalNoticeLink.href = 'https://' + site.destination_base_url;
searchRemovalNoticeLink.textContent = site.destination;
searchRemovalNoticePretext = document.createTextNode('Indie Wiki Buddy has filtered out results from ' + site.origin_group + (site.lang !== 'EN' ? ' (' + site.lang + ')' : '') + '. Look for results from ');
searchRemovalNoticePosttext = document.createTextNode(' instead!');
linebreak = document.createElement("br");
searchRemovalNotice.appendChild(searchRemovalNoticePretext);
searchRemovalNotice.appendChild(searchRemovalNoticeLink);
searchRemovalNotice.appendChild(searchRemovalNoticePosttext);
searchRemovalNotice.appendChild(linebreak);
// Output "show results" button
let showResultsButton = document.createElement('button');
showResultsButton.classList.add('iwb-show-results-button');
showResultsButton.setAttribute('data-group', 'iwb-search-result-' + elementId);
showResultsButton.textContent = 'Show filtered results';
searchRemovalNotice.appendChild(showResultsButton);
showResultsButton.onclick = function (e) {
if (e.target.textContent.includes('Show')) {
e.target.textContent = 'Re-hide filtered results';
hiddenWikisRevealed[elementId] = true;
const selector = e.currentTarget.dataset.group;
document.querySelectorAll('.' + selector).forEach(el => {
el.classList.add('iwb-show');
})
} else {
e.target.textContent = 'Show filtered results';
hiddenWikisRevealed[elementId] = false;
const selector = e.currentTarget.dataset.group;
document.querySelectorAll('.' + selector).forEach(el => {
el.classList.remove('iwb-show');
})
}
}
// Output "disable filtering" button
let disableFilterButton = document.createElement('button');
disableFilterButton.classList.add('iwb-disable-filtering-button');
disableFilterButton.textContent = 'Stop filtering ' + site.origin_group + ' in future searches';
disableFilterButton.style.border = '1px solid';
searchRemovalNotice.appendChild(disableFilterButton);
disableFilterButton.onclick = function (e) {
if (e.target.textContent.includes('Stop')) {
chrome.storage.sync.get({ 'siteSettings': {} }, function (response) {
response.siteSettings.get(site.id).set('searchFilter', 'false');
chrome.storage.sync.set({ 'siteSettings': response.siteSettings });
e.target.textContent = 'Re-enable filtering for ' + site.origin_group;
})
} else {
chrome.storage.sync.get({ 'siteSettings': {} }, function (response) {
response.siteSettings.get(site.id).set('searchFilter', 'true');
chrome.storage.sync.set({ 'siteSettings': response.siteSettings });
e.target.textContent = 'Stop filtering ' + site.origin_group + ' in future searches';
})
}
}
switch (searchEngine) {
case 'google':
if (document.querySelector('#search')) {
document.querySelector('#search').prepend(searchRemovalNotice);
} else if (document.querySelector('#topstuff')) {
document.querySelector('#topstuff').prepend(searchRemovalNotice);
} else if (document.querySelector('#main')) {
var el = document.querySelector('#main');
if (el.querySelector('#main > div[data-hveid]')) {
el.insertBefore(searchRemovalNotice, el.querySelector('div[data-hveid]'));
} else {
el.insertBefore(searchRemovalNotice, el.querySelector('div div[data-hveid]').parentElement);
}
};
break;
case 'bing':
var li = document.createElement('li');
li.appendChild(searchRemovalNotice);
document.querySelector('#b_results').prepend(li);
break;
case 'duckduckgo':
if (document.getElementById('web_content_wrapper')) {
var li = document.createElement('li');
li.appendChild(searchRemovalNotice);
document.querySelector('#web_content_wrapper ol').prepend(li);
} else {
document.getElementById('links').prepend(searchRemovalNotice);
}
break;
case 'brave':
document.querySelector('body').prepend(searchRemovalNotice);
break;
case 'ecosia':
document.querySelector('body').prepend(searchRemovalNotice);
break;
case 'startpage':
document.querySelector('#main').prepend(searchRemovalNotice);
break;
case 'yahoo':
if (document.querySelector('#web > ol')) {
var li = document.createElement('li');
li.appendChild(searchRemovalNotice);
document.querySelector('#web > ol').prepend(li);
} else {
document.querySelector('#main-algo').prepend(searchRemovalNotice);
}
break;
default:
}
}
if (!Array.from(searchResultContainer.classList).includes('iwb-hide')) {
let elementId = stringToId(site.lang + '-' + site.origin_group);
searchResultContainer.classList.add('iwb-search-result-' + elementId);
searchResultContainer.classList.add('iwb-hide');
countFiltered++;
if (hiddenWikisRevealed[elementId]) {
searchResultContainer.classList.add('iwb-show');
}
}
return countFiltered;
}
function filterSearchResults(searchResults, searchEngine, storage) { function filterSearchResults(searchResults, searchEngine, storage) {
getData().then(sites => { getData().then(sites => {
@ -131,7 +358,7 @@ function filterSearchResults(searchResults, searchEngine, storage) {
} }
let link = String(decodeURIComponent(searchResultLink)); let link = String(decodeURIComponent(searchResultLink));
if (searchEngine ==='google') { if (searchEngine === 'google') {
// Break if image result: // Break if image result:
if (link.includes('imgurl=')) { if (link.includes('imgurl=')) {
break; break;
@ -192,179 +419,38 @@ function filterSearchResults(searchResults, searchEngine, storage) {
} }
} }
// Insert search result removal notice
if (!filteredWikis.includes(site.lang + ' ' + site.origin_group)) {
filteredWikis.push(site.lang + ' ' + site.origin_group);
let elementId = stringToId(site.lang + '-' + site.origin_group);
hiddenWikisRevealed[elementId] = false;
let searchRemovalNotice = document.createElement('aside');
searchRemovalNotice.id = 'iwb-notice-' + elementId;
searchRemovalNotice.classList.add('iwb-notice');
let searchRemovalNoticeLink = document.createElement('a');
searchRemovalNoticeLink.href = 'https://' + site.destination_base_url;
searchRemovalNoticeLink.textContent = site.destination;
searchRemovalNoticePretext = document.createTextNode('Indie Wiki Buddy has filtered out results from ' + site.origin_group + (site.lang !== 'EN' ? ' (' + site.lang + ')' : '') + '. Look for results from ');
searchRemovalNoticePosttext = document.createTextNode(' instead!');
linebreak = document.createElement("br");
searchRemovalNotice.appendChild(searchRemovalNoticePretext);
searchRemovalNotice.appendChild(searchRemovalNoticeLink);
searchRemovalNotice.appendChild(searchRemovalNoticePosttext);
searchRemovalNotice.appendChild(linebreak);
// Output "show results" button
let showResultsButton = document.createElement('button');
showResultsButton.classList.add('iwb-show-results-button');
showResultsButton.setAttribute('data-group', 'iwb-search-result-' + elementId);
showResultsButton.textContent = 'Show filtered results';
searchRemovalNotice.appendChild(showResultsButton);
showResultsButton.onclick = function (e) {
if(e.target.textContent.includes('Show')) {
e.target.textContent = 'Re-hide filtered results';
hiddenWikisRevealed[elementId] = true;
const selector = e.currentTarget.dataset.group;
document.querySelectorAll('.' + selector).forEach(el => {
el.classList.add('iwb-show');
})
} else {
e.target.textContent = 'Show filtered results';
hiddenWikisRevealed[elementId] = false;
const selector = e.currentTarget.dataset.group;
document.querySelectorAll('.' + selector).forEach(el => {
el.classList.remove('iwb-show');
})
}
}
// Output "disable filtering" button
let disableFilterButton = document.createElement('button');
disableFilterButton.classList.add('iwb-disable-filtering-button');
disableFilterButton.textContent = 'Stop filtering ' + site.origin_group + ' in future searches';
disableFilterButton.style.border = '1px solid';
searchRemovalNotice.appendChild(disableFilterButton);
disableFilterButton.onclick = function (e) {
if (e.target.textContent.includes('Stop')) {
chrome.storage.sync.get({ 'siteSettings': {} }, function (response) {
response.siteSettings.get(site.id).set('searchFilter', 'false');
chrome.storage.sync.set({ 'siteSettings': response.siteSettings });
e.target.textContent = 'Re-enable filtering for ' + site.origin_group;
})
} else {
chrome.storage.sync.get({ 'siteSettings': {} }, function (response) {
response.siteSettings.get(site.id).set('searchFilter', 'true');
chrome.storage.sync.set({ 'siteSettings': response.siteSettings });
e.target.textContent = 'Stop filtering ' + site.origin_group + ' in future searches';
})
}
}
switch (searchEngine) {
case 'google':
if (document.querySelector('#search')) {
document.querySelector('#search').prepend(searchRemovalNotice);
} else if (document.querySelector('#topstuff')) {
document.querySelector('#topstuff').prepend(searchRemovalNotice);
} else if (document.querySelector('#main')) {
var el = document.querySelector('#main');
if (el.querySelector('#main > div[data-hveid]')) {
el.insertBefore(searchRemovalNotice, el.querySelector('div[data-hveid]'));
} else {
el.insertBefore(searchRemovalNotice, el.querySelector('div div[data-hveid]').parentElement);
}
};
break;
case 'bing':
var li = document.createElement('li');
li.appendChild(searchRemovalNotice);
document.querySelector('#b_results').prepend(li);
break;
case 'duckduckgo':
if (document.getElementById('web_content_wrapper')) {
var li = document.createElement('li');
li.appendChild(searchRemovalNotice);
document.querySelector('#web_content_wrapper ol').prepend(li);
} else {
document.getElementById('links').prepend(searchRemovalNotice);
}
break;
case 'brave':
document.querySelector('body').prepend(searchRemovalNotice);
break;
case 'ecosia':
document.querySelector('body').prepend(searchRemovalNotice);
break;
case 'startpage':
document.querySelector('#main').prepend(searchRemovalNotice);
break;
case 'yahoo':
if (document.querySelector('#web > ol')) {
var li = document.createElement('li');
li.appendChild(searchRemovalNotice);
document.querySelector('#web > ol').prepend(li);
} else {
document.querySelector('#main-algo').prepend(searchRemovalNotice);
}
break;
default:
}
}
let cssQuery = ''; let cssQuery = '';
let searchResultContainer = null; let searchResultContainer = null;
switch (searchEngine) { switch (searchEngine) {
case 'google': case 'google':
if (searchResult.closest('div[data-hveid]')) { searchResultContainer = searchResult.closest('div[data-hveid]');
cssQuery = 'div[data-hveid]';
searchResultContainer = searchResult.closest(cssQuery).parentElement;
}
break; break;
case 'bing': case 'bing':
if (searchResult.closest('li.b_algo')) { searchResultContainer = searchResult.closest('li.b_algo');
cssQuery = 'li.b_algo';
searchResultContainer = searchResult.closest(cssQuery);
}
break; break;
case 'duckduckgo': case 'duckduckgo':
if (searchResult.closest('li[data-layout], div.web-result')) { searchResultContainer = searchResult.closest('li[data-layout], div.web-result');
cssQuery = 'li[data-layout], div.web-result';
searchResultContainer = searchResult.closest(cssQuery);
}
break; break;
case 'brave': case 'brave':
if (searchResult.closest('div.snippet')) { searchResultContainer = searchResult.closest('div.snippet');
cssQuery = 'div.snippet';
searchResultContainer = searchResult.closest(cssQuery);
}
break; break;
case 'ecosia': case 'ecosia':
if (searchResult.closest('div.mainline__result-wrapper')) { searchResultContainer = searchResult.closest('div.mainline__result-wrapper article div.result__body');
cssQuery = 'div.mainline__result-wrapper';
searchResultContainer = searchResult.closest(cssQuery);
}
break; break;
case 'startpage': case 'startpage':
if (searchResult.closest('div.w-gl__result')) { searchResultContainer = searchResult.closest('div.w-gl__result');
cssQuery = 'div.w-gl__result';
searchResultContainer = searchResult.closest(cssQuery);
}
break; break;
case 'yahoo': case 'yahoo':
if (searchResult.closest('#web > ol > li, section.algo')) { searchResultContainer = searchResult.closest('#web > ol > li div.itm .exp, #web > ol > li div.algo, #web > ol > li, section.algo');
cssQuery = '#web > ol > li, section.algo';
searchResultContainer = searchResult.closest(cssQuery);
}
break; break;
default: default:
} }
if(!Array.from(searchResultContainer.classList).includes('iwb-hide')) { if (searchResultContainer) {
let elementId = stringToId(site.lang + '-' + site.origin_group); if (storage.searchSetting === 'hide') {
searchResultContainer.classList.add('iwb-search-result-' + elementId); countFiltered += hideSearchResults(searchResultContainer, searchEngine, site);
searchResultContainer.classList.add('iwb-hide'); } else {
countFiltered++; countFiltered += redirectSearchResults(searchResultContainer, site, link);
if (hiddenWikisRevealed[elementId]) {
searchResultContainer.classList.add('iwb-show');
} }
} }
} }
@ -391,7 +477,7 @@ function main(mutations = null, observer = null) {
// Check if extension is on: // Check if extension is on:
if ((storage.power ?? 'on') === 'on') { if ((storage.power ?? 'on') === 'on') {
// Determine which search engine we're on // Determine which search engine we're on
if ((storage.searchFilter ?? 'on') === 'on') { if ((storage.searchSetting ?? 'replace') !== 'nothing') {
if (currentURL.hostname.includes('www.google.')) { if (currentURL.hostname.includes('www.google.')) {
// Function to filter search results in Google // Function to filter search results in Google
function filterGoogle() { function filterGoogle() {
@ -447,7 +533,6 @@ function main(mutations = null, observer = null) {
// Function to filter search results in Brave // Function to filter search results in Brave
function filterBrave() { function filterBrave() {
let searchResults = Array.from(document.querySelectorAll('div.snippet[data-type="web"] a')).filter(el => el.innerHTML.includes('fandom.com') || el.innerHTML.includes('fextralife.com')); let searchResults = Array.from(document.querySelectorAll('div.snippet[data-type="web"] a')).filter(el => el.innerHTML.includes('fandom.com') || el.innerHTML.includes('fextralife.com'));
console.log(searchResults);
filterSearchResults(searchResults, 'brave', storage); filterSearchResults(searchResults, 'brave', storage);
} }

View File

@ -99,7 +99,8 @@
Indie Wiki Buddy provides a suite of features to help you discover independent wikis and improve your general wiki reading experience. Indie Wiki Buddy provides a suite of features to help you discover independent wikis and improve your general wiki reading experience.
<br /><br /> <br /><br />
When you visit a wiki on a large, corporate-run wiki host, this extension can notify or automatically redirect you to quality independent wikis when they're available. When you visit a wiki on a large, corporate-run wiki host, this extension can notify or automatically redirect you to quality independent wikis when they're available.
Search results in Google, Bing, DuckDuckGo, Yahoo, Brave Search, Ecosia, and Startpage can also be filtered, replacing non-independent wikis with text inviting you to visit the independent counterpart. Search results in Google, Bing, DuckDuckGo, Yahoo, Brave Search, Ecosia, and Startpage can also be filtered,
replacing non-independent wikis with links to independent counterpart (or hiding them completely).
<br /><br /> <br /><br />
We currently redirect from Fandom and Fextralife wikis to independent counterparts. We currently redirect from Fandom and Fextralife wikis to independent counterparts.
<br /><br /> <br /><br />
@ -119,6 +120,33 @@
This allows you to enable/disable all Indie Wiki Buddy functionality at the click of a button. This allows you to enable/disable all Indie Wiki Buddy functionality at the click of a button.
</li> </li>
<br /> <br />
<li>
<b>🔎 Search engine options</b>
<br />
Indie Wiki Buddy provides two ways to filter results from
Google, Bing, DuckDuckGo, Yahoo, Brave Search, Ecosia, and Startpage.
<br />
<br />
When "disable non-indie wikis & add link to indie counterparts" is selected,
tracked Fandom and Fextralife wikis that appear in search engine results
will be disabled, and a button will be inserted above that attempts to
link you to the same article on the respective indie wiki.
<br />
<br />
When "hide non-indie wikis that have indie counterparts" is selected,
the results are completely hidden. A notice will be inserted at the top of the search page
letting you know that results were hidden, and you will have the option to temporarily
re-reveal the results or disable search engine filtering for that particular wiki.
<br />
<br />
If you don't want a particular Fandom or Fextralife wiki to be filtered from search results,
you can disable search engine filtering per-wiki on the full settings page.
<br />
<br />
Note that image results are not filtered;
we don't want users to miss out on images they might not find elsewhere!
</li>
<br />
<li> <li>
<b>🔔 Desktop notifications when redirected to an indie wiki or BreezeWiki</b> <b>🔔 Desktop notifications when redirected to an indie wiki or BreezeWiki</b>
<br /> <br />
@ -131,24 +159,6 @@
settings to ensure that your browser is allowed to send notifications. settings to ensure that your browser is allowed to send notifications.
</li> </li>
<br /> <br />
<li>
<b>🔎 Filter non-indie wikis in Google, Bing, DuckDuckGo, & other search engines</b>
<br />
When this option is enabled, non-indie wikis will be filtered from search engine results
when an independent wiki is available. This is to help prioritize independent wikis in your results.
This is on by default.
<br />
<br />
Currently, Google, Bing, DuckDuckGo, Yahoo, Brave Search, Ecosia, and Startpage are supported.
Note that image results are not filtered;
we don't want users to miss out on images they might not find elsewhere!
<br />
<br />
When a search result is filtered, it will be replaced with:
<br />
"<i>A search result from ABC Wiki has been removed by Indie Wiki Buddy. Look for results from XYZ instead!</i>"
</li>
<br />
<li> <li>
<b>🌬️ Use BreezeWiki on Fandom</b> <b>🌬️ Use BreezeWiki on Fandom</b>
<br /> <br />

View File

@ -40,6 +40,7 @@
} }
}, },
"web_accessible_resources": [ "web_accessible_resources": [
"favicons/*",
"data/sitesDE.json", "data/sitesDE.json",
"data/sitesEN.json", "data/sitesEN.json",
"data/sitesES.json", "data/sitesES.json",

View File

@ -28,6 +28,7 @@
"web_accessible_resources": [ "web_accessible_resources": [
{ {
"resources": [ "resources": [
"favicons/*",
"data/sitesDE.json", "data/sitesDE.json",
"data/sitesEN.json", "data/sitesEN.json",
"data/sitesES.json", "data/sitesES.json",

View File

@ -139,7 +139,7 @@
width: 100%; width: 100%;
} }
.options .settingToggleContainer { .options .settingToggleContainer {
padding-bottom: .8em; padding-bottom: 1em;
} }
.options .settingToggleContainer:last-child { .options .settingToggleContainer:last-child {
padding-bottom: 0; padding-bottom: 0;
@ -181,18 +181,30 @@
<div id="content"> <div id="content">
<div class="options"> <div class="options">
<div class="settingToggleContainer"> <div class="settingToggleContainer">
<div id="notifications" class="settingToggle"> <div id="searchFilteringReplace" class="settingToggle">
<input id="notificationsCheckbox" type="checkbox" /> <label for="searchFilteringReplaceRadio">
<label for="notificationsCheckbox"> <input id="searchFilteringReplaceRadio" type="radio" name="searchSetting" value="replace" />
<span id="notificationsText">🔔 Desktop notifications when redirected to indie wiki or BreezeWiki</span> <span id="searchFilteringReplaceText">🔎 In search engines, disable non-indie wikis & add link to indie counterparts</span>
</label>
</div>
<div id="searchFilteringHide" class="settingToggle">
<label for="searchFilteringHideRadio">
<input id="searchFilteringHideRadio" type="radio" name="searchSetting" value="hide" />
<span id="searchFilteringHideText">🔎 In search engines, hide non-indie wikis that have indie counterparts</span>
</label>
</div>
<div id="searchFilteringNothing" class="settingToggle">
<label for="searchFilteringNothingRadio">
<input id="searchFilteringNothingRadio" type="radio" name="searchSetting" value="nothing" />
<span id="searchFilteringNothingText">🔎 Do nothing on search engines</span>
</label> </label>
</div> </div>
</div> </div>
<div class="settingToggleContainer"> <div class="settingToggleContainer">
<div id="searchFilter" class="settingToggle"> <div id="notifications" class="settingToggle">
<input id="searchFilterCheckbox" type="checkbox" /> <input id="notificationsCheckbox" type="checkbox" />
<label for="searchFilterCheckbox"> <label for="notificationsCheckbox">
<span id="searchFilterText">🔎 Filter non-indie wikis in Google, Bing, DuckDuckGo, & other search engines</span> <span id="notificationsText">🔔 Desktop notifications when redirected to an indie wiki or BreezeWiki</span>
</label> </label>
</div> </div>
</div> </div>

View File

@ -145,14 +145,16 @@ function setNotifications(setting, storeSetting = true) {
} }
// Set search filter setting // Set search filter setting
function setSearchFilter(setting, storeSetting = true) { function setSearchSetting(setting, storeSetting = true) {
if (storeSetting) { if (storeSetting) {
chrome.storage.sync.set({ 'searchFilter': setting }); chrome.storage.sync.set({ 'searchSetting': setting });
} }
if (setting === 'on') { if (setting === 'hide') {
document.getElementById('searchFilterCheckbox').checked = true; document.getElementById('searchFilteringHideRadio').checked = true;
} else if (setting === 'nothing') {
document.getElementById('searchFilteringNothingRadio').checked = true;
} else { } else {
document.getElementById('searchFilterCheckbox').checked = false; document.getElementById('searchFilteringReplaceRadio').checked = true;
} }
} }
@ -242,8 +244,8 @@ document.addEventListener('DOMContentLoaded', function () {
chrome.storage.sync.get({ 'notifications': 'on' }, function (item) { chrome.storage.sync.get({ 'notifications': 'on' }, function (item) {
setNotifications(item.notifications, false); setNotifications(item.notifications, false);
}); });
chrome.storage.sync.get({ 'searchFilter': 'on' }, function (item) { chrome.storage.sync.get({ 'searchSetting': 'replace' }, function (item) {
setSearchFilter(item.searchFilter, false); setSearchSetting(item.searchSetting, false);
}); });
chrome.storage.sync.get({ 'breezewiki': 'off' }, function (item) { chrome.storage.sync.get({ 'breezewiki': 'off' }, function (item) {
setBreezeWiki(item.breezewiki, false); setBreezeWiki(item.breezewiki, false);
@ -273,14 +275,14 @@ document.addEventListener('DOMContentLoaded', function () {
} }
}); });
}); });
document.getElementById('searchFilterCheckbox').addEventListener('change', function () { document.getElementById('searchFilteringReplaceRadio').addEventListener('change', function () {
chrome.storage.sync.get({ 'searchFilter': 'on' }, function (item) { setSearchSetting('replace');
if (item.searchFilter === 'on') { });
setSearchFilter('off'); document.getElementById('searchFilteringHideRadio').addEventListener('change', function () {
} else { setSearchSetting('hide');
setSearchFilter('on'); });
} document.getElementById('searchFilteringNothingRadio').addEventListener('change', function () {
}); setSearchSetting('nothing');
}); });
document.getElementById('breezewikiCheckbox').addEventListener('change', function () { document.getElementById('breezewikiCheckbox').addEventListener('change', function () {
chrome.storage.sync.get({ 'breezewiki': 'off' }, function (item) { chrome.storage.sync.get({ 'breezewiki': 'off' }, function (item) {

View File

@ -131,7 +131,7 @@
width: fit-content; width: fit-content;
} }
.options .settingToggleContainer { .options .settingToggleContainer {
padding-bottom: .8em; padding-bottom: 1em;
} }
.options .settingToggleContainer:last-child { .options .settingToggleContainer:last-child {
padding-bottom: 0; padding-bottom: 0;
@ -361,18 +361,30 @@
</div> </div>
</div> </div>
<div class="settingToggleContainer"> <div class="settingToggleContainer">
<div id="notifications" class="settingToggle"> <div id="searchFilteringReplace" class="settingToggle">
<label> <label for="searchFilteringReplaceRadio">
<input id="notificationsCheckbox" type="checkbox" /> <input id="searchFilteringReplaceRadio" type="radio" name="searchSetting" value="replace" />
<span id="notificationsText">🔔 Desktop notifications when redirected to an indie wiki or BreezeWiki</span> <span id="searchFilteringReplaceText">🔎 In search engines, disable non-indie wikis & add link to indie counterparts</span>
</label>
</div>
<div id="searchFilteringHide" class="settingToggle">
<label for="searchFilteringHideRadio">
<input id="searchFilteringHideRadio" type="radio" name="searchSetting" value="hide" />
<span id="searchFilteringHideText">🔎 In search engines, hide non-indie wikis that have indie counterparts</span>
</label>
</div>
<div id="searchFilteringNothing" class="settingToggle">
<label for="searchFilteringNothingRadio">
<input id="searchFilteringNothingRadio" type="radio" name="searchSetting" value="nothing" />
<span id="searchFilteringNothingText">🔎 Do nothing on search engines</span>
</label> </label>
</div> </div>
</div> </div>
<div class="settingToggleContainer"> <div class="settingToggleContainer">
<div id="searchFilter" class="settingToggle"> <div id="notifications" class="settingToggle">
<label> <label>
<input id="searchFilterCheckbox" type="checkbox" /> <input id="notificationsCheckbox" type="checkbox" />
<span id="searchFilterText">🔎 Filter non-indie wikis in Google, Bing, DuckDuckGo, & other search engines</span> <span id="notificationsText">🔔 Desktop notifications when redirected to an indie wiki or BreezeWiki</span>
</label> </label>
</div> </div>
</div> </div>

View File

@ -439,14 +439,16 @@ function setNotifications(setting, storeSetting = true) {
} }
// Set search filter setting // Set search filter setting
function setSearchFilter(setting, storeSetting = true) { function setSearchSetting(setting, storeSetting = true) {
if (storeSetting) { if (storeSetting) {
chrome.storage.sync.set({ 'searchFilter': setting }); chrome.storage.sync.set({ 'searchSetting': setting });
} }
if (setting === 'on') { if (setting === 'hide') {
document.getElementById('searchFilterCheckbox').checked = true; document.getElementById('searchFilteringHideRadio').checked = true;
} else if (setting === 'nothing') {
document.getElementById('searchFilteringNothingRadio').checked = true;
} else { } else {
document.getElementById('searchFilterCheckbox').checked = false; document.getElementById('searchFilteringReplaceRadio').checked = true;
} }
} }
@ -578,8 +580,8 @@ document.addEventListener('DOMContentLoaded', function () {
chrome.storage.sync.get({ 'notifications': 'on' }, function (item) { chrome.storage.sync.get({ 'notifications': 'on' }, function (item) {
setNotifications(item.notifications, false); setNotifications(item.notifications, false);
}); });
chrome.storage.sync.get({ 'searchFilter': 'on' }, function (item) { chrome.storage.sync.get({ 'searchSetting': 'replace' }, function (item) {
setSearchFilter(item.searchFilter, false); setSearchSetting(item.searchSetting, false);
}); });
chrome.storage.sync.get({ 'breezewiki': 'off' }, function (item) { chrome.storage.sync.get({ 'breezewiki': 'off' }, function (item) {
setBreezeWiki(item.breezewiki, false); setBreezeWiki(item.breezewiki, false);
@ -604,14 +606,14 @@ document.addEventListener('DOMContentLoaded', function () {
} }
}); });
}); });
document.getElementById('searchFilterCheckbox').addEventListener('change', function () { document.getElementById('searchFilteringReplaceRadio').addEventListener('change', function () {
chrome.storage.sync.get({ 'searchFilter': 'on' }, function (item) { setSearchSetting('replace');
if (item.searchFilter === 'on') { });
setSearchFilter('off'); document.getElementById('searchFilteringHideRadio').addEventListener('change', function () {
} else { setSearchSetting('hide');
setSearchFilter('on'); });
} document.getElementById('searchFilteringNothingRadio').addEventListener('change', function () {
}); setSearchSetting('nothing');
}); });
document.getElementById('breezewikiCheckbox').addEventListener('change', function () { document.getElementById('breezewikiCheckbox').addEventListener('change', function () {
chrome.storage.sync.get({ 'breezewiki': 'off' }, function (item) { chrome.storage.sync.get({ 'breezewiki': 'off' }, function (item) {