Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
AzureaVim.js #AzureaScript
// @author = http://c4se.sakura.ne.jp/profile/ne.html
// @date = 2011-02-23
// @site = https://gist.github.com/833567
// @license = public domain
var COMMANDS_LIST = {
open: 'open',
o: 'open',
url: 'open url',
view: 'view',
v: 'view',
home: 'view home',
user: 'view user',
retweet: 'retweet',
rt: 'retweet',
reply: 'reply',
r: 'reply',
'@': 'reply',
quotetweet: 'reply quote',
qt: 'reply quote',
mrt: 'reply mrt',
settings: 'settings',
setting: 'settings',
'set': 'settings',
gettings: 'settings',
getting: 'settings',
'get': 'settings'
};
//PreSendUpdateStatus Event Handler
function PreSendUpdateStatus(status) {
var azvim, flag = false;
try {
if (/^:/.test(status.text)) {
flag = true;
azvim = new AzureaVim(status);
azvim.run();
TextArea.text = '';
TextArea.in_reply_to_status_id = 0;
}
} catch (e) {
System.alert(e.name + ':\n' + e.message);
flag = true;
}
return flag;
}
function _focusInput(status_id) {
TextArea.text = ':';
TextArea.in_reply_to_status_id = status_id;
TextArea.show();
TextArea.setFocus();
TextArea.setCursor(1);
}
System.addKeyBindingHandler(0xBA, // VK_OEM_1 (:)
0, _focusInput);
System.addContextMenuHandler(':vim', 0, _focusInput);
function _pearse(text) { // @reply String:
// @return Array:
var command = [], match, regex = /[^\s"]+|\s+|"[^\\"]*(?:\\.[^\\"]*)*"/g; //"
text = text.replace(/^\s+|\s+$/g, '');
while (match = regex.exec(text)) {
if (!/^\s/.test(match[0])) {
command.push(match[0].replace(/^"|"$/g, ''));
}
}
return command;
}
function _expandTemplate(template, // String:
view) { // Object:
// String: has Number [cursor] property
var cursor,
text = template.replace(/#{([^}]+?)}/g, function() {
with (view) {
return eval(arguments[1]);
}
});
text = text.split('#{}');
if (text.length === 1) {
cursor = 0;
text = text[0];
} else {
cursor = text[0].length;
text = text.join('');
}
text.cursor = cursor;
return {
'text': text,
'cursor': cursor
};
}
//AzureaVim Class
function AzureaVim(status) { //@param StatusUpdate Object:
this.command_text = status.text.slice(1);
this.command = _pearse(this.command_text);
this.status_id = status.in_reply_to_status_id;
this.screen_name = TwitterService.status.get(this.status_id).user.screen_name;
this.status_text = TwitterService.status.get(this.status_id).text;
this.status_urls = [];
this.status_hashes = [];
this.status_users = [];
TwitterService.status.getUrls(this.status_id, this.status_urls);
TwitterService.status.getHashes(this.status_id, this.status_hashes);
TwitterService.status.getUsers(this.status_id, this.status_users);
}
AzureaVim.commands_list = COMMANDS_LIST;
AzureaVim.prototype.run = function() {
var command = COMMANDS_LIST[this.command[0]];
if (/ /.test(command)) {
this.command.shift();
this.command = command.split(' ').concat(this.command);
} else {
this.command[0] = command;
}
this[this.command[0]]();
}
AzureaVim.prototype.open = function() {
var url,
c1 = {
status: 'status',
favstar: 'favstar',
fav: 'favstar',
f: 'favstar',
favotter: 'favotter',
favlook: 'favlook',
twistar: 'twistar',
favolog: 'favolog',
twilog: 'twilog',
user: 'user',
url: 'url'
};
switch (c1[this.command[1]]) {
case 'status':
url = 'https://twitter.com/' + this.screen_name + '/status/' + this.status_id;
break;
case 'favstar':
url = 'http://favstar.fm/t/' + this.status_id;
break;
case 'favotter':
url = 'http://favotter.net/status.php?id=' + this.status_id;
break;
case 'favlook':
url = 'http://favlook.osa-p.net/status.html?status_id=' + this.status_id;
break;
case 'twistar':
url = 'http://twistar.cc/' + this.screen_name + '/status/' + this.status_id;
break;
case 'favolog':
url = 'http://favolog.org/' + this.screen_name;
break;
case 'twilog':
url = 'http://twilog.org/' + this.screen_name;
break;
case 'user':
url = 'http://twitter.com/' + this.screen_name;
break;
case 'url':
if (!this.command[2]) {
this.command[2] = 0;
}
url = this.status_urls[this.command[2]];
break;
default:
url = this.status_urls[0] || 'https://twitter.com/' + this.screen_name + '/status/' + this.status_id;
break;
}
System.openUrl(url);
}
AzureaVim.prototype.view = function() {
var c1 = {
home: 'home',
timeline: 'home',
h: 'home',
mention: 'mention',
reply: 'mention',
r: 'mention',
m: 'mention',
'@': 'mention',
message: 'message',
dm: 'message',
d: 'message',
user: 'user',
u: 'user',
favorite: 'favorite',
fav: 'favorite',
f: 'favorite',
following: 'following',
follow: 'following',
followers: 'followers',
follower: 'followers',
followed: 'followers'
},
views = System.apiLevel >= 11 ? System.views : System;
switch (c1[this.command[1]]) {
case 'home':
views.openTimeline();
break;
case 'mention':
views.openMention();
break;
case 'message':
views.openMessage();
break;
case 'user':
views.openUserTimeline(this.command[2] || this.screen_name, false);
break;
case 'search':
views.openSearch(this.command[2], false);
break;
case 'favorite':
views.openFavorite();
break;
case 'match':
views.openMatch(this.command[2], false);
break;
case 'following':
views.openFollwoing();
break;
case 'followers':
views.openFollowers();
break;
default:
break;
}
}
AzureaVim.prototype.retweet = function() {
TwitterService.retweet.create(this.status_id);
}
AzureaVim.prototype.reply = function() {
var c1 = {
template: 'template',
all: 'all',
quote: 'quote',
qt: 'quote',
mrt: 'mrt',
masirosiki: 'mrt'
},
t;
switch (c1[this.command[1]]) {
case 'template':
t = _expandTemplate(this.command[2], this);
Http.sendRequestAsync('http://google.com/', false,
new Function("TextArea.text = '" + t.text.replace("'", "\\'") + "';" +
"TextArea.in_reply_to_status_id = '" + (this.command[3] === 'true' ? this.status_id : 0) + "';" +
"TextArea.show();" +
"TextArea.setFocus();" +
"TextArea.setCursor(" + t.cursor + ");"));
break;
case 'all':
this.command = ['reply', 'template', "@#{screen_name + (status_users.length ? ' @' +status_users.join(' @') : '')} #{}", 'true'];
this.reply();
break;
case 'quote':
this.command = ['reply', 'template', "@#{screen_name} #{} RT: #{status_text}", 'true'];
this.reply();
break;
case 'mrt':
this.command = ['reply', 'template', "#{} MRT: #{'http://twitter.com/' + screen_name + '/' + status_id}", 'false'];
this.reply();
break;
default:
this.command = ['reply', 'template', "@#{screen_name} #{}#{status_hashes.length ? ' ' + status_hashes.join(' ') : ''}", 'true'];
this.reply();
break;
}
}
AzureaVim.prototype.settings = function() {
var figure, value;
//if (/^(?:switch)$/.test(this.command[1])) {
// figure = this.command.slice(2).join('');
//} else {
figure = this.command.slice(1).join('');
//}
figure = figure.split('::');
figure = [figure[0]].concat(figure[1].split('='));
if (/^get/.test(this.command[0])) {
figure.length = 2;
}
//switch (this.command[1]) {
//case 'switch':
// value = System.settings.getValue(figure[0], figure[1]);
// if (value === '0') {
// System.settings.setValue(figure[0], figure[1], '1');
// System.showNotice('Setting switched: ' + figure[0] + '::' + figure[1] + '=true');
// } else if (value === '1') {
// System.settings.setValue(figure[0], figure[1], '0');
// System.showNotice('Setting switched: ' + figure[0] + '::' + figure[1] + '=false');
// } else {
// System.showNotice('Setting cannot switch: ' + figure[0] + '::' + figure[1]);
// }
// break;
//default:
if (figure[2]) {
System.settings.setValue(figure[0], figure[1], figure[2]);
System.showNotice('Setting done: ' + figure[0] + '::' + figure[1] + '=' + figure[2]);
} else {
System.showNotice('Getting done: ' + figure[0] + '::' + figure[1] + '=' + System.settings.getValue(figure[0], figure[1]));
}
// break;
//}
//System.settings.reconfigure();
}
////test
//:settings Misc :: FontSize = 10
//:settings Misc::EnableAutoRefresh=1
function _attachNewCommands() {
var path = System.applicationPath.replace(/[^\\]+$/, 'Scripts\\AzureaVim'),
fso = new ActiveXObject('Scripting.FileSystemObject'),
files = new Enumerator(fso.GetFolder(path).Files);
for (; !files.atEnd(); files.moveNext()) {
try {
if (/\.js$/.test(files.item().Name)) {
eval(fso.OpenTextFile(path + '\\' + files.item().Name, 1).ReadAll());
}
} catch (e) {}
}
}
try {
_attachNewCommands();
} catch (e) {}
@ne-sachirou

