Jump to content

User:Writ Keeper/Scripts/commonHistory.js

From Wikipedia, the free encyclopedia
This is an old revision of this page, as edited by Writ Keeper (talk | contribs) at 19:16, 25 July 2017 (test?). The present address (URL) is a permanent link to this revision, which may differ significantly from the current revision.
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.
diffRequestLocked = "f";
if (typeof inspectText == "undefined")
{
	inspectText = "inspect diff";
}
if (typeof showText == "undefined")
{
	showText = "show diff";
}
if (typeof hideText == "undefined")
{
	hideText = "hide diff";
}
if (mw.config.get("wgCanonicalSpecialPageName") == "Watchlist" ||
	mw.config.get("wgCanonicalSpecialPageName") == "Recentchanges" ||
	mw.config.get("wgCanonicalSpecialPageName") == "Contributions" ||
	mw.config.get("wgAction") == "history")
{
	function inspectionEachHelper(index, element)
	{
		var findString;
		if (mw.config.get("wgAction") == "history" || $(element).hasClass("mw-enhanced-rc-nested"))
		{
			findString = 'a:contains("prev")';
		}
		else
		{
			findString = 'a:contains("diff")';
		}

		var regex;

		if (mw.config.get("wgCanonicalSpecialPageName") == "Contributions")
		{
			regex = /&oldid=(\d+)$/;

		}
		else
		{
			regex = /&diff=(\d+)&oldid=/;
		}
		var diffLink = $(element).find(findString);
		if (diffLink.length > 0)
		{
			var regexResult = regex.exec(diffLink[0].href);
			if (regexResult != null && regexResult.length >= 2)
			{
				var diffID = regexResult[1];
				//don't re-add if it already exists
				if ($("#" + diffID).length > 0)
				{
					return;
				}
				var inlineDiffButton;
				if (typeof inlineDiffBigUI === "undefined")
				{
					inlineDiffButton = document.createElement("a");
					inlineDiffButton.href = "#";
					inlineDiffButton.innerHTML = '<b><span style="color:black;"> [</span><span style="color:#339900;">' + inspectText + '</span><span style="color:black;">] </span></b>';
				}
				else
				{
					inlineDiffButton = document.createElement("input");
					inlineDiffButton.type = "button";
					inlineDiffButton.value = "Inspect edit";
				}
				inlineDiffButton.id = diffID;
				$(inlineDiffButton).addClass("inspectDiffButton");
				$(inlineDiffButton).click(function ()
				{
					return inspectWatchlistDiff(this);
				}
				);
				if ($(element).find("tr:first").length == 0)
				{
					$(inlineDiffButton).insertAfter($(element).children(".mw-changeslist-separator:first"));
				}
				else
				{
					$(element).find("tr:first").append("<td></td>");
					$(element).find("tr:first>td:last").append(inlineDiffButton);
				}
			}
		}
	}
	function addWatchlistInspectionBoxes()
	{

		var entries = $("#mw-content-text table.mw-enhanced-rc");
		if (entries.length == 0)
		{
			$("#mw-content-text ul").each(function (ind, el)
			{
				$(el).children("li").each(inspectionEachHelper);
			}
			);
		}
		else
		{
			entries.each(inspectionEachHelper);
			$("td.mw-enhanced-rc-nested").each(inspectionEachHelper);
		}
		mw.loader.load('mediawiki.action.history.diff');
	}

	function inspectWatchlistDiff(button)
	{
		if (diffRequestLocked === "t")
		{
			alert("An old request is still being processed, please wait...");
			return false;
		}
		else
		{
			diffRequestLocked = "t";
			mw.loader.using(['mediawiki.api']).done(function ()
			{
				var mwApi = new mw.Api();
				mwApi.get(
				{
					action: "query",
					prop: "revisions",
					format: "json",
					rvprop: "timestamp",
					rvdiffto: "prev",
					revids: button.id
				}
				).done(function (response)
				{
					if (response == null)
					{
						alert("Request failed!");
						diffRequestLocked = "f";
						return false;
					}

					var diffString = response.query.pages[Object.keys(response.query.pages)[0]].revisions[0].diff["*"];

					if (diffString == null)
					{
						alert("Request failed!");
						diffRequestLocked = "f";
						return false;
					}

					var newTable = document.createElement("table");
					newTable.className = "diff";
					$(newTable).html('<colgroup><col class="diff-marker"><col class="diff-content"><col class="diff-marker"><col class="diff-content"></colgroup>');

					$(newTable).append(diffString);
					diffParent = null;
					if ($("#" + button.id).parent("td").length > 0 && !($("#" + button.id).parent("td").hasClass("mw-enhanced-rc-nested")))
					{
						$("#" + button.id).parents("table.mw-enhanced-rc:first").after(newTable);
					}
					else
					{
						diffParent = $("#" + button.id).parent();
						diffParent.append(newTable);
					}
					newTable.id = button.id + "display";

					$(button).unbind("click");
					if (typeof inlineDiffBigUI === "undefined")
					{
						$(button).html('<b><span style="color:black;"> [</span><span style="color:#339900;">' + hideText + '</span><span style="color:black;">] </span></b>');
						$(button).click(function ()
						{
							return hideSmallEditInspection(this);
						}
						);
					}
					else
					{
						$(button).attr("value", "Hide edit");
						$(button).click(function ()
						{
							return hideEditInspection(this);
						}
						);
					}
					if (typeof markAsViewed != "undefined" && markAsViewed)
					{
						mwApi.postWithToken('csrf',
						{
							action: "setnotificationtimestamp",
							revids: button.id
						}
						).done(function (data)
						{
							if (diffParent != null)
							{
								diffParent.removeClass("mw-changeslist-line-watched");
								diffParent.addClass("mw-changeslist-line-not-watched");
							}
						}
						);
					}
					diffRequestLocked = "f";
				}
				);
			}
			);
		}
		return false;
	}

	function showEditInspection(button)
	{
		$("#" + button.id + "display").css("display", "");
		$(button).attr("value", "Hide edit");
		$(button).unbind("click");
		$(button).click(function ()
		{
			return hideEditInspection(this);
		}
		);
		return false;
	}

	function hideEditInspection(button)
	{
		$("#" + button.id + "display").css("display", "none");
		$(button).attr("value", "Show edit");
		$(button).unbind("click");
		$(button).click(function ()
		{
			return showEditInspection(this);
		}
		);
		return false;
	}

	function showSmallEditInspection(button)
	{
		$("#" + button.id + "display").css("display", "");
		$(button).html('<b><span style="color:black;"> [</span><span style="color:#339900;">' + hideText + '</span><span style="color:black;">] </span></b>');
		$(button).unbind("click");
		$(button).click(function ()
		{
			return hideSmallEditInspection(this);
		}
		);
		return false;
	}

	function hideSmallEditInspection(button)
	{
		$("#" + button.id + "display").css("display", "none");
		$(button).html('<b><span style="color:black;"> [</span><span style="color:#339900;">' + showText + '</span><span style="color:black;">] </span></b>');
		$(button).unbind("click");
		$(button).click(function ()
		{
			return showSmallEditInspection(this);
		}
		);
		return false;
	}

	mw.hook( 'wikipage.content' ).add(addWatchlistInspectionBoxes);
}