tinyurl.com - URL shorten button

Add a URL shorten button to the bottom left corner. Click it to get a shortened URL (by tinyurl.com) of current page.

As of 2022-07-01. See the latest version.

// ==UserScript==
// @name				tinyurl.com - URL shorten button
// @name:zh-TW			tinyurl.com 縮短網址按鈕
// @name:zh-CN			tinyurl.com 缩短网址按钮
// @description			Add a URL shorten button to the bottom left corner. Click it to get a shortened URL (by tinyurl.com) of current page.
// @description:zh-TW	在頁面左下角設置一個縮短網址的按鈕,點按即可從 tinyurl.com 取得目前頁面的縮址
// @description:zh-CN	在页面左下角设置一个缩短网址的按钮,点按即可从 tinyurl.com 取得当前页面的缩址
// @namespace			https://greasyfork.org/zh-TW/users/393133-evan-tseng
// @version				0.35
// @author				Evan Tseng
// @include				*://*
// @grant				none
// @run-at				document-body
// @license				MIT
// ==/UserScript==

(function() {
	'use strict';
	if(location.hostname == "tinyurl.com") {
		var url = new URL(location.href);
		if(url.searchParams.get("trigger") == "shortenButton") {
			var tu = document.body.innerText;
			document.body.innerHTML = "";
			document.write(`<style>
html, body { color:#000; background:#bbb; overflow:hidden }
body { width:236pt; height:24pt; font:400 12pt/20pt sans-serif; text-align:center; padding:0 2pt; margin:0; vertical-align:middle }
.errMsg { color:#600; font-weight:600; line-height:24pt; }
#sUrl, #ccBtn { font:400 12pt/20pt sans-serif; height:20pt; line-height:1; text-align:center; vertical-align:middle; padding:0 .5em; margin:2pt 0 }
#sUrl { width:160pt; text-align:center; color:222; border:1px inset #eee; border-radius:5pt }
#ccBtn { width:4em; color:#000; background:#ddd; border:1px solid #888; border-radius:5pt; cursor:pointer }
input, button { outline:none }
input:focus, button:focus { box-shadow:0 0 1mm 1px #08f }
@media (prefers-color-scheme: light) {
	#ccBtn:hover { filter:brightness(1.2) }
	#ccBtn:active { filter:brightness(.9) }
}
@media (prefers-color-scheme: dark) {
	#ccBtn:hover { filter:brightness(1.5) }
	#ccBtn:active { filter:brightness(.75) }
}
</style>`);
			if(tu.match(/^https?:\/\/tinyurl\.com\/\w+$/)) {
				document.write('<div><input id="sUrl" value="' + tu + '" readonly/> <button id="ccBtn" onclick="copyUrl()">Copy</button></div>');
				document.write(`<script>
function copyUrl() {
	let txtBox = document.querySelector("#sUrl");
	txtBox.focus();
	txtBox.select();
	document.execCommand("copy");
	txtBox.setSelectionRange(0,0)
	window.close();
}
document.querySelector("#ccBtn").focus();
</script>`);
			}
			else document.write('<div class="errMsg">Error! Unable to shorten this URL.</div>');
		}
	}
	else if(window.self === window.top) {
		(function(){
			const TUcss = `
.__TUwrap__ { position:fixed; left:0; bottom:33mm; width:0; margin:0; z-index:2147483647 }
.__TUbg__ { position:fixed; top:0; left:0; background:rgba(0,0,0,.5); width:100vw; height:100vh; z-index:-1; backdrop-filter:blur(3mm); -webkit-backdrop-filter:blur(3mm); visibility:hidden; opacity:0; transition:.5s, width 0s, height 0s }
.__TUbtn__ { position:absolute; left:.2em; transform:rotate(90deg); width:64pt; font:400 12pt/1.6 arial!important; color:#333!important; background:#ddd!important; padding:0!important; margin:0 -32pt!important; line-height:1.6!important; border:1px solid #888; border-radius:5px 5px 0 0; box-shadow:0 0 0 1px rgba(0,0,0,.4); opacity:.4; white-space:nowrap; cursor:pointer; transition:.3s,left .5s .5s; }
.__TUbtn__:hover { left:.8em; box-shadow: 2px 0 2mm 1px rgba(0,0,0,.5); opacity:1; transition:.1s;}
.__TUbtn__:active { color:#eee!important; background:#666!important; box-shadow: inset 1px 0 1mm 1px rgba(0,0,0,.5); transition:0s}
.__TUbox__ { position:absolute; left:10mm; top:-4mm; display:none; box-sizing:content-box; width:236pt; height:24pt; padding:3mm; border-radius:3mm; background:#bbb; box-shadow:0 1mm 5mm rgba(0,0,0,.3); backdrop-filter:blur(3mm); -webkit-backdrop-filter:blur(3mm)}
.__TUbox__:before { position:absolute; top:20px; left:-7px; display:block; content:""; border-top:7px solid transparent;border-bottom:7px solid transparent; border-right:7px solid #bbb; z-index:2 }
.__TUpage__ { display:block!important; width:236pt; height:24pt; background:transparent; background-image:none; border:none; }`;

			let cssStyle = document.createElement('style');
			if(cssStyle.styleSheet)	cssStyle.styleSheet.cssText = TUcss;
			else	cssStyle.appendChild(document.createTextNode(TUcss));
			document.querySelector('head').appendChild(cssStyle);

			var TUwrap = null,
				TUbg = null,
				TUbox = null,
				TUpage = null;

			function query(theUrl){
				close();
				let queryURL = 'https://tinyurl.com/api-create.php?trigger=shortenButton&url=' + encodeURIComponent(theUrl);
				TUpage = document.createElement('iframe');
				TUpage.setAttribute('class', '__TUpage__');
				TUpage.src = queryURL;
				TUbox.appendChild(TUpage);
				TUbox.setAttribute('style', 'display:block;');
				TUbg.setAttribute('style', 'visibility:visible; opacity:1')
			}

			function close(){
				if(TUpage) {
					TUbox.setAttribute('style', 'display:none');
					TUpage.remove();
					TUpage = null;
				}
				TUbg.setAttribute('style', 'visibility:hidden; opacity:0')
			}

			function initialize(){
				TUwrap = document.createElement('div');
				TUwrap.setAttribute('class', '__TUwrap__');
				TUbg = document.createElement('div');
				TUbg.setAttribute('class', '__TUbg__');
				let TUbtn = document.createElement('button');
				TUbtn.setAttribute('class', '__TUbtn__');
				TUbtn.innerText = "TinyURL"
				TUbox = document.createElement('div');
				TUbox.setAttribute('class', '__TUbox__');

				TUwrap.appendChild(TUbg);
				TUwrap.appendChild(TUbtn);
				TUwrap.appendChild(TUbox);
				document.body.appendChild(TUwrap);
				TUbg.addEventListener('click', close );
				TUbtn.addEventListener('click', function(){ query(window.location.href) });
			}

			if(TUwrap == null) initialize();
		})();
	}

})();