MediaWiki:Common.js: различия между версиями
Luciana (обсуждение | вклад) Нет описания правки |
Luciana (обсуждение | вклад) Нет описания правки |
||
| Строка 65: | Строка 65: | ||
getReverinDate(); | getReverinDate(); | ||
} | } | ||
}); | |||
$(document).ready(function() { | |||
function fetchReverinYear(callback) { | |||
$.getJSON("/api.php?action=parse&page=Шаблон:Текущий_год_Альдморры&prop=text&format=json", function(data) { | |||
if (data.parse && data.parse.text) { | |||
let parser = new DOMParser(); | |||
let doc = parser.parseFromString(data.parse.text["*"], "text/html"); | |||
let reverinYearText = doc.body.textContent.trim(); | |||
let reverinYear = parseInt(reverinYearText, 10); | |||
if (!isNaN(reverinYear)) { | |||
callback(reverinYear); | |||
} else { | |||
console.error("Ошибка: не удалось получить корректный год."); | |||
callback(null); | |||
} | |||
} | |||
}).fail(function() { | |||
console.error("Ошибка запроса к API MediaWiki."); | |||
callback(null); | |||
}); | |||
} | |||
function isLeap(year) { | |||
return ((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0); | |||
} | |||
function getReverinDate(reverinYear) { | |||
const now = new Date(); | |||
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 D_r = ((D_z - D_offset + earthTotalDays) % earthTotalDays) + 1; | |||
// Длины лун (месяцев) | |||
const monthLengths = [30, 31, 31, 31, 31, 31, 31, 30, 30, 30, 30, (isLeap(reverinYear) ? 30 : 29)]; | |||
const monthNames = ["Любимец", "Жрец", "Хранитель", "Правитель", "Воитель", | |||
"Хозяин", "Купец", "Творец", "Плут", "Колдун", "Отшельник", "Наставник"]; | |||
// Дни недели в реверинском календаре | |||
const weekDays = ["Вивидис", "Аспирис", "Альтис", "Эквилис", "Либерис", "Реновис", "Мистерис"]; | |||
// Определяем месяц и день | |||
let dayCount = D_r; | |||
let monthIndex = 0; | |||
while (monthIndex < monthLengths.length && dayCount > monthLengths[monthIndex]) { | |||
dayCount -= monthLengths[monthIndex]; | |||
monthIndex++; | |||
} | |||
// Определяем день недели | |||
const weekDayIndex = (D_r - 1) % 7; | |||
const reverinWeekDay = weekDays[weekDayIndex]; | |||
// Формируем строку даты | |||
return `${reverinWeekDay},\n${dayCount} ${monthNames[monthIndex]}, ${reverinYear}`; | |||
} | |||
function insertReverinDate() { | |||
let sidebar = document.getElementById("p-navigation") || document.getElementById("p-tb"); | |||
if (sidebar) { | |||
let portletBody = sidebar.querySelector(".body") || 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.innerText = "Загрузка..."; | |||
portletBody.appendChild(dateDiv); | |||
fetchReverinYear(function(reverinYear) { | |||
if (reverinYear) { | |||
dateDiv.innerText = getReverinDate(reverinYear); | |||
} else { | |||
dateDiv.innerText = "Ошибка загрузки даты"; | |||
} | |||
}); | |||
} | |||
} | |||
insertReverinDate(); | |||
}); | }); | ||
Версия от 16:31, 25 февраля 2025
/* Размещённый здесь код JavaScript будет загружаться пользователям при обращении к каждой странице */
$(document).ready(function() {
// Найти панель навигации (можно заменить на другую панель, если нужно)
let sidebar = document.getElementById("p-navigation");
// Если боковая панель существует, добавляем контейнер для даты
if (sidebar) {
let portletBody = sidebar.querySelector(".body") || 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.innerText = "Загрузка реверинской даты...";
portletBody.appendChild(dateDiv);
// Функция для вычисления реверинской даты
function isLeap(year) {
return ((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0);
}
function getReverinDate() {
const now = new Date();
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;
// Длины лун (месяцев)
const monthLengths = [30, 31, 31, 31, 31, 31, 31, 30, 30, 30, 30, (isLeap(reverinYear) ? 30 : 29)];
const monthNames = ["Любимец", "Жрец", "Хранитель", "Правитель", "Воитель",
"Хозяин", "Купец", "Творец", "Плут", "Колдун", "Отшельник", "Наставник"];
// Дни недели в реверинском календаре
const weekDays = ["Вивидис", "Аспирис", "Альтис", "Эквилис", "Либерис", "Реновис", "Мистерис"];
// Определяем месяц и день
let dayCount = D_r;
let monthIndex = 0;
while (monthIndex < monthLengths.length && dayCount > monthLengths[monthIndex]) {
dayCount -= monthLengths[monthIndex];
monthIndex++;
}
// Определяем день недели
const weekDayIndex = (D_r - 1) % 7;
const reverinWeekDay = weekDays[weekDayIndex];
const dateText = `${reverinWeekDay}\n${dayCount} ${monthNames[monthIndex]}, {{Текущий_год_Альдморры}}`;
/* const dateText = `${reverinWeekDay}\n${dayCount} ${monthNames[monthIndex]}, ${reverinYear}`; */
// Выводим дату в боковую панель
dateDiv.innerText = dateText;
}
// Вызываем функцию для отображения даты
getReverinDate();
}
});
$(document).ready(function() {
function fetchReverinYear(callback) {
$.getJSON("/api.php?action=parse&page=Шаблон:Текущий_год_Альдморры&prop=text&format=json", function(data) {
if (data.parse && data.parse.text) {
let parser = new DOMParser();
let doc = parser.parseFromString(data.parse.text["*"], "text/html");
let reverinYearText = doc.body.textContent.trim();
let reverinYear = parseInt(reverinYearText, 10);
if (!isNaN(reverinYear)) {
callback(reverinYear);
} else {
console.error("Ошибка: не удалось получить корректный год.");
callback(null);
}
}
}).fail(function() {
console.error("Ошибка запроса к API MediaWiki.");
callback(null);
});
}
function isLeap(year) {
return ((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0);
}
function getReverinDate(reverinYear) {
const now = new Date();
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 D_r = ((D_z - D_offset + earthTotalDays) % earthTotalDays) + 1;
// Длины лун (месяцев)
const monthLengths = [30, 31, 31, 31, 31, 31, 31, 30, 30, 30, 30, (isLeap(reverinYear) ? 30 : 29)];
const monthNames = ["Любимец", "Жрец", "Хранитель", "Правитель", "Воитель",
"Хозяин", "Купец", "Творец", "Плут", "Колдун", "Отшельник", "Наставник"];
// Дни недели в реверинском календаре
const weekDays = ["Вивидис", "Аспирис", "Альтис", "Эквилис", "Либерис", "Реновис", "Мистерис"];
// Определяем месяц и день
let dayCount = D_r;
let monthIndex = 0;
while (monthIndex < monthLengths.length && dayCount > monthLengths[monthIndex]) {
dayCount -= monthLengths[monthIndex];
monthIndex++;
}
// Определяем день недели
const weekDayIndex = (D_r - 1) % 7;
const reverinWeekDay = weekDays[weekDayIndex];
// Формируем строку даты
return `${reverinWeekDay},\n${dayCount} ${monthNames[monthIndex]}, ${reverinYear}`;
}
function insertReverinDate() {
let sidebar = document.getElementById("p-navigation") || document.getElementById("p-tb");
if (sidebar) {
let portletBody = sidebar.querySelector(".body") || 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.innerText = "Загрузка...";
portletBody.appendChild(dateDiv);
fetchReverinYear(function(reverinYear) {
if (reverinYear) {
dateDiv.innerText = getReverinDate(reverinYear);
} else {
dateDiv.innerText = "Ошибка загрузки даты";
}
});
}
}
insertReverinDate();
});