Add check for Google images

pull/227/head
Kevin Payravi 2023-09-03 12:54:57 -06:00
parent 8c1405a43a
commit 2640482aab
1 changed files with 211 additions and 203 deletions

View File

@ -127,247 +127,255 @@ function filterSearchResults(searchResults, searchEngine, storage) {
getData().then(sites => { getData().then(sites => {
let countFiltered = 0; let countFiltered = 0;
searchResults.forEach(searchResult => { for (let searchResult of searchResults) {
let searchResultLink = '';
try { try {
let searchResultLink = '';
if (searchEngine === 'bing') { if (searchEngine === 'bing') {
searchResultLink = searchResult.innerHTML.replaceAll('<strong>', '').replaceAll('</strong>', ''); searchResultLink = searchResult.innerHTML.replaceAll('<strong>', '').replaceAll('</strong>', '');
} else { } else {
searchResultLink = searchResult.closest('a[href]').href; searchResultLink = searchResult.closest('a[href]').href;
} }
} catch (e) {
console.log('Indie Wiki Buddy failed to properly parse search results with error: ' + e);
}
// Check if site is in our list of wikis:
let matchingSites = sites.filter(el => {
let link = String(decodeURIComponent(searchResultLink)); let link = String(decodeURIComponent(searchResultLink));
if (link.substring(8).includes('/')) {
// If the URL has a path, check if an exact match with base URL or base URL + content path if (searchEngine ==='google') {
// This is done to ensure we capture non-English Fandom wikis correctly // Break if image result:
return (link === 'https://' + el.origin_base_url) || (link.includes('https://' + el.origin_base_url + el.origin_content_path)); if (link.includes('imgurl=')) {
} else { break;
// If URL does not have a path, just check base URL }
return link.includes('https://' + el.origin_base_url);
} }
});
if (matchingSites.length > 0) { // Check if site is in our list of wikis:
// Select match with longest base URL let matchingSites = sites.filter(el => {
let closestMatch = ""; if (link.substring(8).includes('/')) {
matchingSites.forEach(site => { // If the URL has a path, check if an exact match with base URL or base URL + content path
if (site.origin_base_url.length > closestMatch.length) { // This is done to ensure we capture non-English Fandom wikis correctly
closestMatch = site.origin_base_url; return (link === 'https://' + el.origin_base_url) || (link.includes('https://' + el.origin_base_url + el.origin_content_path));
} else {
// If URL does not have a path, just check base URL
return link.includes('https://' + el.origin_base_url);
} }
}); });
let site = matchingSites.find(site => site.origin_base_url === closestMatch); if (matchingSites.length > 0) {
if (site) { // Select match with longest base URL
// Get user's settings for the wiki let closestMatch = "";
let settings = storage.siteSettings || {}; matchingSites.forEach(site => {
let id = site['id']; if (site.origin_base_url.length > closestMatch.length) {
let searchFilterSetting = ''; closestMatch = site.origin_base_url;
if (settings.hasOwnProperty(id) && settings[id].searchFilter) {
searchFilterSetting = settings[id].searchFilter;
} else if (storage.defaultSearchFilterSettings && storage.defaultSearchFilterSettings[site.language]) {
searchFilterSetting = storage.defaultSearchFilterSettings[site.language];
} else {
searchFilterSetting = 'true';
}
if (searchFilterSetting === 'true') {
// Output stylesheet if not already done
if (filteredWikis.length === 0) {
// Wait for head to be available
const headElement = document.querySelector('head');
if (headElement) {
insertCSS();
} else {
const docObserver = new MutationObserver(function (mutations, mutationInstance) {
const headElement = document.querySelector('head');
if (headElement) {
insertCSS();
mutationInstance.disconnect();
}
});
docObserver.observe(document, {
childList: true,
subtree: true
});
}
} }
});
// Insert search result removal notice let site = matchingSites.find(site => site.origin_base_url === closestMatch);
if (!filteredWikis.includes(site.lang + ' ' + site.origin_group)) { if (site) {
filteredWikis.push(site.lang + ' ' + site.origin_group); // Get user's settings for the wiki
let settings = storage.siteSettings || {};
let elementId = stringToId(site.lang + '-' + site.origin_group); let id = site['id'];
hiddenWikisRevealed[elementId] = false; let searchFilterSetting = '';
if (settings.hasOwnProperty(id) && settings[id].searchFilter) {
let searchRemovalNotice = document.createElement('aside'); searchFilterSetting = settings[id].searchFilter;
searchRemovalNotice.id = 'iwb-notice-' + elementId; } else if (storage.defaultSearchFilterSettings && storage.defaultSearchFilterSettings[site.language]) {
searchRemovalNotice.classList.add('iwb-notice'); searchFilterSetting = storage.defaultSearchFilterSettings[site.language];
let searchRemovalNoticeLink = document.createElement('a'); } else {
searchRemovalNoticeLink.href = 'https://' + site.destination_base_url; searchFilterSetting = 'true';
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 '); if (searchFilterSetting === 'true') {
searchRemovalNoticePosttext = document.createTextNode(' instead!'); // Output stylesheet if not already done
linebreak = document.createElement("br"); if (filteredWikis.length === 0) {
searchRemovalNotice.appendChild(searchRemovalNoticePretext); // Wait for head to be available
searchRemovalNotice.appendChild(searchRemovalNoticeLink); const headElement = document.querySelector('head');
searchRemovalNotice.appendChild(searchRemovalNoticePosttext); if (headElement) {
searchRemovalNotice.appendChild(linebreak); insertCSS();
// 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 { } else {
e.target.textContent = 'Show filtered results'; const docObserver = new MutationObserver(function (mutations, mutationInstance) {
hiddenWikisRevealed[elementId] = false; const headElement = document.querySelector('head');
const selector = e.currentTarget.dataset.group; if (headElement) {
document.querySelectorAll('.' + selector).forEach(el => { insertCSS();
el.classList.remove('iwb-show'); mutationInstance.disconnect();
}) }
});
docObserver.observe(document, {
childList: true,
subtree: true
});
} }
} }
// Output "disable filtering" button // Insert search result removal notice
let disableFilterButton = document.createElement('button'); if (!filteredWikis.includes(site.lang + ' ' + site.origin_group)) {
disableFilterButton.classList.add('iwb-disable-filtering-button'); filteredWikis.push(site.lang + ' ' + site.origin_group);
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) { let elementId = stringToId(site.lang + '-' + site.origin_group);
case 'google': hiddenWikisRevealed[elementId] = false;
if (document.querySelector('#search')) {
document.querySelector('#search').prepend(searchRemovalNotice); let searchRemovalNotice = document.createElement('aside');
} else if (document.querySelector('#topstuff')) { searchRemovalNotice.id = 'iwb-notice-' + elementId;
document.querySelector('#topstuff').prepend(searchRemovalNotice); searchRemovalNotice.classList.add('iwb-notice');
} else if (document.querySelector('#main')) { let searchRemovalNoticeLink = document.createElement('a');
var el = document.querySelector('#main'); searchRemovalNoticeLink.href = 'https://' + site.destination_base_url;
el.insertBefore(searchRemovalNotice, el.querySelector('div [data-hveid]').parentElement); 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 ');
break; searchRemovalNoticePosttext = document.createTextNode(' instead!');
case 'bing': linebreak = document.createElement("br");
var li = document.createElement('li'); searchRemovalNotice.appendChild(searchRemovalNoticePretext);
li.appendChild(searchRemovalNotice); searchRemovalNotice.appendChild(searchRemovalNoticeLink);
document.querySelector('#b_results').prepend(li); searchRemovalNotice.appendChild(searchRemovalNoticePosttext);
break; searchRemovalNotice.appendChild(linebreak);
case 'duckduckgo':
if (document.getElementById('web_content_wrapper')) { // 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');
el.insertBefore(searchRemovalNotice, el.querySelector('div [data-hveid]').parentElement);
};
break;
case 'bing':
var li = document.createElement('li'); var li = document.createElement('li');
li.appendChild(searchRemovalNotice); li.appendChild(searchRemovalNotice);
document.querySelector('#web_content_wrapper ol').prepend(li); document.querySelector('#b_results').prepend(li);
} else { break;
document.getElementById('links').prepend(searchRemovalNotice); 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('#results').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 searchResultContainer = null;
switch (searchEngine) {
case 'google':
if (searchResult.closest('div[data-hveid]')) {
cssQuery = 'div[data-hveid]';
searchResultContainer = searchResult.closest(cssQuery).parentElement;
}
break;
case 'bing':
if (searchResult.closest('li.b_algo')) {
cssQuery = 'li.b_algo';
searchResultContainer = searchResult.closest(cssQuery);
}
break;
case 'duckduckgo':
if (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':
document.querySelector('#results').prepend(searchRemovalNotice); if (searchResult.closest('div.snippet')) {
cssQuery = 'div.snippet';
searchResultContainer = searchResult.closest(cssQuery);
}
break; break;
case 'ecosia': case 'ecosia':
document.querySelector('body').prepend(searchRemovalNotice); if (searchResult.closest('div.mainline__result-wrapper')) {
cssQuery = 'div.mainline__result-wrapper';
searchResultContainer = searchResult.closest(cssQuery);
}
break; break;
case 'startpage': case 'startpage':
document.querySelector('#main').prepend(searchRemovalNotice); if (searchResult.closest('div.w-gl__result')) {
cssQuery = 'div.w-gl__result';
searchResultContainer = searchResult.closest(cssQuery);
}
break; break;
case 'yahoo': case 'yahoo':
if (document.querySelector('#web > ol')) { if (searchResult.closest('#web > ol > li, section.algo')) {
var li = document.createElement('li'); cssQuery = '#web > ol > li, section.algo';
li.appendChild(searchRemovalNotice); searchResultContainer = searchResult.closest(cssQuery);
document.querySelector('#web > ol').prepend(li);
} else {
document.querySelector('#main-algo').prepend(searchRemovalNotice);
} }
break; break;
default: default:
} }
}
let cssQuery = ''; if(!Array.from(searchResultContainer.classList).includes('iwb-hide')) {
let searchResultContainer = null; let elementId = stringToId(site.lang + '-' + site.origin_group);
switch (searchEngine) { searchResultContainer.classList.add('iwb-search-result-' + elementId);
case 'google': searchResultContainer.classList.add('iwb-hide');
if (searchResult.closest('div[data-hveid]')) { countFiltered++;
cssQuery = 'div[data-hveid]'; if (hiddenWikisRevealed[elementId]) {
searchResultContainer = searchResult.closest(cssQuery).parentElement; searchResultContainer.classList.add('iwb-show');
} }
break;
case 'bing':
if (searchResult.closest('li.b_algo')) {
cssQuery = 'li.b_algo';
searchResultContainer = searchResult.closest(cssQuery);
}
break;
case 'duckduckgo':
if (searchResult.closest('li[data-layout], div.web-result')) {
cssQuery = 'li[data-layout], div.web-result';
searchResultContainer = searchResult.closest(cssQuery);
}
break;
case 'brave':
if (searchResult.closest('div.snippet')) {
cssQuery = 'div.snippet';
searchResultContainer = searchResult.closest(cssQuery);
}
break;
case 'ecosia':
if (searchResult.closest('div.mainline__result-wrapper')) {
cssQuery = 'div.mainline__result-wrapper';
searchResultContainer = searchResult.closest(cssQuery);
}
break;
case 'startpage':
if (searchResult.closest('div.w-gl__result')) {
cssQuery = 'div.w-gl__result';
searchResultContainer = searchResult.closest(cssQuery);
}
break;
case 'yahoo':
if (searchResult.closest('#web > ol > li, section.algo')) {
cssQuery = '#web > ol > li, section.algo';
searchResultContainer = searchResult.closest(cssQuery);
}
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');
} }
} }
} }
} }
} catch (e) {
console.log('Indie Wiki Buddy failed to properly parse search results with error: ' + e);
} }
}); };
addLocationObserver(main); addLocationObserver(main);
if (countFiltered > 0) { if (countFiltered > 0) {
chrome.storage.sync.set({ 'countSearchFilters': (storage.countSearchFilters ?? 0) + countFiltered }); chrome.storage.sync.set({ 'countSearchFilters': (storage.countSearchFilters ?? 0) + countFiltered });