From Wikipedia, the free encyclopedia
Note: After saving, you have to bypass your browser's cache to see the changes. Google Chrome, Firefox, Microsoft Edge and Safari: Hold down the ⇧ Shift key and click the Reload toolbar button. For details and instructions about other browsers, see Wikipedia:Bypass your cache.

// Add "refresh" option on category pages, template pages,  and on

// "Special:WhatLinksHere". Makes forceupdate nulledit on all pages in the

// category, all transclusing pages, or all linked pages.

// Based on [https://phabricator.wikimedia.org/T170039#3473755] and [[:he:User:IKhitron/101.js]]



mw.loader.using(  'mediawiki.util', 'mediawiki.api'  ).then( function() {

	var pageList = [];

	const reuse = ( typeof refreshReuseBubble === 'undefined' ? false : refreshReuseBubble );

	

	function getWait(d, totalCount) {

		var wait={: 8000, purge: 2100};

		if (d && d?.query?.userinfo) {

			var ratelimits = d.query.userinfo?.ratelimits;

			if (d.query.userinfo.rights 

				&& d.query.userinfo.rights.includes("noratelimit")) {

				wait = {: 1, purge: 1};

			} else if (ratelimits) {

				'edit', 'purge'].forEach ( (v) => {

					var u = ratelimits?.[v?.user;

					if (u && u?.hits && u?.seconds) {

						console.log(v + " rate limit: hits=" + u.hits + ", seconds=" + u.seconds);

						if (u.hits < totalCount) {

							waitv = Math.ceil( (u.seconds/u.hits) * 1050 );

						} else {

							console.log(totalCount+" items to refresh is less than "+u.hits);

							waitv = 1;

						}

					}

				} );

			}

		}

		console.log("Millisecond waits between queries:");console.log(wait);

		return wait;

	}

	

	function doRefresh(action, count, totalCount, wait) {

		function postDone() {

			if (pageList.length > 0) {

				setTimeout(function() {

					doRefresh(action, count, totalCount, wait);

				}, waitaction]);

			} else if (confirm("Done!\n\nReload page?") == true) {

				document.location.reload();

			} else {

				mw.notify("Done!", {type: 'success', tag: "bubble" + (reuse ? 0 : 'done')});

			}

		}

		

		function postFail(code, error) {

			console.error(error);

			var err = error?.textStatus || code;

			var errMsg;

			if (confirm("Error performing " + action + ": " + err + "!\n\nContinue?") == true) {

				errMsg = "Continuing after "+err+" error...";

				postDone();

			} else {

				errMsg = "Aborted due to "+err+" error!";

			}

			mw.notify(errMsg, { tag: "bubble" + (reuse ? 0 : "error"), type: 'error',

				autoHideSeconds: (action == 'purge') ? 'long' : 'short'	} );

		}

		

		function postSuccess() {

			count = count + ( (action == "purge") ? ((apiParams.titles.match(/\|/g) || []).length + 1) : 1 );

			mw.notify(count + " of " + totalCount + " page(s) were updated", {

				tag: "bubble" + (reuse ? 0 : count),

				autoHideSeconds: (action == 'purge') ? 'long' : 'short'

			} );

			postDone();

		}



		var apiParams = {action: action};

		

		if (action == "purge") {

			var numPages = Math.round(wait.purge/wait.) || 1;

			apiParams.titles = pageList.splice(0, numPages).join('|');

			apiParams.forcerecursivelinkupdate = "1";

			//apiParams.forcelinkupdate = "1";

			new mw.Api().post(apiParams).fail(postFail).done(postSuccess);

		} else {

			apiParams.title = pageList.shift();

			apiParams.watchlist = "nochange";

			apiParams.nocreate = "1";

			apiParams.appendtext = "";

			new mw.Api().postWithEditToken(apiParams).fail(postFail).done(postSuccess);

		}

	}

	

	function getList(action, target, addParams) {

		mw.notify("Fetching " + target.generator + "...", { tag: "bubble0" } );

		var queryParams = $.extend({

				action: 'query', 

				formatversion: '2',

				prop: ''

			},

			target,

			addParams);

		new mw.Api().post(queryParams).fail(function(code, error) {

			console.error(error);

			alert("Error fetching page titles: " + code + "!");

		} ).done(function(q) {

			if(q && q.warnings === undefined && q.query && q.query.pages) {

				for (var page in q.query.pages) {

					if (q.query.pagespage].title) {

						pageList.push(q.query.pagespage].title);

					}

				}

				if (q"continue" !== undefined	

					&& (q"continue"].gticontinue

						|| q"continue"].gcmcontinue

						|| q"continue"].glhcontinue

					)

				) {

					getList(action, target, q"continue"]);

				} else {

					console.log(pageList);

					new mw.Api().get( {

						meta: 'userinfo',

						uiprop: 'ratelimits'

					} ).fail( function(e) {

						console.error(e);

						doRefresh(action, 0, pageList.length, {: 8000, purge: 2100});

					} ).done( function(ui) {

						var len = pageList.length;

						mw.notification.autoHideLimit = len;

						mw.notify('Performing '+action+' on '+len+' page(s)...', {

							autoHideSeconds: (action == 'purge') ? 'long' : 'short',

							tage: 'bubble0'

						} );

						doRefresh(action, 0, len, getWait(ui, len));

					} );

				}

			}

		} );

	}

	

	if ( (mw.config.get('wgNamespaceNumber') == 10) 

		|| (mw.config.get('wgNamespaceNumber') == 14) 

		|| (mw.config.get('wgNamespaceNumber') == 828) 

		|| (mw.config.get("wgCanonicalSpecialPageName") == "Whatlinkshere") )

	{

		var linkTitle="", toolTipText="";

		var target = mw.config.get("wgRelevantPageName").replace(/_/g, " ");

		var targetNS = mw.Title.newFromText(target).getNamespaceId();

		if ( (targetNS == 10) || (targetNS == 828) ){

			target = {

				generator: 'transcludedin',

				titles: target,

				gtilimit: 'max'

			};

			linkTitle = "transcluding pages";

			toolTipText = "that transclude this template.";

		} else if (targetNS == 14) {

			target = {

				generator: 'categorymembers',

				gcmtitle: target,

				gcmlimit: 'max'

			};

			linkTitle = "category members";

			toolTipText = "in this category.";

		} else {

			target = {

				generator: 'linkshere',

				titles: target,

				glhlimit: 'max'

			};

			linkTitle = "linking pages";

			toolTipText = "that link to this page.";

		}

		$(mw.util.addPortletLink('p-cactions', '#', 'Purge ' + linkTitle, 'pt-refresh-purge', 'Perform a "forcelinkupdate" purge on all pages ' + toolTipText))

			.click(function() {

				getList("purge", target);

			});

		$(mw.util.addPortletLink('p-cactions', '#', 'Null edit ' + linkTitle, 'pt-refresh-null', 'Perform a null edit on all pages ' + toolTipText))

			.click(function() {

				getList("edit", target);

			});

	}

});
From Wikipedia, the free encyclopedia
Note: After saving, you have to bypass your browser's cache to see the changes. Google Chrome, Firefox, Microsoft Edge and Safari: Hold down the ⇧ Shift key and click the Reload toolbar button. For details and instructions about other browsers, see Wikipedia:Bypass your cache.

