del.icio.usのタグに英語しか使わない人のためのGreasemonkeyスクリプト

せっかくなのでさっきのエントリturnOffIME() を使ってdel.icio.us用のGreasemonkeyスクリプトを書いてみました。Windows限定です。

機能は4つ。

  • 投稿ページのtags欄にフォーカスするとIMEがオフになる。
  • ページ上部のパンくずリストのタグを入力する所にフォーカスするとIMEがオフになる。
  • 投稿ページを表示したときにtags欄にフォーカスする。
  • 投稿ページじゃなかったらパンくずリストのタグを入力する所にフォーカスする。

追記 2007-01-15 19:55

IMEのキャレットが表示されなくなっていた不具合を修正しました。

コード

// ==UserScript==
// @name           del.icio.us IME OFF
// @namespace      http://d.hatena.ne.jp/margin/
// @include        http://del.icio.us/*
// ==/UserScript==

(function(){

  function turnOffIME(focusElement) {
    function c() {
      var s = document.createElement('span');
      s.innerHTML =
        '<input type="password" style="visibility:hidden;position:fixed">';
      return document.body.appendChild(s.firstChild);
    }

    var p = c();
    p.focus();
    document.body.removeChild(p);
    if (focusElement && focusElement.focus) {
      focusElement.focus();
    } else {
      var x = turnOffIME.x = turnOffIME.x || c();
      x.focus();
      x.blur();
    }
  }

  function turnOffIMEOnFocus(element) {
    element._focused = false;
    element.addEventListener('focus', function() {
      if(!this._focused) {
        this._focused = true;
        turnOffIME(this);
      }
    }, false);
    element.addEventListener('blur', function(){
      this._focused = false;
    }, false);
  }

  window.addEventListener('load', function() {
    var crumb = document.getElementById('crumb');
    if (crumb) {
      var crumbs = crumb.getElementsByTagName('input');
      crumb = crumbs[crumbs.length-1];
      turnOffIMEOnFocus(crumb);
      crumb.focus();
    }

    var tags = document.getElementById('tags');
    if (tags) {
      turnOffIMEOnFocus(tags);
      tags.focus();
    }
  }, false);

})();

Remember The MilkでIMEをオフにするGreasemonkeyスクリプト

Remember The Milkでキーボード・ショートカットを使っていて、ひとつ困ることがあります。タスクを追加したときにはすぐに d で期日を入力したいのですが、タスクの入力時にIMEがオンになっている場合、わざわざIMEをオフにしないとキーボード・ショートカットが使えません。というわけで、タスクを追加した後にIMEをオフにするGreasemonkeyスクリプトを書いてみました。

ついでにページの読み込み時にもオフにしています。IMEをオフにするやり方はLDRの棒人間に怒られないようにするGreaemonkeyスクリプト(Windows限定) - AUSGANG SOFTを参考にさせていただきました。したがってこのGreasemonkeyWindows限定です。

追記 2006-01-15 21:30

タスクの追加だけではなく、全ての input[type="text"] において、フォーカスが外れたときとエンターキーが押されたときににIMEをオフにするようにしました。後から追加されるフォームもDOMNodeInsertedイベントで捕まえて設定しています。

追記 2006-02-11 19:30

Flashを使ってちゃんとしたものを書いてくれた人がいるので皆さんこちらを使いましょう。

コード

// ==UserScript==
// @name           Remember The Milk IME OFF
// @namespace      http://d.hatena.ne.jp/margin/
// @include        http://www.rememberthemilk.com/*
// ==/UserScript==

(function(){

  function turnOffIME(focusElement) {
    function c() {
      var s = document.createElement('span');
      s.innerHTML =
        '<input type="password" style="visibility:hidden;position:fixed">';
      return document.body.appendChild(s.firstChild);
    }

    var p = c();
    p.focus();
    document.body.removeChild(p);
    if (focusElement && focusElement.focus) {
      focusElement.focus();
    } else {
      var x = turnOffIME.x = turnOffIME.x || c();
      x.focus();
      x.blur();
    }
  }

  function turnOffIMEOnBlur(element) {
    element.addEventListener('blur', turnOffIME, false);
  }

  function turnOffIMEOnBlurInput(element) {
    var type = element.type.toLowerCase();
    if (type == '' || type == 'text') {
      element.addEventListener('blur', turnOffIME, false);
      element.addEventListener('keypress', function(e) {
        if (e.keyCode == 13)
          turnOffIME();
      }, false);
    }
  }

  window.addEventListener('load', function() {
    Array.forEach(document.getElementsByTagName('input'), turnOffIMEOnBlurInput);
    Array.forEach(document.getElementsByTagName('textarea'), turnOffIMEOnBlur);

    document.addEventListener('DOMNodeInserted', function(event) {
      target = event.target;
      if (target.nodeType == 1) {
        tagName = target.tagName.toLowerCase();
        if (tagName == 'input') {
          turnOffIMEOnBlurInput(target);
        } else if (tagName == 'textarea') {
          turnOffIMEOnBlur(target);
        } else {
          Array.forEach(target.getElementsByTagName('input'), turnOffIMEOnBlurInput);
          Array.forEach(target.getElementsByTagName('textarea'), turnOffIMEOnBlur);
        }
      }
    }, false);

    turnOffIME();
  }, false);

})();

