LINUX.ORG.RU

Что здесь можно сократить?

 , ,


0

1

У одного известного сайта конфликт с черногорским(?) регистратором доменов. В результате ему пришлось срочно переехать с домена t.me, на домен telegram.me. Часть веб-страниц поломалась, т.к. пытаются качать IFRAME-ы со старого домена.

Гугло-ИИ предложил короткий скрипт, который работал, но высота IFRAME была неверной. После долгой беседы DeepSeek выдал такой скрипт:

// ==UserScript==
// @name         t.me corrector
// @namespace    http://tampermonkey.net/
// @version      2026-07-14
// @description  replace "t.me" with "telegram.me"
// @author       DeepSeek
// @match        https://telegram.me/*
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    // Функция замены домена
    function replaceDomain(url) {
        try {
            const urlObj = new URL(url, window.location.href);
            if (urlObj.hostname.includes('t.me')) {
                urlObj.hostname = urlObj.hostname.replace(/t\.me/g, 'telegram.me');
                return urlObj.toString();
            }
        } catch (_) {}
        return url.replace(/t\.me/g, 'telegram.me');
    }

    // Функция подстройки высоты одного iframe
    function autoHeightIframe(iframe) {
        // Сначала убираем прокрутку и задаём начальную высоту
        iframe.style.overflow = 'hidden';
        //iframe.scrolling = 'no'; // для старых браузеров
        iframe.style.height = '100px'; // временная, чтобы сработало

        const adjustHeight = () => {
            try {
                // Доступ к содержимому возможен, т.к. домен совпадает
                const doc = iframe.contentDocument || iframe.contentWindow.document;
                if (!doc) return;

                // Вычисляем высоту содержимого (body + margin)
                const body = doc.body;
                const html = doc.documentElement;
                const height = Math.max(
                    body.scrollHeight,
                    body.offsetHeight,
                    html.clientHeight,
                    html.scrollHeight,
                    html.offsetHeight
                );

                // Устанавливаем новую высоту с небольшим запасом (опционально)
                iframe.style.height = height + 'px';
            } catch (e) {
                // Если доступ запрещён (неожиданно) – игнорируем
            }
        };

        // Подстраиваем после полной загрузки iframe
        iframe.addEventListener('load', () => {
            adjustHeight();
            // Настраиваем отслеживание изменений внутри iframe
            //setupObservers(iframe);
        });

        // Если iframe уже загружен (например, src установлен ранее)
        if (iframe.contentDocument && iframe.contentDocument.readyState === 'complete') {
            adjustHeight();
            //setupObservers(iframe);
        }
    }

    /*
    // Настройка наблюдателей за изменениями внутри iframe
    function setupObservers(iframe) {
        try {
            const doc = iframe.contentDocument;
            if (!doc) return;

            const target = doc.body;
            if (!target) return;

            // 1. ResizeObserver – отслеживает изменение размера элементов
            if (window.ResizeObserver) {
                const resizeObserver = new ResizeObserver(() => {
                    // При изменении размера пересчитываем высоту
                    const height = Math.max(
                        doc.body.scrollHeight,
                        doc.documentElement.scrollHeight,
                        doc.body.offsetHeight,
                        doc.documentElement.offsetHeight
                    );
                    iframe.style.height = height + 'px';
                });
                resizeObserver.observe(target);
                // Также наблюдаем за html, так как изменения могут быть там
                resizeObserver.observe(doc.documentElement);
            }

            // 2. MutationObserver – отслеживает добавление/удаление узлов
            const mutationObserver = new MutationObserver(() => {
                // Пересчёт высоты после изменения DOM
                const height = Math.max(
                    doc.body.scrollHeight,
                    doc.documentElement.scrollHeight,
                    doc.body.offsetHeight,
                    doc.documentElement.offsetHeight
                );
                iframe.style.height = height + 'px';
            });
            mutationObserver.observe(target, {
                childList: true,
                subtree: true,
                attributes: true,
                attributeFilter: ['style', 'class', 'height', 'width']
            });
        } catch (e) {
            // Если доступ запрещён – игнорируем
        }
    }
    */

    // Обработка одного элемента
    function processElement(el) {
        if (el.tagName === 'IFRAME') {
            // Заменяем src у iframe
            const src = el.getAttribute('src');
            if (src && src.includes('t.me')) {
                el.setAttribute('src', replaceDomain(src));
                // После замены src запускаем подстройку высоты
                autoHeightIframe(el);
            }
            return; // Не обрабатываем другие атрибуты у iframe
        }

        // Для остальных элементов заменяем href, src, action
        const attrs = ['href', 'src', 'action'];
        for (const attr of attrs) {
            if (el.hasAttribute(attr)) {
                const value = el.getAttribute(attr);
                if (value.includes('t.me')) {
                    el.setAttribute(attr, replaceDomain(value));
                }
            }
        }
    }

    // Обработка всех существующих элементов
    function processAllElements() {
        document.querySelectorAll('[href], [src], [action]').forEach(processElement);
    }

    // Запуск после загрузки DOM
    if (document.readyState === 'loading') {
        document.addEventListener('DOMContentLoaded', processAllElements);
    } else {
        processAllElements();
    }

    /*// Наблюдаем за динамически добавляемыми элементами
    const observer = new MutationObserver((mutations) => {
        for (const mutation of mutations) {
            for (const node of mutation.addedNodes) {
                if (node.nodeType === Node.ELEMENT_NODE) {
                    processElement(node);
                    node.querySelectorAll('[href], [src], [action]').forEach(processElement);
                }
            }
        }
    });
    observer.observe(document.body, {
        childList: true,
        subtree: true
    });*/
})();

