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

Материал из Revera Wiki
Нет описания правки
Нет описания правки
 
(не показано 28 промежуточных версий этой же участницы)
Строка 1: Строка 1:
/* Размещённый здесь код JavaScript будет загружаться пользователям при обращении к каждой странице */
 
$(document).ready(function() {
$(document).ready(function() {
     // Найти панель навигации (можно заменить на другую панель, если нужно)
     function fetchReverinYear(callback) {
     let sidebar = document.getElementById("p-navigation");
        $.ajax({
            url: "/wiki/index.php?title=Шаблон:Текущий_год_Альдморры&action=raw",
            dataType: "text",
            success: function(data) {
                let reverinYear = parseInt(data.trim(), 10);
                if (!isNaN(reverinYear)) {
                    console.log("Год Альдморры загружен:", reverinYear);
                    callback(reverinYear);
                } else {
                    console.error("Ошибка: невозможно прочитать год.");
                    callback(null);
                }
            },
            error: function() {
                console.error("Ошибка загрузки шаблона.");
                callback(null);
            }
        });
     }
 
    function fetchGuardian(year, callback) {
        $.ajax({
            url: "/wiki/index.php?title=Шаблон:Хранители_лет&action=raw",
            dataType: "text",
            success: function(data) {
                let lines = data.split("\n");
                let guardian = "Неизвестный Хранитель";
 
                for (let line of lines) {
                    let parts = line.split("=");
                    if (parts.length === 2) {
                        let storedYear = parseInt(parts[0].trim(), 10);
                        if (storedYear === year) {
                            guardian = parts[1].trim();
                            break;
                        }
                    }
                }
 
                console.log(`Хранитель для ${year}: ${guardian}`);
                callback(guardian);
            },
            error: function() {
                console.error("Ошибка загрузки Хранителей лет.");
                callback("Неизвестный Хранитель");
            }
        });
    }
 
    function isReverinLeap(year) {
        return [1, 5, 9, 13, 17, 22, 26, 30].includes(year % 33);
    }


     // Если боковая панель существует, добавляем контейнер для даты
     function getReverinDate(reverinYear, guardian, dateDiv) {
    if (sidebar) {
         const now = new Date();
         let portletBody = sidebar.querySelector(".body") || sidebar;
         const startOfYear = new Date(now.getFullYear(), 0, 1);
          
         const dayOfYear = Math.floor((now - startOfYear) / (1000 * 60 * 60 * 24)) + 1;
        let dateDiv = document.createElement("div");
         const D_offset = 49;
         dateDiv.id = "reverinDateWidget";
         const D_r = ((dayOfYear - D_offset + 365) % 365) + 1;
        dateDiv.style.padding = "10px";
         const reverinLeap = isReverinLeap(reverinYear);
         dateDiv.style.borderTop = "1px solid #ccc";
         dateDiv.style.marginTop = "10px";
         dateDiv.style.fontWeight = "bold";
        dateDiv.innerText = "Загрузка реверинской даты...";


         portletBody.appendChild(dateDiv);
         const monthLengths = [30, 31, 31, 31, 31, 31, 31, 30, 30, 30, 30, reverinLeap ? 30 : 29];
        const monthNames = ["Любимца", "Жреца", "Хранителя", "Правителя", "Воителя",
                            "Хозяина", "Купца", "Творца", "Плута", "Колдуна", "Отшельника", "Наставника"];


         // Функция для вычисления реверинской даты
         // Соответствие земных дней недели реверинским
         function isLeap(year) {
         const earthToReveraWeekDays = {
             return ((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0);
             "Monday": "Вивидис",
            "Tuesday": "Аспирис",
            "Wednesday": "Альтис",
            "Thursday": "Эквилис",
            "Friday": "Либерис",
            "Saturday": "Реновис",
            "Sunday": "Мистерис"
        };
 
        const earthDayOfWeek = new Date().toLocaleDateString("en-US", { weekday: "long" });
        const reverinWeekDay = earthToReveraWeekDays[earthDayOfWeek] || "Неизвестный день";
 
        let dayCount = D_r, monthIndex = 0;
        while (dayCount > monthLengths[monthIndex]) {
            dayCount -= monthLengths[monthIndex];
            monthIndex++;
         }
         }


         function getReverinDate() {
         const monthName = monthNames[monthIndex];
            const now = new Date();
        const formattedYear = reverinLeap ? `${reverinYear}'` : reverinYear;
            const earthYear = now.getFullYear();
            const earthTotalDays = isLeap(earthYear) ? 366 : 365;
            const startOfYear = new Date(earthYear, 0, 1);
            const D_z = Math.floor((now - startOfYear) / (1000 * 60 * 60 * 24)) + 1;
            const D_offset = 49; // 18 февраля - 49-й день


            const reverinYear = (D_z >= D_offset ? earthYear : earthYear - 1);
        // Очищаем содержимое перед добавлением строк
             const D_r = ((D_z - D_offset + earthTotalDays) % earthTotalDays) + 1;
        while (dateDiv.firstChild) {
             dateDiv.removeChild(dateDiv.firstChild);
        }


            // Длины лун (месяцев)
        // Создаём первую строку (день недели + дата)
            const monthLengths = [30, 31, 31, 31, 31, 31, 31, 30, 30, 30, 30, (isLeap(reverinYear) ? 30 : 29)];
        let firstRow = document.createElement("div");
            const monthNames = ["Любимец", "Жрец", "Хранитель", "Правитель", "Воитель",
        firstRow.classList.add("row");
                                "Хозяин", "Купец", "Творец", "Плут", "Колдун", "Отшельник", "Наставник"];
        firstRow.appendChild(document.createTextNode(`${reverinWeekDay}, ${dayCount} ${monthName}`));


            // Дни недели в реверинском календаре
        // Создаём вторую строку (год + хранитель лет)
            const weekDays = ["Вивидис", "Аспирис", "Альтис", "Эквилис", "Либерис", "Реновис", "Мистерис"];
        let secondRow = document.createElement("div");
        secondRow.classList.add("row");


            // Определяем месяц и день
        // Создаём ссылку на год
            let dayCount = D_r;
        let yearLink = document.createElement("a");
            let monthIndex = 0;
        yearLink.href = "/wiki/index.php/Шаблон:Текущий_год_Альдморры";
            while (monthIndex < monthLengths.length && dayCount > monthLengths[monthIndex]) {
        yearLink.textContent = `${formattedYear} год`;
                dayCount -= monthLengths[monthIndex];
        yearLink.classList.add("year-link");
                monthIndex++;
 
            }
        // Создаём ссылку на хранителя лет
        let guardianLink = document.createElement("a");
        guardianLink.href = "/wiki/index.php/Шаблон:Хранители_лет";
        guardianLink.textContent = guardian;
        guardianLink.classList.add("guardian-link");


            // Определяем день недели
        // Добавляем элементы в `secondRow`
            const weekDayIndex = (D_r - 1) % 7;
        secondRow.appendChild(yearLink);
            const reverinWeekDay = weekDays[weekDayIndex];
        secondRow.appendChild(document.createTextNode(" ")); // Пробел между ссылками
        secondRow.appendChild(guardianLink);


        // Добавляем обе строки в `dateDiv`
        dateDiv.appendChild(firstRow);
        dateDiv.appendChild(secondRow);
    }


    function insertReverinDate() {
        let sidebar = document.getElementById("p-navigation") || document.getElementById("p-tb");
        if (sidebar) {
            let dateDiv = document.createElement("div");
            dateDiv.id = "reverinDateWidget";
            dateDiv.style.padding = "10px";
            dateDiv.style.borderTop = "1px solid #ccc";
            dateDiv.style.marginTop = "10px";
            dateDiv.style.fontWeight = "bold";
            dateDiv.style.whiteSpace = "pre-line"; // ВАЖНО: это делает \n рабочим!
            dateDiv.appendChild(document.createTextNode("Загрузка..."));
            sidebar.appendChild(dateDiv);


const dateText = `${reverinWeekDay}\n${dayCount} ${monthNames[monthIndex]}, {{Текущий_год_Альдморры}}`;
            fetchReverinYear(function(reverinYear) {
/* const dateText = `${reverinWeekDay}\n${dayCount} ${monthNames[monthIndex]}, ${reverinYear}`; */
                if (reverinYear) {
            // Выводим дату в боковую панель
                    fetchGuardian(reverinYear, function(guardian) {
            dateDiv.innerText = dateText;
                        getReverinDate(reverinYear, guardian, dateDiv);
                    });
                } else {
                    dateDiv.innerText = "Ошибка загрузки даты";
                }
            });
         }
         }
    }


        // Вызываем функцию для отображения даты
    insertReverinDate();
        getReverinDate();
    }
});
});

Текущая версия от 01:45, 27 февраля 2025


$(document).ready(function() {
    function fetchReverinYear(callback) {
        $.ajax({
            url: "/wiki/index.php?title=Шаблон:Текущий_год_Альдморры&action=raw",
            dataType: "text",
            success: function(data) {
                let reverinYear = parseInt(data.trim(), 10);
                if (!isNaN(reverinYear)) {
                    console.log("Год Альдморры загружен:", reverinYear);
                    callback(reverinYear);
                } else {
                    console.error("Ошибка: невозможно прочитать год.");
                    callback(null);
                }
            },
            error: function() {
                console.error("Ошибка загрузки шаблона.");
                callback(null);
            }
        });
    }

    function fetchGuardian(year, callback) {
        $.ajax({
            url: "/wiki/index.php?title=Шаблон:Хранители_лет&action=raw",
            dataType: "text",
            success: function(data) {
                let lines = data.split("\n");
                let guardian = "Неизвестный Хранитель";

                for (let line of lines) {
                    let parts = line.split("=");
                    if (parts.length === 2) {
                        let storedYear = parseInt(parts[0].trim(), 10);
                        if (storedYear === year) {
                            guardian = parts[1].trim();
                            break;
                        }
                    }
                }

                console.log(`Хранитель для ${year}: ${guardian}`);
                callback(guardian);
            },
            error: function() {
                console.error("Ошибка загрузки Хранителей лет.");
                callback("Неизвестный Хранитель");
            }
        });
    }

    function isReverinLeap(year) {
        return [1, 5, 9, 13, 17, 22, 26, 30].includes(year % 33);
    }

    function getReverinDate(reverinYear, guardian, dateDiv) {
        const now = new Date();
        const startOfYear = new Date(now.getFullYear(), 0, 1);
        const dayOfYear = Math.floor((now - startOfYear) / (1000 * 60 * 60 * 24)) + 1;
        const D_offset = 49;
        const D_r = ((dayOfYear - D_offset + 365) % 365) + 1;
        const reverinLeap = isReverinLeap(reverinYear);

        const monthLengths = [30, 31, 31, 31, 31, 31, 31, 30, 30, 30, 30, reverinLeap ? 30 : 29];
        const monthNames = ["Любимца", "Жреца", "Хранителя", "Правителя", "Воителя",
                            "Хозяина", "Купца", "Творца", "Плута", "Колдуна", "Отшельника", "Наставника"];

        // Соответствие земных дней недели реверинским
        const earthToReveraWeekDays = {
            "Monday": "Вивидис",
            "Tuesday": "Аспирис",
            "Wednesday": "Альтис",
            "Thursday": "Эквилис",
            "Friday": "Либерис",
            "Saturday": "Реновис",
            "Sunday": "Мистерис"
        };

        const earthDayOfWeek = new Date().toLocaleDateString("en-US", { weekday: "long" });
        const reverinWeekDay = earthToReveraWeekDays[earthDayOfWeek] || "Неизвестный день";

        let dayCount = D_r, monthIndex = 0;
        while (dayCount > monthLengths[monthIndex]) {
            dayCount -= monthLengths[monthIndex];
            monthIndex++;
        }

        const monthName = monthNames[monthIndex];
        const formattedYear = reverinLeap ? `${reverinYear}'` : reverinYear;

        // Очищаем содержимое перед добавлением строк
        while (dateDiv.firstChild) {
            dateDiv.removeChild(dateDiv.firstChild);
        }

        // Создаём первую строку (день недели + дата)
        let firstRow = document.createElement("div");
        firstRow.classList.add("row");
        firstRow.appendChild(document.createTextNode(`${reverinWeekDay}, ${dayCount} ${monthName}`));

        // Создаём вторую строку (год + хранитель лет)
        let secondRow = document.createElement("div");
        secondRow.classList.add("row");

        // Создаём ссылку на год
        let yearLink = document.createElement("a");
        yearLink.href = "/wiki/index.php/Шаблон:Текущий_год_Альдморры";
        yearLink.textContent = `${formattedYear} год`;
        yearLink.classList.add("year-link");

        // Создаём ссылку на хранителя лет
        let guardianLink = document.createElement("a");
        guardianLink.href = "/wiki/index.php/Шаблон:Хранители_лет";
        guardianLink.textContent = guardian;
        guardianLink.classList.add("guardian-link");

        // Добавляем элементы в `secondRow`
        secondRow.appendChild(yearLink);
        secondRow.appendChild(document.createTextNode(" ")); // Пробел между ссылками
        secondRow.appendChild(guardianLink);

        // Добавляем обе строки в `dateDiv`
        dateDiv.appendChild(firstRow);
        dateDiv.appendChild(secondRow);
    }

    function insertReverinDate() {
        let sidebar = document.getElementById("p-navigation") || document.getElementById("p-tb");
        if (sidebar) {
            let dateDiv = document.createElement("div");
            dateDiv.id = "reverinDateWidget";
            dateDiv.style.padding = "10px";
            dateDiv.style.borderTop = "1px solid #ccc";
            dateDiv.style.marginTop = "10px";
            dateDiv.style.fontWeight = "bold";
            dateDiv.style.whiteSpace = "pre-line"; // ВАЖНО: это делает \n рабочим!
            dateDiv.appendChild(document.createTextNode("Загрузка..."));
            sidebar.appendChild(dateDiv);

            fetchReverinYear(function(reverinYear) {
                if (reverinYear) {
                    fetchGuardian(reverinYear, function(guardian) {
                        getReverinDate(reverinYear, guardian, dateDiv);
                    });
                } else {
                    dateDiv.innerText = "Ошибка загрузки даты";
                }
            });
        }
    }

    insertReverinDate();
});