You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
169 lines
3.9 KiB
169 lines
3.9 KiB
var httpGet = require('./httpGet')
|
|
var ImageLoader = require('./ImageLoader')
|
|
const displayBlock = require('./displayBlock')
|
|
var showTimer
|
|
|
|
function showImage (image, dom) {
|
|
var a = document.createElement('a')
|
|
a.target = '_blank'
|
|
a.href = image.id
|
|
|
|
let img = document.createElement('img')
|
|
img.src = image.id
|
|
a.appendChild(img)
|
|
|
|
dom.appendChild(a)
|
|
|
|
return img
|
|
}
|
|
|
|
function showWikimediaImage (image, options, dom) {
|
|
let img = document.createElement('img')
|
|
|
|
if (!options.size) {
|
|
options.size = 800
|
|
}
|
|
|
|
httpGet(
|
|
'https://commons.wikimedia.org/wiki/File:' + encodeURIComponent(image.id),
|
|
{
|
|
forceServerLoad: true
|
|
},
|
|
function (err, result) {
|
|
if (err || !result) {
|
|
return
|
|
}
|
|
|
|
let m = result.body.match(/<a href="([^"]+\/)([0-9]+)(px-[^"\/]+)" class="mw-thumbnail-link"/)
|
|
if (m) {
|
|
let src = m[1] + options.size + m[3]
|
|
let srcset = m[1] + options.size + m[3] + ' 1x, ' +
|
|
m[1] + Math.ceil(options.size * 1.5) + m[3] + ' 1.5x, ' +
|
|
m[1] + Math.ceil(options.size * 2) + m[3] + ' 2x'
|
|
|
|
let a = document.createElement('a')
|
|
a.target = '_blank'
|
|
a.href = 'https://commons.wikimedia.org/wiki/File:' + encodeURIComponent(image.id)
|
|
|
|
img.src = src
|
|
img.srcset = srcset
|
|
a.appendChild(img)
|
|
|
|
dom.appendChild(a)
|
|
}
|
|
}
|
|
)
|
|
|
|
return img
|
|
}
|
|
|
|
// feature: { id: 'File:xxx.jpg', type: 'wikimedia|url', url: 'https://...' }
|
|
function show (img, options, div) {
|
|
div.innerHTML = ''
|
|
|
|
switch (img.type) {
|
|
case 'wikimedia':
|
|
return showWikimediaImage(img, options, div)
|
|
break
|
|
case 'url':
|
|
return showImage(img, div)
|
|
break
|
|
default:
|
|
}
|
|
}
|
|
|
|
register_hook('show-details', function (data, category, dom, callback) {
|
|
displayImages(data, category, dom, callback, 'details')
|
|
})
|
|
|
|
register_hook('show-popup', function (data, category, dom, callback) {
|
|
displayImages(data, category, dom, callback, 'popup')
|
|
})
|
|
|
|
function displayImages(data, category, dom, callback, displayId) {
|
|
var div = document.createElement('div')
|
|
div.className = 'images'
|
|
var imageWrapper
|
|
var nextImageWrapper = document.createElement('div')
|
|
let options
|
|
|
|
if (showTimer) {
|
|
window.clearInterval(showTimer)
|
|
}
|
|
|
|
var currentLoader = new ImageLoader(data)
|
|
|
|
data.detailsImageCounter = {}
|
|
|
|
currentLoader.next({
|
|
counter: data.detailsImageCounter,
|
|
wrap: true
|
|
}, function (err, data) {
|
|
if (!data) {
|
|
return callback(err)
|
|
}
|
|
|
|
const block = displayBlock({
|
|
dom,
|
|
content: div,
|
|
title: displayId === 'popup' ? null : lang('images'),
|
|
order: displayId === 'popup' ? -1 : 2
|
|
})
|
|
block.classList.add('empty')
|
|
|
|
imageWrapper = document.createElement('div')
|
|
imageWrapper.className = 'imageWrapper'
|
|
div.appendChild(imageWrapper)
|
|
|
|
options = {
|
|
size: Math.max(imageWrapper.offsetWidth, imageWrapper.offsetHeight)
|
|
}
|
|
|
|
let img = show(data, options, imageWrapper)
|
|
if (img) {
|
|
img.onload = () => {
|
|
block.classList.remove('empty')
|
|
dom.classList.add('hasImage')
|
|
}
|
|
}
|
|
|
|
if (displayId === 'details') {
|
|
showTimer = window.setInterval(showNext, 5000)
|
|
loadNext()
|
|
}
|
|
})
|
|
|
|
function loadNext () {
|
|
currentLoader.next({
|
|
counter: data.detailsImageCounter,
|
|
wrap: true
|
|
}, function (err, data) {
|
|
if (err) {
|
|
return console.log("Can't load next image", err)
|
|
}
|
|
|
|
show(data, options, nextImageWrapper)
|
|
})
|
|
}
|
|
|
|
function showNext () {
|
|
// when nothing was loaded, skip showing
|
|
if (nextImageWrapper.firstChild) {
|
|
while (imageWrapper.firstChild) {
|
|
imageWrapper.removeChild(imageWrapper.firstChild)
|
|
}
|
|
|
|
while (nextImageWrapper.firstChild) {
|
|
imageWrapper.appendChild(nextImageWrapper.firstChild)
|
|
}
|
|
}
|
|
|
|
loadNext()
|
|
}
|
|
}
|
|
|
|
register_hook('hide-details', function () {
|
|
if (showTimer) {
|
|
window.clearInterval(showTimer)
|
|
}
|
|
})
|