スポンサーサイト
投稿日時 : -------- --:--
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
-------- --:-- | スポンサー広告
Firefoxの右クリックメニューからSleipnirで開く
投稿日時 : 2008-09-21 23:11
 このあたりを参考にuserChrome.jsを導入。この解説の中で右クリックメニューから現在開いているページをIEで開く「LaunchIE」が紹介されていたが、同じTridentエンジンならSleipnirで開きたいのでLaunchIE.uc.jsをちょこっと改造してLaunchPnir.uc.jsを作ってみた。userChrome.jsとSub-Script/XUL Loaderなどのサブスクリプトローダの導入が完了していることが前提です。
 

■LaunchPnir.uc.jsのダウンロード

 

■sleipnir.exeのパスの設定

 ダウンロードしたらsleipnir.exeのパスをソース内5行目の「Sleipnir_Path: ""」のところに記述してください。円マーク(バックスラッシュ)はエスケープすることに注意。
/* :::::::: LaunchPnir (cf. IE View) ::::::::::::::: */

var LaunchPnir = {
	//input the path of sleipnir.exe
	Sleipnir_Path: "",
(省略)
たとえばこんな感じになります。
/* :::::::: LaunchPnir (cf. IE View) ::::::::::::::: */

var LaunchPnir = {
	//input the path of sleipnir.exe
	Sleipnir_Path: "C:\\Program Files\\Sleipnir\\bin\\Sleipnir.exe",
(省略)
 同じような要領で他のプログラムのパスを指定すればSleipnir以外のものでもURLを渡して起動することができます。
 

■コンテキストメニューの表示名に日本語を使う

 デフォルトではコンテキストメニュー(右クリックメニュー)には「LaunchPnir」と表示されますが、これを「Sleipnirで開く」と日本語で表示したい場合は以下の箇所を
(省略)
	init: function()
	{
		this.mItem = document.createElement("menuitem");
		this.mItem.setAttribute("label", "LaunchPnir");
(省略)
こんな感じにします。
(省略)
	init: function()
	{
		this.mItem = document.createElement("menuitem");
		this.mItem.setAttribute("label", "Sleipnir\u3067\u958B\u304F");
(省略)
日本語をそのまま書くと文字化けするのでUnicodeエスケープしたものを記述します。  

■chromeフォルダに移動

 編集が終わったらchromeフォルダに移動させてください。chromeフォルダのパスは環境によって異なりますがだいたい以下のような感じじゃないかと。
C:\Documents and Settings\[ユーザ名]\Application Data\Mozilla\Firefox\Profiles\[ランダムな英数字].default\chrome\LaunchPnir.uc.js
 

■右クリックメニューからLaunchPnirを選択

 Firefoxを再起動させて適当なページを開いたら右クリックメニューから「LaunchPnir」を選択して下さい。
LaunchPnri demo
 
現在Firefoxで開いているページがSleipnirで開いたハズです。
 
メニューを日本語化した場合は以下のような感じになっているかと。
 LaunchPnir Japanese menu
 
 
スポンサーサイト
2008-09-21 23:11 | Javascript | Comment(8) | Trackback(0)
Comment
どうも上手くSleipnirで開いてくれなくて、
Sleipnirのパスの書き方がおかしいのかなと思ったのですが、
以下の書き方で合ってますでしょうか。

C:/Program Files/Sleipnir/bin/Sleipnir.exe
- 2008/10/01(水) 00:02:36) 編集

あ、違いますね。こうですね
Sleipnir_Path: "C:\\Program Files\\Sleipnir\\bin\\Sleipnir.exe",

ちょっと説明が足りなかった気もしていたので具体例を載せておくことにします。


itmst 2008/10/01(水) 02:36:51) 編集

愛用させていただいてます。

ちょっとお尋ねしたいのですが、launchPnirをインストールすると
launchPnirのメニューが右クリックメニューの一番下に表示されるのですが、
このメニューの表示位置を変更するということは可能でしょうか?

具体的には、"viewcache-menu-group"というIDをもつメニュー項目の一つ上に表示されるようにしたいのですが。

Menu Editorというメニューの順番を並び換えられるアドオンも使用してみたのですが、
アドオンのオプションの画面にlaunchPnirの項目が表示されないため、表示位置は変えられませんでした。
seyron 2009/08/22(土) 14:39:41) 編集

seyron さん、こんにちは。ご愛用ありがとうございます。

関数 onPopupShowing の1行目で右クリックメニューのどの位置に「Sleipnirで開く」を挿入するかを指定しています。ソース通りの書き方だと読みにくい上に改造しにくいのでちょっと書き換えると、

aPopup.insertBefore(this.mItem, document.getElementById(gContextMenu.onLink ? "context-sep-open" : "context-sep-stop" ));

となります。
このとき、右クリックした場所がリンクだった場合に「Sleipnirで開く」メニューは context-sep-open のIDを持つ要素の直前に挿入されます。右クリックした場所がリンクではない場合は context-sep-stop の直前に挿入されます。

これらを目的の viewcache-menu-group に書き換えるといけるハズですが、リンクを右クリックしたときとリンクでない場所を右クリックした場合でメニューの構成が変わるので viewcache-menu-groupがいずれの場合でも存在していることを確認してください。

また、viewcache-menu-group がアドオンやその他のスクリプトで動的に挿入されている場合、このLaunchPnirを実行した時点で存在していない可能性もあります。
以下のような感じのコードを関数 onPopupShowing 内に入れると確認できるかと思います。

var obj = aPopup.getElementsByTagName("menuitem");
for(var i=0, ids=""; i<obj.length; i++){if(obj[i].id){ids += obj[i].id + ",";}}
alert(ids);

>アドオンのオプションの画面にlaunchPnirの項目が表示されない
これはLaunchPnir(Launch IE)が右クリックしたときに初めてメニューを挿入するという動作だからです。

itmst 2009/08/22(土) 18:58:06) 編集

