Firefoxでコンテンツにフォーカスする方法(KeySnail)

KeySnailでj,k,n,mなどをスクロールキーとして利用しているが、「Fast look up JP and EN for Greasemonkey」で検索をした後などに、フォーカスがコンテンツエリアから外れてしまい、スクロールができなくなってしまう。

で、コンテンツエリアにフォーカスさせる方法として下記の2種類の方法で試していたのだけど、うまく機能するときとしないときがあった。

  let elem = document.commandDispatcher.focusedElement;
  if (elem) elem.blur();
  gBrowser.focus();
  _content.focus();
  gBrowser.selectedTab.focus();
  content.focus();

しかし、今日どんな場面でも意図通りコンテンツエリアにフォーカスさせることができるようになった。

  document.getElementById("searchbar").focus();
  document.commandDispatcher.advanceFocus();
  document.commandDispatcher.advanceFocus();

やっていることは、まず検索バーにフォーカスしてから、TABキーを2回押す動作をJavascriptで実現している。
1つ目のTABでタブバーがフォーカスされ、2つ目でコンテンツエリアがフォーカスされる。

livedoor Readerで本文を非表示にしている状態で、gキーかアイコンクリックで全文を取得しても、取得された文章は表示されない。

記事を読むためにはさらに「本文の表示を切り替える」というアクションが必要で、それがいちいち面倒くさいので、全文取得したときに自動的に本文を表示状態に切り替えるように修正した。

LDR Full Feedのソースを開き928行目と929行目の間に以下のように追加する

