AO3: [Wrangling] Exclude Subtags and Synonyms

Link to works for a canonical tag, excluding all sub tags and syns

目前為 2024-08-17 提交的版本,檢視 最新版本

// ==UserScript==
// @name         AO3: [Wrangling] Exclude Subtags and Synonyms
// @namespace    https://greasyfork.org/en/users/1322876-keladry
// @version      2.2
// @description  Link to works for a canonical tag, excluding all sub tags and syns
// @author       keladry
// @match        *://*.archiveofourown.org/tags/*
// @license MIT
// @grant        none
// ==/UserScript==

//Gets the particular tags, if any such exist on the landing page
function get_landing_tags(elements) {
    if (elements.length > 0) {
        return elements.item(0).getElementsByTagName('li');
    }
    else {
        return []
    }
}

//Gets the particular tags, if any such exist on the edit page
function get_edit_tags(element) {
    if (document.getElementById(element) != null) {
        return document.getElementById(element).childNodes[0].getElementsByTagName('li');
    }
    else {
        return []
    }
}

function search_string(canonical, excludes) {
    var start = "https://archiveofourown.org/works?commit=Sort+and+Filter&work_search%5Bexcluded_tag_names%5D=";
    return(start + excludes + "&tag_id=" + encodeURIComponent(canonical));
}

(function() {
    'use strict';

// Landing Page
if ((document.getElementsByClassName('sub').length > 0) || (document.getElementsByClassName('synonym').length > 0)){

    var subtags_landing = get_landing_tags(document.getElementsByClassName('sub'));
    var syns_landing = get_landing_tags(document.getElementsByClassName('synonym'));
    var excludes_landing = "";

    for(var i=0; i <= subtags_landing.length-1; i++){
        excludes_landing += encodeURIComponent(subtags_landing[i].childNodes[0].innerText);

        if (i < subtags_landing.length-1){
            excludes_landing += encodeURIComponent(",");
        }
    }

    if ((subtags_landing.length > 0) && (syns_landing.length > 0)) {
        excludes_landing += encodeURIComponent(",");
    }

    for(var l=0; l <= syns_landing.length-1; l++){
        excludes_landing += encodeURIComponent(syns_landing[l].childNodes[0].innerText);

        if (l < syns_landing.length-1){
            excludes_landing += encodeURIComponent(",");
        }
    }

    if (excludes_landing != "") {
        var canonical_landing = document.querySelector('h2.heading').innerHTML;
        var search_landing = search_string(canonical_landing, excludes_landing)
        var buttons_landing = document.querySelector('.tag [role="navigation"]');
        var button_landing = document.createElement("li");
        button_landing.innerHTML = '<a href="' + search_landing + '">Exclude Subtags & Syns</a>';
        buttons_landing.insertBefore(button_landing, buttons_landing.childNodes[0]);
    }
}
// Edit Page
else if (document.getElementsByClassName('tags-edit').length > 0) {

    var subtags_edit = get_edit_tags("child_SubTag_associations_to_remove_checkboxes");
    var syns_edit = get_edit_tags("child_Merger_associations_to_remove_checkboxes");
    var excludes_edit = ""

    for(var j=0; j <= subtags_edit.length-1; j++){
        excludes_edit += encodeURIComponent(subtags_edit[j].innerText);

        if (j < subtags_edit.length-1){
            excludes_edit += encodeURIComponent(",");
        }
    }

    if ((subtags_edit.length > 0) && (syns_edit.length > 0)) {
        excludes_edit += encodeURIComponent(",");
    }

    for(var k=0; k <= syns_edit.length-1; k++){
        excludes_edit += encodeURIComponent(syns_edit[k].innerText);

        if ( k < syns_edit.length-1){
            excludes_edit += encodeURIComponent(",");
        }
    }

    if (excludes_edit != "") {
        var canonical_edit = document.getElementById("tag_name").value;
        var search_edit = search_string(canonical_edit, excludes_edit);
        var button_edit = document.querySelectorAll("div.tag.wrangling ul.navigation")[1];
        button_edit.innerHTML = button_edit.innerHTML + '<li><a href="' + search_edit + '">Exclude Subtags & Syns</a></li>';
    }
}


})();