MediaWiki:Common.js: различия между версиями

мНет описания правки
Нет описания правки
Строка 631: Строка 631:
     var ajaxElements = document.querySelectorAll('.ajax-load-link');
     var ajaxElements = document.querySelectorAll('.ajax-load-link');


     const BATCH_SIZE = 100;
     var BATCH_SIZE = 100;
     var queue = [];
     var queue = [];
     var processing = false;
     var processing = false;
Строка 663: Строка 663:
                 try {
                 try {
                     $.globalEval(scr.textContent || scr.innerText || "");
                     $.globalEval(scr.textContent || scr.innerText || "");
                 } catch (e) {
                 } catch (e) {}
                    console.warn("Ошибка при исполнении inline-скрипта:", e);
                }
                 parent.removeChild(scr);
                 parent.removeChild(scr);
             }
             }
Строка 676: Строка 674:


         mw.hook('wikipage.content').fire(newContainer);
         mw.hook('wikipage.content').fire(newContainer);
         mw.loader.load('//station14.ru/w/index.php?title=MediaWiki:Common.js&action=raw&ctype=text/javascript');
         mw.loader.load('//station14.ru/w/index.php?title=MediaWiki:Common.js&action=raw&ctype=text/javascript');
     }
     }


     async function processQueue() {
     function processQueue() {
         if (processing) return;
         if (processing) return;
         processing = true;
         processing = true;


         while (queue.length > 0) {
         function nextBatch() {
            if (queue.length === 0) {
                processing = false;
                return;
            }
 
             var batch = queue.splice(0, BATCH_SIZE);
             var batch = queue.splice(0, BATCH_SIZE);
             var promises = batch.map(function (job) {
             var remaining = batch.length;
                 return fetchParsedData(job.wikiText).then(function (data) {
 
                    if (data.parse && data.parse.text) {
            batch.forEach(function (job) {
                        var parsedHTML = data.parse.text["*"] || "";
                 fetchParsedData(job.wikiText)
                        applyParsedHTML(parsedHTML, job.placeholder);
                    .done(function (data) {
                    } else {
                        if (data.parse && data.parse.text) {
                        if (job.placeholder) job.placeholder.textContent = "API не вернул ожидаемых данных.";
                            var parsedHTML = data.parse.text["*"] || "";
                         console.warn("Ответ API:", data);
                            applyParsedHTML(parsedHTML, job.placeholder);
                     }
                        } else {
                }).catch(function () {
                            if (job.placeholder) job.placeholder.textContent = "API не вернул ожидаемых данных.";
                    if (job.placeholder) job.placeholder.textContent = "Ошибка при выполнении запроса к API.";
                         }
                });
                     })
                    .fail(function () {
                        if (job.placeholder) job.placeholder.textContent = "Ошибка при выполнении запроса к API.";
                    })
                    .always(function () {
                        remaining--;
                        if (remaining === 0) {
                            nextBatch();
                        }
                    });
             });
             });
            await Promise.allSettled(promises);
         }
         }


         processing = false;
         nextBatch();
     }
     }


Строка 710: Строка 719:
         if (!content.closest('.ajax-load-link')) {
         if (!content.closest('.ajax-load-link')) {
             var wikiText = content ? (content.textContent || content.innerText) : null;
             var wikiText = content ? (content.textContent || content.innerText) : null;
             if (!wikiText) {
             if (!wikiText) return;
                console.warn("У элемента отсутствует .ajax-load-content с вики-разметкой.");
                return;
            }


             var placeholder = document.createElement("div");
             var placeholder = document.createElement("div");
Строка 725: Строка 731:
     ajaxElements.forEach(function (element) {
     ajaxElements.forEach(function (element) {
         element.addEventListener('click', function () {
         element.addEventListener('click', function () {
             var content = element.querySelector('.ajax-load-content');
             var content = element.querySelector('.ajax-load-content');
             var wikiText = content ? (content.textContent || content.innerText) : null;
             var wikiText = content ? (content.textContent || content.innerText) : null;
 
             if (!wikiText) return;
             if (!wikiText) {
                console.warn("У элемента отсутствует .ajax-load-content с вики-разметкой.");
                return;
            }


             var placeholder = document.createElement("div");
             var placeholder = document.createElement("div");
Строка 739: Строка 740:


             queue.push({ wikiText: wikiText, placeholder: placeholder });
             queue.push({ wikiText: wikiText, placeholder: placeholder });
             processQueue();
             processQueue();
         });
         });