2008/01/31


Firefoxをshellの様に扱えるグリモン「Minibuffer ? Userscripts.org」で使える、はてなブックマークコマンド「hatena-bookmark」書いた。 Minibufferは、LDRizeと併用すると「pinned-link」や「pinned-node」というルートコマンド(フィルタコマンドではない)が追加される。
例えば、LDRizeでpinを付けたリンクをタブで開くには :pinned-link | open とすれば良い。ここで注意しなければならないのがグリモンの設定で
  • Minibuffer
  • LDRize
  • ...LDRizeプラグインもしくはMinubufferプラグイン...
という順番にしておかないと、「pinned-link」や「pinned-node」が正しく動かなくなるので注意。

この順番になるように、以下のスクリプト入れると、「hatena-bookmark」コマンドが追加される。
LDRizeを入れておくと、ブログ等の記事1つずつにpinが付けられるようになっていて、そのpinを付けたものに対してパイプ形式にコマンドを繋げられる。
例えば、pinをつけたリンクのGoogleキャッシュを開くには :pinned-link | google-cache | open とすればよい。
※pinをつけるには「p」を押す。

「hatena-bookmark」の使い方は、何もpinしていない状態で「Alt-x」(ALTキーを押しながらx)を押して :hatena-bookmark とすると、現在見ているページのはてなブックマーク登録画面が立ち上がる。またpinを付けた状態で :pinned-link | hatena-bookmark とすると、pinが指すリンクのブックマーク登録画面が立ち上がる。
なお :pinned-node | hatena-bookmark では、pinしているHTMLノードの先頭にあるリンクを使ってブックマーク登録画面を表示する。
ちなみにソースはこんな感じ。 // ==UserScript==
// @name           Minibuffer Hatena Command
// @namespace      Minibuffer.Hatena-Command
// @description    add hatena-bookmark command to Minibuffer.
// @include        http://*
// @include        https://*
// ==/UserScript==

var SCRIPT_VERSION  = 'Thu, 15 Nov 2007'

var Minibuffer_Hatena = new function() {
    var self = this;

    this._run_bookmark = function(u, t) {
        var link;
        if (t) link = 'http://b.hatena.ne.jp/add?mode=confirm&is_bm=1&title='+escape(t)+'&url='+escape(u);
        else   link = 'http://b.hatena.ne.jp/add?mode=confirm&is_bm=1&url='+escape(u);

        setTimeout(function(){
            window.open(link, '_blank', 'width=550,height=600,resizable=1,scrollbars=1');
        }, 10);
    }

    this.bookmark = function ( stdin ) {
        if (stdin.length == 0) {
            self._run_bookmark(location.href, document.title);
        } else {
            stdin.forEach(function(obj){
                if (typeof obj == 'string' && obj.match(/^https?:.*/)) self._run_bookmark(obj);
                else if (typeof obj == 'object') {
                    try {
                        var links = obj.getElementsByTagName('a');
                        for(var n = 0; n < links.length; n++) {
                            if (links[n].href.match(/^https?:.*/)) {
                                self._run_bookmark(links[n].href);
                                break;
                            }
                        }
                    } catch(e) { }
                }
            });
        }
    };
    this.condition = function() { return true; };
};

if (window.Minibuffer) {
    Minibuffer.addCommand({
        "hatena-bookmark": Minibuffer_Hatena.bookmark,
    });
}

インストール:minibuffer.hatena.user.js
ちなみに、ファイル名が「minibuffer.hatena.bookmark.user.js」になっていないのは、いずれ他のコマンドも作って行きたいから...。

あ、あと記事とは無関係ですが、今日CodeReposのLDRize-SITEINFO書いときました。

追記1
bookmarkコマンドで、stdinを返すように修正した。
これで :pinned-link | hatena-bookmark | clear-pin とか出来る様になった。

追記2
申し訳ない。objがtypeofでstringとして戻るパターンとobjectとして戻るパターンがあるようです。修正しました。
Posted at by




