Skip to content

Instantly share code, notes, and snippets.

@ne-sachirou
Created February 20, 2011 00:52
Show Gist options
  • Save ne-sachirou/835563 to your computer and use it in GitHub Desktop.
Save ne-sachirou/835563 to your computer and use it in GitHub Desktop.
短縮URLを伸展する #AzureaScript
// @author = http://c4se.sakura.ne.jp/profile/ne.html
// @date = 2011-02-25
// @site = https://gist.github.com/835563
// @license = public domain
var services = [],
cashe = {
'http://c4se.tk/': 'http://c4se.sakura.ne.jp/'
};
try {
Http.sendRequestAsync('http://untiny.me/api/1.0/services/?format=text', false,
function(response) { // @param HttpResponce Object:
services = response.body.split(', ');
});
} catch (e) {}
function isPossibleUnshorten(url) { // @param String: shortend URL
// @return Boolean:
var _services = services, i = -1, is_possible = false;
while (_services[++i]) {
if (url.indexOf(_services[i]) !== -1) {
is_possible = true;
break;
}
}
return is_possible;
}
function unshorten(url, // @param String: shortened URL
async) { // @param Boolean=false:
// @return String: unshortened URL
var _cashe = cashe, response, result = url;
if (_cashe[url]) {
result = _cashe[url];
} else if (isPossibleUnshorten(url)) {
if (!async) {
try {
response = Http.sendRequest('http://untiny.me/api/1.0/extract/?url=' + url + '&format=text', false);
result = /^error/.test(response.body) ? url : response.body;
_cashe[url] = result;
} catch (e) {}
} else {
try {
Http.sendRequestAsync('http://untiny.me/api/1.0/extract/?url=' + url + '&format=text', false,
function(response) {
cashe[url] = /^error/.test(response.body) ? url : response.body;
});
} catch (e) {}
}
}
return result;
}
function PreProcessTimelineStatus(status) { // @param Status Object:
status.text = status.text.replace(/https?:\/\/[0-9A-Za-z._\-^~\/&%?]+/g,
function(url) {
return unshorten(url, true);
});
}
System.addContextMenuHandler('unshorten', 0,
function(status_id) { // @param String:
var urls = [], i = -1;
TwitterService.status.getUrls(status_id, urls);
while (urls[++i]) {
if (isPossibleUnshorten(urls[i])) {
System.inputBox(urls[i], unshorten(urls[i]), false);
break;
}
}
});
@ne-sachirou
Copy link
Author

https://gist.github.com/835563/93459539463b98c4127dff6015ba424c593adf67
短縮urlを伸展するAzureaScriptです。伸展にはUnity[ http://untiny.me/ ]のAPIを使用します。
受信した全てのstatusのurlを伸展します。自動に伸展したくない場合は、PreProcessTimelineStatusの関数をコメントアウトして下さい。
其の場合、Context Menuの、unshotenから、statusが含む最初のurlのみ、進展してダイアログ表示します。

@ne-sachirou
Copy link
Author

https://gist.github.com/835563/b448fa0d2293fca1fca305afc2884a79f4163b6c
エラー処理を追加。
キャッシュを追加。(RTで何度も同じURLが回ってくる場合等の為。)

@ne-sachirou
Copy link
Author

https://gist.github.com/835563/d65426e422c8aea86f2d5ed5f158966e9f877b45
ContextMenuから呼び出しの結果表示を、inputBoxへ変更。
PreProcessTimelineStatusに、伸展urlがキャッシュに有る場合のみ、statusを書き換える処理を追記(デフォルトでコメントアウト済み)。ContextMenuからの呼び出しでunshortenしたい時には、PreProcessTimelineStatus自体はコメントアウトせず、此れを利用すると良い。 (line 65)

@ne-sachirou
Copy link
Author

https://gist.github.com/835563/fa5dbf84d768663517f77b0d402ef9bff662b498
isPossibleUnshorten()関数を追加。
unshorten()に於いて、第二引数で非同期処理を可能にした。
ContextMenuからの呼び出しでは、無条件に0番目のurlを与えるのではなく、伸展可能なurlの内、初めのものを与える様にした。伸展可能なurlを含まない場合は、何も動作しない。

@ne-sachirou
Copy link
Author

https://gist.github.com/835563/5ee92fc1d9534d3542365fa2902843d7e240c6e0
デフォルト動作を変更した。PreProcessTimelineStatusでは、新規短縮URLを得た場合、非同期で伸展し、キャッシュに保存する。同じURLを二度目に得た時は、伸展されて表示する。此の変更で、UIは凍結しなく成る。(TODO: AzureaVimの:shindanプラグインは、別途対処する事)

@ne-sachirou
Copy link
Author

AzureaVim pluginへ統合しました。此ちらのGistは更新しません。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment