ao3 multishipper savior

Show only works with the specified character(s) in a (romantic/platonic/any) relationship

// ==UserScript==
// @name         ao3 multishipper savior
// @namespace    ao3
// @version      1.0
// @description  Show only works with the specified character(s) in a (romantic/platonic/any) relationship
// @match      http*://archiveofourown.org/*
// @grant        none
// ==/UserScript==

//DISCLAIMER
// this code is based on the ao3 savior and ao3 savior config script, which I adapted for another purpose.
// ao3 savior and ao3 savior config were created by tuff on greasyfork.org or tuff_ghost on userscripts.org, who kindly gave me permission to use it and share.


(function () {
  'use strict';

  /**** CONFIG ********************/
  
window.ao3MSsaviorConfig = {

    //Put the name of the character(s) that you want to read about in quotes and arterisk
    //you can put in several characters. Separate them with commas. Each name needs the quotes and asterisk
    characterList: ['*Aragorn*', '*Cloud Strife*'],

    //set to true if you want to include romantic relationships (Character/any)
    romantic: true,

    //set to true if you want to include platonic relationships (Character & any)
    platonic: false,

    //set to true, if you want to include works tagging the character one type of relationship (Character/any but not character & any and vice versa)
    //use with caution
    exclusive_relationship_type: false,

    //set to true, if you want to include works with the character tagged in past relationships or minor relationships
    //does not work perfectly because of tagging conventions
    include_past_or_minor_ship: false};


}());

 /********************************/
//
    //STOP RIGHT HERE
    //DO NOT EDIT THE REST OF THE SCRIPT

(function () {
  'use strict';

 var STYLE = '\n  html body .ao3-ms-savior-hidden.ao3-ms-savior-hidden {\n    display: none;\n  }\n  \n  \n';

  function addStyle() {
    var style = document.createElement('style');
    style.innerHTML = STYLE;
    style.className = 'ao3-ms-savior';

    document.head.appendChild(style);
  }

  var CSS_NAMESPACE = 'ao3-ms-savior';

  function blockWork(work, reason) {
      if(!reason) return

    work.className += ' ' + CSS_NAMESPACE + '-hidden';
  }

  function matchTermsWithWildCard(term0, pattern0) {
    var term = term0.toLowerCase();
    var pattern = pattern0.toLowerCase();

    if (term === pattern) return true;
    if (pattern.indexOf('*') === -1) return false;

    var lastMatchedIndex = pattern.split('*').filter(Boolean).reduce(function (prevIndex, chunk) {
      var matchedIndex = term.indexOf(chunk);
      return prevIndex >= 0 && prevIndex <= matchedIndex ? matchedIndex : -1;
    }, 0);

    return lastMatchedIndex >= 0;
  }

    var showThisItem = function showThisItem(list, includedCharacters, comparator,flagr, flagp, flagpm) {
    var matchingEntry = void 0;
    list.some(function (item) {
      includedCharacters.some(function (entry) {
        var matched = comparator(item, entry);
      if (matched) {
            if(!flagpm){
                if(flagr && item.indexOf("/")>0 && item.indexOf("Past ") == -1 && item.indexOf("Minor ") == -1 ) matchingEntry = entry;
                if(flagp && item.indexOf("&")>0 && item.indexOf("Past ") == -1 && item.indexOf("Minor ") == -1 ) matchingEntry = entry;
            }else{
          if(flagr && item.indexOf("/")>0) matchingEntry = entry;
          if(flagp && item.indexOf("&")>0) matchingEntry = entry;
            }
        }
        return matched;
      });
    });

    return matchingEntry;
  };


  function getBlockReason(ref,ref2) {
    var ref$tags = ref.tags,
        tags = ref$tags === undefined ? [] : ref$tags;

      var ref2$characterList = ref2.characterList,
        characterList = ref2$characterList === undefined ? [] : ref2$characterList;
      var romantic = ref2.romantic,
        platonic = ref2.platonic,
          pastMinor=ref2.include_past_or_minor_ship,
          exclusive= ref2.exclusive_relationship_type;


    var whiteTag = showThisItem(tags, characterList, matchTermsWithWildCard, romantic, platonic, pastMinor);
    var exclusiveTag=showThisItem(tags,characterList, matchTermsWithWildCard, !romantic, !platonic, pastMinor);
        if(whiteTag){
            if(exclusive){
                if(exclusiveTag) return true;
                else return null;
            }
            return null;
        } else{
        return true};
  }


  function isDebug(location) {
    return location.hostname === 'localhost' || /\ba3sv-debug\b/.test(location.search);
  }

  var getText = function getText(element) {
    return element.textContent.replace(/^\s*|\s*$/g, '');
  };
  var selectTextsIn = function selectTextsIn(root, selector) {
    return Array.from(root.querySelectorAll(selector)).map(getText);
  };

  function selectFromBlurb(blurb) {
    return {tags: [].concat(selectTextsIn(blurb, 'a.tag'), selectTextsIn(blurb, '.required-tags .text'))};
  }

  setTimeout(function () {
    var debugMode = isDebug(window.location);
    var config = window.ao3MSsaviorConfig;
    var workContainer = document.querySelector('#main.works-show');
    var blocked = 0;
    var total = 0;

    if (debugMode) {
      console.groupCollapsed('AO3 MS SAVIOR');
    }

    addStyle();

    Array.from(document.querySelectorAll('li.blurb')).forEach(function (blurb) {
      var blockables = selectFromBlurb(blurb);
      var reason = getBlockReason(blockables, config);

      total++;

      if (reason) {
        blockWork(blurb, reason);
        blocked++;

        if (debugMode) {
          console.groupCollapsed('- blocked ' + blurb.id);
          console.log(blurb, reason);
          console.groupEnd();
        }
      } else if (debugMode) {
        console.groupCollapsed('  skipped ' + blurb.id);
        console.log(blurb);
        console.groupEnd();
      }
    });
    if (debugMode) {
      console.log('Blocked ' + blocked + ' out of ' + total + ' works');
      console.groupEnd();
    }
  }, 10);

}());