gatherer/tag_images.js: add images control

This commit is contained in:
Astro 2023-03-02 00:30:40 +01:00
parent a6404e16ce
commit b277ea5e80
2 changed files with 143 additions and 72 deletions

View File

@ -59,6 +59,11 @@ nav ul li {
list-style-type: none;
margin: 0 0.15rem;
}
nav form {
margin: 0 0.5rem;
padding: 0.2rem;
padding-bottom: 0.5rem;
}
main {
display: flex;

View File

@ -1,82 +1,148 @@
(function() {
var articleEls = document.getElementsByTagName("article");
for(var i = 0; i < articleEls.length; i++) {
var articleEl = articleEls[i];
(function(articleEl) {
var images = articleEl.getAttribute("data-images").split(" ").filter(function(image) { return !!image; });
if (images.length > 0) {
var imageContainer = document.createElement("div");
imageContainer.className = "images";
if (images.length == 1) {
/* Show a single image */
var img = document.createElement("p");
img.className = "image";
img.style.backgroundImage = "url('" + images[0] + "')";
imageContainer.appendChild(img);
} else {
/* Show slideshow */
/* url */
var currentImage = null;
/* <img> element */
var currentImg = null;
function show() {
var oldImage = currentImage;
var oldImg = currentImg;
var nextImage = null;
while(!currentImage || currentImage == oldImage) {
currentImage = images[Math.floor(images.length * Math.random())];
}
var retryTimeout;
let image = new Image();
image.src = currentImage;
image.onload = function() {
if (retryTimeout) {
clearTimeout(retryTimeout);
var enableImages = false;
function startImages() {
enableImages = true;
var articleEls = document.getElementsByTagName("article");
for(var i = 0; i < articleEls.length; i++) {
var articleEl = articleEls[i];
(function(articleEl) {
var images = articleEl.getAttribute("data-images").split(" ").filter(function(image) { return !!image; });
if (images.length > 0) {
var imageContainer = document.createElement("div");
imageContainer.className = "images";
if (images.length == 1) {
/* Show a single image */
var img = document.createElement("p");
img.className = "image";
img.style.backgroundImage = "url('" + images[0] + "')";
imageContainer.appendChild(img);
} else {
/* Show slideshow */
/* url */
var currentImage = null;
/* <img> element */
var currentImg = null;
function show() {
if (!enableImages) {
/* stop the recursion if control just disabled images */
return;
}
var oldImage = currentImage;
var oldImg = currentImg;
var nextImage = null;
while(!currentImage || currentImage == oldImage) {
currentImage = images[Math.floor(images.length * Math.random())];
}
currentImg = document.createElement("p");
currentImg.className = "image";
currentImg.alt = "Preview image from dubious source";
currentImg.style.backgroundImage = "url('" + currentImage + "')";
currentImg.style.left = oldImg ? "100%" : "0";
imageContainer.appendChild(currentImg);
var retryTimeout;
let image = new Image();
image.src = currentImage;
image.onload = function() {
if (retryTimeout) {
clearTimeout(retryTimeout);
}
requestAnimationFrame(function() {
setTimeout(function() {
// slide
if (oldImg) {
oldImg.style.left = "-100%";
}
currentImg.style.left = "0";
currentImg = document.createElement("p");
currentImg.className = "image";
currentImg.alt = "Preview image from dubious source";
currentImg.style.backgroundImage = "url('" + currentImage + "')";
currentImg.style.left = oldImg ? "100%" : "0";
imageContainer.appendChild(currentImg);
requestAnimationFrame(function() {
setTimeout(function() {
if (oldImg) {
imageContainer.removeChild(oldImg);
}
// loop
show();
}, 5000 + Math.ceil(10000 * Math.random()));
}, 100);
});
};
/* slide */
if (oldImg) {
oldImg.style.left = "-100%";
}
currentImg.style.left = "0";
retryTimeout = setTimeout(function() {
// img didn't load, cancel and retry
image.onload = null;
show();
}, 5000);
setTimeout(function() {
if (oldImg) {
imageContainer.removeChild(oldImg);
}
/* loop */
show();
}, 5000 + Math.ceil(10000 * Math.random()));
}, 100);
});
};
retryTimeout = setTimeout(function() {
/* img didn't load, cancel and retry */
image.onload = null;
show();
}, 5000);
}
show()
}
show()
}
articleEl.style.backgroundPosition = "center";
articleEl.style.backgroundSize = "cover";
articleEl.className = "with-image";
var titleEl = articleEl.getElementsByClassName("title")[0];
if (titleEl) {
titleEl.insertBefore(imageContainer, titleEl.firstChild);
}
}
})(articleEl);
articleEl.style.backgroundPosition = "center";
articleEl.style.backgroundSize = "cover";
articleEl.className = "with-image";
var titleEl = articleEl.getElementsByClassName("title")[0];
if (titleEl && enableImages) {
titleEl.insertBefore(imageContainer, titleEl.firstChild);
}
}
})(articleEl);
}
}
var controlForm = document.createElement("form");
var controlFormLabel = document.createElement("label");
controlFormLabel.innerText = "Safety and Privacy:";
controlForm.appendChild(controlFormLabel);
function addInputToControlForm(id, text, title) {
var input = document.createElement("input");
input.setAttribute("id", id);
input.setAttribute("name", "image_control");
input.setAttribute("type", "radio");
input.setAttribute("title", title);
controlForm.appendChild(input);
var label = document.createElement("label");
label.innerText = text;
label.setAttribute("for", id);
label.setAttribute("title", title);
controlForm.appendChild(label);
return {
get: function() {
return input.checked;
},
set: function() {
input.setAttribute("checked", true);
},
onChange: function(cb) {
input.addEventListener("change", cb);
},
};
}
var controlImagesOff = addInputToControlForm(
"images_off", "On",
"Keep #FediBuzz a plain text website."
);
var controlImagesOn = addInputToControlForm(
"images_on", "Off",
"Load preview images from random servers, wildly depicting offensive indecencies. You have been warned!"
);
function onImageControlChange() {
var state = controlImagesOn.get();
if (state) {
startImages();
} else {
/* Remove images */
var imageContainers = document.getElementsByClassName("images");
for(var i = imageContainers.length - 1; i >= 0; i--) {
imageContainers[i].parentNode.removeChild(imageContainers[i]);
}
/* Disable slideshows */
enableImages = false;
}
}
controlImagesOff.set();
controlImagesOff.onChange(onImageControlChange);
controlImagesOn.onChange(onImageControlChange);
document.getElementsByTagName("nav")[0].appendChild(controlForm);
})()