IconizeTaskbarButton が欲しい

いやね、 Firefox 拡張の FaviconizeTab が恐ろしく便利で、これをタスクバー上でもやりたいと思ったわけです。 タスクトレイにアイコン化させるソフトはいっぱいあるのですけど、タスクバーのボタンをアイコンのみにするってのは、なかなか無い。 TClock2ch には「タスクスイッチにアイコンのみ表示」っていうのがあるみたいですけど、これだと全部アイコンのみになっちゃいます。 それで (何処かに無いかな && 誰か作ってくれないかな && 自分で作ろうかな) とか思ったわけですよ。 思っただけですけど。

Remember The Milk のキーボード・ショートカットを分かり易く表示する

すっごく今更ですけど Remember The Milk を使ってみました。 思い立ったのが今日の朝なので1日も使ってませんけど、しばらく使ってみることにします。
使うからにはキーボード・ショートカットを使ってサクサクっと編集したいのですけど、キーボード・ショートカットとか覚えたくない。 というか覚えられない。 というわけでそれっぽいところにキーボード・ショートカットを表示するユーザー・スタイルシートを自分用に書いてみました。 例によって userstyles.org に上げてあります。

ちなみにコードは以下。

@namespace url(http://www.w3.org/1999/xhtml);

@-moz-document domain("www.rememberthemilk.com") {
  #detailstitle_highlight[title]::after {
    content: " (r)";
    color: #575757;
    font-weight: normal;
  }
  #detailsdue::after       { content: " (d)"; }
  #detailsreoccur::after   { content: " (f)"; }
  #detailsduration::after  { content: " (g)"; }
  #detailstags::after      { content: " (s)"; }
  #detailslocation::after  { content: " (l)"; }
  #detailsurl::after       { content: " (u)"; }
  #detailspostponed::after { content: " (p)"; }
  #detailsnotes::after     { content: " (y)"; }

  #tasksToolbox > .xtoolbox_selector > a:first-child::after { content: " (a)"; }
  #tasksToolbox > .xtoolbox_selector > a:last-child::after  { content: " (n)"; }
  #addEntry > a::after { content: " (t)"; }

  #tasktabs:after, #detailstabs::after {
    content: "(h)";
    line-height: 2;
    margin: 0 0.5em;
  }

  #searchtogglewrap::before {
    content: "(C-S-/) ";
    margin-left: -10em;
  }

  #viewSelector > a[href="#section.overview"]::after  { content: " (C-S-6)"; }
  #viewSelector > a[href="#section.tasks"]::after     { content: " (C-S-7)"; }
  #viewSelector > a[href="#section.locations"]::after { content: " (C-S-8)"; }
  #viewSelector > a[href="#section.contacts"]::after  { content: " (C-S-9)"; }
  #viewSelector > a[href="#section.settings"]::after  { content: " (C-S-0)"; }
  #viewSelector > a::after { font-size: 80%; }
  #appheaderlogo { position: absolute !important; }
  #topnav { position: relative !important; }

  #statusboxUndo > a::after { content: " (z)"; }

  #tasksToolbox > .xtoolbox_actions > form > div::after {
    content: " Complete (c), Postpone (p)";
    color: #757575;
  }
  #tasksToolbox::after {
    content: "Up (k), Down (j), Select (i), Undo (z), Multi-edit (m)";
    color: #757575;
    display: block;
    margin: 5px 0 -1.5em 20px;
  }
}

これを書くにあたっては Firebug が大活躍でした。 DOM Inspector よりずっど使いやすい。 ほとんど疑似要素になっちゃいましたけど、 Greasemonkey でやるべきだったかな。

2007-01-13 11:55 更新

上に表示される名前が長い名前の場合にロゴの後ろに隠れてしまっていたのを修正しました。

2007-01-14 19:18 更新

変更時に出てくる黄色いボックスの中の「とりけす」にも表示するようにしました。

私のFirefox2

TB企画*あなたのFirefox見せてほしいな :: Love & Design ::に参加してみようかと思います。

バージョンは2.0、テーマはデフォルト。これと言ったホームページも無いのでホームは about:blank にしています。ロケーションバーで Smart Keyword を使って検索するので検索バーは非表示。あとはメニュー(Iconic Main Menu使用)とブックマーク(レット)だけで、出来るだけ小さくまとめています。
拡張機能は Talkback を除いて19個でした。

