GeenStijl & Powned & Dumpert Comment Enhancer

Add features to enhance comments on GeenStijl & Powned & Dumpert & more.

// ==UserScript==
// @name             GeenStijl & Powned & Dumpert Comment Enhancer
// @namespace        https://github.com/jerone/UserScripts
// @description      Add features to enhance comments on GeenStijl & Powned & Dumpert & more.
// @author           jerone
// @copyright        2014+, jerone (https://github.com/jerone)
// @license          CC-BY-NC-SA-4.0; https://creativecommons.org/licenses/by-nc-sa/4.0/legalcode
// @license          GPL-3.0-or-later; http://www.gnu.org/licenses/gpl-3.0.txt
// @homepage         https://github.com/jerone/UserScripts/tree/master/GeenStijl_Powned_Dumpert_Comment_Enhancer
// @homepageURL      https://github.com/jerone/UserScripts/tree/master/GeenStijl_Powned_Dumpert_Comment_Enhancer
// @supportURL       https://github.com/jerone/UserScripts/issues
// @contributionURL  https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=VCYMHWQ7ZMBKW
// @include          http*://*geenstijl.nl/mt/archieven/*
// @include          http*://*geenstijl.tv/*
// @include          http*://*powned.tv/nieuws/*
// @include          http*://*dumpert.nl/mediabase/*
// @include          http*://*daskapital.nl/*
// @include          http*://*glamora.ma/*
// @version          2.0
// @grant            none
// ==/UserScript==

// cSpell:ignore Dumpert, dumpert, geenstijl, powned, daskapital, glamora, perma
/* eslint security/detect-object-injection: "off" */

(function () {
	function proxy(fn) {
		return function () {
			var that = this;
			return function (e) {
				var args = that.slice(0); // clone;
				args.unshift(e); // prepend event;
				fn.apply(this, args);
			};
		}.call([].slice.call(arguments, 1));
	}

	function wait(condition, next) {
		var loop = window.setInterval(function () {
			if (condition() === true) {
				window.clearInterval(loop);
				next();
			}
		}, 100);
	}

	String.format = function (string) {
		var args = Array.prototype.slice.call(arguments, 1, arguments.length);
		return string.replace(/{(\d+)}/g, function (match, number) {
			return typeof args[number] !== "undefined" ? args[number] : match;
		});
	};

	var replyImgScr =
		"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAABcSURBVChTjZBbDsAgCATl2PDFzW236RjqI+kmSsBxQS0i+q2GzKzVfBy8oOCj3L03bRIROjNHbQGBgRQx+TgC6ALQEawtGeNpzWNwETjD2xlVrGtp/et7ZpddfgEnfhsfVr//KQAAAABJRU5ErkJgggA=";
	var permaImgScr =
		"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAIAAAACUFjqAAAABGdBTUEAAK/INwWK6QAAAAlwSFlzAAAOwwAADsMBx2+oZAAAABZ0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMDvo9WkAAABfSURBVChTXY9BEsAgCAP7bMqpL4euDaJ2D0xMzKDXvWFmpSYjzsyIYP4YMQ2y7+rRrlhKh2ci091XDH1DJnPtlgsIetpYsTImmoxHVLuVMsHxaDf7D+tpQr/CAjnu/gJVo8cY6M1GEAAAAABJRU5ErkJggg==";

	var commentsList = document.getElementById("comments");
	if (commentsList) {
		wait(
			function () {
				return (
					commentsList.querySelectorAll("article .nsb,.comment .nsb")
						.length > 0
				);
			},
			function () {
				Array.forEach(
					commentsList.querySelectorAll("article,.comment"),
					function (comment) {
						var footer = comment.querySelector("footer,.footer");

						if (comment.id) {
							var perma = document.createElement("a");
							perma.classList.add("nsb");
							perma.setAttribute(
								"href",
								String.format("#{0}", comment.id),
							);
							perma.setAttribute(
								"title",
								String.format("Permalink #{0}", comment.id),
							);
							perma.style.backgroundImage = String.format(
								"url('{0}')",
								permaImgScr,
							);
							perma.style.backgroundPosition = "center center";
							perma.style.marginRight = "4px";
							if (
								/https?:\/\/www\.powned\.tv\/nieuws\/.*/.test(
									location.href,
								)
							) {
								// add missing css;
								perma.style.cursor = "pointer";
								perma.style.cssFloat = "right";
								perma.style.height = perma.style.width = "10px";
							}
							footer.appendChild(perma);
						}

						var textArea = document.getElementById("text");
						if (textArea) {
							var reply = document.createElement("span");
							reply.classList.add("nsb");
							reply.setAttribute("title", "Beantwoorden");
							reply.style.backgroundImage = String.format(
								"url('{0}')",
								replyImgScr,
							);
							reply.style.backgroundPosition = "center center";
							reply.style.marginRight = "4px";
							if (
								/https?:\/\/www\.powned\.tv\/nieuws\/.*/.test(
									location.href,
								)
							) {
								// add missing css;
								reply.style.cursor = "pointer";
								reply.style.cssFloat = "right";
								reply.style.height = reply.style.width = "10px";
							}
							reply.addEventListener(
								"click",
								proxy(function () {
									textArea.value += String.format(
										"@{0}\n",
										Array.map(
											this.childNodes,
											function (node) {
												return node.nodeType === 3
													? node.textContent.trim()
													: "";
											},
										)
											.join(" ")
											.trim()
											.replace(/\s{2,}/, " ")
											.replace(/\s?\|\s?$/g, ""),
									);
									textArea.focus();
									textArea.scrollIntoView();
								}).bind(footer),
							);
							footer.appendChild(reply);
						}
					},
				);
			},
		);
	}
})();