AO3 Easy Navigation Userscripts

Adds "Marked for Later" and "Bookmarked Fics" buttons on the top navigation bar of AO3, as well as creates a "random works" button in marked for later list

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name         AO3 Easy Navigation Userscripts
// @namespace    Ellililunch AO3 USERSCIPTS
// @version      0.3
// @history      0.0 deplicated JaneBuzJane's script to put the "Marked for Later" button on the home page of AO3.
// @history      0.1 modified JaneBuzJane's script to put the "Marked for Later" button on the home page of AO3 wo create a "bookmarked fics" botton to the home tab of AO3.
// @history      0.2 combined the script for a "Marked for Later" and "Bookmarked Fics" botton in one script
// @history      0.3 added the escctrl's AO3: Jump to a Random Work script to adds a "Random Work" button (top right corner) when viewing works in a tag/filter or your Marked For Later list
// @description  Adds "Marked for Later" and "Bookmarked Fics" buttons on the top navigation bar of AO3, as well as creates a "random works" button in marked for later list
// @author       Ellililunch
// @match        http://archiveofourown.org/*
// @match        https://archiveofourown.org/*
// @match        http://archiveofourown.org/works*
// @match        https://archiveofourown.org/works*
// @require      http://ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.min.js
// @require      https://code.jquery.com/jquery-2.2.4.js
// @run-at       document-idle
// @grant        none
// @match        *://*.archiveofourown.org/tags/*/works*
// @match        *://*.archiveofourown.org/works?*
// @match        *://*.archiveofourown.org/users/*/readings*show=to-read*
// @require      https://ajax.googleapis.com/ajax/libs/jquery/3.6.1/jquery.min.js
// @license      MIT
// ==/UserScript==



//////Puts Marked for Later Button on AO3 Home Bar///////////////
var $j = jQuery.noConflict();

$j(document).ready(function() {

    // From https://greasyfork.org/en/scripts/406616-ao3-no-rekudos/code
var greeting, username;
greeting = document.getElementById('greeting'); 
username = greeting.querySelector('a').href;
    
    // From https://stackoverflow.com/questions/43742732/use-javascript-or-jquery-to-create-an-href-url-using-variables-passed-in-through
var dynamicContent = "archiveofourown.org";
var username = ""+username+"";
var url = ""+username+"/readings?show=to-read";
$('#container').html('<a href="'+url+'">Marked for Later</a>');


    // From https://stackoverflow.com/questions/1145208/how-to-add-a-list-item-to-an-existing-unordered-list
$("ul.primary.navigation.actions").append('<li><a href="'+url+'"><span class="dropdown-toggle">Marked for Later</span></a></li>');
    
});


////////////////////////////////////////
///////////////AO3: Jump to a Random Work///////////// adds a "Random Work" button (top right corner) when viewing works in a tag/filter or your Marked For Later list
////////////////////////////////////////////////
(function($) {
    'use strict';

    // add a button
    var button = document.createElement('li');
    button.innerHTML = '<a href="#">Random Work</a>';
    button.addEventListener("click", RandomWork);
    if (location.href.indexOf('show=to-read') > 0) document.querySelector('div#main.readings-index ul.navigation.actions').appendChild(button);
    else document.querySelector('div#main.works-index div.navigation.actions.module ul.user.navigation.actions').appendChild(button);

    // when the button was pressed, read the number of works, pick a random one, and redirect there
    function RandomWork() {

        // Find number of pages. content of second-to-last <li> tells us
        var pageCount = parseInt($('ol.pagination').first().find('li').last().prev().text() || 1);

        // pick random whole number of the available pages
        const pageRandom = Math.floor((Math.random() * pageCount) + 1);

        // figure out which page we're currently viewing
        var thisPage = location.search.match(/page=(\d)+/);
        thisPage = thisPage === null ? 1 : parseInt(thisPage[1]); // match only works if URL contained a page (i.e. if not on page 1)

        // check: are we currently on the randomly chosen page?
        if (thisPage !== pageRandom) LoadRandomPage(pageRandom); // if not - read that page to find a random work link
        else Redirect2Work($('ol.work.index.group li.work.blurb')); // if yes - skip page loads, read a random work link from this page
    }

    function LoadRandomPage(r) {
        // build the URL of the page to load
        var pageURL = location.search.indexOf('page=') > 0 ? location.href.replace(/page=(\d)+/, 'page='+r) // replace existing page number
            : location.href + (location.href.indexOf('?') > 0 ? '&' : '?') + 'page='+r; // add page number if not yet in URL search parameters

        // grab the list of works from the page
        $.get(pageURL, function(response) {
        }).done(function(response) {
            Redirect2Work($(response).find('ol.work.index.group li.work.blurb'));

        // if that sent us to jail, set the ao3jail marker
        }).fail(function(data, textStatus, xhr) {
            console.log("Random Work script has hit Retry later", data.status);
            return false;
        });
    }

    function Redirect2Work(worksList) {
        // pick a random work from within the list
        var pick = Math.floor((Math.random() * worksList.length) + 1);

        // read that random work's URL and title
        pick = $(worksList[pick-1]).find('h4 a').first();
        var path = $(pick).attr('href');
        var title = $(pick).text();

        // jump to that work but warn the user
        alert('Redirecting you to a random work: '+title);
        window.location.assign(path);
    }

    function HideClearHistory(){
        var btn;
        btn = document.getElementById('Clear History');
        btn.style.display = "none";
    }


})(jQuery);

//////////////////////////////////////////
///////////////////////////////////////Put Bookmarks Button on AO3 Home//////////////////////////
///////////////////Puts the "Bookmarked Fics" button on the home page of AO3.

    var $j = jQuery.noConflict();

    $j(document).ready(function() {

        // From https://greasyfork.org/en/scripts/406616-ao3-no-rekudos/code
    var greeting, username;
    greeting = document.getElementById('greeting');
    username = greeting.querySelector('a').href;

        // From https://stackoverflow.com/questions/43742732/use-javascript-or-jquery-to-create-an-href-url-using-variables-passed-in-through
    var dynamicContent = "archiveofourown.org";
    var username = ""+username+"";
    var url = ""+username+"/bookmarks";
    $('#container').html('<a href="'+url+'">Bookmarked Fics</a>');


        // From https://stackoverflow.com/questions/1145208/how-to-add-a-list-item-to-an-existing-unordered-list
    $("ul.primary.navigation.actions").append('<li><a href="'+url+'"><span class="dropdown-toggle">Bookmarked Fics</span></a></li>');

    });