ChapterSlides.js: Difference between revisions
From Illustrations in German Translations of Mark Twain's Works
No edit summary |
No edit summary Tag: Reverted |
||
| Line 59: | Line 59: | ||
if (slides[name].length === 0) { | if (slides[name].length === 0) { | ||
imageElement.src = "https://illus.twainframe.org/images/2/2b/ChapterPlaceholder.png"; | imageElement.src = "https://illus.twainframe.org/images/2/2b/ChapterPlaceholder.png"; | ||
imageElement.alt = ""; // kein Dateiname → kein Hover | |||
imageElement.title = "No matching images found."; | imageElement.title = "No matching images found."; | ||
imageElement.onclick = null; // Klick deaktivieren | |||
updateCounter(name); // Counter aktualisieren | updateCounter(name); // Counter aktualisieren | ||
} else { | } else { | ||
| Line 72: | Line 74: | ||
const slideArray = slides[illustrator]; | const slideArray = slides[illustrator]; | ||
if (!imageElement | if (!imageElement) return; | ||
// Kein Bild gefunden → Platzhalter setzen | |||
if (slideArray.length === 0) { | |||
imageElement.src = "https://illus.twainframe.org/images/2/2b/ChapterPlaceholder.png"; | |||
imageElement.alt = ""; // kein Dateiname → kein Hover | |||
imageElement.title = "No matching images found."; | |||
imageElement.onclick = null; | |||
updateCounter(illustrator); | |||
return; | |||
} | |||
// Index im gültigen Bereich halten | |||
currentIndex[illustrator] = (index + slideArray.length) % slideArray.length; | currentIndex[illustrator] = (index + slideArray.length) % slideArray.length; | ||
const imageId = slideArray[currentIndex[illustrator]]; | const imageId = slideArray[currentIndex[illustrator]]; | ||
// Bild setzen | |||
imageElement.src = "/index.php/Special:Redirect/file/" + imageId + ".jpg"; | imageElement.src = "/index.php/Special:Redirect/file/" + imageId + ".jpg"; | ||
imageElement.alt = imageId; | imageElement.alt = imageId; | ||
| Line 86: | Line 100: | ||
}; | }; | ||
// Hover-Popup für | // Hover-Popup nur für echte Bilder | ||
attachMediaInfoHoverDynamic(imageElement, imageId); | attachMediaInfoHoverDynamic(imageElement, imageId); | ||
| Line 120: | Line 134: | ||
// MediaInfo Hover Popup (File-Seite, Raw-Text) | // MediaInfo Hover Popup (File-Seite, Raw-Text) | ||
// =============================== | // =============================== | ||
function attachMediaInfoHoverDynamic(imgElement) { | function attachMediaInfoHoverDynamic(imgElement, filename) { | ||
if (!imgElement) return; | if (!imgElement) return; | ||
if (!filename) return; // kein gültiger Dateiname → kein Hover | |||
let infoBox = document.createElement('div'); | let infoBox = document.createElement('div'); | ||
| Line 132: | Line 147: | ||
infoBox.style.fontSize = "0.9em"; | infoBox.style.fontSize = "0.9em"; | ||
infoBox.style.zIndex = 1000; | infoBox.style.zIndex = 1000; | ||
infoBox.style.pointerEvents = "none"; | infoBox.style.pointerEvents = "none"; | ||
document.body.appendChild(infoBox); | document.body.appendChild(infoBox); | ||
imgElement.addEventListener('mouseenter', () => { | imgElement.addEventListener('mouseenter', () => { | ||
imgElement.removeAttribute('title'); // Browser Tooltip weg | |||
infoBox.textContent = "Loading ..."; | infoBox.textContent = "Loading ..."; | ||
| Line 181: | Line 194: | ||
infoBox.style.display = 'none'; | infoBox.style.display = 'none'; | ||
}); | }); | ||
} | } | ||
Revision as of 15:33, 6 October 2025
// Acht feste Illustratoren definieren
const illustrators = [
"Kemble",
"Schroedter",
"Hirth",
"Busoni",
"Kellerer",
"Harder",
"Trier",
"Bebié"
];
// Bildlisten und aktuelle Indizes
let slides = {};
let currentIndex = {};
illustrators.forEach(name => {
slides[name] = [];
currentIndex[name] = 0;
});
// Eingabe verarbeiten
function loadSlideshowsByChapter() {
const chapterInput = document.getElementById("chapterInput").value.trim();
const chapterNumber = parseInt(chapterInput, 10);
if (isNaN(chapterNumber) || chapterNumber < 1 || chapterNumber > 43) {
alert("Please enter a number between 1 and 43.");
return;
}
const chapterTag = "ch" + String(chapterNumber).padStart(3, "0");
// Tabelle durchsuchen
const rows = document.querySelectorAll("#catalog tbody tr");
illustrators.forEach(name => {
slides[name] = [];
currentIndex[name] = 0;
const imageElement = document.getElementById("slide-" + name);
for (let i = 0; i < rows.length; i++) {
const row = rows[i];
const illustratorCell = row.cells[2];
const idCell = row.cells[8];
const illustratorText = illustratorCell ? illustratorCell.textContent.trim().toLowerCase() : "";
const idLink = idCell ? idCell.getElementsByTagName("a")[0] : null;
const idText = idLink ? idLink.textContent.trim().toLowerCase() : "";
if (
illustratorText.indexOf(name.toLowerCase()) !== -1 &&
idText.indexOf(chapterTag) !== -1
) {
slides[name].push(idText);
}
}
if (slides[name].length === 0) {
imageElement.src = "https://illus.twainframe.org/images/2/2b/ChapterPlaceholder.png";
imageElement.alt = ""; // kein Dateiname → kein Hover
imageElement.title = "No matching images found.";
imageElement.onclick = null; // Klick deaktivieren
updateCounter(name); // Counter aktualisieren
} else {
showSlide(name, 0);
}
});
}
// Ein Bild anzeigen
function showSlide(illustrator, index) {
const imageElement = document.getElementById("slide-" + illustrator);
const slideArray = slides[illustrator];
if (!imageElement) return;
// Kein Bild gefunden → Platzhalter setzen
if (slideArray.length === 0) {
imageElement.src = "https://illus.twainframe.org/images/2/2b/ChapterPlaceholder.png";
imageElement.alt = ""; // kein Dateiname → kein Hover
imageElement.title = "No matching images found.";
imageElement.onclick = null;
updateCounter(illustrator);
return;
}
// Index im gültigen Bereich halten
currentIndex[illustrator] = (index + slideArray.length) % slideArray.length;
const imageId = slideArray[currentIndex[illustrator]];
// Bild setzen
imageElement.src = "/index.php/Special:Redirect/file/" + imageId + ".jpg";
imageElement.alt = imageId;
imageElement.title = imageId;
// Klick öffnet File-Seite
imageElement.onclick = function() {
window.open("/File:" + imageId + ".jpg", "_blank");
};
// Hover-Popup nur für echte Bilder
attachMediaInfoHoverDynamic(imageElement, imageId);
// Counter aktualisieren
updateCounter(illustrator);
}
// Counter aktualisieren
function updateCounter(illustrator) {
const counterElement = document.getElementById("counter-" + illustrator);
const slideArray = slides[illustrator];
const index = currentIndex[illustrator];
if (counterElement) {
if (slideArray.length === 0) {
counterElement.textContent = "0/0";
} else {
counterElement.textContent = (index + 1) + "/" + slideArray.length;
}
}
}
// Buttons
function nextSlide(illustrator) {
showSlide(illustrator, currentIndex[illustrator] + 1);
}
function prevSlide(illustrator) {
showSlide(illustrator, currentIndex[illustrator] - 1);
}
// ===============================
// MediaInfo Hover Popup (File-Seite, Raw-Text)
// ===============================
function attachMediaInfoHoverDynamic(imgElement, filename) {
if (!imgElement) return;
if (!filename) return; // kein gültiger Dateiname → kein Hover
let infoBox = document.createElement('div');
infoBox.style.position = 'absolute';
infoBox.style.display = 'none';
infoBox.style.backgroundColor = "#f9f9f9";
infoBox.style.border = "1px solid #ccc";
infoBox.style.padding = "0.5em 1em";
infoBox.style.borderRadius = "4px";
infoBox.style.fontSize = "0.9em";
infoBox.style.zIndex = 1000;
infoBox.style.pointerEvents = "none";
document.body.appendChild(infoBox);
imgElement.addEventListener('mouseenter', () => {
imgElement.removeAttribute('title'); // Browser Tooltip weg
infoBox.textContent = "Loading ...";
fetch('/index.php?title=File:' + encodeURIComponent(filename) + ".jpg" + '&action=raw')
.then(resp => resp.text())
.then(text => {
const match = text.match(/\{\{MediaInfo([\s\S]*?)\}\}/);
if (!match) {
infoBox.textContent = "No Data found.";
return;
}
const block = match[1];
const fields = ["title","chapter","illustration","illustrator","year","tags"];
let htmlList = "<ul style='margin:0; padding-left:1em; list-style:none;'>";
fields.forEach(field => {
const m = block.match(new RegExp("\\|\\s*" + field + "\\s*=([^\\n]*)"));
if (m) {
const label = field.charAt(0).toUpperCase() + field.slice(1);
htmlList += `<li><b>${label}:</b> ${m[1].trim()}</li>`;
}
});
htmlList += "</ul>";
infoBox.innerHTML = htmlList;
})
.catch(err => {
console.error(err);
infoBox.textContent = "Error";
});
infoBox.style.display = 'block';
});
imgElement.addEventListener('mousemove', (e) => {
infoBox.style.top = (e.pageY + 15) + 'px';
infoBox.style.left = (e.pageX + 15) + 'px';
});
imgElement.addEventListener('mouseleave', () => {
infoBox.style.display = 'none';
});
}