Add Wayback Machine Toolbar Toggler
This commit is contained in:
		
							parent
							
								
									b2f18e2841
								
							
						
					
					
						commit
						35231b7410
					
				| 
						 | 
				
			
			@ -66,3 +66,8 @@ Keyboard shortcuts:
 | 
			
		|||
- `Enter`/`Shift+Enter` on a crosspoted item: Open a crossposted item instead
 | 
			
		||||
  of its link (sometimes also opens its link, no idea how to fix)
 | 
			
		||||
- `Shift+Enter` on Continue this thread: Opens a thread in a new tab
 | 
			
		||||
 | 
			
		||||
## Wayback Machine Toolbar Toggler
 | 
			
		||||
 | 
			
		||||
A userscript that replaces the "close this toolbar" button with one that lets
 | 
			
		||||
you reopen the toolbar; its collapsed state is also saved
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,136 @@
 | 
			
		|||
// ==UserScript==
 | 
			
		||||
// @name        Wayback Machine Toolbar Toggler
 | 
			
		||||
// @namespace   blankie-scripts
 | 
			
		||||
// @match       https://web.archive.org/web/*
 | 
			
		||||
// @grant       GM.getValue
 | 
			
		||||
// @grant       GM.setValue
 | 
			
		||||
// @version     1.0.0
 | 
			
		||||
// @author      blankie
 | 
			
		||||
// @description Replaces the "close this toolbar" button with one that lets you reopen the toolbar; its collapsed state is also saved
 | 
			
		||||
// @inject-into page
 | 
			
		||||
// @run-at      document-start
 | 
			
		||||
// ==/UserScript==
 | 
			
		||||
 | 
			
		||||
"use strict";
 | 
			
		||||
 | 
			
		||||
let wmIppBase = null;
 | 
			
		||||
let wmIpp = null;
 | 
			
		||||
 | 
			
		||||
function hideToolbar() {
 | 
			
		||||
    wmIpp.querySelector("#wm-ipp-inside").style.display = "none";
 | 
			
		||||
 | 
			
		||||
    let openA = wmIpp.querySelector("#wmtt-open-toolbar");
 | 
			
		||||
    let baseHeight = wmIpp.querySelector("#donato").offsetHeight + openA.offsetHeight + (wmIpp.querySelector("#wm-ipp-inside").offsetHeight - wmIpp.querySelector("#wm-capinfo").offsetHeight);
 | 
			
		||||
    wmIppBase.style.height = `${baseHeight}px`;
 | 
			
		||||
    openA.style.display = "";
 | 
			
		||||
 | 
			
		||||
    GM.setValue("autoHideToolbar", true).catch(function(error) {
 | 
			
		||||
        console.error("Failed to set autoHideToolbar to true:", error);
 | 
			
		||||
    });
 | 
			
		||||
}
 | 
			
		||||
