find_in_searchbar_highlight.uc.jsに機能追加したりボタンをテーマ「rein」に合わせてみた

Firefox 4.0.1, userChromeJS 1.3, Sub-Script/Overlay Loader v3.0.30modで動作確認。

検索ボックスのボタン(虫眼鏡)をクリックでページ内検索する便利なuserChrome.jsのスクリプト「find_in_searchbar_highlight.uc.js」(Firefox用スクリプトアップローダー(新)の642.js)ですが、テーマ「rein」を使ってるとハイライトボタンが浮いてしまう。
ということで変えました。

ついでにいろいろ変えてます。以下の通り。

  • 虫眼鏡クリック以外にも検索ボックス内でCtrl+EnterまたはAlt+Nでページ内検索(次へ)
  • 同様にCtrl+Shift+EnterまたはAlt+Pでページ内検索(前へ)
  • ハイライトボタンは初期状態で非表示(使えないので)
    ページ内検索を1回実行すると表示
    通常の検索(Enterのみ、Alt+Enterなど)でまたハイライトボタン非表示にする
  • ハイライトはボタンクリック以外にも検索ボックス内Ctrl+Hで切り替えできる
  • 背景色変更あたりを微調整

ダウンロード : find_in_searchbar_highlight_mod.uc.js (デフォルトボタンのまま)
ダウンロード : find_in_searchbar_highlight_mod(rein).uc.js (rein対応ボタン)
※ボタンの画像が違うだけです。たぶん。

// ==UserScript==
// @name           find_in_searchbar_highlight.uc.js (mod)
// @description    検索バーでページ内検索+検索文字のハイライト
// @include        chrome://browser/content/browser.xul
// @author         yosuke
// @compatibility  Firefox 4.0
// @Note           (概要)
// @Note           ・検索バー内にある検索ボタン(虫眼鏡)をクリックすると,検索バーに入力された文字列をページ内検索する.
// @Note           ・検索バーの右端にあるペンボタンをクリックすると,検索バーに入力された文字列をすべてハイライト表示する.
// @Note           ・検索した結果,文字列がみつからない場合,検索バー内の背景が赤になる.
// @Note           ・先頭に戻って検索するか,末尾に戻って検索する場合,検索バー内の背景が緑になる.
// @Note           (具体的な使い方)
// @Note             検索ボタンの右クリック -> ページ内検索,次を検索
// @Note             検索ボタンの左クリック -> 前を検索
// @Note             検索ボタンの中クリック -> 検索バー内の文字列を消去
// @Note             ペンボタンをクリック   -> ハイライトのオン,オフ
// @Note           (注意)
// @Note             「任意の設定」の値を変更することで各種機能を個別に設定できます.
// @Note             検索バーによるページ内検索を行う場合,検索ボタンを表示させてください.
// @Note           (追加機能:oflow)
// @Note             テーマ「rain」に合わせてアイコンを変更
// @Note             ハイライトボタンの位置を検索ボックスの中に移動
// @Note             ページ内検索をした時だけハイライトボタンを表示するように変更
// @Note             Ctrl+Enter, Alt+Nでページ内検索(次を検索)
// @Note             Ctrl+Shift+Enter, Alt+Pでページ内検索(次を検索)
// ==/UserScript==

