У Juick.com день рождения
У хорошего сервиса микроблогинга Juick.com сегодня день рождения с чем я и поздравляю его создателя, товарища @ugnich! Год ему сегодня. Совсем молодой ещё. Желаю этому сервису всяческого развития и прироста пользователей. И в этот знаменательный день, у меня есть подарок всем пользователям сервиса- новая версия моего букмарклета, который показывает комментарии на Жуйке в виде дерева.
Первая версия получилась немного корявая и, как оказалось, подобное уже делали до меня. Так что я решил радикально всё улучшить, так что встречайте, новая версия:
Juick.com Tree View (перетащите этот линк себе в избранное)
Из улучшений:
- Сделал нормальную сортировку внутри веток (а не так как раньше- более новые вверху)
- Как мне кажется, решил проблему с характерной чертой Жуйка, вложенностью комментариев over 9000. Теперь если идет просто диалог двух чуваков, отступы не добавляются, ибо не нужны.
- Выделение цветом последних комментариев, где идёт реальная дискуссия.
Код скрипта без обфускации, для использования в greasemonkey.
// ==UserScript== // @name Tree view for Juick.com // @description Tree view for Juick.com // @namespace / // @include http://*.juick.com/* // @include http://juick.com/* // @version 0.0.2 // ==/UserScript== var juick_tree_view = { IndentStep: 20, MaxLevel:16, LeftBorderStyle:"3px double", LBColorNormal:"#89BDE6", LBColorLast:"#0E94E6", LBColorSuperLast:"#E64848", get_nextsibling: function(n){ x=n.nextSibling; while (x && x.nodeType!=1) x=x.nextSibling; return x; }, get_lastchild: function(n){ x=n.lastChild; while (x && x.nodeType!=1) x=x.previousSibling; return x; }, set_node_styles: function(n){ n.style.borderLeft = this.LeftBorderStyle + ' ' + this.LBColorNormal; n.style.backgroundPosition = "4px 0"; /* move avatar image to right */ n.style.backgroundPosition = "100% 0"; n.style.padding = "0 42px 0 10px"; /* remove replyto nickname */ var tmp = n.firstChild.firstChild; if(tmp && tmp.nodeType == 1 && String(tmp.innerHTML).substring(0,1) == '@'){ n.firstChild.removeChild(tmp); } }, make: function(){ var oUl = document.getElementById("replies"); if (oUl){ var oUlChilds = oUl.getElementsByTagName("LI"); for (var i = 0; i < oUlChilds.length; i++){ var oCurLi = oUlChilds[i]; var oSmall = this.get_lastchild(oCurLi); var oALast = this.get_lastchild(oSmall); var _level = 0; var _margin = 0; if (oALast.tagName == "A"){ var sId = String(oALast.innerHTML).substring(1); var parentLi = document.getElementById(sId); if (! parentLi) continue; var _level = parseInt(parentLi._level); (isNaN(_level))?_level=parentLi._level=0:_level+=1; if (isNaN(parseInt(parentLi._replies))) parentLi._replies = 1; else parentLi._replies += 1; var prevLi = this.get_nextsibling(parentLi); if(prevLi.id != oCurLi.id){ var tmp_lvl = parseInt(prevLi._level); while (! (isNaN(tmp_lvl) || (tmp_lvl < _level))){ prevLi = this.get_nextsibling(prevLi); tmp_lvl = parseInt(prevLi._level); } var newLi = oCurLi.cloneNode(1); oUl.insertBefore(newLi,prevLi); oUl.removeChild(oCurLi); oCurLi = newLi; } } oCurLi._level = _level; oCurLi._replies = 0; oCurLi._margin = this.IndentStep * _level; this.set_node_styles(oCurLi); } var oUlChilds = oUl.getElementsByTagName("LI"); for (var i = 0; i < oUlChilds.length; i++){ var _level = oUlChilds[i]._level; var _replies = oUlChilds[i]._replies; var _margin = parseInt(oUlChilds[i]._margin); /* set margins */ oUlChilds[i].style.marginLeft = oUlChilds[i]._margin + "px"; /* remove tree view for dialogs */ if ((_replies == 1) && (_level > 0)) { var oSibl = this.get_nextsibling(oUlChilds[i]); while (oSibl && oSibl._level > _level){ oSibl._margin = oSibl._margin - this.IndentStep; oSibl.style.marginLeft = oSibl._margin + "px"; oSibl = this.get_nextsibling(oSibl); } } /* mark last childs */ if ((_replies == 0) && (_level > 0)) { oUlChilds[i]._margin = _margin + this.IndentStep; oUlChilds[i].style.marginLeft = oUlChilds[i]._margin + "px"; if (i >= oUlChilds.length - 5) oUlChilds[i].style.borderLeft = this.LeftBorderStyle + ' ' + this.LBColorSuperLast; else oUlChilds[i].style.borderLeft = this.LeftBorderStyle + ' ' + this.LBColorLast; } /* check max level */ if (_margin > (this.MaxLevel * this.IndentStep)){ oUlChilds[i]._margin = this.MaxLevel * this.IndentStep; oUlChilds[i].style.marginLeft = oUlChilds[i]._margin + "px"; } } } } }; juick_tree_view.make();
Дальнейшего развития для этого скрипта я не планирую, так что просто пользуйтесь. Баги, если таковые будут найдены, я поправлю.
В заключение, как оно всё выглядит после того как скрипт сделает свою грязную работу по улучшению внешнего вида