function showToolbar() {
 | 
			
		||||
    wmIpp.querySelector("#wm-ipp-inside").style.display = "";
 | 
			
		||||
    wmIppBase.style.height = "";
 | 
			
		||||
    wmIpp.querySelector("#wmtt-open-toolbar").style.display = "none";
 | 
			
		||||
 | 
			
		||||
    GM.setValue("autoHideToolbar", false).catch(function(error) {
 | 
			
		||||
        console.error("Failed to set autoHideToolbar to false:", error);
 | 
			
		||||
    });
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function handleWmIpp() {
 | 
			
		||||
    // Hook wm-tb-close for our own toolbar hider
 | 
			
		||||
    let close = wmIpp.querySelector("#wm-tb-close");
 | 
			
		||||
    let newClose = close.cloneNode(true);
 | 
			
		||||
    newClose.addEventListener("click", function(event) {
 | 
			
		||||
        event.preventDefault();
 | 
			
		||||
        hideToolbar();
 | 
			
		||||
    });
 | 
			
		||||
    close.replaceWith(newClose);
 | 
			
		||||
 | 
			
		||||
    // Add the "Open toolbar" button
 | 
			
		||||
    let openWrapper = document.createElement("div");
 | 
			
		||||
    openWrapper.style.paddingRight = "13px";
 | 
			
		||||
    openWrapper.style.textAlign = "right";
 | 
			
		||||
    openWrapper.style.whiteSpace = "nowrap";
 | 
			
		||||
    wmIpp.append(openWrapper);
 | 
			
		||||
 | 
			
		||||
    let openA = document.createElement("a");
 | 
			
		||||
    openA.id = "wmtt-open-toolbar";
 | 
			
		||||
    openA.className = "wm-btn wm-closed";
 | 
			
		||||
    openA.addEventListener("click", function(event) {
 | 
			
		||||
        event.preventDefault();
 | 
			
		||||
        showToolbar();
 | 
			
		||||
    });
 | 
			
		||||
    // hide by default
 | 
			
		||||
    openA.style.display = "none";
 | 
			
		||||
    // copy of #wm-expand to avoid duplicate ids
 | 
			
		||||
    openA.style.backgroundColor = "#666";
 | 
			
		||||
    openA.style.padding = "0 5px 0 3px";
 | 
			
		||||
    openA.style.borderRadius = "0 0 3px 3px";
 | 
			
		||||
    openA.style.textDecoration = "none";
 | 
			
		||||
    openA.setAttribute("role", "link");
 | 
			
		||||
    openA.style.cursor = "pointer";
 | 
			
		||||
    openWrapper.append(openA);
 | 
			
		||||
 | 
			
		||||
    let openIcon = document.createElement("span");
 | 
			
		||||
    openIcon.style.color = "white";
 | 
			
		||||
    openIcon.className = "iconochive-down-solid";
 | 
			
		||||
    openA.append(openIcon);
 | 
			
		||||
 | 
			
		||||
    let openText = document.createElement("span");
 | 
			
		||||
    openText.style.color = "white";
 | 
			
		||||
    openText.style.fontSize = "80%";
 | 
			
		||||
    // add leading whitespace
 | 
			
		||||
    openText.innerText = " Open toolbar";
 | 
			
		||||
    openA.append(openText);
 | 
			
		||||
 | 
			
		||||
    // Automatically hide toolbar on startup
 | 
			
		||||
    GM.getValue("autoHideToolbar", false).then(function(autoHideToolbar) {
 | 
			
		||||
        if (autoHideToolbar) {
 | 
			
		||||
            hideToolbar();
 | 
			
		||||
        }
 | 
			
		||||
    }).catch(function(error) {
 | 
			
		||||
        console.log("Failed to fetch autoHideToolbar:", error);
 | 
			
		||||
    });
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
// i hate IIFEs.
 | 
			
		||||
// Hook Element.prototype.attachShadow to get wm-ipp-base and its (closed) shadow root
 | 
			
		||||
let realAttachShadow = Element.prototype.attachShadow;
 | 
			
		||||
Element.prototype.attachShadow = function() {
 | 
			
		||||
    let shadowRoot = realAttachShadow.apply(this, arguments);
 | 
			
		||||
    if (this.id === "wm-ipp-base") {
 | 
			
		||||
        Element.prototype.attachShadow = realAttachShadow;
 | 
			
		||||
        wmIppBase = this;
 | 
			
		||||
        observer.observe(shadowRoot, {childList: true});
 | 
			
		||||
    }
 | 
			
		||||
    return shadowRoot;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// Hook wm-ipp-base's shadow root to get wm-ipp
 | 
			
		||||
let observer = new MutationObserver(function(mutations, observer) {
 | 
			
		||||
    for (let mutation of mutations) {
 | 
			
		||||
        if (mutation.type !== "childList") {
 | 
			
		||||
            continue;
 | 
			
		||||
        }
 | 
			
		||||
        for (let node of mutation.addedNodes) {
 | 
			
		||||
            let stop = handleNewNode(node, observer);
 | 
			
		||||
            if (stop) {
 | 
			
		||||
                observer.disconnect();
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
});
 | 
			
		||||
function handleNewNode(node, observer) {
 | 
			
		||||
    if (node.nodeType !== 1 || node.id !== "wm-ipp") {
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    wmIpp = node;
 | 
			
		||||
    handleWmIpp();
 | 
			
		||||
    return true;
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
		Reference in New Issue