This comment has been minimized.

Copy link
Owner Author

@ne-sachirou ne-sachirou commented Feb 18, 2011

https://gist.github.com/833567/9c926f7979ee566cbdbc568a93cdde09262ceb13
AzureaWinにコマンド風操作を追加する #AzureaScript #js - c4se記:さっちゃんですよ☆ http://d.hatena.ne.jp/Kureduki_Maari/20110219/1298054093 説明記事。

AzureaWinで、tweetを翻訳する拡張 #js - c4se記:さっちゃんですよ☆ http://d.hatena.ne.jp/Kureduki_Maari/20110127/1296092606 の機能を統合。:translate, :jaコマンド追加。

:userコマンド追加(動作せず←何故?)。

@ne-sachirou

This comment has been minimized.

Copy link
Owner Author

@ne-sachirou ne-sachirou commented Feb 19, 2011

https://gist.github.com/833567/67a1f5e7293f92a3565fd2a6c8cc1fd6d6f94a0c
:translateコマンドを、拡張可能な様に改変。

:jaコマンドを、:translateではなく、:translate jaと同義にした。

ライセンスをpublic domainとして明記。

@ne-sachirou

This comment has been minimized.

Copy link
Owner Author

@ne-sachirou ne-sachirou commented Feb 19, 2011