Что в нём можно сократить? Помимо вызова observer.

★★★★★

По диагонали глянул, не эксперт. Если смущают два конструктора завернутые в отдельных наблюдателей и что на них висит прослушивание событий, то возможно копать в сторону «из коробки» в браузере.

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

вот как это сделано у меня в glide-browser

// redirects {{{
glide.autocmds.create("ConfigLoaded", async () => { const redirectRules: Record<string, string> = {
	'^https?://t.me/(.*)':'https://telegram.me/$1',
	'^https?://(?:www\\.)?youtube\\.com/shorts/([A-Za-z0-9_-]+)':'https://youtube.com/watch?v=$1'
	};
	async function request( details: browser.webRequest.OnBeforeRequestDetailsType,):
	browser.webRequest.RedirectOption | browser.webRequest.CancelOption {
		const url = details.url;
		for (const [pattern, replacement] of Object.entries(redirectRules)) {
			const re = new RegExp(pattern);
			const match = url.match(re);
			if (!match) continue;
			const newUrl = replacement.replace(/\$(\d+)/g, (full, groupIndexStr) => {
				const idx = Number(groupIndexStr);
				return match[idx] ?? full; });
			return { redirectUrl: newUrl }};
	return { cancel: false }; }

	browser.webRequest.onBeforeRequest.addListener( request, { urls: ['<all_urls>'], types: ['main_frame'] }, ['blocking'],);
});
// }}}	
BACR
()

Гугло-ИИ предложил короткий скрипт, который работал, но высота IFRAME была неверной. После долгой беседы DeepSeek выдал такой скрипт:

Что в нём можно сократить? Помимо вызова observer.

Так у своих бредогенераторов и спрашивай, что можно сократить. Ну или в Job. Ладно ещё когда сам писал, но когда «вот LLM мне наговнокодила, ЛОРчик, доделай» — это на мой взгляд, совсем уже наглость.

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

вот LLM мне наговнокодила

Разве подфорум не для обсуждения творчества LLM создавался?

ЛОРчик, доделай

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

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

Разве подфорум не для обсуждения творчества LLM создавался?

Нет.

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

Доделывать не прошу.

И сразу:

Но если кто-то разбирающийся скажет, что какой-то блок здесь лишний — буду рад.

Это и есть «доделывать». Ну, то есть, это 99% работы по доделыванию. Гордо выделить и нажать Del ты, конечно, соизволишь сам.

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

Половина скрипта оказалась сделана для фич, которых сайт не имеет. Знающий человек сразу сказал бы, что observer не нужен. Возможно, кто-то твёрдо знает, что не нужна обработка action или img. Для них сказать это — минутное дело.

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

Знающий человек сразу сказал бы, что observer не нужен. Возможно, кто-то твёрдо знает, что не нужна обработка action или img. Для них сказать это — минутное дело.

Сказать — минутное дело. А не сказать — двухминутное, но принципиально и методологически более правильное, хоть и отнимает больше сил. Ибо нефиг.

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

Существует glide-browser, в котором подобные вещи можно делать прямо в конфиге.

Как у него с перегруженными скриптами сайтами, вроде Youtube, Facebook или Twitter? Или с любителями вложенных таблиц и незакрытых тегов?

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

На момент создания темы ещё было заблокировано.

И вообще пригодится для старых сайтов на поломанном WordPress.

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

я мышевозю, не парюсь, так что не могу точно сказать, на yt сейчас проверил, вроде шустро работает

BACR
()
Ответ на: комментарий от question4

Да тут переделать проще чем нейрослоп править. Оно может и работает, но наговнокожено капитально.

ya-betmen ★★★★★
()
Ответ на: комментарий от LightDiver

Он хочет, чтобы ему то же самое написали нормально. Это делается в 12 строк вместо представленного (не уверен, что при этом все особенности целевого сайта учтены, я туда не ходил и не думаю). Но он ещё и стесняется попросить «напишите за меня 12 строк» вместо «сократите за меня 173 строки». В виду особенностей умественного развития (то ли реальнрого, то ли у роли, которую он играет, второе скорее), он считает (или скорее делает вид, что считает), что второе легче, чем перовое, хотя на самом деле наоборот.

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

Мне непонятно нахрена ему это. Да хоть в 300 строк - скрипт работает, чего еще надо. Или у него диск начала 90х и хранение платное.

LightDiver ★★★★★
()
  • Markdown
Пустая строка (два раза Enter) начинает новый абзац. Знак '>' в начале абзаца выделяет абзац курсивом цитирования.
Внимание: прочитайте описание разметки Markdown.
Используйте Ctrl-Enter для размещения комментария