Yarportal Ignore 2

Игнор для форумов на IPB 1.3

当前为 2014-11-19 提交的版本,查看 最新版本

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。

您需要先安装用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name        Yarportal Ignore 2
// @namespace   http://yarportal.ru
// @description Игнор для форумов на IPB 1.3
// @include     http://yarportal.ru/*
// @include     http://www.yarportal.ru/*
// @version     2.2.141119
// @grant       none
// @require     http://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js
// ==/UserScript==

// что за страника? Для списка тем и собственно темы разные обработчики
var curPageName = window.location.pathname.toString();

// инициализируем список игнора из локального хранилища
// localStorage.clear();
var ignoreList = localStorage.ignoreList ? JSON.parse(localStorage.ignoreList)  : {};
var ypignoreFlags = localStorage.ypignoreFlags ? JSON.parse(localStorage.ypignoreFlags) : {};
if (ypignoreFlags.ShowNames === undefined) ypignoreFlags.ShowNames = true;

// alert (JSON.stringify(ignoreList));
// alert (JSON.stringify(ypignoreFlags));

// чистим список. Если все флаги стоят false, то незачем их хранить. Только место занимают.
for (var k in ignoreList)
  {
    if (!ignoreList[k].hidePost && !ignoreList[k].hideQuote && !ignoreList[k].hideThread ) delete ignoreList[k];
  }
localStorage.ignoreList = JSON.stringify(ignoreList);

if (~curPageName.indexOf('forum')) {
// работаем со списком тем

// Сначала вставляем внизу DIV в который мы потом будем запихивать имена игнорируемых, если таковые будут
if (ypignoreFlags.ShowNames) $("div.darkrow2:last").after('<div class="row2" id="ignoreNamesHere" style="padding:4px" align="left"><strong>В игноре темы от: </strong> </div>');

// список тем, перебираем имена авторов
var authList = {};
var authors = $('form > div.tableborder > table > tbody > tr > td.row2 > a[href*="showuser"]');
authors.each(function ()
{
  // вылущиваем имя и ID
  var authorName = $(this).text();
  authorName = spcharReplace(authorName);
  var authorID = $(this).attr('href');
  var authorID = authorID.substring(authorID.indexOf('=') + 1);

  //собираем найденные уникальные пары ID:имя
  authList[authorID] = authorName;

  // и присваиваем строкам ID их авторов, чтоб потом проще прятать
  $(this).closest('tr').addClass(authorID);
  // за никами вставляем ссылку-кнопку, инициирующую удаление
  $(this).after(' <strong><a class="ignoreAdd" id="' + authorID + '" href="#" style="text-decoration: none" title="Игнорировать все темы этого пользователя">[-]</a></strong>');
});

//прячем темы, если есть что, и чтобы два раза не вставать выводим список игнора вконце
//кстати вконце выводим только тех кого реально прятали на этой странице, чтобы не путать бедных юзеров километровыми простынями, если список игнора большой
for (var k in ignoreList)
  {
    if (ignoreList[k].hideThread) 
      {
        var hidelen = $('.' + k).length;
        $('.' + k).hide();
        if (hidelen > 0 && ypignoreFlags.ShowNames) putName(k, 'Перестать игнорировать темы пользователя');
      }
  }
}




// работаем с сообщениями
if (~curPageName.indexOf('topic')) 
{
// Сначала вставляем внизу DIV в который мы потом будем запихивать имена игнорируемых, если таковые будут
if (ypignoreFlags.ShowNames) $("div.activeuserstrip:last").after('<div class="row2" id="ignoreNamesHere" style="padding:4px" align="left"><strong>В игноре посты от: </strong> </div>');

// список постов, перебираем имена авторов
var authList = {};
var authors = $('div.tableborder > table');
// > td.row4 > a[href*="javascript:ins"]
authors.each(function ()
{
  // вылущиваем имя и ID
  var authorName = $(this).find('span.normalname > a').filter(':first').text();
  // имя может быть пустым, если пост от удаленного пользователя, такие пропускаем
  if (authorName)
    {
      authorName = spcharReplace(authorName);
      var authorID = $(this).find('tr > td > span.postdetails > a').filter(':first').attr('href');
      var authorID = authorID.substring(authorID.indexOf('=') + 1);

      authList[authorID] = authorName;

      // и присваиваем целым таблицам ID их авторов, чтоб потом проще прятать
      $(this).addClass(authorID);
      // туда где жалоба вставляем ссылку на игнорирование пользователя
      $(this).find('td.row4 > div > a').filter(':first').before(' <strong><a class="ignoreAdd" id="' + authorID + '" href="#" style="text-decoration: none" title="Игнорировать все сообщения этого пользователя">[В игнор]</a></strong>&nbsp;&nbsp;&nbsp;');
    }
});
var authors = $('div.tableborder > table');
  
//прячем посты, если есть что, и чтобы два раза не вставать выводим список игнора вконце
//вконце выводим только тех кого реально прятали на этой странице, чтобы не путать бедных юзеров километровыми простынями, если список игнора большой
for (var k in ignoreList)
  {
    if (ignoreList[k].hidePost) 
    {
      var check = $('.' + k).length;
      $('.' + k).hide();
      if (check > 0 && ypignoreFlags.ShowNames) putName(k, 'Перестать игнорировать сообщения пользователя');

      var hideUser = ignoreList[k].Name;
      var hideUserN = '(' + hideUser + ' @';
      hideUserN = hideUserN.replace(/\&nbsp;/g, ' ');
//            alert (hideUser + ' : ' + hideUser.charCodeAt(4) + " : " + hideUserN);

      authors.each(function()
               {
                 var post = $(this);
                 var check = checkEquals(post.find('b'), hideUser);
                 check = check + checkContains(post.find('td'), hideUserN);
                 if (check > 0) post.hide();
               });

    }
  }
}




