Writing.com's Archive Navigation Enhancement

A script that I create to better navigate writing archived

Voor het installeren van scripts heb je een extensie nodig, zoals Tampermonkey, Greasemonkey of Violentmonkey.

Voor het installeren van scripts heb je een extensie nodig, zoals {tampermonkey_link:Tampermonkey}.

Voor het installeren van scripts heb je een extensie nodig, zoals Tampermonkey of Violentmonkey.

Voor het installeren van scripts heb je een extensie nodig, zoals Tampermonkey of Userscripts.

Voor het installeren van scripts heb je een extensie nodig, zoals {tampermonkey_link:Tampermonkey}.

Voor het installeren van scripts heb je een gebruikersscriptbeheerder nodig.

(Ik heb al een user script manager, laat me het downloaden!)

Voor het installeren van gebruikersstijlen heb je een extensie nodig, zoals {stylus_link:Stylus}.

Voor het installeren van gebruikersstijlen heb je een extensie nodig, zoals {stylus_link:Stylus}.

Voor het installeren van gebruikersstijlen heb je een extensie nodig, zoals {stylus_link:Stylus}.

Voor het installeren van gebruikersstijlen heb je een gebruikersstijlbeheerder nodig.

Voor het installeren van gebruikersstijlen heb je een gebruikersstijlbeheerder nodig.

Voor het installeren van gebruikersstijlen heb je een gebruikersstijlbeheerder nodig.

(Ik heb al een beheerder - laat me doorgaan met de installatie!)

	// ==UserScript==
// @name     Writing.com's Archive Navigation Enhancement
// @version         22
// @description A script that I create to better navigate writing archived
// @include  http*://web.archive.org/web/*writing.com*
// @include  http*://web.archive.org/web/*writingbk*
// @include  http*://web.archive.org/web/*writingbackupproject*
// @include  http*://web.archive.org/web/*writingbackup.000webhostapp*
// @namespace https://greasyfork.org/users/218817
// @require  http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js
// @grant    GM_addStyle
// ==/UserScript==

/////block warning messages/////
addJS_Node (null, null, overrideSelectNativeJS_Functions);

function overrideSelectNativeJS_Functions () {
    window.alert = function alert (message) {
        console.log (message);
    }
}

function addJS_Node (text, s_URL, funcToRun) {
    var D                                   = document;
    var scriptNode                          = D.createElement ('script');
    scriptNode.type                         = "text/javascript";
    if (text)       scriptNode.textContent  = text;
    if (s_URL)      scriptNode.src          = s_URL;
    if (funcToRun)  scriptNode.textContent  = '(' + funcToRun.toString() + ')()';

    var targ = D.getElementsByTagName ('head')[0] || D.body || D.documentElement;
    targ.appendChild (scriptNode);
}