// Add "refresh" option on category pages, template pages,  and on

// "Special:WhatLinksHere". Makes forceupdate nulledit on all pages in the

// category, all transclusing pages, or all linked pages.

// Based on [https://phabricator.wikimedia.org/T170039#3473755] and [[:he:User:IKhitron/101.js]]



mw.loader.using(  'mediawiki.util', 'mediawiki.api'  ).then( function() {

	var pageList = [];

	const reuse = ( typeof refreshReuseBubble === 'undefined' ? false : refreshReuseBubble );

	

	function getWait(d, totalCount) {

		var wait={: 8000, purge: 2100};

		if (d && d?.query?.userinfo) {

			var ratelimits = d.query.userinfo?.ratelimits;

			if (d.query.userinfo.rights 

				&& d.query.userinfo.rights.includes("noratelimit")) {

				wait = {: 1, purge: 1};

			} else if (ratelimits) {

				'edit', 'purge'].forEach ( (v) => {

					var u = ratelimits?.[v?.user;

					if (u && u?.hits && u?.seconds) {

						console.log(v + " rate limit: hits=" + u.hits + ", seconds=" + u.seconds);

						if (u.hits < totalCount) {

							waitv = Math.ceil( (u.seconds/u.hits) * 1050 );

						} else {

							console.log(totalCount+" items to refresh is less than "+u.hits);

							waitv = 1;

						}

					}

				} );

			}

		}

		console.log("Millisecond waits between queries:");console.log(wait);

		return wait;

	}

	

	function doRefresh(action, count, totalCount, wait) {

		function postDone() {

			if (pageList.length > 0) {

				setTimeout(function() {

					doRefresh(action, count, totalCount, wait);

				}, waitaction]);

			} else if (confirm("Done!\n\nReload page?") == true) {

				document.location.reload();

			} else {

				mw.notify("Done!", {type: 'success', tag: "bubble" + (reuse ? 0 : 'done')});

			}

		}

		

		function postFail(code, error) {

			console.error(error);

			var err = error?.textStatus || code;

			var errMsg;

			if (confirm("Error performing " + action + ": " + err + "!\n\nContinue?") == true) {

				errMsg = "Continuing after "+err+" error...";

				postDone();

			} else {

				errMsg = "Aborted due to "+err+" error!";

			}

			mw.notify(errMsg, { tag: "bubble" + (reuse ? 0 : "error"), type: 'error',

				autoHideSeconds: (action == 'purge') ? 'long' : 'short'	} );

		}

		

		function postSuccess() {

			count = count + ( (action == "purge") ? ((apiParams.titles.match(/\|/g) || []).length + 1) : 1 );

			mw.notify(count + " of " + totalCount + " page(s) were updated", {

				tag: "bubble" + (reuse ? 0 : count),

				autoHideSeconds: (action == 'purge') ? 'long' : 'short'

			} );

			postDone();

		}



		var apiParams = {action: action};

		

		if (action == "purge") {

			var numPages = Math.round(wait.purge/wait.) || 1;

			apiParams.titles = pageList.splice(0, numPages).join('|');

			apiParams.forcerecursivelinkupdate = "1";

			//apiParams.forcelinkupdate = "1";

			new mw.Api().post(apiParams).fail(postFail).done(postSuccess);

		} else {

			apiParams.title = pageList.shift();

			apiParams.watchlist = "nochange";

			apiParams.nocreate = "1";

			apiParams.appendtext = "";

			new mw.Api().postWithEditToken(apiParams).fail(postFail).done(postSuccess);

		}

	}

	

	function getList(action, target, addParams) {

		mw.notify("Fetching " + target.generator + "...", { tag: "bubble0" } );

		var queryParams = $.extend({

				action: 'query', 

				formatversion: '2',

				prop: ''

			},

			target,

			addParams);

		new mw.Api().post(queryParams).fail(function(code, error) {

			console.error(error);

			alert("Error fetching page titles: " + code + "!");

		} ).done(function(q) {

			if(q && q.warnings === undefined && q.query && q.query.pages) {

				for (var page in q.query.pages) {

					if (q.query.pagespage].title) {

						pageList.push(q.query.pagespage].title);

					}

				}

				if (q"continue" !== undefined	

					&& (q"continue"].gticontinue

						|| q"continue"].gcmcontinue

						|| q"continue"].glhcontinue

					)

				) {

					getList(action, target, q"continue"]);

				} else {

					console.log(pageList);

					new mw.Api().get( {

						meta: 'userinfo',

						uiprop: 'ratelimits'

					} ).fail( function(e) {

						console.error(e);

						doRefresh(action, 0, pageList.length, {: 8000, purge: 2100});

					} ).done( function(ui) {

						var len = pageList.length;

						mw.notification.autoHideLimit = len;

						mw.notify('Performing '+action+' on '+len+' page(s)...', {

							autoHideSeconds: (action == 'purge') ? 'long' : 'short',

							tage: 'bubble0'

						} );

						doRefresh(action, 0, len, getWait(ui, len));

					} );

				}

			}

		} );

	}

	

	if ( (mw.config.get('wgNamespaceNumber') == 10) 

		|| (mw.config.get('wgNamespaceNumber') == 14) 

		|| (mw.config.get('wgNamespaceNumber') == 828) 

		|| (mw.config.get("wgCanonicalSpecialPageName") == "Whatlinkshere") )

	{

		var linkTitle="", toolTipText="";

		var target = mw.config.get("wgRelevantPageName").replace(/_/g, " ");

		var targetNS = mw.Title.newFromText(target).getNamespaceId();

		if ( (targetNS == 10) || (targetNS == 828) ){

			target = {

				generator: 'transcludedin',

				titles: target,

				gtilimit: 'max'

			};

			linkTitle = "transcluding pages";

			toolTipText = "that transclude this template.";

		} else if (targetNS == 14) {

			target = {

				generator: 'categorymembers',

				gcmtitle: target,

				gcmlimit: 'max'

			};

			linkTitle = "category members";

			toolTipText = "in this category.";

		} else {

			target = {

				generator: 'linkshere',

				titles: target,

				glhlimit: 'max'

			};

			linkTitle = "linking pages";

			toolTipText = "that link to this page.";

		}

		$(mw.util.addPortletLink('p-cactions', '#', 'Purge ' + linkTitle, 'pt-refresh-purge', 'Perform a "forcelinkupdate" purge on all pages ' + toolTipText))

			.click(function() {

				getList("purge", target);

			});

		$(mw.util.addPortletLink('p-cactions', '#', 'Null edit ' + linkTitle, 'pt-refresh-null', 'Perform a null edit on all pages ' + toolTipText))

			.click(function() {

				getList("edit", target);

			});

	}

});

Videos

Youtube | Vimeo | Bing

Websites

Google | Yahoo | Bing

Encyclopedia

Google | Yahoo | Bing

Facebook