Warning: fopen(/www/sites/update.greasyfork.icu/index/store/temp/630dcdefe78eb9ed4ee2f9e08822804e.js): failed to open stream: No space left on device in /www/sites/update.greasyfork.icu/index/scriptControl.php on line 65
// ==UserScript==
// @name fimfiction Add Comment Links
// @namespace http://tampermonkey.net/
// @version 0.1.1
// @description Make Comment counts in items into clickable links, or add a link if no count exists
// @author yrfoxtaur
// @match https://www.fimfiction.net/*
// @grant none
// @downloadURL https://update.greasyfork.icu/scripts/415854/fimfiction%20Add%20Comment%20Links.user.js
// @updateURL https://update.greasyfork.icu/scripts/415854/fimfiction%20Add%20Comment%20Links.meta.js
// ==/UserScript==
(function (){
//is this is a user's blog page?
var elemsToEdit = document.querySelectorAll("div.content_box.blog-post-content-box");
if (elemsToEdit.length > 1){
//Yup, this is a user's blog page.
elemsToEdit.forEach(el=>{
//for each blog post, get the href that points to the blog post's page,
//append the appropriate fragment, and insert the link just after the first classless b element
var selectedhref = el.querySelector("h1 span.resize_text a").getAttribute("href");
selectedhref += "#comment_list";
var cmlink = document.createElement('a');
var cmlinktarget = el.querySelector("div.information_box > b:not(.dot)");
var cmlinkinnertext = document.createTextNode("Comments");
var cmlinkpad = document.createTextNode(" ");
cmlink.setAttribute('href', selectedhref);
cmlink.appendChild(cmlinkinnertext);
cmlinktarget.parentElement.insertBefore(cmlinktarget.cloneNode(true), cmlinktarget);
cmlinktarget.parentElement.insertBefore(cmlinkpad, cmlinktarget);
cmlinktarget.parentElement.insertBefore(cmlink, cmlinktarget);
cmlinktarget.parentElement.insertBefore(cmlinkpad.cloneNode(), cmlinktarget);
});
} else {
//maybe it's a stor[y/ies] page?
elemsToEdit = document.querySelectorAll("article.story_container");
if (elemsToEdit.length >= 1){
elemsToEdit.forEach(el=>{
//for each story post, get the href that points to the blog post's page,
//append the appropriate fragment, and insert the link just after the first classless b element
var selectedhref = el.querySelector("a.story_name").getAttribute("href");
selectedhref += "#comment_list";
var cmlink = document.createElement('a');
var cmlinkcontent = el.querySelector("i.fa-comments").parentElement;
var cmlinktarget = cmlinkcontent.parentElement;
cmlink.setAttribute('href', selectedhref);
cmlink.appendChild(cmlinkcontent);
cmlinktarget.insertBefore(cmlink, cmlinktarget.querySelector("div.divider + div.divider"));
});
} else {
//last chance! a chapter page.
elemsToEdit = document.querySelectorAll("div.story-top-toolbar div.rating_container");
if (elemsToEdit.length == 1){
elemsToEdit.forEach(el=>{
//for each story post, get the href that points to the blog post's page,
//append the appropriate fragment, and insert the link just after the first classless b element
var selectedhref = "#comment_list";
var cmlink = document.createElement('a');
var cmlinkcontent = el.querySelector("i.fa-comments").parentElement;
var cmlinktarget = cmlinkcontent.parentElement;
cmlink.setAttribute('href', selectedhref);
cmlink.appendChild(cmlinkcontent);
cmlinktarget.insertBefore(cmlink, cmlinktarget.querySelector("div.divider + div.divider"));
});
} else {
//None of the above.
return;
}
}
}
})();
function AddCMLinks2Feed(e2e) {
'use strict';
if (e2e.length < 1){
//oops, called without e2e, or e2e contains no node[lists/s]
return(0);
} else {
//this is the feed. do the same as in anonymous function, but with different elements
e2e.forEach(el=>{
var els;
if (NodeList.prototype.isPrototypeOf(el)){
els = el[0];
} else {
els = el;
}
var selectedhref = els.querySelector("a.title").getAttribute("href");
selectedhref += "#comment_list";
var cmlink = document.createElement('a');
var cmlinktarget = els.querySelector("div.comment_count");
if (cmlinktarget === null){
return;
}
cmlink.setAttribute('href', selectedhref);
if (els.getAttribute("class").includes("feed_new_story")){
cmlink.appendChild(cmlinktarget.querySelector("b").nextElementSibling.nextSibling);
cmlinktarget.insertBefore(cmlink, cmlinktarget.querySelector("b").nextElementSibling.nextSibling);
} else if (els.getAttribute("class").includes("feed_blog_post")) {
cmlink.appendChild(cmlinktarget.firstChild);
cmlinktarget.insertBefore(cmlink, cmlinktarget.firstChild);
}
});
}
};
AddCMLinks2Feed(document.querySelectorAll("li.feed_item"));
let observer = new MutationObserver(mutations =>{
var mutts = [];
for(let mutation of mutations){
mutts.push(mutation.addedNodes);
}
AddCMLinks2Feed(mutts);
});
try{
observer.observe(document.querySelector("ul.feed"),{childList: true, subtree:false});
}
catch(err){
return;
}