非常に丁寧な回答をいただき、どうもありがとうございます。

ですが、イマイチうまくいきません・・・。

aPopup.insertBefore(this.mItem, document.getElementById(gContextMenu.onLink ? "context-sep-open" : "context-sep-stop" )); のcontext-sep-openとcontext-sep-stopをviewcache-menu-groupに書き換えたのですが、メニューの表示位置は変えられませんでした。


var obj = aPopup.getElementsByTagName("menuitem");
for(var i=0, ids=""; i<obj.length; i++){if(obj[i].id){ids += obj[i].id + ",";}}
alert(ids);

以上のコードですが、これはonPopupShowing内の、以下のコードの前か後ろにそのまま挿入すればいいのでしょうか?

aPopup.insertBefore(this.mItem, document.getElementById(gContextMenu.onLink ? "viewcache-menu-group" : "viewcache-menu-group" ));
this.mItem.setAttribute("oncommand", "LaunchIE.launch(" + ContextMenu.onLink)?"gContextMenu.linkURI":"gBrowser.currentURI") + ");");
this.mItem.hidden = !gContextMenu.onLink && (gContextMenu.isTextSelected || gContextMenu.onImage || ntextMenu.onTextInput);
this.mItem.setAttribute("disabled", this.mItem.hidden || !this.isSupported((gContextMenu.onLink)?gContextMenu.linkURI:gBrowser.currentURI));

試みに前後にそのまま挿入してみましたが、やはりメニューの表示位置は変わらず、その上Webページ上で右クリックメニューを開くたびに[JavaScript アプリケーション]というタイトルで以下の内容のダイアログが表示されてしまうようになりました。

context-cut,context-copy,context-paste,spell-no-suggestions,context-bookmarklink,context-savelink,tm-openinverselink,context-saveimage,context-bookmarkpage,viewcache-menu-0,viewcache-menu-1


launchPnirのメニューの直下に表示させたいメニューはスクリプトによって生成されるメニューですので、素人考えでスクリプトの読み込みの順番を変えてみたらうまくいくのではと思い、chromeフォルダのlaunchpnir.uc.jsのファイル名の前に"zzz-"を付けてみたりもしたのですが、やはりというか、うまくはいきませんでした。
seyron 2009/08/23(日) 13:27:28) 編集

>ダイアログが表示されてしまうようになりました。
ちょっと説明が足りなかったようですね。
ダイアログが表示されるようになったのは
 
var obj = aPopup.getElementsByTagName("menuitem");
for(var i=0, ids=""; i<obj.length; i++){if(obj[i].id){ids += obj[i].id + ",";}}
alert(ids);
 
のコードを入れたからで、意図通りの動作です。書き加えた位置も問題なさそうです。
ダイアログ内に表示されていたのは以下ですべてでしょうか?
 
context-cut,context-copy,context-paste,spell-no-suggestions,context-bookmarklink,context-savelink,tm-openinverselink,context-saveimage,context-bookmarkpage,viewcache-menu-0,viewcache-menu-1
 
これらは右クリックした時点でメニュー内に存在しているアイテムのIDがカンマ区切りですべて表示されています。この中に目的のID「viewcache-menu-group」が見当たらないので、LaunchPnirが実行された時点では「viewcache-menu-group」が存在しないということです。そのためメニューを挿入する位置を決めることができず最後尾に追加されているものと思われます。
 
ですので上記ID一覧の中から、挿入位置の目安になるIDを選択するしかありません。
 
aPopup.insertBefore(this.mItem, document.getElementById(gContextMenu.onLink ? "context-bookmarklink" : "viewcache-menu-1" ));
 
などとしてみてください(↑適当です)。
追加した以下のコードはID一覧を確認するためだけのものですので、思い通りの位置に挿入できるようになったなら削除してかまいません。
 
var obj = aPopup.getElementsByTagName("menuitem");
for(var i=0, ids=""; i<obj.length; i++){if(obj[i].id){ids += obj[i].id + ",";}}
alert(ids);

 
itmst 2009/08/23(日) 14:48:58) 編集

教えていただいた通りに再度コードを書き換えてみたところ、今度は希望通りの位置にメニューを挿入できました!

何も分かっていないド素人の質問にも関わらず、非常に丁寧な回答で辛抱強く付き合っていただき、大変感謝しております。

どうもありがとうございました。
seyron 2009/08/23(日) 16:43:47) 編集

いえいえそんな。力になれてよかったです。
これからもいろいろチャレンジしてください。
itmst 2009/08/23(日) 16:58:51) 編集

コメントを書く
#

管理者にだけ表示
Trackback
Trackbak URL:http://itmst.blog71.fc2.com/tb.php/144-70cd669a
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。