MediaWiki:Gadget-MainPageDynamicContent.js
Jump to navigation
Jump to search
Note: After publishing, you may have to bypass your browser's cache to see the changes.
- Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
- Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
- Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5.
/**
* Handles dynamic content for the main page (Did You Know? and On This Day)
* This is based on Fire Emblem Wiki's https://fireemblemwiki.org/wiki/MediaWiki:Gadget-MainPageRandomizer.js
* by the user Peter Samuels and it was modified for Megami Tensei Wiki by its original author.
*/
const api = new mw.Api();
const didYouKnow = require('./DidYouKnowData.js');
const { gameAnniversaries, characterBirthdays, miscEvents } = require('./OnThisDayData.js');
function doRandomization(idName, listName) {
const element = document.getElementById(idName);
if (!element) {
return;
}
const randomItem = listName[Math.floor(Math.random() * listName.length)];
api.parse(randomItem).done(function (parsedHtml) {
element.innerHTML = parsedHtml;
});
}
$(function () {
/* Did You Know? randomizer for main page */
for(const [key, value] of Object.entries(didYouKnow)) {
doRandomization(key, value);
}
/* "On this day" for main page */
let otdElement = document.getElementById("onThisDay");
if (!otdElement) {
return;
}
function makeList(array, separator, prefix, suffix) {
const items = array.map(item => `${prefix}${item}${suffix}`);
if (items.length === 1) {
return items[0];
} else if (items.length === 2) {
return `${items[0]} and ${items[1]}`;
} else {
return items.slice(0, -1).join(separator) + separator + "and " + items[items.length - 1];
}
}
const clientDate = new Date();
const month = clientDate.getMonth() + 1;
const day = clientDate.getDate();
var anniOutput = "";
if (gameAnniversaries && gameAnniversaries[month] && gameAnniversaries[month][day]) {
let length = gameAnniversaries[month][day].length;
let gameList = makeList(gameAnniversaries[month][day], ", ", '{{Link|Game|', '}}');
let verb = "was";
if (length > 1) {
verb = "were";
}
anniOutput = `<p>${gameList} ${verb} released.</p>`;
} else {
anniOutput = "";
}
var bdayOutput = "";
if (characterBirthdays && characterBirthdays[month] && characterBirthdays[month][day]) {
let charList = makeList(characterBirthdays[month][day], ", ", '[[', ']]');
bdayOutput = `<p>It is the birthday of ${charList}.</p>`;
} else {
bdayOutput = "";
}
var miscOutput = "";
if (miscEvents && miscEvents[month] && miscEvents[month][day]) {
let miscList = makeList(miscEvents[month][day], "; ", '', '');
miscOutput = `<p>${miscList}.</p>`;
} else {
miscOutput = "";
}
var otdOutput = `${anniOutput}${bdayOutput}${miscOutput}`;
var isEmpty = otdOutput === "";
if (isEmpty) {
otdOutput = "Sorry nothing";
otdElement.innerHTML = otdOutput;
return;
}
/* Add pic */
api.parse(otdOutput).done(function (parsedOtd) {
const $parsed = $(parsedOtd);
const $firstLink = $parsed.find('a').first();
if ($firstLink.length > 0) {
var pageTitle = $firstLink.attr('title') || $firstLink.text().trim();
var preferredPages = {
"Kuma no Megane": "Persona 5",
"Giten Megami Tensei: Tokyo Revelation": "Shin Megami Tensei: Imagine"
};
if (preferredPages[pageTitle]) {
pageTitle = preferredPages[pageTitle];
}
const apiParameters = {
action: 'query',
titles: pageTitle,
prop: 'pageimages',
format: 'json'
};
api.get(apiParameters).done(function (data) {
const pages = data.query.pages;
const pageId = Object.keys(pages)[0];
const fileName = pages[pageId].pageimage;
if (fileName) { // Check if image exists
api.parse(`[[File:${fileName}|right|200x180px]]`).done(function (parsedImg) {
otdElement.innerHTML = parsedImg + parsedOtd;
});
} else {
otdElement.innerHTML = parsedOtd;
}
});
}
});
});
/* Refresh button */
const span = document.getElementById('dyk-refresh');
span.addEventListener('click', function() {
for(const [key, value] of Object.entries(didYouKnow)) {
doRandomization(key, value);
}
});
span.addEventListener('keydown', function(e) {
if (e.key === 'Enter') {
for(const [key, value] of Object.entries(didYouKnow)) {
doRandomization(key, value);
}
}
});