https://gist.github.com/833567/dbee742e128015b14e3160cfb644bd64a8b51dca
:translateコマンドのオプションを省略出来る様に。:translateは:translate jaと同義(←初めから其うしろ)。

:openコマンド(:oコマンド)のオプション省略時動作を変更。指定statusがurlを含む時は、:open url 0と同義、含まない時は、今迄通り、:open statusと同義。

@ne-sachirou

This comment has been minimized.

Copy link
Owner Author

@ne-sachirou ne-sachirou commented Feb 20, 2011

https://gist.github.com/833567/e6e5f1146ab605b050fd26d44bf1aac06aa43703
コマンドの追加を簡易化。短縮コマンドには、prototype関数を作らなくて良い様にした。例えば、'b': 'a x',と空白を入れて書けば、:b yは:a x yと同義に成る。
:viewコマンドを追加。Azurea内のviewを移動する。API Level10, API Level11に対応 (line 238)。各種短縮コマンドも追加。:userコマンドは、:view userに吸収。

:openコマンドのオプション管理を、Hashにして簡易化。

:shindanコマンドを追加。指定したtweetの診断メーカーをリクエストし、投稿欄に結果を入力(tweet自動送信はしない)。 (by https://gist.github.com/831901 )

@ne-sachirou

This comment has been minimized.

Copy link
Owner Author

@ne-sachirou ne-sachirou commented Feb 21, 2011

https://gist.github.com/833567/99c80580593b8b0f667f14f143bf11fecc92738d
AzureaWin、リプライ拡張 #js #AzureaScript - c4se記:さっちゃんですよ☆ http://d.hatena.ne.jp/Kureduki_Maari/20110129/1296267611 の機能を統合。:rtコマンドと:replyコマンドを追加。
:rtコマンドは、ReTweetするのみ。

:replyコマンドは、templateを取って展開する内部動作とし、拡張を容易とした。各種短縮コマンドを追加。

_pearse関数を:replyに合わせて拡張(内部動作)。
:reply template部分のコードは、可能であれば将来に改善する事(TODO)。

@ne-sachirou

This comment has been minimized.

Copy link
Owner Author

@ne-sachirou ne-sachirou commented Feb 21, 2011

https://gist.github.com/833567/3fa34716153928fd5b8b8ea85dc39f8b9a79b1b4
:translateコマンドを、非同期へ書き直した。

:replyコマンド部分の誤字修正 s/masirisiki/masirosiki/

@ne-sachirou

This comment has been minimized.

Copy link
Owner Author

@ne-sachirou ne-sachirou commented Feb 24, 2011

https://gist.github.com/833567/f04cab61135d06d8845542d253808f4306dde826
:settingsコマンドを追加。:settings Misc::EnableAutoRefresh=1 の様に設定し、:settings Misc::EnableAutoRefreshの様に取得する。各種短縮コマンドを追加。

プラグインを取得可能にした。Scripts/AzureaVim下のjsを、起動時に読み込む。ActiveXObjectが有効に成っている必要が有る(無効の場合、単純に読み込まれない)。
上記に合わせ、:shindanコマンドと:translateコマンドを、本体から外した。

@ne-sachirou

This comment has been minimized.

Copy link
Owner Author

@ne-sachirou ne-sachirou commented Mar 1, 2011

AzureaVim変更点 #AzureaScript #js - c4se記:さっちゃんですよ☆ http://d.hatena.ne.jp/Kureduki_Maari/20110225/1298622144 変更点解説記事

ne-sachirou/AzureaVim - GitHub https://github.com/ne-sachirou/AzureaVim にprojectを移動

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