MediaWiki:Common.js: различия между версиями
Luciana (обсуждение | вклад) Нет описания правки |
Luciana (обсуждение | вклад) Нет описания правки |
||
| (не показано 40 промежуточных версий этой же участницы) | |||
| Строка 1: | Строка 1: | ||
$(document).ready(function() { | $(document).ready(function() { | ||
function getReverinDate(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 monthLengths = [30, 31, 31, 31, 31, 31, 31, 30, 30, 30, 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; | |||
let monthIndex = 0; | |||
while (dayCount > monthLengths[monthIndex]) { | |||
dayCount -= monthLengths[monthIndex]; | |||
monthIndex++; | |||
} | |||
const monthName = monthNames[monthIndex]; | |||
while (dateDiv.firstChild) { | |||
dateDiv.removeChild(dateDiv.firstChild); | |||
} | |||
let firstRow = document.createElement("div"); | |||
firstRow.classList.add("row"); | |||
firstRow.appendChild(document.createTextNode(`${reverinWeekDay}, ${dayCount} ${monthName}`)); | |||
dateDiv.appendChild(firstRow); | |||
} | |||
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"; | |||
dateDiv.appendChild(document.createTextNode("Загрузка...")); | |||
sidebar.appendChild(dateDiv); | |||
getReverinDate(dateDiv); | |||
} | } | ||
} | |||
function insertReverinYearConverter() { | |||
let sidebar = document.getElementById("p-navigation") || document.getElementById("p-tb"); | |||
if (!sidebar) return; | |||
/* | |||
Базовая шкала — альдморрское летоисчисление, г.а. | |||
0 г.а. = 1489 г.д. | |||
значит: | |||
г.д. = г.а. + 1489 | |||
4556 г.ф. = 0 г.д. | |||
0 г.д. = -1489 г.а. | |||
значит: | |||
г.ф. = г.а. + 6045 | |||
0 г.л. = -15126 г.а. | |||
значит: | |||
г.л. = г.а. + 15126 | |||
*/ | |||
const YEAR_OFFSETS = { | |||
la: 15126, // г.л. = г.а. + 15126 | |||
da: 1489, // г.д. = г.а. + 1489 | |||
fa: 6045, // г.ф. = г.а. + 6045 | |||
aa: 0 // г.а. | |||
}; | |||
let wrapper = document.createElement("div"); | |||
wrapper.id = "reverinYearConverter"; | |||
wrapper.style.padding = "10px"; | |||
wrapper.style.borderTop = "1px solid #ccc"; | |||
wrapper.style.marginTop = "10px"; | |||
wrapper.style.fontWeight = "bold"; | |||
let title = document.createElement("div"); | |||
title.textContent = "Пересчёт лет"; | |||
title.style.marginBottom = "6px"; | |||
wrapper.appendChild(title); | |||
const fields = [ | |||
{ key: "la", label: "г.л." }, | |||
{ key: "da", label: "г.д." }, | |||
{ key: "fa", label: "г.ф." }, | |||
{ key: "aa", label: "г.а." } | |||
]; | |||
let inputs = {}; | |||
let isUpdating = false; | |||
fields.forEach(function(field) { | |||
let row = document.createElement("div"); | |||
row.style.display = "flex"; | |||
row.style.alignItems = "center"; | |||
row.style.gap = "6px"; | |||
row.style.marginBottom = "4px"; | |||
let label = document.createElement("label"); | |||
label.textContent = field.label; | |||
label.style.width = "35px"; | |||
let input = document.createElement("input"); | |||
input.type = "number"; | |||
input.dataset.yearType = field.key; | |||
input.style.width = "90px"; | |||
input.style.boxSizing = "border-box"; | |||
inputs[field.key] = input; | |||
row.appendChild(label); | |||
row.appendChild(input); | |||
wrapper.appendChild(row); | |||
}); | |||
function clearOtherFields(sourceKey) { | |||
Object.keys(inputs).forEach(function(key) { | |||
if (key !== sourceKey) { | |||
inputs[key].value = ""; | |||
} | |||
}); | |||
} | |||
function recalculateFrom(sourceKey) { | |||
let | if (isUpdating) return; | ||
let | |||
let sourceInput = inputs[sourceKey]; | |||
let sourceValue = sourceInput.value.trim(); | |||
if (sourceValue === "") { | |||
clearOtherFields(sourceKey); | |||
return; | |||
} | } | ||
let yearValue = Number(sourceValue); | |||
if (!Number.isFinite(yearValue)) return; | |||
isUpdating = true; | |||
let aldYear = yearValue - YEAR_OFFSETS[sourceKey]; | |||
Object.keys(inputs).forEach(function(key) { | |||
if (key !== sourceKey) { | |||
inputs[key].value = aldYear + YEAR_OFFSETS[key]; | |||
} | |||
}); | |||
isUpdating = false; | |||
} | } | ||
Object.keys(inputs).forEach(function(key) { | |||
inputs[key].addEventListener("input", function() { | |||
recalculateFrom(key); | |||
}); | |||
}); | |||
sidebar.appendChild(wrapper); | |||
} | } | ||
insertReverinDate(); | |||
insertReverinYearConverter(); | |||
}); | }); | ||
Текущая версия от 14:37, 15 мая 2026
$(document).ready(function() {
function getReverinDate(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 monthLengths = [30, 31, 31, 31, 31, 31, 31, 30, 30, 30, 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;
let monthIndex = 0;
while (dayCount > monthLengths[monthIndex]) {
dayCount -= monthLengths[monthIndex];
monthIndex++;
}
const monthName = monthNames[monthIndex];
while (dateDiv.firstChild) {
dateDiv.removeChild(dateDiv.firstChild);
}
let firstRow = document.createElement("div");
firstRow.classList.add("row");
firstRow.appendChild(document.createTextNode(`${reverinWeekDay}, ${dayCount} ${monthName}`));
dateDiv.appendChild(firstRow);
}
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";
dateDiv.appendChild(document.createTextNode("Загрузка..."));
sidebar.appendChild(dateDiv);
getReverinDate(dateDiv);
}
}
function insertReverinYearConverter() {
let sidebar = document.getElementById("p-navigation") || document.getElementById("p-tb");
if (!sidebar) return;
/*
Базовая шкала — альдморрское летоисчисление, г.а.
0 г.а. = 1489 г.д.
значит:
г.д. = г.а. + 1489
4556 г.ф. = 0 г.д.
0 г.д. = -1489 г.а.
значит:
г.ф. = г.а. + 6045
0 г.л. = -15126 г.а.
значит:
г.л. = г.а. + 15126
*/
const YEAR_OFFSETS = {
la: 15126, // г.л. = г.а. + 15126
da: 1489, // г.д. = г.а. + 1489
fa: 6045, // г.ф. = г.а. + 6045
aa: 0 // г.а.
};
let wrapper = document.createElement("div");
wrapper.id = "reverinYearConverter";
wrapper.style.padding = "10px";
wrapper.style.borderTop = "1px solid #ccc";
wrapper.style.marginTop = "10px";
wrapper.style.fontWeight = "bold";
let title = document.createElement("div");
title.textContent = "Пересчёт лет";
title.style.marginBottom = "6px";
wrapper.appendChild(title);
const fields = [
{ key: "la", label: "г.л." },
{ key: "da", label: "г.д." },
{ key: "fa", label: "г.ф." },
{ key: "aa", label: "г.а." }
];
let inputs = {};
let isUpdating = false;
fields.forEach(function(field) {
let row = document.createElement("div");
row.style.display = "flex";
row.style.alignItems = "center";
row.style.gap = "6px";
row.style.marginBottom = "4px";
let label = document.createElement("label");
label.textContent = field.label;
label.style.width = "35px";
let input = document.createElement("input");
input.type = "number";
input.dataset.yearType = field.key;
input.style.width = "90px";
input.style.boxSizing = "border-box";
inputs[field.key] = input;
row.appendChild(label);
row.appendChild(input);
wrapper.appendChild(row);
});
function clearOtherFields(sourceKey) {
Object.keys(inputs).forEach(function(key) {
if (key !== sourceKey) {
inputs[key].value = "";
}
});
}
function recalculateFrom(sourceKey) {
if (isUpdating) return;
let sourceInput = inputs[sourceKey];
let sourceValue = sourceInput.value.trim();
if (sourceValue === "") {
clearOtherFields(sourceKey);
return;
}
let yearValue = Number(sourceValue);
if (!Number.isFinite(yearValue)) return;
isUpdating = true;
let aldYear = yearValue - YEAR_OFFSETS[sourceKey];
Object.keys(inputs).forEach(function(key) {
if (key !== sourceKey) {
inputs[key].value = aldYear + YEAR_OFFSETS[key];
}
});
isUpdating = false;
}
Object.keys(inputs).forEach(function(key) {
inputs[key].addEventListener("input", function() {
recalculateFrom(key);
});
});
sidebar.appendChild(wrapper);
}
insertReverinDate();
insertReverinYearConverter();
});