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

6 years ago
7 years ago
7 years ago
7 years ago
3 years ago
3 years ago
3 years ago
7 years ago
7 years ago
3 years ago
  1. var httpGet = require('./httpGet')
  2. var ImageLoader = require('./ImageLoader')
  3. const displayBlock = require('./displayBlock')
  4. var showTimer
  5. function showImage (image, dom) {
  6. var a = document.createElement('a')
  7. a.target = '_blank'
  8. a.href = image.id
  9. let img = document.createElement('img')
  10. img.src = image.id
  11. a.appendChild(img)
  12. dom.appendChild(a)
  13. return img
  14. }
  15. function showWikimediaImage (image, options, dom) {
  16. let img = document.createElement('img')
  17. if (!options.size) {
  18. options.size = 800
  19. }
  20. httpGet(
  21. 'https://commons.wikimedia.org/wiki/File:' + encodeURIComponent(image.id),
  22. {
  23. forceServerLoad: true
  24. },
  25. function (err, result) {
  26. if (err || !result) {
  27. return
  28. }
  29. let m = result.body.match(/<a href="([^"]+\/)([0-9]+)(px-[^"\/]+)" class="mw-thumbnail-link"/)
  30. if (m) {
  31. let src = m[1] + options.size + m[3]
  32. let srcset = m[1] + options.size + m[3] + ' 1x, ' +
  33. m[1] + Math.ceil(options.size * 1.5) + m[3] + ' 1.5x, ' +
  34. m[1] + Math.ceil(options.size * 2) + m[3] + ' 2x'
  35. let a = document.createElement('a')
  36. a.target = '_blank'
  37. a.href = 'https://commons.wikimedia.org/wiki/File:' + encodeURIComponent(image.id)
  38. img.src = src
  39. img.srcset = srcset
  40. a.appendChild(img)
  41. dom.appendChild(a)
  42. }
  43. }
  44. )
  45. return img
  46. }
  47. // feature: { id: 'File:xxx.jpg', type: 'wikimedia|url', url: 'https://...' }
  48. function show (img, options, div) {
  49. div.innerHTML = ''
  50. switch (img.type) {
  51. case 'wikimedia':
  52. return showWikimediaImage(img, options, div)
  53. break
  54. case 'url':
  55. return showImage(img, div)
  56. break
  57. default:
  58. }
  59. }
  60. register_hook('show-details', function (data, category, dom, callback) {
  61. displayImages(data, category, dom, callback, 'details')
  62. })
  63. register_hook('show-popup', function (data, category, dom, callback) {
  64. displayImages(data, category, dom, callback, 'popup')
  65. })
  66. function displayImages(data, category, dom, callback, displayId) {
  67. var div = document.createElement('div')
  68. div.className = 'images'
  69. var imageWrapper
  70. var nextImageWrapper = document.createElement('div')
  71. let options
  72. if (showTimer) {
  73. window.clearInterval(showTimer)
  74. }
  75. var currentLoader = new ImageLoader(data)
  76. data.detailsImageCounter = {}
  77. currentLoader.next({
  78. counter: data.detailsImageCounter,
  79. wrap: true
  80. }, function (err, data) {
  81. if (!data) {
  82. return callback(err)
  83. }
  84. const block = displayBlock({
  85. dom,
  86. content: div,
  87. title: displayId === 'popup' ? null : lang('images'),
  88. order: displayId === 'popup' ? -1 : 2
  89. })
  90. block.classList.add('empty')
  91. imageWrapper = document.createElement('div')
  92. imageWrapper.className = 'imageWrapper'
  93. div.appendChild(imageWrapper)
  94. options = {
  95. size: Math.max(imageWrapper.offsetWidth, imageWrapper.offsetHeight)
  96. }
  97. let img = show(data, options, imageWrapper)
  98. if (img) {
  99. img.onload = () => {
  100. block.classList.remove('empty')
  101. dom.classList.add('hasImage')
  102. }
  103. }
  104. if (displayId === 'details') {
  105. showTimer = window.setInterval(showNext, 5000)
  106. loadNext()
  107. }
  108. })
  109. function loadNext () {
  110. currentLoader.next({
  111. counter: data.detailsImageCounter,
  112. wrap: true
  113. }, function (err, data) {
  114. if (err) {
  115. return console.log("Can't load next image", err)
  116. }
  117. show(data, options, nextImageWrapper)
  118. })
  119. }
  120. function showNext () {
  121. // when nothing was loaded, skip showing
  122. if (nextImageWrapper.firstChild) {
  123. while (imageWrapper.firstChild) {
  124. imageWrapper.removeChild(imageWrapper.firstChild)
  125. }
  126. while (nextImageWrapper.firstChild) {
  127. imageWrapper.appendChild(nextImageWrapper.firstChild)
  128. }
  129. }
  130. loadNext()
  131. }
  132. }
  133. register_hook('hide-details', function () {
  134. if (showTimer) {
  135. window.clearInterval(showTimer)
  136. }
  137. })