Jump to content

User:Begoon/commonHistory.js

From Wikipedia, the free encyclopedia
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
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.
//Forked, with thanks, from [[User:Writ Keeper/Scripts/commonHistory.js]]
//so that I can do some fussy formatting

//changes: 14/08/16 - hardcode labels, remove bold font, remove leading/trailing spaces
//updated: 13/12/17 - updated source re-merged with local changes 
//updated: 19/01/18 - updated source re-merged with local changes 
//updated: 27/02/18 - updated source re-merged with local changes 

if (typeof inspectText == "undefined")
{
	inspectText = "+";
}
if(typeof showText == "undefined")
{
	showText = "+";
}
if(typeof hideText == "undefined")
{
	hideText = "–"; //en-dash for consistent width with '+'
}
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 = '<span style="color:black;">[</span><span style="color:#339900;">'+inspectText+'</span><span style="color:black;">]</span>';
				}
				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).find(".mw-changeslist-separator:first"));
				}
				else
				{
					$(inlineDiffButton).insertBefore($(element).find(".mw-title"));
					$(inlineDiffButton).addClass("mw-enhanced-rc-diff");
					/*
					$(element).find("tr:first").append("<td></td>");
					$(element).find("tr:first>td:last").append(inlineDiffButton);
					*/
				}
			}
		}
	}
	function addWatchlistInspectionBoxes()
	{
		mw.loader.using("mediawiki.diff.styles").done(function()
		{
			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);
			}
		});
	}

	function inspectWatchlistDiff(button)
	{
		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!");
					return false;
				}

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

				if (diffString == null)
				{
					alert("Request failed!");
					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).hasClass("mw-enhanced-rc-diff"))
				{
					$("#" + button.id).parents("table").after(newTable);
				}
				else
				{
					diffParent = $("#" + button.id).parent();
					diffParent.append(newTable);
				}
				newTable.id = button.id + "display";

				$(button).unbind("click");
				if (typeof inlineDiffBigUI === "undefined")
				{
					$(button).html('<span style="color:black;">[</span><span style="color:#339900;">'+hideText+'</span><span style="color:black;">]</span>');
					$(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");
						}
					}
					);
				}
			}
			);
		}
		);
		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('<span style="color:black;">[</span><span style="color:#339900;">'+hideText+'</span><span style="color:black;">]</span>');
		$(button).unbind("click");
		$(button).click(function ()
		{
			return hideSmallEditInspection(this);
		}
		);
		return false;
	}

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

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