All-inOne Gestures
進む/戻る/閉じる くらいしか使ってませんがやっぱり外せません。
ColorZilla
カラーピッカー。実はあんまり使ってなかったり。
DOM Inspector
主にFirefoxのUIを調べる時に使ってます。
Download Statusbar
いちいちウィンドウが出てくると邪魔なので。
Favicon Picker 2
これで bookmarkletfavicon を付けてます。
FireBug
JavaScriptコンソールにDOMインスペクタにデバッガにと便利すぎ。
Google NoteBook
ちょっとしたメモ用。
Greasemonkey
公開されているものを自分でいじって使うことが多いです。
Html Validator
Webサイトの構文チェックに。
IE Tab
IEでの表示チェックとか、IEでしか見れないサイトはこれで。
Long Titles
title属性の中身をマウスオーバーで全部表示するように。脚注とかのリンクを見るのに便利かと。
MeasureIt
いろいろサイズを測る。たまに使う程度。
Menu Editor
いらないメニューは消すに限ります。
Organize Status Bar
ステータスバーのアイコンの順序を入れ替え。
Stylish
userContent.css でも良いけど、その場でプレビューできるのが便利。
Text Link
URLテキストをダブルクリックで移動できるように。必須。
ViewSourceWith
フォームやページの CSS/JavaScript ファイルを任意のエディターで開く。私は xyzzy で開くようにしています。
Web Developer
便利ツールいろいろ。
翻訳パネル
英語が苦手な私にとっては必需品。

Tab Mix Plus を入れようかどうか迷ったのですけど、Firefox2 でタブ機能も強化されたので思いきって外してみました。ブックマークをタブで開く設定にしていたのでちょっと戸惑いましたが2日で慣れました^^
あと、Firefox の好きなところは、シンプルで拡張性が高いところでしょうか。これ1つで何でも出来るというものよりは、シンプルなものに自分の必要なものを付け足していく方が、私は好きみたいです。

文字列操作の比較表

文字列操作の比較表: Ruby, Python, JavaScript, Perl, C++ - bkブログ
便利だし面白いです。 C++ で空白ところをちょっと考えてみました。

Ruby C++
s.upcese! transform(s.begin(), s.end(), s.begin(), (int (*)(int))toupper)
s.downcese! transform(s.begin(), s.end(), s.begin(), (int (*)(int))tolower)
s.lstrip s.substr(s.find_first_not_of(" \t\r\n\f\v"))
s.rstrip s.substr(0, s.find_last_not_of(" \t\r\n\f\v")+1)

なんかどれもイマイチ。
Boost を使っていいのなら string_algo とか regex, format, toknizer あたりで大抵のことは出来ますね。あと BOOST_FOREACH はすごく便利なんじゃないかと(最近あまりC++使って無いのでなんとも言えませんが)。

ところでコメント機能が無いみたいなので、気になったことを以下に。

  • boost::lexical_cast って16進とか8進表示の指定って出来ませんよね?
  • s.substr(i, j ? i + 1)s.substr(i, j ? i)s.substr(i, j - i + 1)s.substr(i, j - i) ですね。 文字化け?
  • s.lstrip が2つありますけど2つ目は s.lstrip! かと。

すでに修正されてます。

livedoor Reader でレートを一括変更する

(2007-07-07 追記) Fastladderに対応しました(include追加しただけですが)。移行時のレート付けにどうぞ。


LDR で複数のフィードのレートをまとめて設定したかったのですけど、そういう機能が見当たらないので Greasemonkey で vi コマンドを拡張してみました。 すでにどこかにありそうですが。

上のユーザースクリプトをインストールした後、「フォルダ、アイテムの編集」画面でフィードをいくつか選択して : 数字 Enter とかやると選択したフィードのレートが変わるはずです。 編集画面以外では通常通り、その時読んでいるフィードのレートが変わります。
あんまりテストとかしてないので関係ないフィードのレートが変わっちゃったりするかもしれませんが、そこは自己責任でおねがいします。

ソース

// ==UserScript==
// @name           LDR Manage Rate Commands
// @namespace      http://d.hatena.ne.jp/margin/
// @include        http://reader.livedoor.com/reader/*
// @include        http://fastladder.com/reader/*
// ==/UserScript==

(function() {with(unsafeWindow) {

  '0,1,2,3,4,5'.split(',').forEach(function(v) {
    register_command(v, function() {
      var rate = v - 0;
      var rate_img = Rate.image_path_p + rate + '.gif';
      if (hasClass('right_container', 'mode-manage')) {
        TRSelector.get_selected().forEach(function(sid) {
          set_rate(sid, rate);
        });
        var table = $('manage_table').getElementsByTagName('table')[0];
        Array.forEach(table.rows, function(row) {
          if (hasClass(row, 'selected')) {
            var img = row.cells[4].getElementsByTagName('img')[0];
            img.src = rate_img;
          }
        });
      } else if (State.now_reading) {
        var sid = State.now_reading;
        set_rate(sid, rate);
        $('rate_img').src = rate_img;
      }
    });
  });

}})();

追記 (2006-10-24 13:24)

隠れているアイテムのレートが変更されなかったのを修正したつもりです。