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.

195 lines
4.2 KiB

6 years ago
7 years ago
7 years ago
7 years ago
6 years ago
7 years ago
7 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. var div = document.createElement('div')
  62. div.className = 'images'
  63. var imageWrapper
  64. var nextImageWrapper = document.createElement('div')
  65. let options
  66. if (showTimer) {
  67. window.clearInterval(showTimer)
  68. }
  69. var currentLoader = new ImageLoader(data)
  70. data.detailsImageCounter = {}
  71. currentLoader.next({
  72. counter: data.detailsImageCounter,
  73. wrap: true
  74. }, function (err, img) {
  75. if (!img) {
  76. return callback(err)
  77. }
  78. displayBlock({
  79. dom,
  80. content: div,
  81. title: lang('images'),
  82. order: 2
  83. })
  84. imageWrapper = document.createElement('div')
  85. imageWrapper.className = 'imageWrapper'
  86. div.appendChild(imageWrapper)
  87. options = {
  88. size: Math.max(imageWrapper.offsetWidth, imageWrapper.offsetHeight)
  89. }
  90. showTimer = window.setInterval(showNext, 5000)
  91. show(img, options, imageWrapper)
  92. loadNext()
  93. })
  94. function loadNext () {
  95. currentLoader.next({
  96. counter: data.detailsImageCounter,
  97. wrap: true
  98. }, function (err, img) {
  99. if (err) {
  100. return console.log("Can't load next image", err)
  101. }
  102. show(img, options, nextImageWrapper)
  103. })
  104. }
  105. function showNext () {
  106. // when nothing was loaded, skip showing
  107. if (nextImageWrapper.firstChild) {
  108. while (imageWrapper.firstChild) {
  109. imageWrapper.removeChild(imageWrapper.firstChild)
  110. }
  111. while (nextImageWrapper.firstChild) {
  112. imageWrapper.appendChild(nextImageWrapper.firstChild)
  113. }
  114. }
  115. loadNext()
  116. }
  117. })
  118. register_hook('hide-details', function () {
  119. if (showTimer) {
  120. window.clearInterval(showTimer)
  121. }
  122. })
  123. register_hook('show-popup', function (data, category, dom, callback) {
  124. var div = document.createElement('div')
  125. div.className = 'images loading'
  126. var imageWrapper
  127. let body = dom.getElementsByClassName('popupBody')
  128. if (body.length) {
  129. dom.insertBefore(div, body[0])
  130. } else {
  131. dom.appendChild(div)
  132. }
  133. var currentLoader = new ImageLoader(data)
  134. data.popupImageCounter = {}
  135. currentLoader.first({
  136. counter: data.popupImageCounter
  137. }, function (err, data) {
  138. div.classList.remove('loading')
  139. if (!data) {
  140. return callback(err)
  141. }
  142. imageWrapper = document.createElement('div')
  143. imageWrapper.className = 'imageWrapper'
  144. div.appendChild(imageWrapper)
  145. let options = {
  146. size: 150
  147. }
  148. let img = show(data, options, imageWrapper)
  149. if (img) {
  150. img.onload = () => {
  151. dom.classList.add('hasImage')
  152. }
  153. }
  154. callback(null)
  155. })
  156. })