// здесь обрабатывается страница настроек
if (~curPageName.indexOf('index') && ~window.location.search.toString().indexOf('act=Msg&CODE=02')) 
{
  //вставляем новую плашку куда мы будем выводить список игнорируемых
  var txt = '';
  if (ypignoreFlags.ShowNames) txt = ' checked="checked" ';
  $("div.pformstrip:last").after('<br><div class="row2" id="ignoreNamesHere" style="padding:4px" align="left"><strong>&nbsp;В игноре темы и/или посты от: </strong></div><div class="row2" style="padding:4px" align="left">&nbsp;<b>Выводить список игнорируемых в списке тем/сообщений: <input type="checkbox" class="ShowNames" ' + txt + ' /></b></div>');
  for (var k in ignoreList)
    {
      var txt = "Игнорируются ";
      var appx = '';
      if (ignoreList[k].hidePost) {
        txt = txt + "сообщения";
        appx = " и ";
      }
      if (ignoreList[k].hideThread) txt = txt + appx + "темы";
      putName(k, txt + ". Удалить из списка.");
    }
}



//обработчик изменения чекбокса
$('input.ShowNames').on("click", function () {
  if (ypignoreFlags.ShowNames) { 
    ypignoreFlags.ShowNames = false;
  } else ypignoreFlags.ShowNames = true;
  localStorage.ypignoreFlags = JSON.stringify(ypignoreFlags);
});




// обработчик нажатия на [-]
$('a.ignoreAdd').click(function ()
{
  var authorID = $(this).attr('id');
  $('.' + authorID).hide();
  // если в списке игнора не было раньше такого ID, то создаём;
  if (ignoreList[authorID] === undefined)
  {
    ignoreList[authorID] = {};
    ignoreList[authorID]['Name'] = authList[authorID];
    ignoreList[authorID]['hidePost'] = false;
    ignoreList[authorID]['hideQuote'] = false;
    ignoreList[authorID]['hideThread'] = false;
  }
  if (~curPageName.indexOf('forum')) 
  {
    ignoreList[authorID].hideThread = true;
  } else 
    {
      ignoreList[authorID].hidePost = true;
      ignoreList[authorID].hideQuote = true;
    }
  localStorage.ignoreList = JSON.stringify(ignoreList);
  putName(authorID, 'Перестать игнорировать темы пользователя');

  return (false);
});




// обработчик нажатия на имя в списке игнора
$("body").on('click', '.ignoreRemove', function (){
  var authorID = $(this).attr('id');
  if (~curPageName.indexOf('forum')) 
  {
    $('.' + authorID).show();
    ignoreList[authorID].hideThread = false;
  } else if (~curPageName.indexOf('topic')) 
    {
      $('.' + authorID).show();
      ignoreList[authorID].hidePost = false;
      ignoreList[authorID].hideQuote = false;
    } else
      {
        delete ignoreList[authorID];
      }
  localStorage.ignoreList = JSON.stringify(ignoreList);
  $(this).remove();
  return (false);
});





// функция вывода имен игнорируемых со ссылками 
function putName(authorID, text)
{
  $("div.row2#ignoreNamesHere").append('<a href="#" class="ignoreRemove" id="' + authorID +'" title="' + text + '" style="text-decoration: none">'+ ignoreList[authorID].Name + ' :</a> ');
}



// поиск неполного совпадения внутри элементов, потребуется если надо найти в цитатах
function checkContains(elem, text) {
  var result = 0;
  elem.each(function () {
    if (~this.innerHTML.indexOf(text)) result++;
  });
  return result;
}

// поиск полного совпадения внутри элементов, потребуется если надо найти в обращениях к юзеру
function checkEquals(elem, text) {
  var result = 0;
  elem.each(function () {
    var i = $(this).html();
    if (i == text) result++;
  });
  return result;
}


// заменяем всякие разные символы на спецполседовательности
function spcharReplace (text) {
  text = text.replace(/&/g, '&amp;');
  text = text.replace(/ /g, '&nbsp;');
  text = text.replace(/ /g, '&nbsp;');
  text = text.replace(/</g, '&lt;');
  text = text.replace(/>/g, '&gt;');
  text = text.replace(/"/g, '&quot;')
  return (text);
}