Greasy Fork is available in English.

AO3: Links to First and Last Chapter

Add links to first and last chapter to AO3.

Pada tanggal 04 Januari 2018. Lihat %(latest_version_link).

// ==UserScript==
// @name          AO3: Links to First and Last Chapter
// @namespace    https://greasyfork.org/en/users/163551-vannius
// @version      1.1
// @description  Add links to first and last chapter to AO3.
// @author       Vannius
// @include       /^https?:\/\/archiveofourown\.org\/works\/\d+\/chapters\/\d+$/*
// @grant        none
// ==/UserScript==

(function() {
    // selectedTag exists only when there are several chapters.
    const selectedTag = document.getElementById('selected_id');
    if (!selectedTag) return;

    // Make hrefs to first and last chapter.
    const firstHref = window.location.href.split('/').slice(0, 6).join('/') + '/' + selectedTag.children[0].value;
    const lastHref = window.location.href.split('/').slice(0, 6).join('/') + '/' + selectedTag.children[selectedTag.children.length - 1].value;

    // Search location to add new link tags.
    const chapterIndexTag = document.getElementById('chapter_index').parentElement;
    const prevTags = chapterIndexTag.parentElement.getElementsByClassName('previous');
    const nextTags = chapterIndexTag.parentElement.getElementsByClassName('next');
    const navigationTags = document.getElementById('feedback').getElementsByClassName('actions');

    // When '← Previous Chapter' exists
    if (prevTags.length) {
        // When '← Previous Chapter' != first chapter
        if (prevTags[0].firstChild.href != firstHref) {
            // Make a link tag to frist chapter
            const firstLiTag = document.createElement('li');
            firstLiTag.className = 'chapter first';
            const firstATag = document.createElement('a');
            firstATag.href = firstHref;
            firstATag.appendChild(document.createTextNode('«'));
            firstLiTag.appendChild(firstATag);

            // Add the link tag to page's top
            prevTags[0].parentElement.insertBefore(firstLiTag.cloneNode(true), prevTags[0]);
            // Add the link tag to page's end
            for (let i = 0; i < navigationTags[0].children.length; i++) {
                if (navigationTags[0].children[i].firstChild.textContent.search(/Previous/) != -1) {
                    navigationTags[0].insertBefore(firstLiTag, navigationTags[0].children[i]);
                    break;
                }
            }
        }
    }

    // When 'Next Chapter →' exists
    if (nextTags.length) {
        // When 'Next Chapter →' isn't last chapter
        if (nextTags[0].firstChild.href != lastHref) {
            // Make a link tag to last chapter
            const lastLiTag = document.createElement('li');
            lastLiTag.className = 'chapter last';
            const lastATag = document.createElement('a');
            lastATag.href = lastHref;
            lastATag.appendChild(document.createTextNode('»'));
            lastLiTag.appendChild(lastATag);

            // Add the link tag to page's top
            nextTags[0].parentElement.insertBefore(lastLiTag.cloneNode(true), nextTags[0].nextElementSibling);
            // Add the link tag to page's end
            for (let i = 0; i < navigationTags[0].children.length - 1; i++) {
                if (navigationTags[0].children[i].firstChild.textContent.search(/Next/) != -1) {
                    navigationTags[0].insertBefore(lastLiTag, navigationTags[0].children[i + 1]);
                    break;
                }
            }
        }
    }
})();