変更前
      if(!c.found && !PHASE.some(function(i){
        log('PHASE: ' + i.type);
変更後
      if(!c.found && !PHASE.some(function(i){
        /* 全文取得をするとき、常に本文を表示状態に切り替える
           LDRで使われている関数はunsafeWindow内でしか使えない */
        with(unsafeWindow) {
          if (contain($("right_body").className, "compact")) {
            toggleClass("right_body", "compact");
          }
          if (!id) id = get_active_item(true).id;
          Control.scroll_to_px($("item_body_" + id).parentNode.offsetTop + 2);
        }
        log('PHASE: ' + i.type);

11月21日に

          if (!id) id = get_active_item(true).id;

を追加した。


なぜか分からないが、はてなダイアリーにアクセスしても記事を書くためのリンクや、過去記事ごとにあったはずの編集するためのリンクが表示されない。
エラーコンソールを見ると、「Hatena is not defined」「Ten is not defined」というエラーが表示されている。
管理画面の過去記事を見ても編集するためのリンクなどが存在しなく、編集ができない状態だったけど、「管理」>「設定」「編集設定」で「編集画面の設定」を「その場編集モード」から「詳細編集モード」に変更したら、ようやく編集するためのリンクが表示されるようになったので、今編集しているところ。

LDRで本文の表示、非表示をワンクリックで切り替える

livedoor Readerで本文の表示・非表示をマウスでワンクリックで切り替える機能を追加する。

HatebuComment on LDRに追加しようと思ったけど、一般的ではないかもしれないので、ソースだけ載せておく。

  // 本文の表示非表示を切り替える▼を追加する
  function byID(id) {
    return document.getElementById(id);
  }
  function EVENT(type) {
    var event = document.createEvent('MouseEvents');
    event.initEvent(type, true, true);
    return event;
  }
  var elem = document.createElement('li');
  elem.id = 'toggleContent';
  elem.title = '本文の表示 / 非表示の切替';
  elem.innerHTML = '▼';
  byID("control_buttons_ul").appendChild(elem);
  byID("toggleContent").addEventListener('click', function() {
    // まずメニューをポップアップさせる
    byID("menu_button").dispatchEvent(EVENT('mousedown'));
    // 次に該当メニューをクリック
    var elem = document.evaluate(
      '//span/text()[self::text()="本文の表示 / 非表示の切替"]',
      document, null, 7, null
    );
    elem.snapshotItem(0).dispatchEvent(EVENT('mouseup'));
    // メニューを閉じる
    byID("menu_button").dispatchEvent(EVENT('click'));
  }, false);

11月21日、LDRの関数を利用するように変更した

  byID("toggleContent").addEventListener('click', function() {
    // まずメニューをポップアップさせる
    byID("menu_button").dispatchEvent(EVENT('mousedown'));
    // 次に該当メニューをクリック
    var elem = document.evaluate(
      '//span/text()[self::text()="本文の表示 / 非表示の切替"]',
      document, null, 7, null
    );
    elem.snapshotItem(0).dispatchEvent(EVENT('mouseup'));
    // メニューを閉じる
    byID("menu_button").dispatchEvent(EVENT('click'));
  }, false);

上記を以下のように変更

    $("toggleContent").addEventListener('click', function() {
      // LDRの関数
      Control.compact()
    }, false);

これに伴い、function byID()やfunction EVENT()は不要となった。

メニューの「その他」の右に▼が追加され、クリックするたびに表示・非表示が切り替わる。

HatebuComment on LDR改良

HatebuComment on LDRでコメントを取得した場合、実際にブックマークされている数より、取得できる数が遥かに少ないケースがよくある。
取得に失敗するのはスクリプトのエラーかと思ったけど、はてな公式の拡張機能である「Hatena Bookmark 2.1.1」でもコメントの取得に失敗するケースがある。
さらに、F5でページリロードしたあとに同じ記事でコメントを取得すると正常に取得できる場合もあるので、はてな側でのエラー?のようす。


shift+m(=M)でコメントを再読込するようにしてみたが改善できず。
色々見ていると、はてなRSSを使ってもコメントを取得できると分かったので、JSONRSS両方で取得して、コメントが多い方を自動的に表示するようにした。
HatebuComment on LDR for Greasemonkey


あと、マウスで取得する場合の動作も改善。
クリックした記事と実際にコメントの取得を試みる記事がずれるケースを修正した。
さらに、最初の3つぐらいの記事でしかマウスによる取得が機能しないケースもあったので、EventListenerの追加を1000ミリ秒から1500ミリ秒に遅らせてみた。


使用方法は同じだが、スクリプトのソースは大幅に変更した。

Gmail Macrosをリメイクしたので公開。

Gmailに独自ショートカットキーを設定できる「Gmail Macros」。
オリジナルは数年前に更新が終了していて、現在は動作しないので、リメイクしてみた。


きっかけは最近フィルタを追加してメールの自動振り分けを細かくしたこと。新たなラベルに振り分けるようにしたのだけど、ラベルに移動することが面倒になってしまった。


Gmail Macrosなら、"g"を押すと「Go to label」のポップアップが表示され、次に"i"と入力すれば受信トレイに移動できる("i"から始まるラベルを作っていない場合)。
これは標準の機能と同じだけど、標準では移動できない迷惑メールフォルダには"sp"で、ゴミ箱には"t"で移動できる(これも同じ頭文字で始まるラベルがない場合)。
もちろん、自分で作成したラベルにも移動できるし、クイックリンクにも同じ動作で移動できる。あまり使わない気もするけど、設定画面の各ページにも"set:Label"などで移動できるようにした。


他には、"Q"を押すと、現在表示している状態のクイックリンクを作成するポップアップが表示される。
"r"を押すと、未読メールなら既読に、既読メールなら未読に、同じキーで変更できる(これはメール一覧の状態の動作で、メールを閲覧しているときに"r"を押すと標準の「返信」として機能する)。
"d"を押すと、迷惑メールやゴミ箱の場合は「完全に削除」、下書きの場合は「破棄」、その他の場合は「既読にして削除」という処理を行う。
"l(小文字のエル)"を押すと、"g"の「Go to label」と同じ方法でラベルを付けたりラベルを外す事ができる。存在しないラベルを入力したら、そのラベルが新規作成されて適用される。


ラベルへの移動はGmailのLabsにある「ラベル ショートカット」でも可能だけど、「Go to label」の方が使いやすいはず。
全部で20個以上のショートカットキーを初期設定しているし、もちろん独自にマクロを追加することもできる。
あと、"f-a"といった複合キー(fを押したあとaを押すと動作する)も設定可能。ただし、その場合"f"単独キーの動作は設定できなくなる。
Gmail Macros for Greasemonkey

Fast look up JP and EN。修正する箇所をメモしておく

Exciteの翻訳機能が使えなくなっていて不便だと思っていたらアップデートされていた。Fast look up JP and EN for Greasemonkey
それに伴い、自分で変更していた箇所がまた元に戻ったのでメモしておく。


初期状態のopacity 0.8だと見づらいので、1.0に変更する。
エディタで検索文字列「(opacity *?[=:] *?)0.8」、置換後文字列「\11.0」で置換。(後方参照+1.0)


自分の環境だとAlt+yで設定画面を開いたときに右側が切れてしまうので修正
「var Navi = {」で検索して、「var css = 」にある「width: 400px;」を600に変更。


そして、gooの検索結果にタイトルを追加したいので、ソースのvar LOCAL_SITEINFO = に以下を追加する

	{
		name: "goo(国語)",
		url: "http://dictionary.goo.ne.jp\/freewordsearcher.html?MT=[context]&mode=1&id=top&kind=jn",
		icon: "data:image/gif;base64,R0lGODlhEAAQALMAAAhWCGe6Z9bfvCqGKoLNgg9vD/v9+6S2nFmBUKrQmiZnJlGkUcvvwixiLJy2hD+SPyH5BAAAAAAALAAAAAAQABAAAwRt0EgpHGoXsSmRR04ijFbDKUnCrEkQPANwBkVCEMEyDIU8KbQbLkBILHwSYOG2agaQBiWuKSA8oMocDlbozQoL2K7r/dHEBV4XS1uQyQB2+g3oya+9wcIKbdB4RWFxUAB/awAYBxwGAg1xiYsSEQA7",
		xpath: "(//h1 | id('incontents')/div[@class='kokugo'] | id('incontents')/div[@class='daijisen_jn']) | id('incontents')/dl[@class='allList']",
		lang: "ja",
		type: "dictionary",
		enc: "UTF-8",
	},


さらに、検索結果が見づらいので、Stylishの「userContent.css」に以下を追加する

/* goo辞書 */
.idiom {color: #8ff !important;}
.compound {color: #8ff !important;}
.meaning:before {content: " ";}

HatebuComment on LDRでエラーが出ていたのを修正

昨日あたりからLivedoor Readerスクリプトエラーが出るようになった。
このエラーの原因が自分のスクリプトだったので、修正。

投稿者名がnullの時に表示されないようになっていたみたい。

author == nullでは機能しなかったけど、
author === nullとすると機能しだした。

HatebuComment on LDR for Greasemonkey

上記に修正したものをアップロードしたので、使っている人はアップロードしてください。
ご迷惑をおかけしました。