2011/07/02
メニューを拡張するスクリプト
Copy URL Lite+ を参考にメニューを拡張するスクリプトを書きました。
JS がよくわからなくてもそれなりに使えると思います。
説明が長くなりそうなので簡単に機能説明するとこんな感じです。
- ページ、タブ、ツール、Firefox Button にメニューを追加できる
- コピー、検索、URL を開く、外部アプリの起動ができる(JS を書けば何でもできる)
- 追加したメニューに自動的にアイコンが付く…かも
- リンクを対象にするメニューはリンク以外では自動で非表示になる
- メニュー、サブメニューが作り放題
- .uc.js を更新しやすいように設定は外部ファイル
サブメニューを足した時のスクリーンショット
DL はこちら
- addMenu.uc.js https://gist.github.com/1059720
- 設定ファイル(_addmenu.js) https://gist.github.com/1059721
使い方
- addMenu.uc.js を入れる
- Chrome フォルダに _addmenu.js を置く
以上。
設定ファイルはツールメニューから再読み込みできます。
メニューの追加
設定ファイルに用意された変数を使って書きます。
書式は Copy URL Lite+ とほぼ一緒です。*1
JS 書ける人はゴリゴリ書いても OK です。
// ページの右クリックメニューに追加 page({ label : "リンクのテキストを検索", text : "%LINK_TEXT%", keyword: "g", where : "tab" });
たったこれだけでメニューが追加でき、自動的に Google のアイコンが付き*2、リンク上でのみ表示され、実行するとリンクのテキストを Google で新しいタブで検索してくれます。
// 見ているページを IE で開く page({ label: "Internet Explorer で開く", text: "%u", exec: "C:\\Program Files\\Internet Explorer\\iexplore.exe", condition: "nolink" });
たったこれだけで IE 起動できます。
// タブの右クリックメニューに追加 tab({ label: "Favicon の URL をコピー", text: "%FAVICON%" });
たったこれだけでタブの右クリックメニューに Favicon をコピーするメニューができます。
ページやタブ以外に、ツールメニューや Firefox Button のメニューにも追加できます。
var mMenus = [ { //... }, { //... } ]; page(mMenus);
配列にしてから一度に追加することも出来ます。
Copy URL Lite+ のコマンドをそのまま持ってきても使えます。
サブメニューの追加
var pagesub = PageMenu({ label: "サブメニュー" }); pagesub({ label : "リンク先のソースを表示", url : "view-source:%l", where : "tab" });
たったこれだけでサブメニューができて、その中に "リンク先のソースを表示" メニューが出来ます。
簡単でしょ?これくらいなら JavaScript 書けなくても何とかなりますよね?
利用可能な変数
基本的に Copy URL Lite+ の変数はそのまま使えます。
大文字・小文字は区別しません。
%EOL% 改行(\r\n) %TITLE% ページタイトル %URL% URI %SEL% 選択範囲の文字列 %RLINK% リンクアンカー先の URL %IMAGE_URL% 画像の URL %IMAGE_ALT% 画像の alt 属性 %IMAGE_TITLE% 画像の title 属性 %LINK% リンクアンカー先の URL %LINK_TEXT% リンクのテキスト %RLINK_TEXT% リンクのテキスト %MEDIA_URL% メディアの URL %CLIPBOARD% クリップボードの内容 %FAVICON% Favicon の URL %EMAIL% リンク先の E-mail アドレス %HOST% ページのホスト(ドメイン) %LINK_HOST% リンクのホスト(ドメイン) %RLINK_HOST% リンクのホスト(ドメイン) %XXX_HTMLIFIED% HTML エンコードされた上記変数(XXX → TITLE などに読み替える) %XXX_HTML% HTML エンコードされた上記変数 %XXX_ENCODE% URI エンコードされた上記変数
簡易的な変数(↑を入力するのがダルい時)
%h ページのホスト(ドメイン) %i 画像の URL %l リンクの URL %m メディアの URL %p クリップボードの内容 %s 選択文字列 %t ページのタイトル %u ページの URL
使えるプロパティ
ここから中級編です。
page({ ... }) このオブジェクトのプロパティがそのままメニューの属性になります。
- exec
外部アプリを起動します。
パラメータは text プロパティを利用します。
アプリのアイコンが自動で付きます。
text プロパティがあればそれを利用して検索などをします。
検索エンジンなどのアイコンが自動で付きます。
- text(変数が利用可能)
クリップボードにコピーしたい文字列を指定します。(Copy URL Lite+ 互換)
keyword, exec があればそれらの補助に使われます。
- url(変数が利用可能)
開きたい URL を指定します。
内容によっては自動的にアイコンが付きます。
- where
keyword, url でのページの開き方を指定できます(current, tab, tabshifted, window)
省略するとブックマークのように左クリックと中クリックを使い分けられます。
- condition
メニューを表示する条件を指定します。(Copy URL Lite+ 互換)
省略すると url や text プロパティから自動的に表示/非表示が決まります。
select, link, mailto, image, media, input, noselect, nolink, nomailto, noimage, nomedia, noinput から組み合わせて使います。
※ページの右クリックメニュー以外では無効です。
- oncommand, command
これらがある時は condition 以外の特殊なプロパティは無視されます。
メニューの挿入位置
ここから上級編です(ぇ
前述のプロパティの他にメニューの位置を決めるプロパティがあります。
- insertBefore(指定した id の前に挿入)
- insertAfter (指定した id の後に挿入)
- position (指定した n 番目に挿入。最初に入れるなら "1")
XUL の overlay を真似ているのでわかる方にはすぐわかる仕様です。
insertBefore は id の複数指定に対応していなかったり、ファイルメニューなどに挿入できたりとちょっとぶっ飛んだ仕様です。
// ファイルメニューの終了の前に再起動メニューを追加 page({ label: "再起動", oncommand: "Application.restart();", insertBefore: "menu_FileQuitItem" });
こんな無茶も出来る
// Services を利用して検索エンジンの一欄を作る var search = new PageMenu({ label:"選択文字列を…", condition: "select" }); Services.search.getEngines().forEach(function(engine){ search({ label: engine.name + " で検索", keyword: engine.alias, text: "%s", src: engine.iconURI? engine.iconURI.spec : "" }); });
PageMenu({ label: "タブ一覧", position:"1", onpopupshowing: function(event) { var popup = event.target; Array.forEach(gBrowser.mTabs, function(tab){ var menuitem = document.createElement("menuitem"); menuitem.setAttribute("label", tab.getAttribute("label")); menuitem.setAttribute("src", tab.getAttribute("image")); menuitem.setAttribute("class", "menuitem-iconic"); menuitem.setAttribute("oncommand", "gBrowser.mTabContainer.selectedIndex = " + tab._tPos); if (tab.selected) menuitem.style.fontWeight = "bold"; popup.appendChild(menuitem); }); }, onpopuphidden: function(event) { var range = document.createRange(); range.selectNodeContents(event.target); range.deleteContents(); range.detach(); } });
作ってみて
あれもこれもできるように〜と思ったら結構大掛かりなスクリプトになっちゃって説明が足りてるかどうか分からない。。
どなたかサンプルや解説を書いてくれると助かるな〜とか言ってみる(ぇ
