LINUX.ORG.RU

Некропостинг и юзерскриптинг

 , некропостер, ,


2

1

Мне надоели некропостеры, которые поднимают старые темы бессмысленными сообщениями. Не хочу возвращать тему к жизни очередным ответом, оставленным по неосторожности, но каждый раз проверять даты сообщений достаточно утомительно. Нужно какое-то визуальное отличие.

Я долго собирался с силами, и вот недавно всё-таки осилил этот десяток строк на Javascript.

// SPDX-License-Identifier: MIT-0

// ==UserScript==
// @name     Highlight older messages on linux.org.ru
// @version  2
// @grant    none
// @include  https://www.linux.org.ru/*
// @run-at   document-end
// ==/UserScript==

(function () {
  
  // Configurables.
  const old_message_age = 30; // Days.
  const old_message_background = '#000000';
  // -------------

  document.querySelectorAll('div.sign time').forEach(function (element) {
    const element_datetime = Date.parse(element.attributes.datetime.value);
    const age_in_seconds = (Date.now() - element_datetime) / 1000;
    const age_in_days = age_in_seconds / 3600 / 24;
    
    if (age_in_days > old_message_age) {
      element.closest('article').style.background = old_message_background;
    }
  });
})();

★★★★★

Последнее исправление: i-rinat (всего исправлений: 2)

// SPDX-License-Identifier: MIT-0

// ==UserScript==
// @name     Highlight older messages on linux.org.ru
// @version  2
// @grant    none
// @include  https://www.linux.org.ru/*
// @run-at   document-end
// ==/UserScript==

(function () {
  
  // Configurables.
  const old_message_age = 30; // Days.
  const old_message_background = '#000000';
  // -------------

  const now = Date.now();
  document.querySelectorAll('div.sign time').forEach(function (element) {
    const element_datetime = Date.parse(element.attributes.datetime.value);
    const age_in_seconds = (now - element_datetime) / 1000;
    const age_in_days = age_in_seconds / 3600 / 24;
    
    if (age_in_days > old_message_age) {
      element.closest('article').style.background = old_message_background;
    }
  });
})();

Пофиксил программистской культуры ради

bga_ ★★★★
()
Ответ на: комментарий от i-rinat

А в новую тампонманкей пихать надо. Уже не торт.

Хотя что это я.

Valman_old
()
13 января 2019 г.
Ответ на: комментарий от deep-purple

Ваши форичи в моём браузере не работают

Что за браузер у тебя такой, что стандарт 2009 года не поддерживает, но поддерживает юзерскрипты?

i-rinat ★★★★★
() автор топика
Ответ на: комментарий от anonymous

В том, что какой-то дятел поднимает тему, а потом 100500 других начинают раздавать тривиальные и повторяющиеся советы ОП, который уже полтора года как забыл про тот тред. Лучше бы темы закрывались для всех, кроме автора, если нет активности пару недель.

t184256 ★★★★★
()
Ответ на: комментарий от t184256

закрывались для всех, кроме автора

А меня вот бесят апщики собственных тем, те, кому сказать больше нечего кроме «ап».

Так что нет, всё это лишнее, гость темы так же может притащить что-то полезное.

deep-purple ★★★★★
()
Ответ на: комментарий от i-rinat

FF ESR 45.2.0

У меня из-за этого форича пол гитхаба на интерактив не работает. А jsfiddle уже вообще давно не запускается. А казалось бы — и то и то разрабские сервисы.

deep-purple ★★★★★
()
Ответ на: комментарий от deep-purple

Да, действительно. У NodeList в Firefox 45 нет метода forEach, он появился только в 50. Но ты можешь продолжать некроманствовать с комфортом, инжектировав во все страницы polyfill для этого метода другим юзерскриптом.

i-rinat ★★★★★
() автор топика
Ответ на: комментарий от i-rinat

Вот такие они — современные разработчики, даже не думают за обратную совместимость. И ладно, если бы речь шла, например, о каком-нибудь локалсторадж, которого не было бы в каком-то браузере — тут разговор о том, как цикл написать, ведь ничего не стоит написать for вместо forEach. Смешно!

deep-purple ★★★★★
()
Ответ на: комментарий от deep-purple

Да и вообще зачем этот новомодный querySelector использовать? Можно же цикл написать и там отбирать нужные узлы!

i-rinat ★★★★★
() автор топика
Ответ на: комментарий от deep-purple

Ну ты же не пишешь эту пару строк. Вместо этого представляешь разработчиков какими-то криворучками. А они выбросили поддержку устаревших костылей, которые уже больше не нужны во всех актуальных браузерах.

Кому нужно — обеспечат совместимость сами. Я не вижу смысла писать с оглядкой на старые системы. Это неудобно.

i-rinat ★★★★★
() автор топика
Ответ на: комментарий от i-rinat

они выбросили поддержку устаревших костылей

Выбросили жопаскриптеры. А for как работал во всех браузерах, так и работает. Вот, разработчики браузеров — это разработчики. А то — макаки. Вот и ты этим течением увлекаешься.

deep-purple ★★★★★
()
Ответ на: комментарий от i-rinat

Мне кажется, for удобнее

let node_list = document.querySelectorAll('.class');

for (const v of node_list) {
console.log(v);
}

Можно пользоваться continue и break, в т.ч. для внешних control statement (break outer_loop;)

anonymous
()
Ответ на: комментарий от i-rinat

тема-то старая

И полугода не прошло ж! А тема вообще, видать, вечная...

и поднимают их всяким нерелевантным бредом

если не добавить в скрипт оценку релевантности поднимающего бреда )

GAMer ★★★★★
()
Ответ на: комментарий от EXL

Я не помню, зачем я это написал. Зачем? Ну, ноликов меньше :)

Virtuos86 ★★★★★
()
4 февраля 2020 г.
Ответ на: комментарий от gtk3

netsurf 2019 года выпуска

Он не умеет querySelector. Нет querySelector — нет результатов querySelector. Нет результатов — нечего итерировать.

$ rg querySelector
netsurf-all-3.9/netsurf/docs/UnimplementedJavascript.md
171:method | Element::querySelector();
172:method | Element::querySelectorAll();
1495:method | Document::querySelector();
1496:method | Document::querySelectorAll();
1580:method | DocumentFragment::querySelector();
1581:method | DocumentFragment::querySelectorAll();

netsurf-all-3.9/nsgenbind/test/data/idl/dom.idl
82:  Element? querySelector(DOMString selectors);
83:  [NewObject] NodeList querySelectorAll(DOMString selectors);

netsurf-all-3.9/netsurf/content/handlers/javascript/WebIDL/dom.idl
82:  Element? querySelector(DOMString selectors);
83:  [NewObject] NodeList querySelectorAll(DOMString selectors);
i-rinat ★★★★★
() автор топика

Наверное, эта тема будет жить вечно.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.