// ==UserScript== // @name Wikimedia Commons upload page: near Categories input - set previous clickable categories // @namespace http://greasyfork.org/ // @version 1.0 // @author Vitaly Zdanevich // @match https://commons.wikimedia.org/wiki/Special:UploadWizard // @supportURL https://gitlab.com/vitaly-zdanevich-userscripts/commonsUploadSetPrevCategories // @description Useful to see previous categories that you used // @license MIT // @downloadURL none // ==/UserScript== // TODO publish to Commons userscript (userscript of another type) (function() { const parent = document.getElementById('upload-wizard') const config = { attributes: true, childList: false, subtree: true } const observer = new MutationObserver(_ => { if (!setPreviousCategories.isStarted && document.querySelector('.oo-ui-draggableGroupElement') && !document.querySelector('#prevCats')) setPreviousCategories() }) function setPreviousCategories() { setPreviousCategories.isStarted = true // https://www.mediawiki.org/wiki/API:Usercontribs fetch(`https://commons.wikimedia.org/w/api.php?action=query&list=usercontribs&uclimit=1&ucuser=${mw.user.getName()}&format=json`) .then(resp => resp.json()) .then(j => { const filename = j['query']['usercontribs'][0]['title'] // https://www.mediawiki.org/w/api.php?action=help&modules=query:categories fetch(`https://commons.wikimedia.org/w/api.php?action=query&format=json&prop=categories&meta=&titles=${filename}&formatversion=2&clshow=!hidden`) .then(resp => resp.json()) .then(j => { const cats = j['query']['pages'][0]['categories'] .reduce(reducer, []) const div = document.createElement('div') div.id = 'prevCats' const a = document.createElement('a') a.innerText = 'Previous:\n' a.href = '//commons.wikimedia.org/wiki/' + filename document.querySelector('.oo-ui-draggableGroupElement').append(a, ...cats) }) }) } observer.observe(parent, config) })() function reducer(acc, cur) { const a = document.createElement('a') a.innerText = cur['title'].replace('Category:', '') a.href = '//commons.wikimedia.org/wiki/' + cur['title'] a.style = 'display: block' acc.push(a) return acc }