User:Splarka/watchimages.js

/* Semi-automatic image watcher, version [0.0.3a]

Originally from: http://en.wikipedia.org/wiki/User:Splarka/watchimages.js

Operation:

  • Checks which images are being used on a page
  • Sorts out those from commons, builds a list of those local or missing
  • Passes this list to Special:Watchlist/raw (but does not save, being a test script).
  • When saved, returns to the original page.

Notes:

  • The logic of which images to watch is easily changed (see below)
  • This avoids ajax editing (which is a pain). Possibly the API actions will be enabled later.

To do after more testing:

  • Abort if no matching images are found.
  • Check page more specifically for a content type (page has ID? etc).
  • Auto-submit if so desired.
  • /

if(mw.config.get('wgNamespaceNumber') != -1) addOnloadHook(watchAllImagesButton)

function watchAllImagesButton() {

mw.util.addPortletLink('p-tb','javascript:watchAllImages()','Watch images','t-wai','Add all images on this page to your watchlist.');

}

function watchAllImages() {

var wai = document.getElementById('t-wai');

if(wai) {

wai.getElementsByTagName('a')[0].style.display = 'none';

var prog = document.createElement('img');

prog.setAttribute('id','wai-prog');

prog.setAttribute('src',stylepath + '/common/images/spinner.gif');

wai.appendChild(document.createTextNode('Working...'));

wai.appendChild(prog);

}

var url = mw.config.get('wgServer') + mw.config.get('wgScriptPath') +'/api.php?action=query&format=json&callback=watchAllImagesCB&generator=images&prop=imageinfo&iiprop=&iilimit=1&titles=' + encodeURIComponent(mw.config.get('wgPageName'))

var scriptElem = document.createElement('script');

scriptElem.setAttribute('src',url);

scriptElem.setAttribute('type','text/javascript');

document.getElementsByTagName('head')[0].appendChild(scriptElem);

}

function watchAllImagesCB(obj) {

document.getElementById('wai-prog').style.display = 'none';

var towatch = '';

if(!obj['query'] || !obj['query']['pages']) return

var images = obj['query']['pages'];

for(var i in images) {

// Logic variables to determine which images to watch

// islocal = image is local, rather than shared (from commons).

// haspage = has a description page, all local and some shared images have this.

// hasmedia = the image exists, either locally or shared.

var islocal = (images[i]['imagerepository'] == 'local')

var haspage = i > 0

var hasmedia = (images[i]['imagerepository'] != '')

//(!hasmedia || islocal) => all local images, as well as all missing (deleted or soon to be uploaded) images

if(!hasmedia || islocal) {

towatch += images[i]['title'] += '\n';

}

}

var url = mw.config.get('wgServer') + mw.config.get('wgArticlePath').replace(/\$1/,'Special:Watchlist/raw') + '?fromtitle=' + encodeURIComponent(mw.config.get('wgPageName')) + '&towatch=' + encodeURIComponent(towatch);

document.location.href = url;

}

if(queryString('towatch') && mw.config.get('wgCanonicalSpecialPageName') == 'Watchlist') addOnloadHook(addToWatchlist)

function addToWatchlist() {

var txt = document.getElementById('titles');

var towatch = decodeURIComponent(queryString('towatch'));

if(!txt) return

if(queryString('fromtitle')) {

var forms = document.forms;

for(var i=0;i

if(forms[i].action.indexOf('Watchlist') != -1) {

forms[i].action += '&pleasereturnto=' + queryString('fromtitle');

}

}

}

txt.value += towatch;

alert('Note: the following images will be added to your watchlist upon save:\n' + towatch);

}

if(queryString('pleasereturnto') && mw.config.get('wgCanonicalSpecialPageName') == 'Watchlist') addOnloadHook(addToWatchlistDone)

function addToWatchlistDone() {

var url = mw.config.get('wgServer') + mw.config.get('wgArticlePath').replace(/\$1/,decodeURIComponent(queryString('pleasereturnto')));

document.location.href = url;

}

function queryString(p) {

var re = RegExp('[&?]' + p + '=([^&]*)');

var matches;

if (matches = re.exec(document.location)) {

try {

return decodeURI(matches[1]);

} catch (e) {

}

}

return null;

}