//block annoying pops up
(function(){

/* PREFERENCE OPTIONS */
var remove_href_popups = "true"; // <a href="javascript:window.open ....
var remove_event_popups = "true"; // <a href="#" onclick="window.open ....
var remove_target_popups = "true"; // <a .... target="_blank"
var remove_script_popups = "true"; // all "in-page" script pop-ups - MAY BREAK LINK
var nullify_all = "true"; // nullifies open in all scripts (external too) - MAY BREAK LINK
var form_targets = "true"; // for <form .. target="_blank"
/* END OF PREFERENCE OPTIONS */

var allLinks, thisLink, L_att_vals, L_attr;
var allScriptTags, target_string;
var allForms, thisForm, F_att_vals, F_attr;

var expression = /(.)*(window\.open\([\'|\"])(https?\:\/\/)?(www\.)?([-_A-Z0-9\/\.]+[^#|?|\'|\"|\s])*/gi;

allLinks = document.evaluate(
			'//a',
			document,
			null,
			XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,
			null
			);
	for (var i = 0; i < allLinks.snapshotLength; i++)
	{
		thisLink = allLinks.snapshotItem(i);
		L_att_vals = thisLink.attributes;
		for (var j = 0; j < L_att_vals.length; j++)
		{
			L_attr = L_att_vals[j].value;
				if((L_att_vals[j].name == "href") && L_attr.match(expression) && (remove_href_popups == "true"))
			{
				thisLink.setAttribute("href", RegExp.$3 + RegExp.$4 + RegExp.$5);
			}
				if((L_att_vals[j].name != "href") && L_attr.match(expression) && (remove_event_popups == "true"))
			{
				thisLink.setAttribute("href", RegExp.$3 + RegExp.$4 + RegExp.$5);
				thisLink.setAttribute(L_att_vals[j].name, "");
			}
				if((L_att_vals[j].name == "target") && L_attr.match(/_blank/gi) && (remove_target_popups == "true"))
			{
				thisLink.setAttribute(L_att_vals[j].name, "_self");
			}

		}
	}

if(remove_script_popups == "true")
{
allScriptTags = document.evaluate(
			'//script',
			document,
			null,
			XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,
			null
			);
	for (var k = 0; k < allScriptTags.snapshotLength; k++)
	{
		target_string = allScriptTags.snapshotItem(k).innerHTML;
		if(target_string.match(/window\.open/gi))
		{
			target_string = target_string.replace(/window\.open/gi, "");
			var new_script_tag = document.createElement('script');
			new_script_tag.setAttribute("type","text/javascript");
			new_script_tag.innerHTML = target_string;
			document.body.appendChild(new_script_tag);
		}
	}
}

if(nullify_all == "true")
{
	var nulling_script_tag = document.createElement('script');
	nulling_script_tag.setAttribute("type","text/javascript");
	nulling_script_tag.innerHTML = "open = null;"
	document.body.appendChild(nulling_script_tag);
}

if(form_targets == "true")
{
allForms = document.evaluate(
			'//form',
			document,
			null,
			XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,
			null
			);
	for (var m = 0; m < allForms.snapshotLength; m++)
	{
		thisForm = allForms.snapshotItem(m);
		F_att_vals = thisForm.attributes;
		for (var n = 0; n < F_att_vals.length; n++)
		{
			F_attr = F_att_vals[n].value;
			if((F_att_vals[n].name == "target") && F_attr.match(/_blank/gi))
			{
				thisForm.setAttribute(F_att_vals[n].name, "_self");
			}
		}
	}
}

})();

/////block media fastclick bullshit/////
var linkList = document.querySelectorAll ("a");

Array.prototype.forEach.call (linkList, function (link) {
    if (link.hostname.includes("fastclick") ||
       link.hostname.includes("media.fastclick")) {
        //-- Block the link
        link.src = "javascript:void(0)";
        link.style = "text-decoration: none;background: #f3f315;";
    }
} );


var linkList = document.querySelectorAll ("a");

Array.prototype.forEach.call (linkList, function (link) {
    if (link.hostname.includes("_static") ||
       link.hostname.includes("_static")) {
        //-- Block the link
        link.src = "javascript:void(0)";
        link.style = "text-decoration: none;background: #f3f315;";
    }
} );

//Prevents Adblock Redirect and annoyances
window.onload = function() {
	var d = document;	// shorthand
	var scripts = d.getElementsByTagName('script');
	for(var i = 0; i < scripts.count; i++) {
		if(scripts[i].src.indexOf('dataStore.js') != -1) {
			scripts[i].src = '';
		}
	}
}


window.onload = function() {
	var d = document;	// shorthand
	var scripts = d.getElementsByTagName('script');
	for(var i = 0; i < scripts.count; i++) {
		if(scripts[i].src.indexOf('is.js') != -1) {
			scripts[i].src = '';
		}
	}
}


window.onload = function() {
	var d = document;	// shorthand
	var scripts = d.getElementsByTagName('script');
	for(var i = 0; i < scripts.count; i++) {
		if(scripts[i].src.indexOf('optionsadvert.js') != -1) {
			scripts[i].src = '';
		}
	}
}


/////block images and bullshit/////
var style = "text-align: right;position: fixed;z-index:9999999;bottom: 0;width: auto;right: 1%;cursor: pointer;line-height: 0;display:block !important;";
var elems = document.getElementsByTagName('div');
for (var i = 0; i < elems.length; i++)   {
    if(elems[i].getAttribute('style') == style) {
        elems[i].style.display = 'none';
    }
}

var images = document.getElementsByTagName ("img");
var x=0;
while(x<images.length)
{
if(images[x].src == "http://web.archive.org/web/20190713212940im_/https://i.imgur.com/MY7IEW1.gif")
{
images[x].src = "https://web.archive.org/web/20190714031110/https://i.imgur.com/S3jkJhG.gif";
}
x=x+1;
}

/////fix link redirection problem/////
var links,thisLink;
links = document.evaluate("//a[@href]",
    document,
    null,
    XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,
    null);

for (var i=0;i<links.snapshotLength;i++) {
    var thisLink = links.snapshotItem(i);

thisLink.href = thisLink.href.replace(RegExp('http(.*)://web.archive.org/web/(.*)https://www.writing.com/main/redirect(.*)&redirect_url=(.*?)'),
                                      'http://web.archive.org/web/$4');

thisLink.href = thisLink.href.replace(RegExp('http(.*)://web.archive.org/web/(.*)/item_id/(.*?)-(.*)\/action\/outline'),
                                      'https://archive.org/download/stories_files/stories.zip/$3.html');

thisLink.href = thisLink.href.replace(RegExp('http(.*)://web.archive.org/web/(.*)/item_id/(.*?)\/action\/outline'),
                                      'https://archive.org/download/stories_files/stories.zip/$3.html');
}

/////change all links from pages "chapter_edit/view/chapter_map" to "chapter_edit/view/chapter_map"/////
if (/\/chapter_edit\/view\/chapter_map/.test (location.pathname) ) {
var qLinks  = document.querySelectorAll ("a[href*='map']");

for (var J = qLinks.length - 1;  J >= 0;  --J) {
    var oldHref = qLinks[J].getAttribute ('href');
    var newHref = oldHref.replace (/\map/, "chapter_edit/view/chapter_map");

    //console.log (oldHref + "\n" + newHref);
    qLinks[J].setAttribute ('href', newHref);
}
}

/////change all links from pages "action/view/chapter_map" to "action/view/chapter_map"/////
else if (/\/action\/view\/chapter_map/.test (location.pathname) ) {
var qLinks  = document.querySelectorAll ("a[href*='map']");

for (var J = qLinks.length - 1;  J >= 0;  --J) {
    var oldHref = qLinks[J].getAttribute ('href');
    var newHref = oldHref.replace (/\map/, "action/view/chapter_map");

    //console.log (oldHref + "\n" + newHref);
    qLinks[J].setAttribute ('href', newHref);
}
}

/////change all links from pages "edit/view/chapter_map" to "edit/view/chapter_map"/////
if (/\/edit\/view\/chapter_map/.test (location.pathname) ) {
var qLinks  = document.querySelectorAll ("a[href*='map']");

for (var J = qLinks.length - 1;  J >= 0;  --J) {
    var oldHref = qLinks[J].getAttribute ('href');
    var newHref = oldHref.replace (/\map/, "edit/view/chapter_map");

    //console.log (oldHref + "\n" + newHref);
    qLinks[J].setAttribute ('href', newHref);
}
}

/////if page URL does not contain "/chapter_map/" or "/cid/" redirect to index instead first chapter when viewing page synopsis/////
if(document.URL.indexOf("/cid/") == -1)
if(document.URL.indexOf("/map/") == -1)
if(document.URL.indexOf("/chapter_map/") == -1)
{
var links,thisLink;
links = document.evaluate("//a[@href]",
    document,
    null,
    XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,
    null);

for (var i=0;i<links.snapshotLength;i++) {
    var thisLink = links.snapshotItem(i);

thisLink.href = thisLink.href.replace(RegExp('http(.*)://web.archive.org/web/200(.*)/item_id/(.*?)-(.*)\/map/1'),
                                      'https://archive.org/download/stories_files/stories.zip/$3.html');

thisLink.href = thisLink.href.replace(RegExp('http(.*)://web.archive.org/web/201[0-7](.*)/item_id/(.*?)-(.*)\/map/1'),
                                      'https://archive.org/download/stories_files/stories.zip/$3.html');

thisLink.href = thisLink.href.replace(RegExp('http(.*)://web.archive.org/web/201[8-9](.*)/item_id/(.*?)-(.*)\/map/1'),
                                      'https://archive.org/download/stories_files/stories.zip/$3.html');

thisLink.href = thisLink.href.replace(RegExp('http(.*)://web.archive.org/web/20[2-9](.*)/item_id/(.*?)-(.*)\/map/1'),
                                      'https://archive.org/download/stories_files/stories.zip/$3.html');
}
}

/////redirect "/action/view/" not founded pages to "/edit/view/" founded pages and vice-versa/////
if (/The Wayback Machine has not archived that URL/i.test (document.body.innerHTML) )
{
    if (/\/action\/view\/chapter_map/.test (location.pathname) ) {
    //alert ("This page is being redirect, please wait!");
        window.location = document.URL.replace("/action/view/","/edit/view/")
    }
}

if (/The Wayback Machine has not archived that URL/i.test (document.body.innerHTML) )
{
    if (/\/edit\/view\/chapter_map/.test (location.pathname) ) {
    //alert ("This page is being redirect, please wait!");
        window.location = document.URL.replace("/edit/view/","/action/view/")
    }
}



////adds redirect to "outline" on writingbackupproject archived pages////
if (/writingbackupproject/.test (location.pathname) )
if(document.URL.indexOf("outline.html") == -1) {
$("body").append ( '                                                \
    <div id="gmRightSideBar"><a href="outline.html">Outline</a></div>\
' );

GM_addStyle ( "                                                     \
    #gmRightSideBar {                                               \
        text-align:              center;                             \
        position:               relative;                              \
        top:                    60;                                  \
        font-family: sans-serif; \
        background:             white;                             \
        padding: 5px 10px;                                             \
        width:                  60%;                              \
        border:                5px solid black;                   \
        border-top: 0px; \
        height:                10%;                               \
        margin:                auto;                                \
    }                                                               \
" );
}


/////hide pop up/////
Array.from( document.querySelectorAll('div.test') )
  .filter( node => /\b(Handtekening|Thuis)\b/i.test(node.textContent) )
  .forEach( node => node.style.display = 'none' );


/////fix font problems that happens during archive/////
(function() {var css = [
	"#Top_Half_Page_Wrapper_Inner {",
	"    font-size: 13px!important;",
	"}",
	"",
	".norm {",
	"    font-size: 13px!important;",
	"}",
	"",
	"",
	".sblueroll {",
	"    font-size: 13px!important;",
	"}",
	"",
	".skinLinks {",
	"    font-size: 13px!important;",
	"}"
].join("\n");
if (typeof GM_addStyle != "undefined") {
	GM_addStyle(css);
} else if (typeof PRO_addStyle != "undefined") {
	PRO_addStyle(css);
} else if (typeof addStyle != "undefined") {
	addStyle(css);
} else {
	var node = document.createElement("style");
	node.type = "text/css";
	node.appendChild(document.createTextNode(css));
	var heads = document.getElementsByTagName("head");
	if (heads.length > 0) {
		heads[0].appendChild(node);
	} else {
		// no head yet, stick it whereever
		document.documentElement.appendChild(node);
	}
}
})();