Вывод комментариев в виде дерева на Juick.com

Информация из этой статьи больше не актуальна. Смотрите новую версию скрипта.

Хороший сервис микроблогинга - Juick.com (я там тут вот @gansik), но по разным идеологическим причинам, разработчик не реализовывает всякие полезные фичи, типа вывода комментариев к записи в виде древовидного списка. Это бывает очень удобно, в случае если комментариев много, и не все они одинаково полезны (нормальная ситуация на этом сервисе, когда пару человек пишут комменты "в тему", а куча "петросянов" не в тему).

Для более удобного чтения обсуждений на Жуйк, я сделал букмарклет, который преобразовывает вывод комментов из потокового в иерархический. Всё что нужно это "перетащить" линк, приведёный ниже, в закладки, и находясь на сайте juick.com, выбирать эту закладку из избранного. Более побробно что такое букмарклет и как оно работает, читайте в википедии.

Линк, который надо перетащить в избранное -
Juick.com Древовидные комментарии

Букмарклет работает во всех распостранёных броузерах, но могут быть глюки, всё таки первая версия. Баги присылайте в комментах к посту, который я создам на juick.com. Там же и работу скрипта потестируем.

Вот код скрипта без обфускации, используйте его как хотите на свой страх и риск. Например этот код можно добавить как greasemonkey скрипт в Firefox.

/**
 * Tree view for Juick.com
 * Version 0.0.1
 * Gansik, /
 */
var juick_tree_view = {
IndentStep: 40,
MaxLevel:4,
get_nextsibling: function(n){
x=n.nextSibling;
while (x.nodeType!=1) x=x.nextSibling;
return x;
},
get_lastchild: function(n){
x=n.lastChild;
while (x.nodeType!=1) x=x.previousSibling;
return x;
},
run: function(){
var cmt = document.getElementById("replies");
if (cmt){
var cmts = cmt.getElementsByTagName("LI");
for (var i = 0; i < cmts.length; i++){
var oo = this.get_lastchild(this.get_lastchild(cmts[i]));
if (oo.tagName == "A"){
var oldLi = cmts[i];
var sId = String(oo.innerHTML).substring(1);
var parentLi = document.getElementById(sId);
var otstup = parseInt(parentLi.style.marginLeft);
(isNaN(otstup)) ?
otstup = this.IndentStep :
otstup += this.IndentStep;
if(otstup > this.IndentStep * (this.MaxLevel-1))
otstup = this.IndentStep * (this.MaxLevel-1);
var prevLi = this.get_nextsibling(parentLi);
var newLi = oldLi.cloneNode(1);
newLi.style.marginLeft = otstup + "px";
cmt.insertBefore(newLi,prevLi);
cmt.removeChild(oldLi);
}
}
}
}
};
juick_tree_view.run();

Если скрипт народ заинтересует, я добавлю скрытие веток обсуждения, и конвертацию представления обратно в потоковый вид.