Hitomi - Language & Tag Filtering

Filters search results by languages and tags

Устаревшая версия за 22.10.2018. Перейдите к последней версии.

// ==UserScript==
// @name      	    Hitomi - Language & Tag Filtering
// @namespace 	    brazenvoid
// @version   		2.1
// @author          brazenvoid
// @description     Filters search results by languages and tags
// @include   		https://hitomi.la/*
// @run-at			document-idle
// ==/UserScript==

// Define languages to keep and tags to exclude here (search urls)

let allowedLanguages = [
  "japanese", 
  "english"
];
let excludedTags = [
  "anthology", 
  "female:loli", 
  "sample", 
  "male:yaoi"
];

// Formatting filters

let formatFilters = function (filters, prefix, suffix) {
  
  for (let index = 0; index < filters.length; index++) {
    
  	filters[index] = '[href="'+ prefix + encodeURIComponent(filters[index]) + suffix +'.html"]';
	}
	return filters.join(", ");
};

let languageFiltersSelector = formatFilters(allowedLanguages, "/index-", "-1");
let tagFiltersSelector = formatFilters(excludedTags, "/tag/", "-all-1");

// Filteration logic

let complianceCallback = function(target) {
  
  let elements = target.querySelectorAll('.manga, .dj, .acg');
  
  for (let element of elements) {

    if (element.querySelectorAll(languageFiltersSelector).length == 0 || 
        element.querySelectorAll(tagFiltersSelector).length > 0) {
      element.remove();
    }
  }
};

// Setting up configuration and galleries list node

let galleriesList = document.querySelector('.gallery-content');
let observerConfig = { 
  attributes: false, 
  childList: true, 
  subtree: false 
};

// Checking compliance in case of gallery page

complianceCallback(galleriesList);

// Adding observer to check compliance of galleries on search pages

let observer = new MutationObserver(function(mutations, observer) {
  for(let mutation of mutations) {
    complianceCallback(mutation.target);
  }
});
observer.observe(galleriesList, observerConfig);