(function() {
    /*----- 任意の設定 -----*/
    // 検索バーによるページ内検索を許可するか("true" or "false")
    const USE_FINDSEARCH = "true"
    // 強調ボタンを配置するか("true" or "false")
    const USE_HIGHLIGHTBUTTON = "true"
    // 検索バーでページ内検索を行う際にページ内検索バーを表示するか("true" or "false")
    const USE_FINDBAR = "false"
    // 先頭に戻って検索,末尾に戻って検索を許可するか("true" or "false")
    const USE_WRAP= "true"
    
    /*----- 初期設定 -----*/
    // ID, Class  Object
    var searchbar = document.getElementById("searchbar");
    var searchbox = document.getAnonymousElementByAttribute(searchbar, "anonid", "searchbar-textbox");
    var searchGoButton = document.getAnonymousElementByAttribute(searchbar, "anonid", "search-go-button");
    var inputbox = document.getAnonymousElementByAttribute(searchbar, "anonid", "input");
    var findstatus = gFindBar.getElement("find-status-icon");
    
    // Colour, Image
    const white = "#ffffff";
    const green = "#ccffcc";
    const red   = "#ffcccc";
    var onHighlight = 'data:image/png;base64,'+
    'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0'+
    'U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAFgSURBVHjaYv7//z/j69evWR8+fMj19etX'+
    'HgYGBhjmxoK5gJhDTEyMOT4+/v+pU6f+AwQQM1Azy5o1a/hevXolC5RUAmIFIJYHYlksWBKIhYEW'+
    'sQEt/PXgwYPfAAHEADQNZKr21KlTD7x8+fLbfwIApAakFqQHpBcggIA0gwAQOxKjGdkQkB6QXoAA'+
    'YgISzCC/AU3jZMADTExMwBgEoGpBLmcGCCCQAYxQQ/BqxgJAehgBAogJymEkUTNcD0AAMZFhMwoA'+
    'CCAmSjSDAEAAMTGQAM6cOYMhBhBAMAP+o9uelpZGSDNYD0AAgQJCGIgtgNG7BZvmWbNmYRgG4jMy'+
    'MvoAmScAAogFSPwF4m/ApPwdlhZAmpAVo2sGqQXpAekFCCCKkzJAADFmZWXBMpMUUFAUmsJYcITj'+
    'H6jNr4Gan4WEhHwCCCAGUHYGGsIKFABlYSGoIWI4MEhOCKQWpAekFyDAAO0k7MPVi8ODAAAAAElF'+
    'TkSuQmCC';
    var offHighlight = 'data:image/png;base64,'+
    'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0'+
    'U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAFYSURBVHjaYv7//z/j69evWR4+fMj59etX'+
    'bgYGBhjmwoI5gZhdTEyMOT4+/v+pU6f+AwQQM0jzmjVr+F69eiUHlFQGYkUgVgBiOSxYCohFgBax'+
    'AS389eDBg98AAcQANA1ksvbUqVMPvHz58tt/AgCkBqQWpAekFyCAgDSDABA7EqMZ2RCQHpBegABi'+
    'AhLMIP8BTQP5DycwMTEBYxCAqgW5nBkggEAGMEINwasZCwDpYQQIICYoh5FEzXA9AAHERIbNKAAg'+
    'gJgo0QwCAAHExEACOHPmDIYYQADBDPiPbju6YiyawXoAAgiEhIHYGxbHxsbGKHGOzocBkB6QXoAA'+
    'YgESf4H4GzApf4elBWT/Y3M2SC1ID0gvQABRnJQBAogxKysLlplAGUUUmsJYcITjH6jNr4Gan4WE'+
    'hHwCCCAGUHYGGsIKFOABSghBDRHDgUFyQiC1ID0gvQABBgCgmw2B3mPqtQAAAABJRU5ErkJggg==';

    /*----- 検索ボタンをページ検索ボタンに -----*/
    // ページ内検索検索関数
    function find_in_searchbar(e){
        document.getElementById('toggle-all-highlight').style.display = 'block';
        var sel = searchbar.value;
        // 中クリック -> 検索文字列消去
        if(e.button == 1){
            gFindBar.toggleHighlight(false);
            searchbar.value = "";
            searchbox.style.backgroundColor = white;
        }
        // 左クリック, Ctrl+Enter       -> ページ内検索,次を検索
        // 右クリック, Ctrl+Shift+Enter -> 前を検索
        else if(sel){
            gFindBar._findField.value = sel;
            if(e.button == 0 || (e.ctrlKey && !e.shiftKey && e.keyCode == 13) || (e.altKey && e.keyCode == 78)){
                // 左クリック or Ctrl+Enter or Alt+N
                // 次へ
                gFindBar.onFindAgainCommand(false);
            } else if (e.button == 2 || (e.ctrlKey && e.shiftKey && e.keyCode == 13) || (e.altKey && e.keyCode == 80)) {
                // 右クリック or Ctrl+Shift+Enter or Alt+P
                // 前へ
                gFindBar.onFindAgainCommand(true);
            }
            if(findstatus.getAttribute("status")=="notfound"){
                searchbox.style.backgroundColor = red;
                // 見つからなくても検索ボックスにフォーカス
                searchbox.focus();
            }
            // 折り返し判定
            else if(findstatus.getAttribute("status")=="wrapped"){
                if(USE_WRAP=="false"){
                    if(e.button == 0){
                        gFindBar.onFindAgainCommand(true);
                    }else{
                        gFindBar.onFindAgainCommand(false);
                    }
                }
                searchbox.style.backgroundColor = green;
            }else{
                searchbox.style.backgroundColor = white;
            }
        }
        // ページ検索バーを表示するかどうか
        if(USE_FINDBAR == "true"){
            gFindBar.open();
        }else if(USE_FINDBAR == "false"){
            gFindBar.close();
        }
    }
    
    // 検索ボタン設定
    if(USE_FINDSEARCH == "true"){
        searchGoButton.removeAttribute("onclick");
        searchGoButton.setAttribute("oncontextmenu","return(false);");
        searchGoButton.addEventListener("click", function(e){ find_in_searchbar (e);}, false);
        searchbar.addEventListener("click", function(){searchbox.style.backgroundColor = white;}, true);
    }
    
    /*----- ハイライトボタンの生成 -----*/
    var sw = true;
    var str = "";
    // ハイライトオン,オフ関数
    function highlight_toggle() {
        var sel = searchbar.value;
        if(sel){
            gFindBar._findField.value = sel;
            gFindBar.toggleHighlight(false);                        // ハイライト初期化
            gFindBar.toggleHighlight(true);
            // 検索結果 notfound
            if(findstatus.getAttribute("status")=="notfound"){
                newButton.setAttribute("image",offHighlight);
                searchbox.style.backgroundColor = red;
                sw = false;
            }
            else if(sw){
                newButton.setAttribute("image",onHighlight);
                searchbox.style.backgroundColor = white;
            }else if(!sw){
                if(str == sel){
                    gFindBar.toggleHighlight(false);
                    newButton.setAttribute("image",offHighlight);
                    //sw = false;
                }else{
                    sw = !sw;
                    newButton.setAttribute("image",onHighlight);
                    searchbox.style.backgroundColor = white;
                }
            }
            sw = !sw;
        }
        else{
            sw = "false";
            newButton.setAttribute("image",offHighlight);
            gFindBar.toggleHighlight(false);
        }
        str = sel;
        // ページ検索バーを表示するかどうか
        if(USE_FINDBAR == "true"){
            gFindBar.open();
        }else if(USE_FINDBAR == "false"){
            gFindBar.close();
        }

    }
    // ハイライトボタン設定
    var newButton = document.createElement("toolbarbutton");
    newButton.setAttribute("label", "u3059u3079u3066u5f37u8abfu8868u793a");
    // ツールチップテキストは検索バーと同じ「すべて強調表示」
    newButton.setAttribute("tooltiptext", "u3059u3079u3066u5f37u8abfu8868u793a");
    newButton.setAttribute("id", "toggle-all-highlight");
    newButton.addEventListener("click", highlight_toggle, false);
    newButton.setAttribute("oncontextmenu","return(false);");
    newButton.setAttribute("image",offHighlight);
    // ボタンのマージンとかの設定
    newButton.style.cssText = 'display: none; margin: -6px 0px;';
    // 検索ボックス内にボタン表示する場合は背景色透過も
    //newButton.style.cssText = 'display: none; margin: 0px -2px; background-color: transparent !important';
    if(USE_HIGHLIGHTBUTTON == "true"){
        searchbar.parentNode.insertBefore(newButton, searchbar.nextSibling);
        // 検索ボックス内にボタン表示
        // searchGoButton.parentNode.insertBefore(newButton, searchGoButton.nextSibling);
        // 検索ボックスの左側にボタン表示
        // searchbar.parentNode.insertBefore(newButton, searchbar);

    }

    // 検索ボックスのCtrl+Enterでもページ内検索(次へ)
    //               Ctrl+Shift+Enterでもページ内検索(前へ)
    //               Ctrl+Hでハイライト切り替え
    // ついでに検索バーと同じようにAlt+Nで次、Alt+Pで前も使えるようにしておく
    searchbox.addEventListener('keydown', function(e) {
        // keyCode: 13=Enter, 72=h, 78=n, 80=p
        if ((e.ctrlKey && e.keyCode == 13) || (e.altKey && (e.keyCode == 78 || e.keyCode == 80))) {
            // suggestが出てる場合があるのでページ内検索実行時は消す
            searchbox.blur();
            searchbox.focus();

            find_in_searchbar(e);

            e.stopPropagation();
            e.preventDefault();
        } else if (e.ctrlKey && e.keyCode == 72) {
            highlight_toggle();
            e.stopPropagation();
            e.preventDefault();
        }
        if (!e.ctrlKey && e.keyCode == 13) {
            // ページ内検索を使用しない場合ハイライトボタンは不要なので非表示にする
            newButton.style.display = 'none';
            // ページ内検索して背景色変わってるかもしれないので戻す
            searchbox.style.backgroundColor = white;
        }
    }, false);
    searchbox.addEventListener('keyup', function(e) {
        if (searchbar.value == '') {
            // 検索ボックスのテキストが空なら背景色戻す
            searchbox.style.backgroundColor = white;
        }
    }, false);
})();

コメントを残す

メールアドレスが公開されることはありません。