c4se記:さっちゃんですよ☆

.。oO(さっちゃんですよヾ(〃l _ l)ノ゙☆)

.。oO(此のblogは、主に音樂考察Programming に分類されますよ。ヾ(〃l _ l)ノ゙♬♪♡)

音樂は SoundCloud に公開中です。

考察は現在は主に Scrapbox で公表中です。

Programming は GitHub で開發中です。

AzureaWinにコマンド風操作を追加する #AzureaScript #js

なかなかAzurea for Windowsに馴染んでいますね! PC版でもメモリ消費が少なく、有り難いです。
Azurea Wikiも出来たようです。
Azureaとは - PukiWiki http://azurea.refy.net/ja/wiki/index.php?Azurea%E3%81%A8%E3%81%AF


今まで2つ、Azurea Scriptを作りました。
AzureaWinで、tweetを翻訳する拡張 #js - c4se記:さっちゃんですよ☆ http://d.hatena.ne.jp/Kureduki_Maari/20110127/1296092606
AzureaWin、リプライ拡張 #js - c4se記:さっちゃんですよ☆ http://d.hatena.ne.jp/Kureduki_Maari/20110129/1296267611
JavaScriptで簡単に拡張出来るのは、嬉しいです。
作ったscriptは、[ http://c4se.sakura.ne.jp/widgets/azurea/ ]に置いてあります。

AzureaVim

今回作ったのは、AzureaWinに、何と言いますか、Vim風と言いますか、Vim使ってないんですけど……、コマンド操作を追加するscriptです。
Gistに上げておきます。あ、ライセンス何にしよう…public domainで好いんじゃないかな。じゃ、public domainです。
gist: 833567 - AzureaVim.js- GitHub https://gist.github.com/833567


インストールは、AzureaWinのインストールフォルダに有る、Scriptsフォルダへ、.js拡張子で保存する丈です。AzureaVim.jsとか。
操作法は、キーボードから行う事に成ります。
先ず適当なtweetを選択します(選択の不要なコマンドを、将来に追加する可能性が有ります。其のコマンドの場合は、何も選択してなかろうが、洞れを選択していようが、同じ事です)。
次に、:キーを押します。コロンです。
すると、入力欄に「:」と自動に入力され、フォーカスが当たります。:に続けてコマンドを打ち込み、送信動作を行って下さい。tweetとして送信はされずに、コマンドが実行されます。


現在有るコマンドは、:open (:oと省略可)、:urlの二つです。
:openは、標準Webブラウザで、何かを開くコマンドです。
:openコマンドは、status、favstar (f、又はfavと省略可)、favotter、favlook、twistar、favolog、twilog、user、urlと云う、9種類のオプションの内一つを取れます。御前普段何してんだ、ってとこですね。此れ等以外のオプションを打った場合は、何も開きません。オプションを省略し、単に:open:oと打った場合は、:open statusと同じ動作を行います。
:open statusは、当該tweetの個別ページを開きます。
:open favotter:open f:open fav:open favotter:open twistarは、其々favstar等の然るべきサービスで、当該tweetページを開きます。頭おかしいんじゃないですかね。
:open favolog:open twilogは、当該tweetのユーザの、其々favolog、twilogを開きます。
:open userは、当該tweetのユーザページを開きます。
:open urlは、当該tweetに含まれているurlを開きます。自然数を更にオプションとして取り、:o url 0:o url 1、と当該tweetの先頭から順番に番号を当てています。0から始まる自然数。其の番号に当たるurlが無かった場合は、何も開きません。番号を省略し、単に:o urlと打った場合は、:o url 0と同じ動作を行います。
:urlは、:open urlの省略形です。:open urlと同じく、後ろに自然数のオプションを取れます。単に:urlとした場合は、:url 0と同じ動作を行います。此のコマンドを一番使いますね。


以上が概略です。
内部動作に就いても書きます。
初めに:キーで入力欄へ飛ぶとき。此所では殆ど何もやっていません。入力欄のin reply toに、選択していたtweetのidを設定し、:を入力し、カーソルを当てている丈です。普通にreplyをしようとした時には、@ユーザー名が入力されますが、代わりに:を入れている丈で、同じです。in reply toさえ設定されれば、:キーなんて押さなくても好いです。
送信しようとしたときに、主な動作を行います。送信テキストの先頭が:だった場合、AzureaVimコマンドと認識し、通常のtweet送信をストップして、コマンドを実行します。其の時に、in reply to等を参照し、好い様にする丈です。
後はGistのソースでも読んで下さい…。
コマンドを追加し易い様に書いた積りなのですが。洞うなんでしょうね。


因みに:userコマンドも作ってありますが、動作しないんですけど……何でしょう……。

code

一応、現時点でのコードも貼っておきますね。

// @author = http://c4se.sakura.ne.jp/profile/ne.html
// @date = 2011-02-18


var commands_list = {
    open: 'open',
    o: 'open',
    url: 'url',
    user: 'user'
};


function _pearse(text) { // @reply String:
                         // @return Array:
    var command = [];
    
    command = text.replace(/^\s+|\s+$/g, '').split(/\s+/);
    return command;
}


//AzureaVim Class
function AzureaVim(status) { //@param StatusUpdate Object:
    this.text = status.text.slice(1);
    this.command = _pearse(this.text);
    this.status_id = status.in_reply_to_status_id;
    this.screen_name = TwitterService.status.get(this.status_id).user.screen_name;
    this.status_urls = [];
    TwitterService.status.getUrls(this.status_id, this.status_urls);
}


AzureaVim.prototype.run = function() {
    this[commands_list[this.command[0]]]();
}


AzureaVim.prototype.open = function() {
    var url = 'http://',
        status_id = this.status_id,
        screen_name = this.screen_name;
    
    if (!this.command[1]) {
        this.command[1] = 'status';
    } else if (this.command[1] === 'f' || this.command[1] === 'fav') {
        this.command[1] = 'favstar';
    }
    switch (this.command[1]) {
    case 'status':
        url += 'twitter.com/' + screen_name + '/status/' + status_id;
        break;
    case 'favstar':
        url += 'favstar.fm/t/' + status_id;
        break;
    case 'favotter':
        url += 'favotter.net/status.php?id=' + status_id;
    case 'favlook':
        url += 'favlook.osa-p.net/status.html?status_id=' + status_id;
        break;
    case 'twistar':
        url += 'twistar.cc/' + screen_name + '/status/' + status_id;
        break;
    case 'favolog':
        url += 'favolog.org/' + screen_name;
        break;
    case 'twilog':
        url += 'twilog.org/' + screen_name;
        break;
    case 'user':
        url += 'twitter.com/' + screen_name;
        break;
    case 'url':
        if (!this.command[2]) {
            this.command[2] = 0;
        }
        url = this.status_urls[this.command[2]];
        break;
    default:
        break;
    }
    System.openUrl(url);
}


AzureaVim.prototype.url = function() {
    this.command.unshift('open');
    this.open();
}


AzureaVim.prototype.user = function() {
    System.views.openUserTimeline(this.screen_name, false);
}


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);


//PreSendUpdateStatus Event Handler
function PreSendUpdateStatus(status) {
    var azvim, flag = false;
    
    try {
        if (/^:/.test(status.text)) {
            flag = true;
            azvim = new AzureaVim(status);
            azvim.run();
        }
    } catch (e) {
        System.alert(e.name + ':\n' + e.message);
        flag = true;
    }
    return flag;
}