Wikimedia Commons upload page: near Categories input - set previous clickable categories

Useful to see previous categories that you used

  1. // ==UserScript==
  2. // @name Wikimedia Commons upload page: near Categories input - set previous clickable categories
  3. // @namespace http://greasyfork.org/
  4. // @version 1.3
  5. // @author Vitaly Zdanevich
  6. // @match https://commons.wikimedia.org/wiki/Special:UploadWizard
  7. // @match https://commons.wikimedia.org/w/index.php?title=Special:UploadWizard*
  8. // @supportURL https://gitlab.com/vitaly-zdanevich-userscripts/commonsUploadSetPrevCategories
  9. // @description Useful to see previous categories that you used
  10. // @license MIT
  11. // ==/UserScript==
  12.  
  13. // TODO publish to Commons userscript (userscript of another type)
  14.  
  15. (function() {
  16. const parent = document.getElementById('upload-wizard')
  17. const config = { attributes: true, childList: false, subtree: true }
  18. const observer = new MutationObserver(_ => {
  19.  
  20. if (!setPreviousCategories.isStarted && document.querySelector('.oo-ui-draggableGroupElement') && !document.querySelector('#prevCats'))
  21. setPreviousCategories()
  22. })
  23.  
  24. function setPreviousCategories() {
  25. setPreviousCategories.isStarted = true
  26.  
  27. // https://www.mediawiki.org/wiki/API:Usercontribs
  28. fetch(`https://commons.wikimedia.org/w/api.php?action=query&list=usercontribs&uclimit=1&ucuser=${mw.user.getName()}&format=json`)
  29. .then(resp => resp.json())
  30. .then(j => {
  31. const filename = j['query']['usercontribs'][0]['title']
  32. // https://www.mediawiki.org/w/api.php?action=help&modules=query:categories
  33. fetch(`https://commons.wikimedia.org/w/api.php?action=query&format=json&prop=categories&meta=&titles=${filename}&formatversion=2&clshow=!hidden`)
  34. .then(resp => resp.json())
  35. .then(j => {
  36. const cats = j['query']['pages'][0]['categories']
  37. .reduce(reducer, [])
  38.  
  39. const a = document.createElement('a')
  40. a.id = 'prevCats'
  41. a.innerText = 'Previous:\n'
  42. a.href = '//commons.wikimedia.org/wiki/' + filename
  43. document.querySelector('.oo-ui-draggableGroupElement').append(a, ...cats)
  44.  
  45. setPreviousCategories.isStarted = false
  46. })
  47. })
  48. }
  49.  
  50. observer.observe(parent, config)
  51.  
  52. })()
  53.  
  54. function reducer(acc, cur) {
  55. const div = document.createElement('div')
  56. const a = document.createElement('a')
  57. a.innerText = cur['title'].replace('Category:', '')
  58. a.href = '//commons.wikimedia.org/wiki/' + cur['title']
  59.  
  60. const copy = document.createElement('span')
  61. copy.innerText = '📋'
  62. copy.style = 'cursor: pointer; margin-left: 10px'
  63.  
  64. copy.onclick = function() {
  65. this.remove()
  66. navigator.clipboard.writeText(a.innerText)
  67. }
  68.  
  69. div.appendChild(a)
  70. div.appendChild(copy)
  71.  
  72. acc.push(div)
  73. return acc
  74. }