Created
April 6, 2009 10:57
-
-
Save satyr/90718 to your computer and use it in GitHub Desktop.
Shortens a URL by the service of your choice.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
const Name = 'shorten-url', | |
Shorteners = [{ | |
text: 'tinyurl.com', | |
data: function(lu, cb)({ | |
url: 'http://tinyurl.com/api-create.php', | |
type: 'post', | |
data: {url: lu}, | |
success: cb, | |
}), | |
logo: <h1 style={( | |
'background-color:#009; color:#eee; padding:0 3px;'+ | |
'display:inline; line-height:1')}>TinyURL.com</h1>, | |
}, { | |
text: 'bit.ly', | |
data: function(lu, cb, er)({ | |
url: 'http://api.bit.ly/shorten', | |
data: { | |
version: '2.0.1', longUrl: lu, | |
login: 'ubiquitron', apiKey: 'R_4d6fa3cba425f012582475355652f8b5'}, | |
dataType: 'json', | |
success: function(res){ | |
if(res.statusCode === 'OK') | |
for each(var o in res.results) return cb(o.shortUrl); | |
er({status: res.errorCode, statusText: res.errorMessage}); | |
}, | |
}), | |
logo: (<img style="height:47px; background-color:#fff; padding:0 3px" | |
src="http://bit.ly/static/images/bitly_logo_top.png"/>), | |
}, { | |
text: 'tr.im', | |
data: function(lu, cb)({ | |
url: 'http://api.tr.im/api/trim_simple', | |
data: {url: lu, username: 'ubiquity', password: 'mozilla'}, | |
success: cb, | |
}), | |
logo: (<img width="150" height="83" | |
src="http://tr.im/images/main/logo_home.png"/>), | |
}, { | |
text: 'is.gd', | |
data: function(lu, cb)({ | |
url: 'http://is.gd/api.php', | |
data: {longurl: lu}, | |
success: cb, | |
}), | |
logo: <img width="150" height="93" src="http://is.gd/isgdlogo_small.jpg"/>, | |
}, { | |
text: 'cli.gs', | |
data: function(lu, cb)({ | |
url: 'http://cli.gs/api/v1/cligs/create', | |
data: { | |
url: lu, appid: 'ubiquity', | |
key: 'e36552b87c6d7f9a73b2a16ed310fcdb'}, | |
success: cb, | |
}), | |
logo: <img width="280" height="60" src="http://cli.gs/images/logo.jpg"/>, | |
}, { | |
text: 'snipr.com', | |
data: function(lu, cb)({ | |
url: 'http://sn.im/site/getsnip', | |
type: 'post', | |
data: { | |
sniplink: lu, snipformat: 'simple', | |
snipuser: 'ubiquity', snipapi: '3e2bbc25e90e97a8a8c0abea311927b5'}, | |
success: function(su){ cb(su === 'ERROR' ? lu : su) }, | |
}), | |
logo: (<img width="176" height="45" | |
src="http://cache.snipurl.com/snipr-mast.png"/>), | |
}, { | |
text: 'hurl.ws', | |
data: function(lu, cb)({ | |
url: 'http://www.hurl.ws/api/', | |
type: 'post', | |
data: {url: lu, user: 'ubiquity'}, | |
success: cb, | |
}), | |
logo: (<img style="height:56px; background-color:#fff; padding:3px" | |
src="http://www.hurl.ws/images/logo.gif"/>), | |
}, { | |
text: 'rubyurl.com', | |
data: function(lu, cb, er)({ | |
url: 'http://rubyurl.com/api/links.json', | |
type: 'post', | |
data: {website_url: lu}, | |
dataType: 'json', | |
success: function(res){ | |
if(typeof res === 'object') cb(res.link.permalink); | |
else er({status: 666, statusText: res}); | |
}, | |
}), | |
logo: (<img style="height:49px; background-color:#eee; padding:3px" | |
src="http://rubyurl.com/images/logo-rubyurl.png"/>), | |
}, { | |
text: 'short.ie', | |
data: function(lu, cb)({ | |
url: 'http://short.ie/api', | |
data: { | |
url: lu, format: 'plain', email: '[email protected]', | |
secretKey: '18661baf56e3c18520d3bcf0e7b1ba61208387c8'}, | |
success: cb, | |
}), | |
logo: (<img width="147" height="41" style="background-color:#eee" | |
src="http://short.ie/media/images/logo2.png"/>), | |
}, { | |
text: 'kl.am', | |
data: function(lu, cb)({ | |
url: 'http://kl.am/api/shorten/', | |
data: { | |
url: lu, format: 'text', tags: 'ubiquity mozilla', | |
api_key: '2102eb935a7447618523a65abc324691'}, | |
success: cb, | |
}), | |
logo: <h1 style={( | |
'background-color:#ccc; color:#333; padding:0 3px;'+ | |
'display:inline; line-height:1')}>kl.am</h1>, | |
}, { | |
text: 'poprl.com', | |
data: function(lu, cb, er)({ | |
url: 'http://poprl.com/api/post', | |
type: 'post', | |
data: {url: lu, out: 'text'}, | |
success: function(res){ | |
var [, stat, text] = /^(\d+): (.+)/(res) || 0; | |
stat ? er({status: stat, statusText: text}) : cb(res); | |
}, | |
}), | |
logo: <img width="214" height="64" src="http://poprl.com/img/logo_v3.jpg"/>, | |
}, { | |
text: 'ad.vu', | |
data: function(lu, cb)({ | |
url: 'http://api.adjix.com/shrinkLink', | |
data: { | |
url: lu, ultraShort: 'y', | |
partnerID: '8989aa095f1f4c2b93508666fcc1c27d'}, | |
success: cb, | |
}), | |
logo: (<img width="170" height="80" | |
src="https://adjix.s3.amazonaws.com/images/adjix-logo.gif"/>), | |
} | |
/* | |
, { | |
text: '', | |
data: function(lu, cb)({ | |
url: 'http://', | |
data: {}, | |
success: cb, | |
}), | |
logo: <img width="" height="" src=""/>, | |
} | |
*/ | |
].sort(function({text: a}, {text: b}) | |
!(a.length === b.length ? a <= b : a.length <= b.length)), | |
{prefs} = Application, | |
PSU = 'extensions.ubiquity.'+ Name +'.', | |
PDef = PSU + 'default', | |
Default = prefs.getValue(PDef, Math.random() * Shorteners.length | 0); | |
Base = <div class={Name}><style><![CDATA[ | |
$pre {overflow:hidden; margin-top:0} | |
$a {text-decoration:none} | |
$kbd {text-decoration:underline} | |
$.to {font-weight:bolder} | |
$.logo img {border:none} | |
$.success .to:before {content:'\2192'; margin-right:0.7em} | |
$.loading .to {display:none} | |
$.loading .logo {opacity:0.4} | |
$.error .to {font-style:oblique} | |
$.error .logo {opacity:0.7} | |
]]></style><div id={Name} | |
><pre class="to"> </pre | |
><pre class="from"> </pre | |
><div class="logo"> </div | |
></div></div>.toXMLString().replace(/\$/g, '.'+ Name +' '); | |
var pu, ps, result; | |
function set(u){ | |
CmdUtils.setSelection(u.link(u), {text: u}); | |
CmdUtils.copyToClipboard(u); | |
} | |
Shorteners.forEach(function(s){ | |
var {text, icon, logo} = s, link = 'http://'+ text; | |
s.summary = text; | |
s.logo = ''+<a href={link} accesskey="l">{logo}</a>; | |
if(!icon) s.icon = link +'/favicon.ico'; | |
}); | |
CmdUtils.CreateCommand({ | |
name: Name, | |
description: 'Shortens a URL by the service of your choice.', | |
help: ( | |
'Powered by: '+ | |
Shorteners.map(function({text}) text.link('http://'+ text)).join(', ') + | |
<form>Default: { | |
Shorteners.reduce( | |
function(select, {text}, i){ | |
var opt = <option value={i}>{text}</option>; | |
if(i === Default) opt.@selected = 'selected'; | |
return select.appendChild(opt); | |
}, | |
<select onmouseover={( | |
'this.selectedIndex = Application.prefs.getValue("'+ PDef + | |
'", eval(this.value))')} | |
onchange={('Application.prefs.setValue("'+ PDef + | |
'", eval(this.value))')}/>)} | |
</form>), | |
synonyms: [Shorteners[Default].text], | |
icon: Shorteners[Default].icon, | |
takes: {URL: { | |
_name: 'url', | |
default: function() CmdUtils.makeSugg(CmdUtils.getWindow().location.href), | |
suggest: function(txt, htm, cb, sx){ | |
if(/^@| @ /(txt)) return []; | |
var [u] = /^\S{1,}/(txt) || 0; | |
if(!u) return [this.default()]; | |
if(!/^[a-z]+:\/\/./.test(u)) u = 'http://'+ u; | |
return [CmdUtils.makeSugg(u, u, 0, sx)]; | |
}, | |
}}, | |
modifiers: {'@': { | |
_name: 'url shortener', | |
default: function() Shorteners[prefs.getValue(PDef, Default)], | |
suggest: function(txt, htm, cb, sx){ | |
if(sx) return []; | |
if(!txt) return [this.default()]; | |
try { var sf = [], re = RegExp(txt, 'i') } catch(_){} | |
if(re) for(var i = 0, l = Shorteners.length; i < l; ++i){ | |
var it = Shorteners[i], x = it.text.search(re); | |
if(~x) sf[x * l + i] = it; | |
} | |
if(sf.length){ | |
var ss = sf.filter(Boolean), [s] = ss; | |
this.default = function() s; | |
return ss; | |
} | |
return Shorteners; | |
}, | |
}}, | |
execute: function({text: U}, {'@': S}){ | |
if(result) return set(result); | |
var opts = S.data(U, set); | |
opts.error = function(x, s, e){ | |
displayMessage({ | |
icon: S.icon, title: S.text, exception: e, | |
text: x.status +' '+ x.statusText +' ('+ s +')' }); | |
}; | |
jQuery.ajax(opts); | |
}, | |
preview: function(pbl, {text: U}, {'@': S}){ | |
do var $c = jQuery('#'+ Name, pbl); | |
while(!$c[0] && (ps = '', pbl.innerHTML = Base)); | |
if(ps !== (ps = S)){ | |
this.icon = S.icon; | |
this.synonyms = [S.text]; | |
$c.find('.logo')[0].innerHTML = S.logo; | |
pu = ''; | |
} | |
if(!U || (pu === (pu = U))) return; | |
result = ''; | |
try { var du = decodeURIComponent(U) } catch(_){} | |
$c.find('.from')[0].textContent = du || U; | |
$c[0].className = 'loading'; | |
var err = function(x){ | |
$c.find('.to')[0].textContent = x.status +' '+ x.statusText; | |
$c[0].className = 'error'; | |
}, | |
opts = S.data(U, function(u){ | |
result = u; | |
$c.find('.to')[0].innerHTML = | |
'<a href="'+ u +'" accesskey="h"><kbd>h</kbd>'+ u.slice(1) +'</a>'; | |
$c[0].className = 'success'; | |
}, err); | |
opts.error = err; | |
CmdUtils.previewAjax(pbl, opts); | |
}, | |
previewDelay: 222, | |
author: 'satyr'.link('http://ubigist.appjet.net/?o=satyr'), license: 'MIT', | |
}); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment