URL Shortener

By Glendon Last update Dec 12, 2008 — Installed 881 times.

There are 6 previous versions of this script.

// URL Shortener
//
// Copyright 2008 Glendon Solsberry
// Released under the Apache license 
// http://www.apache.org/licenses/LICENSE-2.0
//
// ==UserScript==
// @name			URL Shortener
// @namespace			http://www.dp.cx/userscripts/
// @description			Submit any page to a url shortening service
// @version			1.1
// @date			2008-12-12
// @include			*
// @exclude			http://www.google.com/reader/*
// ==/UserScript==

var version_scriptNum = 22029; // Change this to the number given to the script by userscripts.org (check the address bar)
var version_timestamp = 1229119690067; // Used to differentiate one version of the script from an older one. Use the Date.getTime() function to get a value for this.

var services = {
	"None" : { },
	"TinyURL" : {
		"url" : 'http://tinyurl.com/create.php?url='+location.href,
		"regexp" : '(http:\/\/tinyurl.com\/[a-z0-9]+)',
	},
	"ln-s.net" : {
		"url" : 'http://ln-s.net/home/api.jsp?url='+encodeURIComponent(location.href),
		"regexp" : '(http:\/\/ln-s.net\/[$+-:_A-Za-z0-9]+)',
	},
	"MetaMark.net" : {
		"url" : 'http://metamark.net/api/rest/simple?long_url='+encodeURIComponent(location.href),
		"regexp" : '(http:\/\/xrl.us/.*)',
	},
	"lnk.nu" : {
		"url" : 'http://minilink.org/?url='+encodeURIComponent(location.href)+'&xml=1',
		"regexp" : '<minilink>(http:\/\/.*?)<\/minilink>',
	},
	"twirl.at" : {
		"url" : 'http://twirl.at/api.php?url='+encodeURIComponent(location.href),
		"regexp" : '(http:\/\/twirl.at\/[A-Za-z0-9]+)',
	},
};

function getshortlink() {
	var url = services[GM_getValue("service", "None")]["url"];
	var regexp = services[GM_getValue("service", "None")]["regexp"];
	
	if (!url || !regexp) { alert("Failure!"); return false; }
	if (!requestInProgress) {
		requestInProgress = true;
		GM_xmlhttpRequest({
			method: 'GET',
			url: url,
			onload: function(response) {
				if (response.status == 200) {
					if (linkhref = response.responseText.match(regexp)) {
						if (linkhref.length > 1) {
							setclip(linkhref[linkhref.length-1]);
						} else {
							setclip(linkhref[0]);
						}
					}
					requestInProgress = false;
				} else {
					reportError(response);
					requestInProgress = false;
				}
			},
			onerror: function(response) {
				reportError(response);
				requestInProgress = false;
			}
		});
	}
}

// Reports an error to the user.
function reportError(response) {
	GM_log('Error: ' + response.responseText);
	window.status = "Error with action: " + response.responseText;
}

function setclip(text) {
	// you have to sign the code to enable this, or see notes below
	try {
		unsafeWindow.netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
		var str = Components.classes["@mozilla.org/supports-string;1"].createInstance(Components.interfaces.nsISupportsString);
		str.data= text;

		// make transferable
		var trans = Components.classes['@mozilla.org/widget/transferable;1'].createInstance(Components.interfaces.nsITransferable);
		if (!trans) return;

		// specify data type; TEXT
		trans.addDataFlavor('text/unicode');
		trans.setTransferData("text/unicode",str,text.length*2);

		// make interface clipboard
		var clip = Components.classes['@mozilla.org/widget/clipboard;1'].createInstance(Components.interfaces.nsIClipboard);
		if (!clip) return;
		var clipid=Components.interfaces.nsIClipboard;
		clip.setData(trans,null,clipid.kGlobalClipboard);
		unsafeWindow.status("URL successfully shortened.  It's in your clipboard!");
	} catch (e) {
		var show_prompt = GM_getValue("show_prompt", 1);
		if (show_prompt) {
			var prompt_res = prompt("Here is your link.\nIf you would like this to be automatically copied in the future, visit 'about:config' the address bar.  Search for 'signed.applets.codebase_principal_support' and set its value to true.\n\nIf you would not like to see this text any more, simply type a '0' (zero) in this box, and press OK.  You'll be alerted instead of prompted.", text);
			if (prompt_res == 0) { GM_setValue("show_prompt", 0); }
		} else {
			alert(location.href + "\n\nhas been shortened to\n\n" + text);
		}
	}
}


// this allows us to only send one request at a time.
// multiple keypresses will not send more than once
var requestInProgress = false;

document.addEventListener('keypress', function(event) {

	if (!event.shiftKey) { return false; }
	if (event.ctrlKey || event.metaKey || event.altKey) { return false; }
	if (event.target.type && (event.target.tagName.match(/text|input|select/i))) { return false; }

	var e = event.target;
	if (e.tagName.toLowerCase() == 'html') {
		e = frameElement; // have to step out of iframes
		while (e && e.parentNode) {
			if ((e.id && e.id.match(/mceEditor|wys/i) || (e.className && e.className.match(/mceEditor|wys/i)))) { return false; break; }
			e = e.parentNode;
		}
	}

	// Shift+T

	if (event.charCode == 84) {

		event.preventDefault();
		getshortlink();

	}

}, false);

function updateCheck(forced) {if((forced)||(parseInt(GM_getValue("lastUpdate", "0")) + 86400000 <= (new Date().getTime()))) {try {GM_xmlhttpRequest({method: "GET",url: "http://userscripts.org/scripts/review/" + version_scriptNum + "?" + new Date().getTime(),headers: {'Cache-Control': 'no-cache'},onload: function(xhrResponse) {GM_setValue("lastUpdate", new Date().getTime() + ""); var rt = xhrResponse.responseText.replace(/&nbsp;?/gm, " ").replace(/<li>/gm, "\n").replace(/<[^>]*>/gm, ""); var scriptName = (/@name\s*(.*?)\s*$/m.exec(rt))[1]; GM_setValue("targetScriptName", scriptName); if (parseInt(/version_timestamp\s*=\s*([0-9]+)/.exec(rt)[1]) > version_timestamp) {if (confirm("There is an update available for the Greasemonkey script \"" + scriptName + ".\"\nWould you like to go to the install page now?")) {GM_openInTab("http://userscripts.org/scripts/show/" + version_scriptNum);}} else if (forced) {alert("No update is available for \"" + scriptName + ".\"");}}});} catch (err) {if (forced) {alert("An error occurred while checking for updates:\n" + err);}}}} updateCheck(false);

function editPref() {
	var div = document.createElement('div');
	div.className = 'gm-pref';
	var css = ".gm-pref {display: none; position: absolute; z-index: 99; left: 200px; top: 200px; overflow: visible; background-color: white; border: 1px solid green; padding: 10px; min-width: 200px; min-height: 100px}";
	GM_addStyle(css);

	/* Setting title */
	div.innerHTML = '<h2>Script Preferences</h2>';

	/* Rule */
	var rule = document.createElement('hr');
	rule.id = 'gm-rule';
	div.appendChild(rule);

	/* Building form */
	var form = document.createElement('form');
	form.action = '';
	form.method = '';
	form.id = 'gm-pref';

	div2 = document.createElement('div');
	div2.innerHTML = '<label for="servicelist">Service to use: </label>';
	var select = document.createElement('select');
	var option = '';
	select.id = 'servicelist';
	for (service in services) {
		option += '<option value="'+service+'"';
		if (service == GM_getValue("service", "None")) { option += ' selected'; }
		option += '>'+service+'</option>';
	}
	select.innerHTML = option;
	div2.appendChild(select);
	form.appendChild(div2);
	div.appendChild(form);

	/* Submit button */
	button = document.createElement('button');
	button.type = 'button';
	button.id = 'pref_submit';
	button.innerHTML = "Update preferences";
	form.appendChild(button);
	document.getElementsByTagName('body')[0].appendChild(div);

	div.style.display = 'block';
	div.scrollIntoView(false);

	/* Add event listener */
	button.addEventListener('click', eventListener(), true);
	form.addEventListener('submit', eventListener(), true);
}

function eventListener() {
	var prefs = this;
	return function(ev) {
		var reload = false;
		// Prevent submitting the form to the server
		ev.preventDefault();
		// Execute all handlers
		GM_setValue("service", document.getElementById('servicelist').value);
		location.reload();
	}
}

GM_registerMenuCommand(GM_getValue("targetScriptName", "???") + " - Manual Update Check", function() {updateCheck(true);}); 
GM_registerMenuCommand(GM_getValue("targetScriptName", "???") + " - Edit Preferences", function() {editPref();});