|
DeadNews
Стаж: 13 лет 8 месяцев Сообщений: 2822
|
DeadNews ·
23-Июн-16 13:55
(8 лет 6 месяцев назад, ред. 23-Июн-16 13:55)
unchqua
Если текст с тегами BBCode, то не переносится.
Код:
bbcode.insertAtCursor("[box]aaa[/box]\[pre]nbbb[/pre]\[box]nccc[/box]");
|
|
Electr0man
Стаж: 12 лет 3 месяца Сообщений: 941
|
Electr0man ·
23-Июн-16 14:00
(спустя 5 мин.)
DeadNews писал(а):
70937720unchqua
Если текст с тегами BBCode, то не переносится.
Код:
bbcode.insertAtCursor("[box]aaa[/box]\n[pre]bbb[/pre]\n[box]ccc[/box]");
Ну как бы вот так должен переноситься, если я не нублю
|
|
DeadNews
Стаж: 13 лет 8 месяцев Сообщений: 2822
|
DeadNews ·
23-Июн-16 14:05
(спустя 4 мин., ред. 23-Июн-16 14:05)
Я нублю, понятно, спасибо.
|
|
unchqua
Стаж: 16 лет 5 месяцев Сообщений: 1060
|
unchqua ·
08-Июл-16 10:20
(спустя 14 дней)
Новая версия скрипта открытия непрочитанных тем. Небольшие улучшения, более аккуратное открытие закладок, увеличена задержка перед перезагрузкой страницы списка, в заголовке окна со списком в скобках пишется число непрочитанных тем.
скрытый текст
Код:
do { // 10. Открытие непрочитанных тем группами в новых вкладках. // Мы не на странице с темами - не работаем.
if (document.location.pathname !== "/forum/search.php" && document.location.pathname !== "/forum/viewforum.php")
break; var jq = window.$; // Сколько тем открывать за раз.
var topics_in_group = 4;
// Задержка между открытиями тем (миллисекунды).
var delay_open = 1000;
// Задержка перед перезагрузкой страницы списка после открытия группы тем (миллисекунды).
var delay_reload = 10000; // Все непрочитанные темы.
var unread_all = jq("div#main_content_wrap td.tt a[href$='&view=newest#newest'], div#main_content_wrap td.tLeft a[href$='&view=newest#newest']")/*.css("background-color", "red")*/; // Сколько всего непрочтённых? Сколько открываем в группе?
var topics_unread = unread_all.length;
var topics_to_open = topics_unread > topics_in_group ? topics_in_group : topics_unread; // Есть ли непрочитанные темы?
if (topics_to_open === 0) // Непрочитанных тем нет.
break; // Пишем в заголовке окна число непрочитанных сообщений.
document.title += " ("+topics_unread+")"; // Делаем кнопку.
var unread_button = jq("<a>").attr("href", "#").text("Непрочитанные ("
+ topics_to_open
+ (topics_to_open < topics_unread ? " из "+topics_unread : "")
+ ")")
// Действия по нажатию на кнопку.
.click(function(){ // Открываем следующую группу тем, если такие есть.
// Открытие постепенное, чтобы браузеру не поплохело.
unread_all
// Открываем темы в новом окне.
.attr("target", "_blank")
// Берём темы сверху списка по количеству в группе.
.filter(function (idx,elem) { return idx < topics_to_open; })
// Открываем каждую тему с задержкой.
.each(
function (idx, elem) {
window.setTimeout(function(){elem.click();}, idx*delay_open+100);
}
); // Обновляем страницу списка.
// Обновление отложенное, после открытия всех тем группы.
// Детали ниже.
window.setTimeout(function(){
// Перегружаем страницу, чтобы обновить состояния тем.
window.location.reload();
// Отмечаем весь форум как прочитанный (это фигово! все непрочитанные темы потеряют это состояние! но как один из вариантов).
//jq("table.w100.brand-fg div.nav > a.med.normal").click();
// Делаем то, что делается по нажатию кнопки строчкой выше. Оставлено как пример.
//BB.Cookies.set("bb_mark_read", "all_forums", "SESSION");
//window.location.reload();
}, topics_to_open*1000+delay_reload); // Возвращаем false, чтобы браузер не переходил по ссылке "#".
return false; }); // unread_button.click(...) // Помещаем нашу кнопку...
// ... перед "ЛС".
if (document.location.pathname === "/forum/viewforum.php")
jq("div.topmenu a[href='privmsg.php?folder=inbox']").before(unread_button, jq("<span>").text(" · "));
// ... после "Отметить всё прочитанным".
else if (document.location.pathname === "/forum/search.php")
jq("td div.nav a.med.normal:last").after(jq("<span>").text(" · "), unread_button); } while (false); // 10
По-прежнему не все открытые темы помечаются прочитанными, видимо, это из-за серверной логики форума: тема не считается прочитанной, если она открыта менее какого-то количества секунд назад, либо когда темы открываются быстро одна за другой. Мешает, но не сильно.
На подходе скрипт для входящих ЛС: реализация простого «чёрного списка».
|
|
RoxMarty
Стаж: 17 лет 9 месяцев Сообщений: 14633
|
RoxMarty ·
08-Июл-16 13:38
(спустя 3 часа)
unchqua писал(а):
71017698На подходе скрипт для входящих ЛС: реализация простого «чёрного списка».
Для всяких спамеров-однодневок - самое то!
P.S. Скрипт Blacklist (для комментариев в темах) из шапки темы работает исправно и который год избавляет меня от всяких троллей и прочих неадекватных личностей по-умолчанию - как будто их и нет на свете
|
|
unchqua
Стаж: 16 лет 5 месяцев Сообщений: 1060
|
unchqua ·
14-Июл-16 17:12
(спустя 6 дней, ред. 15-Июл-16 10:16)
Скрипт для входящих ЛС: реализация простого «чёрного списка».
скрытый текст
Код:
do { // 11. Фильтрация пользователей-новичков в ЛС. // Мы не на странице ЛС со входящими сообщениями - не работаем.
if (document.location.pathname !== "/forum/privmsg.php" || document.location.search.indexOf("?folder=inbox") === -1)
break; var jq = window.$; // Условия фильтрации сообщений.
//
// Минимальный возраст пользователя-автора (в днях).
// Меньше этого - с сообщениями пользователя надо что-то делать.
var MIN_AGE = 3; // Действия с сообщениями тех пользователей, кто попал под условия фильтра.
//
// Скрывать ли в списке?
var MESSAGES__HIDE = false;
// Удалять ли?
var MESSAGES__DELETE = false;
// Запрашивать ли подтверждение удаления?
var MESSAGES__CONFIRM_DELETE = true; // Идентификаторы и даты регистрации каждого пользователя.
// id -> дата, id -> дата ...
var user_registration_dates = {}; // Заполняем массив user_registration_dates - даты регистрации пользователей, что значатся авторами входящих сообщений на этой странице.
// Здесь же рассчитываем количество этих пользователей.
var users_count = 0;
jq("table.forumline tr[id^='tr-'].pm-row td.pm-nick-td a[href*='viewprofile']").each(function(idx, elem){
var user_profile_href = elem.getAttribute("href");
var user_id = user_profile_href.replace(/.+&u=(\d+)$/, "$1");
if (typeof user_registration_dates[user_id] === "undefined") {
user_registration_dates[user_id] = user_profile_href;
users_count++;
}
}); // Читаем из локального хранилища ранее запомненных пользователей.
// id -> дата, id -> дата ...
var users_cache = localStorage.getItem("gms_11_users") || "{}";
users_cache = JSON.parse(users_cache); // Заполняем user_registration_dates из кэша.
// Заодно считаем число пользователей, за данными о которых придётся идти на сервер.
var users_to_fetch = users_count;
for (var user_id in user_registration_dates) {
if (typeof users_cache[user_id] !== "undefined") {
user_registration_dates[user_id] = users_cache[user_id];
users_to_fetch--;
}
} // Определяем даты регистрации пользователей, запрашивая их персональные страницы с сервера.
// TODO Надо как-то информировать пользователя, что идёт процесс получения дат (user_idx от 1 до users_to_fetch).
var user_idx = 1;
for (var user_id in user_registration_dates) {
// Дата нам известна - не запрашиваем с сервера.
if (typeof user_registration_dates[user_id] === "number")
continue;
// Дата неизвестна - запрашиваем с сервера.
// Запрашиваем страницу профиля пользователя и читаем там дату его регистрации.
jq.get({
url: user_registration_dates[user_id],
success: function (data, status) {
var user_data = jq(data).find("table.user_details tr th");
for (var th_idx = 0; th_idx < user_data.size(); th_idx++) {
var user_registration_date = jq(user_data.get(th_idx));
if (user_registration_date.text() === "Зарегистрирован:") {
user_registration_date = user_registration_date.next().children("b").text();
break;
}
}
user_registration_date = user_registration_date.split("-");
user_registration_date = user_registration_date[0]*10000 + user_registration_date[1]*100 + user_registration_date[2]*1;
user_registration_dates[user_id] = user_registration_date;
user_idx++;
}
, async: false
});
}; // Запоминаем в локальном хранилище все найденные даты, чтобы потом не запрашивать их снова.
for (var user_id in user_registration_dates)
users_cache[user_id] = user_registration_dates[user_id];
localStorage.setItem("gms_11_users", JSON.stringify(users_cache)); // Определяем минимальную дату, позднее которой пользователь считается "слишком молодым".
var now = new Date();
var allowed_age = new Date(now.getTime() - MIN_AGE*24*60*60*1000);
now = now.getFullYear()*10000 + (now.getMonth()+1)*100 + now.getDate()*1;
allowed_age = allowed_age.getFullYear()*10000 + (allowed_age.getMonth()+1)*100 + allowed_age.getDate()*1; // Делаем что-то с сообщениями молодых.
var young_count = 0;
var messages_count = 0;
// Запоминаем id сообщений, с которыми потом будем что-то делать.
var messages = [];
for (var user_id in user_registration_dates) {
if (user_registration_dates[user_id] >= allowed_age) {
var link_to_profile = jq("table.forumline tr[id^='tr-'].pm-row td.pm-nick-td a[href*='mode=viewprofile'][href*='u="+user_id+"']");
var message_row = link_to_profile.parents("tr[id^='tr-'].pm-row");
var message_checkbox = message_row.find("input[name='mark[]']");
// Расставляем галочки у молодого.
message_checkbox.attr("checked","checked");
// Скрываем эту строку.
if (MESSAGES__HIDE)
message_row.hide();
// Запоминаем id всех сообщений молодого.
message_checkbox.each(function(idx,elem){
messages.push(parseInt(elem.value));
messages_count++;
});
young_count++;
}
} // Удаляем найденные сообщения.
if (MESSAGES__DELETE && messages_count > 0 && (!MESSAGES__CONFIRM_DELETE || window.confirm("Найдено сообщений новичков: "+messages_count+"\nУдалить?"))) {
// Вызываем удаление отобранных сообщений на сервере.
var form_data = {
"mode": "",
"delete": "1",
"confirm": "Да",
"form_token": window.BB.form_token
};
for (var idx = 0; idx < messages.length; idx++)
form_data["mark["+idx+"]"] = messages[idx];
//window.alert(JSON.stringify(form_data));
jq.post({
url: "privmsg.php?folder=inbox",
data: form_data,
success: function (data, status) {
window.alert("Удалено сообщений: " + messages_count);
}
//, async: false
});
} } while (false); // 11
От скрипта Blacklist отличается тем, что работает с личными сообщениям (Blacklist работает с сообщениями в темах) и умеет удалять сообщения, удовлетворяющие условиям фильтра, автоматически или по запросу (Blacklist их скрывает). Условие фильтрации и действия над найденными сообщениями настраиваются. Перед применением внимательно прочтите и поймите значения констант MESSAGES__ в начале скрипта, чтобы случайно не удалить нужные сообщения.
Предложения в разумных пределах принимаются .
|
|
unchqua
Стаж: 16 лет 5 месяцев Сообщений: 1060
|
unchqua ·
29-Июл-16 15:29
(спустя 14 дней)
Скрипт для входящих ЛС: из списка можно сразу сохранять выбранные сообщения (переносить в «Сохранённые»).
скрытый текст
Код:
do { // 12. Сохранение сообщений ЛС. // Мы не на странице ЛС со входящими сообщениями - не работаем.
if (document.location.pathname !== "/forum/privmsg.php" || document.location.search.indexOf("?folder=inbox") === -1)
break; var jq = window.$; // Новая кнопка "Сохранить отмеченное" рядом с "Удалить отмеченное".
var save_button = jq("<input>")
.attr("name", "save")
.attr("value", "Сохранить отмеченное")
.attr("type", "button")
.addClass("lite")
.css("margin-right", "14px"); // Основная работа.
save_button.click(function(){ // Все отмеченные для сохранения сообщения.
var messages_checked = jq("div#main_content_wrap table.forumline input[name='mark[]']:checkbox:checked");
var messages_count = messages_checked.length;
// Если ничего не отмечено, выходим.
if (messages_count === 0)
return; // Данные для отправки на сервер.
var form_data = {
"save": "Сохранить сообщение",
"form_token": window.BB.form_token
}; // По каждому отмеченному сообщению.
// TODO Надо как-то информировать пользователя, что идёт процесс сохранения (idx+1 от 1 до messages_count).
messages_checked.each(function(idx, elem){
var message_id = parseInt(elem.value);
form_data["mark[]"] = message_id;
// Вызываем сохранение отмеченного сообщения на сервере.
jq.post({
url: "privmsg.php?folder=inbox",
data: form_data,
success: function (data, status) {
//console.log("Сохранено сообщение "+(idx+1)+ " (id="+message_id+")");
}
, async: false
});
}); // Перезагрузка страницы после работы.
window.location.reload(); }); // save_button.click // Размещаем новую кнопку на странице.
jq("div#main_content_wrap tr:last input[name='delete']").before(save_button); } while (false); // 12
Под списком сообщений слева рядом с кнопкой «Удалить отмеченное» сделана новая кнопка «Сохранить отмеченное». Отмечаете галками нужные сообщения и жмёте кнопку, на фоне происходит сохранение каждого сообщения по отдельности (массовое сохранение не поддерживается форумом), после чего страница перегружается. Индикации работы нет и не видно, какое сообщение из всех выбранных сейчас сохраняется.
|
|
korne007
Стаж: 9 лет 10 месяцев Сообщений: 13
|
korne007 ·
30-Июл-16 12:42
(спустя 21 час)
"Kinopoisk+" перестал работать? Может есть какая-то альтернатива?
|
|
Xant1k
Стаж: 16 лет 7 месяцев Сообщений: 3701
|
Xant1k ·
30-Июл-16 14:11
(спустя 1 час 28 мин.)
korne007 писал(а):
71139342"Kinopoisk+" перестал работать? Может есть какая-то альтернатива?
В начале скрипта измени http на https.
|
|
Денис Пирожков
Стаж: 15 лет 2 месяца Сообщений: 1515
|
Денис Пирожков ·
31-Июл-16 09:20
(спустя 19 часов)
А можно как то сделать, чтобы поиск в скрипте "Кинопоиск+" шёл для некоторых трекеров на испанском языке? Вот сам сайт кинопоиск понимает названия на разных языках Dioses de Egipto, но вот как сделать, чтобы в скрипте шёл поиск не по английскому названию, а по испанскому, французскому, польскому. Можно ли это реализовать? Хотя бы для испанского сделать, а далее можно допетрить и на другие языки.
|
|
korne007
Стаж: 9 лет 10 месяцев Сообщений: 13
|
korne007 ·
31-Июл-16 10:44
(спустя 1 час 24 мин.)
Xant1k писал(а):
71139803
korne007 писал(а):
71139342"Kinopoisk+" перестал работать? Может есть какая-то альтернатива?
В начале скрипта измени http на https.
Супер, спасибо!
|
|
unchqua
Стаж: 16 лет 5 месяцев Сообщений: 1060
|
unchqua ·
31-Июл-16 11:49
(спустя 1 час 4 мин.)
Денис Пирожков писал(а):
71143819А можно как то сделать, чтобы поиск в скрипте "Кинопоиск+" шёл для некоторых трекеров на испанском языке?
Судя по коду скрипта, он сначала пробует найти оригинальное название фильма, а если не находит, то русскоязычное, так что если есть испанское название, поиск будет по нему.
|
|
unchqua
Стаж: 16 лет 5 месяцев Сообщений: 1060
|
unchqua ·
06-Окт-16 17:44
(спустя 2 месяца 6 дней, ред. 19-Сен-17 17:37)
Скрипт, которого некоторым не хватает: поиск текста в рамках одной темы. Штатный поиск форума ищет по названиям тем, а в разделах, где что-то обсуждается, интересно найти ответ по каким-то словам.
скрытый текст
Код:
// ==UserScript==
// @name Рутрекер 13. Поиск текста по сообщениям темы.
// @namespace http://www.unchqua.ru/ns/greasemonkey
// @include *://rutr.life/forum/*
// @include *://rutracker.net/forum/*
// @include *://rutracker.cr/forum/*
// @include *://torrents.loc/forum/*
// @version 1
// @grant none
// ==/UserScript== (function(){ // Мы не на странице темы - не работаем.
if (window.location.pathname !== "/forum/viewtopic.php" || !(window.location.search.indexOf("?t=") === 0 || window.location.search.indexOf("?p=") === 0))
return; // Определяем id темы.
var topic_id = $("a#topic-title").attr("href").replace(/.*\?t=(\d+).*$/, "$1"); // Определяем число страниц темы.
// Определяем число сообщений на странице темы.
// Определяем номер текущей страницы.
var last_page = 1;
var per_page;
var cur_page;
var nav_pages = $("table#pagination");
// Если навигации нет вообще, у нас только одна страница.
if (nav_pages.length === 0) {
last_page = 1;
per_page = $("table#topic_main tbody[id^='post_']").length;
cur_page = 1;
}
// Иначе читаем номер последней страницы.
else {
nav_pages = nav_pages.find("td.nav p:eq(1)").find("a.pg,b");
last_page = nav_pages.eq(-1);
last_page = nav_pages.eq(
last_page.text() === "След."
? -2 : -1);
last_page = parseInt(last_page.text());
cur_page = parseInt(nav_pages.filter("b").text());
per_page = $("table#topic_main tbody[id^='post_']").length;
} // Поле ввода текста поиска.
var input_searchtext =
$("<input>")
.attr("id","input_searchtext")
.attr("type","text")
.attr("title","Поиск текста в сообщениях темы")
.keypress(function(ev){
if (ev.keyCode === 13/* || ev.key === "Enter"*/) {
$("#button_searchtext").click();
}
}); // Кнопка начала поиска.
var button_startsearch =
$("<input>")
.attr("id", "button_searchtext")
.attr("type","button")
.addClass("med")
.attr("title","Поиск текста в сообщениях темы")
.val("Поиск")
.click(function(){ // Если текст поиска не введён, ничего не делаем.
var search_term = $("#input_searchtext").val();
if (typeof search_term !== "string" || search_term.length === 0)
return;
search_term = search_term.toUpperCase(); // Упрощаем текст: остаются только буквы, цифры, пробелы, дефис.
var simplify_text_re = /[^\w\s_абвгдеёжзийклмнопрстуфхцчшщъыьэюя-]/gi;
var simplify_text = function (s) {
return s.replace(simplify_text_re, "").replace(/\s+/, " ");
}
search_term = simplify_text(search_term); // Перевод <var> -> <img>.
var normalize_images_re = /<var class="([^"]+)" title="([^"]+)".*?>[\n.]+?<\/var>/gi;
var normalize_images = function (s) {
return s.replace(normalize_images_re, "<img class=\"$1\" src=\"$2\" alt=\"pic\"/>");
} // Удаляем все сообщения темы на текущей странице: будем пользоваться освободившимся местом для показа найденных сообщений.
$("table#topic_main tbody").remove();
// Скрываем строки навигации по страницам - они не имеют смысла.
$("h1.maintitle + p.small, table#pagination").hide(); // Получаем все страницы по очереди и ищем в них текст, найденные сообщения показываем.
// TODO Надо как-то информировать пользователя, что идёт процесс получения страниц с сервера (page_idx от 1 до last_page).
for (var page_idx = 1; page_idx <= last_page; page_idx++) {
// Поиск по сообщениям темы.
$.get({
url: "//" + window.location.hostname + "/forum/viewtopic.php?t="+topic_id+(page_idx>1?"&start="+((page_idx-1)*per_page):""),
async: false,
success: function (data, status) {
var page_data = $(data);
var post_elems = page_data.find("table#topic_main tbody[id^='post_']");
var found = [];
post_elems.each(function(post_idx, post_elem){
post_elem = $(post_elem);
var author_elem = post_elem.find("tr:first > td.poster_info > p.nick > a");
var body_elem = post_elem.find("tr:first > td.message div.post_wrap div.post_body");
var s = simplify_text(author_elem.text().toUpperCase() + " " + body_elem.text().toUpperCase());
// Если нашли текст, запоминаем все нужные данные сообщения.
if (s.indexOf(search_term) >= 0) {
found.push({
author_nick: author_elem.text(),
author_link: post_elem.find("tr:eq(1) a[href^='profile.php']").attr("href"),
post_link: post_elem.find("tr:first a.p-link").attr("href"),
post_time: post_elem.find("tr:first a.p-link").text(),
post_text: normalize_images(body_elem.html())
});
}
});
// Рисуем все найденные сообщения.
if (found.length > 0) {
var container = $("table#topic_main");
for (var idx = 0; idx < found.length; idx++) {
container.append($(
"<tbody class=\"row"+(idx%2+1)+"\"><tr><td class=\"poster_info td1\">"
+ "<p class=\"nick\"><a href=\""+found[idx].author_link+"\">"+found[idx].author_nick+"</a></p>"
+ "</td>"
+ "<td class=\"message td2\"><div class=\"post_head\">"
+ "<p class=\"post_time\"><span class=\"hl-scrolled-to-wrap\"><a class=\"p-link small\" href=\""+found[idx].post_link+"\">"+found[idx].post_time+"</a></span></p>"
+ "</div><div class=\"post_wrap\"><div class=\"post_body\">"+found[idx].post_text+"</div></div>"
+ "</td></tr></tbody>"
));
}
}
}
});
} }); // button_startsearch.click() // Добавляем поле ввода искомого текста и кнопку начала поиска.
$("ul#t-top-user-buttons").prepend($("<li>").append(input_searchtext, button_startsearch)); })();
Заходите на страницу темы, вверху справа на синей плашке, где
Мои сообщения [ добавить / удалить ]
, появляется поле ввода текста и кнопка поиска. По нажатию: удаляются все сообщения на странице, скрываются строки постраничной навигации (не имеют смысла), затем подряд! запрашиваются все страницы темы (если их сто, делайте выводы сами — трафик, время), в которых ищется нужный текст. Найденные сообщения заполняют освободившийся центр страницы.
Минусы:
- Никакой постраничной навигации по результату поиска, конечно же, нет и не будет.
- Не работают спойлеры: движок форума накладывает на них яваскрипты, а в моём топорном поиске они, само собой, отсутствуют.
- Выкачивает в браузер все страницы темы (только HTML без картинок, скриптов и стилей), для больших тем это тяжело и долго, а также это нагружает сервер, так что пользуйтесь ответственно.
- Если используете поиск по печатной версии, картинок в найденном не будет вообще. Отдельной печатной версии сайта больше не существует.
- Нет индикации, какая страница сейчас запрошена из общего числа страниц, то есть непонятно, когда поиск закончится.
- ???
То есть это решение «для бедных», упрощённый текстовой поиск. Как обычный поисковик: в результатах поиска пара предложений с найденными словами, а за подробностями — по ссылке.
Критика? Предложения?
|
|
RoxMarty
Стаж: 17 лет 9 месяцев Сообщений: 14633
|
RoxMarty ·
06-Окт-16 19:58
(спустя 2 часа 13 мин., ред. 10-Окт-16 20:34)
unchqua
Спасибо, что скриптописательство для народа продолжается. Надо будет потестить потом.
Строка поиска и кнопка появились. Кнопка нажимается и работает (вычленяются все собственные сообщения из соответствующей темы), а вот в строке поиска что не пиши - ничего не происходит. Точнее, ничего не находится. Даже если страница в теме одна и задаёшь своё слово, скопированное с любого поста. Или надо как-то по-другому делать? исправлено
|
|
unchqua
Стаж: 16 лет 5 месяцев Сообщений: 1060
|
unchqua ·
10-Окт-16 14:57
(спустя 3 дня, ред. 12-Май-17 12:37)
Исправил скрипт поиска по тексту и сильно его оптимизнул: теперь ищет не по обычной версии списка сообщений темы, а по печатной — значительно меньше трафика; печатные страницы быстрее генерируются сервером; не грузятся попусту картинки из сообщений. Минусы тоже добавились: картинок в найденном нет вообще.
Желающие могут пользоваться двумя поисками на выбор — один вариант оставьте, другой закомментируйте или удалите, в коде видно, что надо сделать.
Отдельной печатной версии сайта больше не существует.
|
|
Денис Пирожков
Стаж: 15 лет 2 месяца Сообщений: 1515
|
Денис Пирожков ·
15-Окт-16 12:22
(спустя 4 дня, ред. 17-Окт-16 10:35)
unchqua
Отличный скрипт по поиску, как его порой не хватало. Единственный нюанс очень не значительный, можно ли добавить функцию нажатия клавиши Enter на клавиатуре? А то по привычке вводишь содержание кляц по кнопки, а поиск не идёт и понимаешь, что тут мышкой нужно нажать на саму кнопку поиск. Не совсем удобно особенно когда заходишь планшетом на сайты и в строках поиска набираешь свой текст и тут по клавиатуре жмяк Enter и пошёл процесс. Если невозможно, что ж ладно и на этом спасибо. UPD:
Просьба выполнена, скрипт обновлен спасибо за работу автору.
|
|
DeadNews
Стаж: 13 лет 8 месяцев Сообщений: 2822
|
DeadNews ·
15-Окт-16 12:40
(спустя 17 мин.)
Можно добавить Кнопку рядом с названием темы, по нажатию на которую копируется ссылка ввида
Код:
[url=ссылка]название темы[/url]
т.е. Скрипты для торрент трекеров
|
|
unchqua
Стаж: 16 лет 5 месяцев Сообщений: 1060
|
unchqua ·
15-Окт-16 23:31
(спустя 10 часов, ред. 17-Окт-16 12:44)
Скриптец: копирование ссылки на текущую тему. Справа от заголовка кнопка R, по нажатию на которую появляется текстовое поле с выделенным текстом, остаётся нажать Ctrl-C.
скрытый текст
Код:
// ==UserScript==
// @name Рутрекер 14. Формирование ссылки на тему рядом с её названием.
// @namespace http://www.unchqua.ru/ns/greasemonkey
// @include *://rutr.life/forum/*
// @include *://rutracker.net/forum/*
// @include *://rutracker.cr/forum/*
// @include *://torrents.loc/forum/*
// @version 1
// @grant none
// ==/UserScript== (function(){ // Мы не на странице темы - не работаем.
if (window.location.pathname !== "/forum/viewtopic.php" || !(window.location.search.indexOf("?t=") === 0 || window.location.search.indexOf("?p=") === 0))
return; // Заголовок темы.
var title = $("#topic-title"); // Название темы и ссылка на неё.
var topic_text = title.text();
var topic_link = title.attr("href"); // Кнопка генерации ссылки.
var link_button =
$("<a>ℜ</a>")
.click(function(){ // Поле ввода с текстом ссылки.
var link_text =
$("<input id=\"\" type=\"text\" readonly>")
.attr("value", "[url="+topic_link+"]"+topic_text+"[/url]")
.attr("style", "margin:0 0 0 4px")
.mouseover(function(){this.select();})
.mouseout(function(){this.blur();});
// Помещаем поле вместо кнопки.
$(this).replaceWith(link_text);
// Выделяем весь текст ссылки для удобного копирования.
link_text.select();
return false; })
.attr("style", "background-color:white;padding:1px;border:1px solid;border-radius:3px;margin:0 0 0 4px;color:#993300;cursor:pointer;font-weight:bold"); // Помещаем кнопку после заголовка.
title.parent().append(link_button); })();
Создавайте файл скрипта в кодировке UTF-8, копируйте в него текст отсюда и устанавливайте в браузере.
|
|
salаm
Стаж: 15 лет 10 месяцев Сообщений: 20
|
salаm ·
25-Окт-16 12:36
(спустя 9 дней)
Народ всем доброго времени.
Как подружить скрипт BlackList с браузером Vivavldi? Или с каким-то другим.
Пробовал на огнелиса 49.0.2, не работает.
|
|
unchqua
Стаж: 16 лет 5 месяцев Сообщений: 1060
|
unchqua ·
27-Окт-16 10:12
(спустя 1 день 21 час, ред. 03-Окт-17 11:02)
salаm
Внёс минимальные изменения, теперь работает:
скрытый текст
Код:
// ==UserScript==
// @name Rutracker Blacklist
// @namespace rutr.life
// @description Personal ban-list
// @include http://rutr.life/forum/viewtopic.php*
// @author moscow-beast
// @license GPLv2
// @version 1.0
// ==/UserScript== // init vars
var trolls;
var topmenu;
var delimiter;
var scriptmenu;
var setuparea;
var hide;
var hidehtml;
var l10n = {
link_name : 'Blacklist',
save : 'Сохранить',
cancel : 'Отменить',
hide_users : 'Скрывать посты этих пользователей'
} function elemenateTrolls() {
var pnics = document.getElementsByClassName('nick')
var re = makeRegExp(trolls);
for (i=0; pnics[i]!=undefined; i++) {
nic = pnics[i].getElementsByTagName('a')[0];
if (re.test(nic.innerText)) {
nic.parentNode.parentNode.parentNode.parentNode.style.display='none';
}
}
}
function restorePosts() {
var posts1 = document.getElementsByClassName('row1');
var posts2 = document.getElementsByClassName('row2');
for (i=0; posts1[i]!=undefined; i++) if (posts1[i].style.display=='none') posts1[i].style.display='table-row-group';
for (i=0; posts2[i]!=undefined; i++) if (posts2[i].style.display=='none') posts2[i].style.display='table-row-group';
}
function menuClickHandler() {
if (setuparea.style.display == 'none') {
setuparea.style.display = 'block';
} else {
setuparea.style.display = 'none';
}
}
function updateSetup() {
setuparea.style.display = 'none';
trolls = document.getElementById('at_trollslist').value.replace(/[\n\l]{2,}/g, '\n');
document.getElementById('at_trollslist').value=trolls;
hide = document.getElementById('at_hide').checked;
localStorage.setItem('at_list', trolls);
localStorage.setItem('at_hide', hide);
restorePosts();
if (hide == true) elemenateTrolls();
}
function makeRegExp(list) {
var temp = list.split('\n');
return new RegExp("^"+temp.join("$|&")+"$|unknown_bug");
}
function initAT() {
topmenu = document.getElementById('dls-menu').getElementsByClassName('nowrap')[0];
delimiter = document.createTextNode('· ');
scriptmenu = document.createElement('a');
setuparea = document.createElement('div');
trolls = localStorage.getItem('at_list');
if (trolls == null) trolls = '';
hide = localStorage.getItem('at_hide');
if (hide == null) {
hide = 'false';
localStorage.setItem('at_list', 'false');
}
if (hide == 'false') hidehtml = '';
else hidehtml = ' checked';
var setupareahtml = '<textarea style="width: 320px; height: 320px;" id="at_trollslist">'+trolls+'</textarea>';
setupareahtml += '<p><label><input type="checkbox" '+hidehtml+' id="at_hide"> '+l10n.hide_users+'</label></p>';
setupareahtml += '<p style="text-align: right"><input type="button" id="at_cancel" value="'+l10n.cancel+'">';
setupareahtml += '<input type="button" id="at_save" value="'+l10n.save+'">';
setuparea.innerHTML=setupareahtml;
setuparea.style.backgroundColor="#EFEFEF";
setuparea.style.border="1px solid #CFD4D8";
setuparea.style.padding="5px";
setuparea.style.width="322px";
setuparea.style.margin="3px 5px 0";
setuparea.style.position="absolute";
setuparea.style.right="12px";
setuparea.style.textAlign="left";
setuparea.style.display = 'none';
setuparea.style.zIndex="1";
scriptmenu.innerText = l10n.link_name;
scriptmenu.setAttribute('href','javascript:void(0);');
scriptmenu.style.fontWeight='bold';
topmenu.appendChild(scriptmenu);
topmenu.appendChild(setuparea);
document.getElementById('at_save').addEventListener("click",updateSetup,false);
document.getElementById('at_cancel').addEventListener("click",function(){setuparea.style.display = 'none';},false);
scriptmenu.addEventListener("click",menuClickHandler,false);
if (hide == 'true') elemenateTrolls();
} initAT();
Скрипт старый, похоже был написан до некоторых изменений в коде форума, так что уже не работал. Осталась кривизна в том, что чтобы отобразить поле для ввода блокируемых, надо нажать трижды: сначала на стрелку справа от «Профиль», затем на пункт «Blacklist» (меню закрывается), затем снова на стрелку. Не стал разбираться, а вообще надо бы заново переписать.
Это всё скрипты для GreaseMonkey, плагина для Firefox. Для Chrome аналог Tampermonkey. Для других не знаю.
У RoxMarty скрипт работает.
Список сокрытия постов пользователей в темах.
Это не чёрный список ЛС, это другое, идея проста: вы не хотите видеть посты какого-то пользователя в темах.
скрытый текст
Код:
// ==UserScript==
// @name Рутрекер 16. Сокрытие сообщений пользователей в темах.
// @namespace http://www.unchqua.ru/ns/greasemonkey
// @include *://rutr.life/forum/*
// @include *://rutracker.net/forum/*
// @include *://rutracker.cr/forum/*
// @include *://torrents.loc/forum/*
// @version 1
// @grant none
// ==/UserScript== (function(){ // Заполнение элемента списка фильтруемых пользователей.
var update_list = function(blacklisted) {
var list = $("#rto16-list");
list.empty();
for (idx = 0; idx < blacklisted.length; idx++) {
var el_option = $("<option>");
el_option.text(blacklisted[idx]["nick"]+" ("+blacklisted[idx]["id"]+")");
el_option.val(blacklisted[idx]["id"]);
list.append(el_option);
}
$("#rto16-count").text(blacklisted.length);
}; // Мы на странице профиля - ведём список пользователей.
if (window.location.pathname === "/forum/profile.php") {
do { // Если это не мой профиль, не работаем.
if ($("#main_content_wrap > h1").text().indexOf("Мой профиль") === -1)
break; // Берём список заблокированных из хранилища.
var blacklisted_users = localStorage.getItem("rto16_blacklisted") || "[]";
blacklisted_users = JSON.parse(blacklisted_users); // Элемент списка фильтруемых пользователей.
var list = $("<select id=\"rto16-list\" multiple=\"multiple\" size=\"11\" style=\"width: 20em; float: left; margin-right: .5em; height: 17em;\">"); // Галочка включения-выключения фильтрации.
var enabled_checkbox = $("<input type=\"checkbox\" id=\"rto16-enabled\">").click(function(){
localStorage.setItem("rto16_enabled", this.checked);
});
enabled_checkbox
.css({"margin-left":".5em","margin-right":".5em"})
.prop("checked", localStorage.getItem("rto16_enabled") === "true"); // Переключатель вида скрытого: скрывать совсем или показывать кнопку открытия.
if (!localStorage.getItem("rto16_method"))
localStorage.setItem("rto16_method", "completely");
var method_completely_radio = $("<input type=\"radio\" id=\"rto16-method-completely\" name=\"rto16-method\" value=\"completely\"/>").click(function(){
localStorage.setItem("rto16_method", "completely");
});
method_completely_radio
.css({"margin":".5em .5em 0 0","vertical-align":"top"})
.prop("checked", localStorage.getItem("rto16_method") === "completely");
var method_showbutton_radio = $("<input type=\"radio\" id=\"rto16-method-showbutton\" name=\"rto16-method\" value=\"showbutton\"/>").click(function(){
localStorage.setItem("rto16_method", "showbutton");
});
method_showbutton_radio
.css({"margin":".5em .5em 0 2em","vertical-align":"top"})
.prop("checked", localStorage.getItem("rto16_method") === "showbutton"); // Надпись с количеством записей в списке.
var count_text = $("<span>(<span id=\"rto16-count\"></span>)</span>").css({"margin-left":".5em","margin-right":".5em"}); // Добавляем список в интерфейс.
var container = $("table.user_profile > tbody > tr:eq(1) > td:eq(1)");
container.append($(
"<fieldset id=\"rto16-container\" style=\"margin: 0 8px 3px;\">" +
"<legend>Скрывать посты</legend>" +
"<div style=\"padding: 4px;\"></div>" +
"</fieldset>"
));
container.find("#rto16-container div").append(list);
container.find("#rto16-container legend").prepend(enabled_checkbox).append(count_text); // Кнопка добавления записи.
var add_button = $("<input type=\"button\">").val("Добавить").click(function(){
var el_newusernick_text = $("#rto16-newusernick");
var newuser_nick = el_newusernick_text.val();
var el_newuserid_text = $("#rto16-newuserid");
var newuser_id = parseInt(el_newuserid_text.val()); // Правильно ли введён id пользователя.
if (isNaN(newuser_id)) {
el_newuserid_text.css({
"background-color": "#FF7F7F"
}).delay(400).queue(function(){
$(this).css({
"background-color": "white"
}).dequeue();
});
return;
} // Если логин не задан, составляем его сами.
newuser_id = parseInt(newuser_id);
if (newuser_nick.length === 0) {
newuser_nick = "Пользователь " + newuser_id;
} // Ищем, нет ли уже такого пользователя в списке.
var found = blacklisted_users.findIndex(function(user){
return newuser_id === user["id"];
});
// Если такой есть, не работаем.
if (found >= 0) {
el_newuserid_text.css({
"background-color": "#FF7F7F"
}).delay(400).queue(function(){
$(this).css({
"background-color": "white"
}).dequeue();
});
return;
} // Ищем место, куда добавить новую запись. Записи должны быть отсортированы по алфавиту.
for (var idx = 0; idx < blacklisted_users.length; idx++) {
if (blacklisted_users[idx]["nick"].toUpperCase() > newuser_nick.toUpperCase())
break;
} // Добавляем в начало списка.
if (idx === 0) {
blacklisted_users.unshift({"nick":newuser_nick,"id":newuser_id});
}
// Добавляем в конец списка.
else if (idx >= blacklisted_users.length) {
blacklisted_users.push({"nick":newuser_nick,"id":newuser_id});
}
// Добавляем в середину списка.
else {
for (var idx1 = blacklisted_users.length-1; idx1 >= idx; idx1--) {
blacklisted_users[idx1+1] = blacklisted_users[idx1];
}
blacklisted_users[idx] = {"nick":newuser_nick,"id":newuser_id};
} // Обновляем список.
update_list(blacklisted_users); // Очищаем поля ввода id и логина пользователя.
el_newusernick_text.val("");
el_newuserid_text.val(""); // Сохраняем список в хранилище.
localStorage.setItem("rto16_blacklisted", JSON.stringify(blacklisted_users));
}); // Кнопка удаления записи.
var remove_button = $("<input type=\"button\">").val("Удалить").click(function(){
var el_list = $("#rto16-list"); // Если ничего не выбрано, не работаем.
if (el_list.find("option:selected").length === -1)
return; // Удаляем выбранное из списка.
blacklisted_users = blacklisted_users.filter(function(user){
return el_list.find("option[value='"+user["id"]+"']:selected").length === 0;
}); // Обновляем список.
update_list(blacklisted_users); // Сохраняем список в хранилище.
localStorage.setItem("rto16_blacklisted", JSON.stringify(blacklisted_users));
}); // Добавляем элементы управления списком.
container.find("#rto16-container div").append(
$("<p style=\"margin-bottom: 2em;\">")
.append("<p style=\"font-size: smaller;\"><span style=\"font-weight: bold;\">Для добавления записи</span> введите логин пользователя и его цифровой id и нажмите на кнопку.<br/>Логин не обязателен, поиск будет производиться по Id.</p>")
.append("<input type=\"text\" id=\"rto16-newusernick\" placeholder=\"Логин\" size=\"12\" style=\"margin-right: .5em;\"/>")
.append("<input type=\"text\" id=\"rto16-newuserid\" placeholder=\"Id\" size=\"8\" style=\"margin-right: .5em;\"/>")
.append(add_button),
$("<p style=\"margin-bottom: 2em;\">")
.append("<p style=\"font-size: smaller;\"><span style=\"font-weight: bold;\">Для удаления записей</span> выберите одну или несколько строк и нажмите на кнопку.<br/>Несколько строк можно выбрать с помощью Ctrl или Shift.</p>")
.append(remove_button),
$("<p style=\"margin-bottom: 2em;\">")
.append("<p>Вид скрытия:</p>")
.append(method_completely_radio, $("<label for=\"rto16-method-completely\" style=\"vertical-align: top;\"><p>Полностью<br/><span style=\"font-size: smaller;\">Скрывать <span style=\"font-weight: bold;\">полностью</span>.</span></p></label>"))
.append(method_showbutton_radio, $("<label for=\"rto16-method-showbutton\" style=\"vertical-align: top;\"><p>Кнопка показа<br/><span style=\"font-size: smaller;\">Скрывать, но <span style=\"font-weight: bold;\">показывать</span> кнопку просмотра скрытого.</span></p></label>"))
); // Заполняем список значениями.
update_list(blacklisted_users); } while (false);
} // Страница своего профиля. // Мы на странице темы - фильтруем пользователей.
if (window.location.pathname === "/forum/viewtopic.php" && (window.location.search.indexOf("?t=") === 0 || window.location.search.indexOf("?p=") === 0)) {
do { // Если фильтрация не включена, не работаем.
var enabled = localStorage.getItem("rto16_enabled") === "true";
if (!enabled)
break; // Вид скрытия.
var method = localStorage.getItem("rto16_method") || "completely"; // Берём список заблокированных из хранилища.
var blacklisted_users = localStorage.getItem("rto16_blacklisted") || "[]";
blacklisted_users = JSON.parse(blacklisted_users);
// Если списка нет, нечего фильтровать, выходим.
if (blacklisted_users.length === 0)
break; // Ищем фильтруемых пользователей и скрываем их сообщения.
$("#topic_main tbody[id^='post_']").filter(function(idx,elem){ var post = $(elem);
var profile_link = post.find("tr:eq(1) a:eq(0)");
if (profile_link.length === 0)
return false;
var user_id = parseInt(profile_link.attr("href").replace(/.+&u=(\d+)$/, "$1"));
if (isNaN(user_id))
return false;
var found = blacklisted_users.findIndex(function(blacklisted){
return user_id === blacklisted["id"];
});
return found > -1; }).after(function(idx){ var post = $(this);
var user_nick = post.find("p.nick a").text();
var user_link = post.find("tr:eq(1) a:eq(0)").attr("href"); // Скрываем сообщение.
post.hide(); // Строка с информацией и возможностью посмотреть сообщение.
if (method === "showbutton") {
var replacer = $("<tbody id=\""+post.attr("id")+"_rto16_bl"+"\" class=\""+post.attr("class")+"\"><tr><td colspan=\"2\" class=\"message td2\"><div class=\"post_head\">" +
"<p class=\"post-time\">Скрыто сообщение от <a href=\""+user_link+"\">"+user_nick+"</a></p><p style=\"float: right; padding: 3px 2px 4px;\"></p>" +
"</div></td></tr></tbody>");
replacer.find("p:eq(1)").append(
$("<a>").data("post_id",post.attr("id")).addClass("txtb").attr("href","#").text("[Показать]")
.click(function(){
var anchor = $(this);
$("#"+anchor.data("post_id")).show();
$("#"+anchor.data("post_id")+"_rto16_bl").hide();
return false;
})
);
return replacer;
} }); } while (false);
} // Страница темы. })();
Ведение списка — на странице своего профиля в отдельной области: добавление/удаление записей, включение/выключение фильтрации, включение/выключение показа строки о заблокированном сообщении, число записей в списке.
В темах: сообщения от заблокированных скрываются, появляется информационная строка о том, кто скрыт, и справа кнопка показа, если всё же очень хочется почитать. Показ строки можно отключить в настройках.
|
|
RoxMarty
Стаж: 17 лет 9 месяцев Сообщений: 14633
|
RoxMarty ·
27-Окт-16 11:47
(спустя 1 час 34 мин., ред. 27-Окт-16 11:47)
unchqua писал(а):
71684181Хе-хе, Чёрный список пользователей
Работает! Ну, почти. Подробности в личку
|
|
maximus_lt
Стаж: 17 лет 6 месяцев Сообщений: 6132
|
maximus_lt ·
04-Ноя-16 22:30
(спустя 8 дней)
Как бы реализовать email уведомления о входящих ЛС ?
|
|
unchqua
Стаж: 16 лет 5 месяцев Сообщений: 1060
|
unchqua ·
05-Ноя-16 03:07
(спустя 4 часа)
maximus_lt
Если в сети есть публичный API, отправляющий мыло с переданными ему данными, реализовать остальное очень просто. Найдёте, сделаю.
|
|
Silverlink
Стаж: 14 лет 7 месяцев Сообщений: 3025
|
Silverlink ·
05-Ноя-16 09:47
(спустя 6 часов, ред. 05-Ноя-16 09:47)
unchqua
Хотел увеличить размер шрифта для одного сайта, но не удалось найти скрипт для GreaseMonkey.
На примере рутрекера можешь подсказать, как это сделать? FF 49.0.2
|
|
unchqua
Стаж: 16 лет 5 месяцев Сообщений: 1060
|
unchqua ·
05-Ноя-16 10:54
(спустя 1 час 6 мин.)
Silverlink
Для стилизации идеально подходит не GreaseMonkey, а расширение Stylish. Я как-то подзабросил им пользоваться, там всё очень легко, вот, например, кое-какая чистка интерфейса Рутрекера:
Код:
@namespace url(http://www.w3.org/1999/xhtml);
@-moz-document domain("rutr.life") {
/* Удаление полосы логотипа. */
#logo,
/* Блок рекламы в подвале страниц. */
#bn-bot-wrap,
/* Удаление подписей пользователей. */
div.signature
/* Не показываем. */
{ display: none !important; }
}
Думаю, из кода понятно, что делать. Пишете подобный файл, домен ставите какой надо, ищете элементы, шрифт которых надо увеличить, и устанавливаете себе буквы побольше. Просматривать стили удобно в инструментах разработчика Firefox. !important применяйте, чтобы перекрыть страничные стили своими, т.е. дать им высший приоритет. Ставьте расширение, добавляйте в него свой стилевой файл, и всё.
|
|
Silverlink
Стаж: 14 лет 7 месяцев Сообщений: 3025
|
Silverlink ·
05-Ноя-16 10:57
(спустя 3 мин., ред. 05-Ноя-16 10:57)
unchqua
Не хочу Stylish, хочу в GreaseMonkey это сделать.
Или там так нельзя?
|
|
unchqua
Стаж: 16 лет 5 месяцев Сообщений: 1060
|
unchqua ·
05-Ноя-16 11:52
(спустя 55 мин.)
Silverlink
Можно, например так:
Код:
var mystyle = document.createElement("STYLE");
mystyle.innerHTML = "body { font-size: 200% !important; }";
document.getElementsByTagName("head")[0].appendChild(mystyle);
Но Stylish удобнее, поверьте.
|
|
Silverlink
Стаж: 14 лет 7 месяцев Сообщений: 3025
|
Silverlink ·
05-Ноя-16 12:18
(спустя 26 мин.)
|
|
zombitv
Стаж: 14 лет 10 месяцев Сообщений: 440
|
zombitv ·
24-Ноя-16 07:49
(спустя 18 дней, ред. 24-Ноя-16 07:49)
unchqua
Спасибо за стиль, добавил туда
и вообще хорошо стало. Постоянно мешают большие подвалы при использовании кнопки прокрутки "в конец страницы".
Можете еще подсказать, как, на постоянно, минимизировать по высоте форму быстрого ответа? Но только именно на странице топика, а на странице редактирования сообщения, что бы форма ответа так как есть осталась? Желательно стилем.
|
|
unchqua
Стаж: 16 лет 5 месяцев Сообщений: 1060
|
unchqua ·
25-Ноя-16 11:15
(спустя 1 день 3 часа, ред. 25-Ноя-16 11:15)
Скриптец 18 для более удобного открытия непрочинанных тем, на которые вы подписаны.
В «Моих сообщениях» при нажатии на название темы переходишь на её первую страницу, а чтобы прочитать новые сообщения, нужно прицельно попасть в оранжевую папочку со стрелочкой. Мне это надоело.
скрытый текст
Код:
// ==UserScript==
// @name Рутрекер 18. Удобные ссылки на последние сообщения подписанных тем.
// @namespace http://www.unchqua.ru/ns/greasemonkey
// @include *://rutr.life/forum/*
// @include *://rutracker.net/forum/*
// @include *://rutracker.cr/forum/*
// @include *://torrents.loc/forum/*
// @version 1
// @grant none
// ==/UserScript== (function(){ do { // Мы не на странице с темами - не работаем.
if (document.location.pathname !== "/forum/search.php")
return; $("div#main_content_wrap td.tt a[href$='&view=newest#newest'], div#main_content_wrap td.tLeft a[href$='&view=newest#newest']")
.each(
function (idx, elem) {
elem = $(elem);
var topic_link = elem.siblings(".topictitle:first");
var tmp = elem.attr("href");
elem.attr("href", topic_link.attr("href"));
topic_link.attr("href", tmp);
}
); } while (false); })();
То есть скрипт просто меняет местами URL-ы ссылок: название темы теперь ведёт на первое непрочитанное сообщение, а папка — в начало темы.
Внимание! Этот код конфликтует со скриптом 10 массового открытия непрочитанных тем в отдельных закладках, так что запускайте его до того скрипта. Если держите для форума один большой код, куда вставляете мои скриптовые блоки, то суйте его до того кода из 10-ки, а если держите отдельные скрипты, то в их списке переместите его выше, до исполнения 10-ки. Жмите правой кнопкой на 18-м, в меню выбирайте
, и так до тех пор, пока он не окажется выше 10-ки. zombitv
Я где-то видел такое автоматическое расширение, по-моему в мобильном Chrome, но вот в настольном этого не вижу, а у вас это где? Для мобильников никогда не программировал, не знаю, как там вообще всё устроено.
|
|
|