Instantly share code, notes, and snippets.
-
Save ob1quixote/7ae7e906912fc18ae36d to your computer and use it in GitHub Desktop.
MeFi Navigator -- Navigate users' comments in MetaFilter threads.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// ==UserScript== | |
// @name MeFi Navigator | |
// @namespace http://www.metafilter.com/ | |
// @description Navigate users' comments in Metafilter threads. | |
// @version 1.3 | |
// @include http://*.metafilter.com/* | |
// @include http://metafilter.com/* | |
// @include https://*.metafilter.com/* | |
// @include https://metafilter.com/* | |
// @grant none | |
// ==/UserScript== | |
if (/.*metafilter\.com\/(\d{1,7}\/|mefi\/|comments\.mefi).*/.test(window.location)) { | |
var mfn_poster; | |
var mfn_all = []; | |
var mfn_div = document.createElement("div"); | |
mfn_preload(); | |
mfn_main(); // don't wait for page load event | |
} | |
function mfn_preload() { | |
mfn_you = mfn_user(); | |
var css = document.createElement("style"); | |
css.setAttribute("type","text/css"); | |
css.innerHTML = "#mfn-dot { padding:0 2px 0 2px;font-size:9pt;line-height:0; } #mfn-arrow { padding:0 2px 0 2px;font-size:10pt;line-height:0;} #mfn-list{padding:0 2px 0 2px;font-size:9pt;line-height:0;} #navigator-list a { -moz-opacity:0.9;background:#666;font-size:8pt;font-family:Arial,sans-serif;border:1px solid #CCC;border-top:none;margin:0;display:block;padding:1px 3px 1px 3px;text-align:center; } #navigator-list li { border:0;margin:0;padding:0;} #navigator-list a:hover { -moz-opacity:1;}"; | |
document.getElementsByTagName("head")[0].appendChild(css); | |
document.body.addEventListener("click",function() { mfn_div.innerHTML = "";mfn_div.style.display = "none"; },true); | |
mfn_div.setAttribute("id","navigator-list"); | |
mfn_div.setAttribute("style","display:none;position:absolute;left:0;top:0;padding:1px 0 0 0;"); | |
document.body.appendChild(mfn_div); | |
mfn_posterNode = document.createElement("span"); | |
mfn_posterNode.innerHTML = "Poster"; | |
mfn_posterNode.setAttribute("style","font-family:Arial,sans-serif;-moz-opacity:0.8;background:#D0D000;color:#222;margin-left:4px;padding:0px 2px 0px 2px;font-weight:bold;font-size:9px;line-height:0;"); | |
mfn_adminNode = mfn_posterNode.cloneNode(true); | |
mfn_adminNode.innerHTML = "Admin"; | |
mfn_adminNode.style.background = "white"; | |
mfn_userNode = mfn_adminNode.cloneNode(true); | |
mfn_userNode.innerHTML = "Me"; | |
mfn_userNode.style.background = "#CC9"; | |
mfn_userNode.style.color = "#333"; | |
mfn_zeroNode = document.createTextNode("No other comments."); | |
var htmlDot = "<b id=\"mfn-dot\">·</b>"; | |
var htmlLeft = "<a href=\"javascript:void(0);\" target='_self' id='mfn-arrow'>«</a>"; | |
var htmlList = "<a href=\"javascript:void(0)\" target='_self' id='mfn-list' onfocus='blur();'>≡</a>"; | |
var htmlRight = "<a href=\"javascript:void(0);\" target='_self' id='mfn-arrow'>»</a>"; | |
mfn_htmlFirst = htmlDot + htmlList + htmlRight; | |
mfn_htmlNormal = htmlLeft + htmlList + htmlRight; | |
mfn_htmlLast = htmlLeft + htmlList + htmlDot; | |
} | |
function mfn_user() { | |
var cookie = document.cookie.toString(); | |
var i = cookie.indexOf("USER_NAME"); | |
if (i == -1) { | |
return false; | |
} else { | |
var j = cookie.indexOf(';',i); | |
if (j == -1) j=cookie.length; | |
return unescape(cookie.substring(i+10,j)); | |
} | |
} | |
function mfn_main() { | |
var elements = document.evaluate('//div[@class="comments" or @class="copy" or @class="comments bestleft"]/span[@class="smallcopy" or @class="smallcopy postbyline"]',document.body,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null); | |
mfn_poster = elements.snapshotItem(0).getElementsByTagName('a').item(0).textContent.toString(); | |
for (var i=0,element;element = elements.snapshotItem(i);i++) { | |
var author = element.getElementsByTagName('a').item(0).textContent.toString(); | |
if (typeof(mfn_all[author]) == "object") { // 'splice' problem | |
mfn_all[author].push(element); | |
} else{ | |
mfn_all[author] = [element,]; | |
} | |
} | |
for (var author in mfn_all) { | |
for (var i = 0,lim=mfn_all[author].length;i<lim;i++) { | |
if (mfn_you != false && author == mfn_you) { | |
mfn_all[author][i].getElementsByTagName('a').item(0).appendChild(mfn_userNode.cloneNode(true)); | |
} | |
if (author == mfn_poster && i > 0) { | |
mfn_all[author][i].getElementsByTagName('a').item(0).appendChild(mfn_posterNode.cloneNode(true)); | |
} | |
if (lim==1) { | |
mfn_all[author][i].appendChild(mfn_zeroNode.cloneNode(false)); | |
} else { | |
var panel = document.createElement("span"); | |
var buffer = ["Other <small style='line-height:0;'>[",]; | |
buffer.push((i+1),"/",lim,"]</small>: "); | |
if (i==0) { | |
buffer.push(mfn_htmlFirst); | |
} else if (i==(lim-1)) { | |
buffer.push(mfn_htmlLast); | |
} else { | |
buffer.push(mfn_htmlNormal); | |
} | |
panel.innerHTML = buffer.join(""); | |
if (i > 0) panel.childNodes.item(3).addEventListener("click",function() {mfn_prev(this.parentNode);},true); | |
panel.childNodes.item(4).addEventListener("click",function() {mfn_list(this);},true); | |
if (i < (lim-1)) panel.childNodes.item(5).addEventListener("click",function() {mfn_next(this.parentNode);},true); | |
mfn_all[author][i].appendChild(panel); | |
} | |
} | |
} | |
} | |
mfn_prev = function (panel) { | |
var author = panel.parentNode.getElementsByTagName('a').item(0).childNodes.item(0).textContent; | |
var i = panel.textContent.substring(panel.textContent.indexOf("[")+1,panel.textContent.indexOf("/")); | |
if (author == mfn_poster && (i-2)==0) { | |
window.location = "#top"; | |
} else { | |
var link = mfn_all[author][i-2].getElementsByTagName('a').item(1).href; | |
if (link.indexOf("faq.metafilter.com") !== -1) { //staff have an extra anchor element to the faq, we don't want that one | |
link = mfn_all[author][i-2].getElementsByTagName('a').item(2).href; | |
} | |
window.location = link.substring(link.lastIndexOf("#")); | |
} | |
}; | |
mfn_list = function (icon) { | |
var author = icon.parentNode.parentNode.getElementsByTagName('a').item(0).childNodes.item(0).textContent; | |
var j = icon.parentNode.textContent.substring(icon.parentNode.textContent.indexOf("[")+1,icon.parentNode.textContent.indexOf("/"))*1; | |
var buffer = []; | |
if (author == mfn_poster) { | |
var link = "#top"; | |
} else { | |
var link = mfn_all[author][0].getElementsByTagName('a').item(1).href; | |
link = link.substring(link.lastIndexOf("#")); | |
} | |
buffer.push("<a href='"+link+"' target='_self' style='float:left;font-size:8px;border-right:none;background:#AAA;' title='first'>·<</a>"); | |
link = mfn_all[author][mfn_all[author].length-1].getElementsByTagName('a').item(1).href; | |
link = link.substring(link.lastIndexOf("#")); | |
buffer.push("<a href='"+link+"' target='_self' style='float:left;font-size:8px;background:#AAA' title='last'>>·</a>"); | |
buffer.push("<div id='navigator-scroll' style='clear:both;height:200px;overflow:auto;'>"); | |
for (var i=0,lim=mfn_all[author].length;i<lim;i++) { | |
if (author == mfn_poster && i==0) { | |
link = "#top"; | |
} else { | |
link = mfn_all[author][i].getElementsByTagName('a').item(1).href; | |
if (link.indexOf("faq.metafilter.com") !== -1) { | |
link = mfn_all[author][i].getElementsByTagName('a').item(2).href; | |
} | |
link = link.substring(link.lastIndexOf("#")); | |
} | |
buffer.push("<a href='"+link+"' target='_self' style='background:#"+(i%2==0?'AAA':'CCC')+((i+1)==j?';text-decoration:underline;color:white;':';')+"'>"+(i+1)+"</a>"); | |
} | |
buffer.push("</div>"); | |
mfn_div.innerHTML = buffer.join(""); | |
var rect = icon.getBoundingClientRect(); | |
var body = document.body | |
var docElem = document.documentElement | |
var scrollTop = window.pageYOffset || docElem.scrollTop || body.scrollTop; | |
var scrollLeft = window.pageXOffset || docElem.scrollLeft || body.scrollLeft; | |
var clientTop = docElem.clientTop || body.clientTop || 0 | |
var clientLeft = docElem.clientLeft || body.clientLeft || 0 | |
var menu_top_pos = rect.bottom + scrollTop - clientTop; | |
var menu_left_pos = rect.left + scrollLeft - clientLeft; | |
mfn_div.style.left = Math.round(menu_left_pos) + 'px'; | |
mfn_div.style.top = Math.round(menu_top_pos) + 'px'; | |
mfn_div.style.display = "block"; | |
mfn_div.childNodes.item(2).scrollTop = mfn_div.childNodes.item(2).childNodes.item(j-1).offsetTop-32; }; | |
mfn_next = function (panel) { | |
var author = panel.parentNode.getElementsByTagName('a').item(0).childNodes.item(0).textContent; | |
var i = panel.textContent.substring(panel.textContent.indexOf("[")+1,panel.textContent.indexOf("/")); | |
var link = mfn_all[author][i].getElementsByTagName('a').item(1).href; | |
if (link.indexOf("faq.metafilter.com") !== -1) { //staff have an extra anchor element to the faq, we don't want that one | |
link = mfn_all[author][i].getElementsByTagName('a').item(2).href; | |
} | |
window.location = link.substring(link.lastIndexOf("#")); | |
}; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment