MetaFilter Thread Highlights
By Plutor
—
Last update Apr 8, 2008
—
Installed
179 times.
// ==UserScript==
// @name MetaFilter Thread Highlights
// @namespace http://plutor.org/
// @description Adds tabs to comment listings on MetaFilter: "All comments", and "Favorited comments"
// @include http://metafilter.com/*
// @include http://*.metafilter.com/*
// ==/UserScript==
// Any comment with at least MINIMUMFAVORITES favorites will be displayed
// under the "Favorite comments" tab.
var MINIMUMFAVORITES = 5;
var tabset;
var tab_all;
var tab_fav;
function mfc_init() {
var styleprefix = 'mefi';
var url = location.href.toLowerCase();
var styleprefix = url.match(/^https?:\/\/([^\/]*\.)?metafilter.com/);
styleprefix = styleprefix[1];
if (styleprefix == "metatalk." || styleprefix == 'podcast.') {
styleprefix = "meta";
} else if (styleprefix == "ask.") {
styleprefix = "ask";
} else if (styleprefix == "music.") {
styleprefix = "mefi"; // No tabs stylesheet for music?
} else {
styleprefix = "mefi";
}
url = url.replace(/^https?:\/\/([^\/]*\.)?metafilter.com/, '');
if (url.match(/^\/(\d+)/))
mfc_init_thread(styleprefix);
}
function mfc_init_thread(styleprefix) {
// Find the comments section and add the tabs
var alldivs = document.getElementsByTagName('div');
var post;
for (var i=0; i<alldivs.length; ++i) {
if (!post && alldivs[i].className == 'copy') {
// This is the post
post = alldivs[i];
break;
}
}
if (!post) return;
// Add the tabs css
head = document.getElementsByTagName('head')[0];
if (!head) return;
var stylelink = document.createElement('link');
stylelink.rel = 'stylesheet';
stylelink.type = 'text/css';
stylelink.href = 'http://styles.metafilter.com/mefi/tabs-' + styleprefix + '.css';
head.appendChild(stylelink);
// Add the tabs right after the comments section
tabset = document.createElement('ul');
tabset.id = 'maintab'; //ugh
tabset.className = 'shadetabs';
tabset.style.textAlign = 'left';
tabset.style.margin = '10px 60px 0 60px';
tabset.style.paddingLeft = '10px';
tab_all = document.createElement('li'); // First tab
tab_all.className = 'selected';
tab_all.style.cursor = 'pointer';
var tablink = document.createElement('a');
tablink.innerHTML = 'All comments';
tablink.addEventListener('click', mfc_show_all, false);
tab_all.appendChild(tablink);
tabset.appendChild(tab_all);
tab_fav = document.createElement('li'); // Second tab
tab_fav.style.cursor = 'pointer';
tablink = document.createElement('a');
tablink.innerHTML = 'Favorite comments (≥' + MINIMUMFAVORITES + ")";
tablink.addEventListener('click', mfc_show_favorites, false);
tab_fav.appendChild(tablink);
tabset.appendChild(tab_fav);
post.parentNode.insertBefore( tabset, post.nextSibling );
}
function mfc_show_favorites() {
if (!tabset || !tab_all || !tab_fav) return;
tab_all.className = '';
tab_fav.className = 'selected';
// Do it
var alldivs = document.getElementsByTagName('div');
var showed = 0;
for (var i=0; i<alldivs.length; ++i) {
if (alldivs[i].className == 'comments' &&
alldivs[i].id != 'prevDiv' && alldivs[i].id != 'prevDiv2') {
// Change all of the trailing brs into margin
var sib = alldivs[i].nextSibling;
while (sib) {
if (sib && sib.tagName) {
if (sib.tagName.toLowerCase() == 'br') {
var todelete = sib;
sib = sib.nextSibling;
todelete.parentNode.removeChild(todelete);
} else {
break;
}
} else {
sib = sib.nextSibling;
}
}
alldivs[i].style.marginBottom = '2em';
// Then hide
var commentspans = alldivs[i].getElementsByTagName('span');
for (var j=0; j<commentspans.length; ++j) {
if (commentspans[j].className == 'smallcopy' &&
commentspans[j].innerHTML.match(/^posted by/)) {
var matches = commentspans[j].innerHTML.match(/(\d+) favorites?/);
if (matches && matches.length > 1 &&
parseInt(matches[1]) >= MINIMUMFAVORITES) {
showed++;
} else {
alldivs[i].style.display = 'none';
}
break;
} // is smallcopy
} // loop spans
} // is a comment
} // loop divs
}
function mfc_show_all() {
if (!tabset || !tab_all || !tab_fav) return;
tab_all.className = 'selected';
tab_fav.className = '';
// Do it
var alldivs = document.getElementsByTagName('div');
for (var i=0; i<alldivs.length; ++i) {
if (alldivs[i].className == 'comments' &&
alldivs[i].id != 'prevDiv' && alldivs[i].id != 'prevDiv2') {
alldivs[i].style.display = 'block';
} // is a comment
} // loop divs
}
mfc_init();