まぁ、ただそれだけなんですが...
はてなスターに連射ボタンをつけるBookmarklet - 0x集積蔵
tyoro.exe はてなスターに連射ボタンをつけるBookmarklet 改造版
Operaは...しらん。
はてスタ連射
コード
(function(){
var SPEED=2000;
var d=document;
function r(b,m){
    b.onclick=function(){
        var t=setInterval(function(){
            var e;
            if(d.all){
              e=d.createEventObject();
              e.target=m;
              m.fireEvent("onclick",e);
            }else{
              e=d.createEvent("MouseEvents");
              e.initMouseEvent("click",true,true,window,1,10,50,10,50,0,0,0,0,1,m);
              m.dispatchEvent(e);
            }
        },SPEED);
        b.innerHTML='[STOP!]';
        b.onclick=function(){
            clearInterval(t);
            b.innerHTML='[&#36899;&#23556;!]';
            r(b,m);
        }
    }
}
var im=d.images;
for(var i=0,l=im.length;i<l;i++){
    var m=im[i];
    if(m.className=='hatena-star-add-button'){
        var b=m.parentNode.appendChild(d.createElement('b'));
        b.innerHTML='[&#36899;&#23556;!]';
        r(b,m);
    }
}
})();
Posted at by




その1 3桁ごとに区切る - PleasureDelayerDiary はてなブックマーク数


Number.prototype.split3_1 = function() {
    var r = ""; 
    var s = this.toString().split("").reverse();
    for(var i = 0; i < s.length; i++) {
        if(i % 3 == 0 && i != 0 && s[i] != "-") {
            r = s[i] + "," + r
        } else {
            r = s[i] + r;
        }
    }  
    return r;
}

その2 iandeth. - javascriptで数値をカンマ区切り文字列に変換する関数メモ はてなブックマーク数


Number.prototype.split3_2 = function () {
    var to = String(this);
    var tmp = "";
    while (to != (tmp = to.replace(/^([+-]?\d+)(\d\d\d)/,"$1,$2"))){
        to = tmp;
    }
    return to;
}

その3 JavaScriptで数値を3桁ごとに区切る - 0x集積蔵 はてなブックマーク数


Number.prototype.split3_3 = function() {
    var m = (this &lt; 0) ? -1 : 1;
    var str = String(this*m).split('.');
    var arr = String(str[0]).split(''), len = Math.ceil(arr.length/3), res = [];
    for (var i =0;i&lt;len;++i) res.push(arr.splice(-3,3).join(''));
    return (m == -1 ? '-' : '') + res.reverse().join(',') + (str[1] ? '.' + str[1] : '');
};

その4 [JavaScript]数値を3桁ごとに区切る はてなブックマーク数


Number.prototype.split3_ore = function() {
  ('' + this).match(/(-?)([0-9]+)(\.[0-9]*)?/);
  var sp = [RegExp.$1, RegExp.$2, RegExp.$3];
  var x = Math.floor(sp[1].length / 3) * 3;
  var len = sp[1].length;
  return sp[0] + (sp[1].substr(0, len - x)) + (len - x == 0 ? '' : ',') +
         (sp[1].substr(len - x, x).match(/[0-9]{3}/g).join(',')) + sp[2];
}
私ならこう書く。
Number.prototype.split3 = function() {
  var r = "", s = this.toString().split("").reverse().join("").replace(/\d{3}/g,
    function(v){r+=v+',';return ''});
  return (r + s).split("").reverse().join("");
}
alert((1000000).split3()) // 1,000,000
文字列を逆にして、replaceに指定した関数で3桁毎にカンマを入れた結果と、空で置換したsubstituteの結果(あまった結果)を足す。その後文字列を逆にして戻す。
マイナスもたぶんOK。


追記1
しまった。チェック甘すぎ。
Number.prototype.split3 = function() {
  var r = "", s = this.toString().split("").reverse().join("").replace(/\d{3}/g,
    function(v){r+=v+',';return ''});
  if (!s.match(/\d/)) r = r.substr(0, r.length-1);
  return (r + s).split("").reverse().join("");
}
計測してみる!
mattnおそ!www
関数呼び出しコストか?
追記2
うむ。小数か...
Number.prototype.split3_mattn2 = function() {
  var r = '', s = this.toString();
  s.match(/(-?)([0-9]+)(\.[0-9]*)?/);
  var sp = [RegExp.$1, s = parseInt(RegExp.$2), RegExp.$3];
  while(s >= 1000) {
    r = ',' + (s%1000) + r;
    s = parseInt(s/1000);
  }
  return sp[0] + s + r + sp[2];
}
-12345678.2356を3桁ごとに区切るテスト

タイム測定



うむ。それでも遅い。
Posted at by