404 motivation not found | t_ishidaのブログ

3月/10

23

pticをviっぽく見るuser.js

ピーチクを vi っぽく見る user.jsです。
ピーチクのタイムラインをキーボード操作で遡るためのuser.jsです。中の人にuser.jsページを作ろうよーと言っても対応してくれないのでこちらで公開します。当たり前ですがOperaのuser.js向けに作っているものなのでOperaで動作させる事を目的としています。でも、多分以下の環境でも動くと思います。思うだけなので、動くかどうかは分かりません。

  • Firefoxのグリモン
  • chromeのextension
  • IEのTrixie(ヘッダコメントに適当なnamespace切らないとダメかもね)
// ==UserScript==
// @name           [ptic] viっぽいの
// @description    viっぽく見るuser.js
// @include        http://ptic.jp/u/tl*
// @author         t_ishida
// ==/UserScript==
(function( w, $ ) {
  var vi_like = {
    'COLOR'        : 'rgb(240, 150, 240)',
    'messageBlock' : null,
    'pageID'       : null,
    'currentIndex'   : 0,

    //
    // j: scrollDOWN
    //
    '74' : function scrollDown(){
      if( !this.canScrollDown() ) return;
      this.clearFocus()
      this.currentIndex++;
      w.scrollTo( 0, this.getLT()[1] - 50 );
      this.setFocus();
      if( !this.canScrollDown() ) this.pageMore();
    },

    //
    // K: scrollUP
    //
    '75' : function (){
      if(this.currentIndex < 1 ) return;
      this.clearFocus();
      this.currentIndex--;
      w.scrollTo( 0, this.getLT()[1] - 50 );
      this.setFocus();
    },

    //
    // R: reply
    //
    '82': function(){
      var a = this.current().getElementsByTagName('a');
      for( var i = 0, l = a.length; i < l; i++ )
        if( a[i].href.match( /javascript:reply/ ) )
          location.href = a[i].href;
    },

    //
    // T: RT
    //
    '84': function(){
      var a = this.current().getElementsByTagName('a');
      for( var i = 0, l = a.length; i < l; i++ )
        if( a[i].href.match( /javascript:retweet/ ) )
          location.href = a[i].href;
    },

    //
    // メッセージブロックを収集
    //
    'getMessageBlock' :  function (){
      var result = [];
      if( !this.pageID ) return ;
      var buf = $( this.pageID ).getElementsByTagName( 'li' );
      for( var i = 0, l = buf.length; i < l; i++ ) result.push( buf[i] );
      buf = $( this.pageID + '_more'  ).getElementsByTagName( 'li' );
      for( var i = 0, l = buf.length; i < l; i++ ) result.push( buf[i] );
      this.messageBlock = result;
      return result;
    },

    //
    // エレメントの絶対位置の取得
    //
    'getLT' : function () {
      var element = this.current();
      var valueT = 0, valueL = 0;
      do {
        valueT += element.offsetTop  || 0;
        valueL += element.offsetLeft || 0;
        element = element.offsetParent;
      } while (element);
      return [valueL, valueT];
    },

    //
    // 現在のインデックスに該当するオブジェクトを返却する
    //
    'current' : function(){
      return this.messageBlock[this.currentIndex];
    },

    //
    // フォーカスをクリアする
    //
    'clearFocus' : function(){
      this.current().style.backgroundColor = '';
    },

    //
    // フォーカスをセットする
    //
    'setFocus' : function(){
      this.current().style.backgroundColor = this.COLOR;
    },

    //
    // 次ページを足す
    //
    'pageMore' : function(){
      if  ( w.tweet_json_more ) w.tweet_json_more( this.pageID );
      else                      location.href = 'javascript:tweet_json_more("' + this.pageID + '");';
    },

    'canScrollDown' : function(){
      return ( this.messageBlock.length > ( this.currentIndex + 1 ) );
    },
    ///
    /// new
    ///
    'initialize' : function(){
      if( !location.href.match( /ch=(.+)(?:&|$)/ ) ) return;
      var self = this;
      self.pageID = RegExp.$1;
      self.getMessageBlock();
      self.setFocus();
      (function ( target, type, listener ){
        if( target.addEventListener ) target.addEventListener( type, listener, false );
        else                          target.attachEvent( 'on' + type, function() {listener.call( target, w.event ); });
      })(
        document.all ? document.body : w, 'keydown', function( e ){
          if( document.activeElement.tagName.match( /(?:text|select|input)/i ) ) return;
          if( !e ) e = event;
          if( self[e.keyCode] ){
            self.getMessageBlock();
            self[e.keyCode]();
          }
        });

      (function ( target, type, listener ){
        if( target.addEventListener ) target.addEventListener( type, listener, false );
        else                          target.attachEvent( 'on' + type, function() {listener.call( target, w.event ); });
      })(
        document.all ? document.body : w, 'scroll', function( e ){
          if( document.activeElement.tagName.match( /(?:text|select|input)/i ) ) return;
          if( !e ) e = event;
          /*
          var top = w.scrollHeight - w.innerHeight - w.pageYOffset;
          alert( top );
          if( top - 50 > this.getLT()[1] ){
            alert( 'hogehoge' );
            this['74']();
          }
          else if( top - 50 <  this.getLT()[1] ){
            this['75']();
          }
          */
        });

    }
  };
  vi_like.initialize();
})( this.unsafeWindow || window, function(id) { return document.getElementById( id ); } );
Share and Enjoy:
  • Digg
  • del.icio.us
  • Google Bookmarks
  • Tumblr
  • email
  • Facebook
  • FriendFeed

RSS Feed

1件のコメント for pticをviっぽく見るuser.js

Tweets that mention pticをviっぽく見るuser.js | 404 motivation not found -- Topsy.com | 2010 年 3 月 25 日 at 10:08 PM

[...] This post was mentioned on Twitter by 志村 俊朗, ピーチク. ピーチク said: エンジニアでこんなの作ってくれた人がいました!!!ありがとです! "pticをviっぽく見るuser.js" http://bit.ly/9t5zdR [...]

Leave a comment!

<< 今日の夕飯

最近のiPhone利用状況(1) >>

Find it!

Theme Design by devolux.org

Tag Cloud