Нравится ли вам дизайн? Контент? Что хотелось бы убрать/добавить. Нам необходимо это знать.
Ответить

Нужна информация про текущее место статьи на конкурсе?

Голосование закончилось Вт окт 01, 2013 16:45:44

Да, текущее
9
60%
Да, график изменений
3
20%
Нет
3
20%
 
Всего голосов : 15

Расширение страницы конкурса (таблица лидеров)

Чт сен 26, 2013 16:45:44

Вот сижу и думаю, зачем показаны результаты голосования на станице конкурса, и не показаны текущие лидеры. Ведь их приходится искать думая, а это утомительно.
Думаю, давай-ка расширю функционал... Покажу первые три места в каждой категории... А может все сортирую...
А давай и то и другое...

Собственно вот для отображения первых трех мест после всех:
Спойлер
Код:
javascript:(function()
{
   function compare(a,b)
   {
     if (a.mark < b.mark)
       return 1;
     if (a.mark > b.mark)
      return -1;
     return 0;
   }
   
   function article(row)
   {
      this.row = row;
      var votes = row.lastElementChild.innerText;
      var re = new RegExp('[0-9]+.?[0-9]?', 'g');
      var total = re.exec(votes);
      var totalVotes = re.exec(votes);
      this.mark = total/totalVotes
   };
   
   function category(row)
   {
      this.row=row;
      this.articles = new Array();
      
      this.AddArticle = function(row)
      {
         this.articles[this.articles.length] = new article(row);
      };
   }
   
   function categories()
   {
      this.categories = new Array();
      
      this.AddCategory = function(row)
      {
         this.categories[this.categories.length] = new category(row);
      };
      
      this.AddArticleToLastCategory = function(row)
      {
         this.categories[this.categories.length - 1].AddArticle(row);
      };
   }

   if(window.location.href !== 'http://radiokot.ru/konkurs/')
   {
      alert('Вы не на странице конкурса!');
      return;
   }

   var div = document.getElementById("hypercontext");
   var table = div.firstElementChild.children[3];
   var cats = new categories();

   for (var i = 0, row; row = table.rows[i]; i++)
   {
      if(row.firstElementChild.colSpan == 2)
      {
         cats.AddCategory(row);
      }
      else
      {
         cats.AddArticleToLastCategory(row);
      }
   }
   
   var newTable = document.createElement("table");
   newTable.className = "Tbl";
   newTable.width = "65%";
   newTable.border = "1";
   newTable.align = "center";
   
   var newTableBody = document.createElement("tbody");
   newTable.appendChild(newTableBody);
   
   for (var i = 0, cat; cat = cats.categories[i]; i++)
   {
      var newCatRow = cat.row.cloneNode(true);
      newCatRow.firstElementChild.colSpan = 3;
      newTableBody.appendChild(newCatRow);
      cat.articles.sort(compare);
      
      var counter = document.createElement("td");
      
      var first = cat.articles[0].row.cloneNode(true);
      counter.innerText = 1;
      first.insertBefore(counter.cloneNode(true),first.firstElementChild);
      newTableBody.appendChild(first);
      
      var second = cat.articles[1].row.cloneNode(true);
      counter.innerText = 2;
      second.insertBefore(counter.cloneNode(true),second.firstElementChild);
      newTableBody.appendChild(second);
      
      var third = cat.articles[2].row.cloneNode(true);
      counter.innerText = 3;
      third.insertBefore(counter.cloneNode(true),third.firstElementChild);
      newTableBody.appendChild(third);      
   }
   
   var par = document.createElement("p");
   par.align = "center";
   
   var txt = document.createElement("strong");
   txt.innerText = "Таблица лидеров";
   txt.style.fontSize = "20";
   par.appendChild(txt);
   
   div.appendChild(par);
   div.appendChild(newTable);

})();

и для отображения всех в порядке убывания
Спойлер
Код:
javascript:(function()
{
   function compare(a,b)
   {
     if (a.mark < b.mark)
       return 1;
     if (a.mark > b.mark)
      return -1;
     return 0;
   }
   
   function article(row)
   {
      this.row = row;
      var votes = row.lastElementChild.innerText;
      var re = new RegExp('[0-9]+.?[0-9]?', 'g');
      var total = re.exec(votes);
      var totalVotes = re.exec(votes);
      this.mark = total/totalVotes
   };
   
   function category(row)
   {
      this.row=row;
      this.articles = new Array();
      
      this.AddArticle = function(row)
      {
         this.articles[this.articles.length] = new article(row);
      };
   }
   
   function categories()
   {
      this.categories = new Array();
      
      this.AddCategory = function(row)
      {
         this.categories[this.categories.length] = new category(row);
      };
      
      this.AddArticleToLastCategory = function(row)
      {
         this.categories[this.categories.length - 1].AddArticle(row);
      };
   }

   if(window.location.href !== 'http://radiokot.ru/konkurs/')
   {
      alert('Вы не на странице конкурса!');
      return;
   }

   var div = document.getElementById("hypercontext");
   var table = div.firstElementChild.children[3];
   var cats = new categories();

   for (var i = 0, row; row = table.rows[i]; i++)
   {
      if(row.firstElementChild.colSpan == 2)
      {
         row.firstElementChild.colSpan = 3;
         cats.AddCategory(row);
      }
      else
      {
         cats.AddArticleToLastCategory(row);
      }
   }
   
   var newTable = document.createElement("table");
   newTable.className = "Tbl";
   newTable.width = "65%";
   newTable.border = "1";
   newTable.align = "center";
   
   var newTableBody = document.createElement("tbody");
   newTable.appendChild(newTableBody);
   
   for (var i = 0, cat; cat = cats.categories[i]; i++)
   {
      newTableBody.appendChild(cat.row.cloneNode(true));
      cat.articles.sort(compare);

      for(var j = 0, art; art = cat.articles[j]; j++)
      {
         var counter = document.createElement("td");
         counter.innerText = j + 1;
         /*Do it without copy to show main table with places*/
         art.row.insertBefore(counter,art.row.firstElementChild);
         newTableBody.appendChild(art.row.cloneNode(true));
      }
   
   }
   
   var par = document.createElement("p");
   par.align = "center";
   
   var txt = document.createElement("strong");
   txt.innerText = "Таблица лидеров";
   txt.style.fontSize = "20";
   par.appendChild(txt);
   
   div.appendChild(par);
   div.appendChild(newTable);

})();

Вставить в адресную строку браузера на странице конкурса.
На Firefox-е не будет работать. https://bugzilla.mozilla.org/show_bug.cgi?id=656433
IE - а кто пользуется? (тоже не работает, почему - не разбирался)
Opera - без проблем
Chrome - подтирает в начале строки "javascript:". Вставить код и вручную дописать вначале "javascript:".

(За код строго не судите - работаю со скриптом второй раз в жизни и писал быстро, глуповато в некоторых местах. И я прекрасно знаю, что можно лучше.)

Re: Расширение страницы конкурса (таблица лидеров)

Пт сен 27, 2013 21:38:50

Да но не забывайте что в этих результатах учтены голоса накрутчиков. Реальная картина будет доступна после сортировки голосов и вычеркивания голосов накрутчиков. 8)

Re: Расширение страницы конкурса (таблица лидеров)

Сб сен 28, 2013 12:26:37

Согласен, все может существенно изменится по окончании... Но мною управляло любопытство. Дважды. Кто же в лидерах? И смогу ли я написать что-то на JS.
Ответить