meta 要素の name 属性値 keywords の内容を、記事単体表示の場合には可変にしてみました。ある種実験的な試みなので、内容にはまったく影響ありません…('A`)
バグ発覚…直ちに修正…('A`) みっともない PHP エラーを御覧になった方、ごめんなさい…('A`)
Firefox はサーチプラグインによって、検索バーに検索エンジンを容易に追加できます。このサーチプラグインの仕様は Firefox 独自の MozSearch と、IE など他のブラウザでも使用できる OpenSearch の二つの形式をサポートしています
詳細な資料は MDC の Creating OpenSearch plugins for Firefox - MDC と Creating MozSearch plugins - MDC です。後者の MozSearch は Mozilla プロジェクトのみの仕様なので、非標準となっています
実際に自分で OpenSearch プラグインを作成して見ようと色々と試してみて、解った事
で、MDC の資料を見ながら、実際にこのサイト用の検索プラグインを作って、検索プラグインの自動検出もできる様にしてみました…ついでに、検索部分のテンプレート多少手直し…
検索プラグインを作成する際に、いちいちエディタを起動して…なんてめんどくさいので、OpenSearch maker なるものを作ってみました。右のコンテンツメニューからもアクセスできます
HTTP リクエストのメソッドが POST のサイトの場合、Proxomitron 1 などを使っていくつか検索プラグインを作ってみました。名前を付けてリンク先を保存(K)... でダウンロードしてください
Firefox 3 のロケーションバーにマルチバイト文字を入力して、サイトにアクセスすると正しく URL が渡らない。検索エンジンなどで使用すると、一部の検索エンジンで入力した文字列が正しくサイト側に伝わらず文字化けしてしまうという問題が…('A`)
ロケーションバーを見ると、何やら URL がエンコードされている様です…この件で検索してみると、やっぱり同じような問題が見つかりました。about:config の network.standard-url.encode-query-utf8 の値を true に変更する事で問題が解決しました
user_pref("network.standard-url.encode-query-utf8", true);
ところが、この問題は半分解決したといった方がいいでしょう。何故なら、この設定はサイト側の URL エンコード処理が UTF-8 の場合しか効果がありません。例えば 緑のgoo に以下の様に文字列を渡してやると、やはり文字化けします 1
http://green.search.goo.ne.jp/search?MT=漢字入力ですよ
入力エンコード指定の URL パラメーターにて、以下の様にエンコードを指定してやれば 緑のgoo に関しては、解決です
http://green.search.goo.ne.jp/search?MT=漢字入力ですよ&IE=UTF-8
サイト側でこの問題を解決する方法もあります。URL パラメーターとして入力された文字列をサイト側で処理すべき文字エンコードに変換してやればいいのです。以下の例は PHP の例です 2
- foreach ( $_GET as $key => $value ) {
- echo '1 key: ' . $key . ' value: ' . $value . "<br />\n";
- echo '2 key: ' . mb_convert_encoding( $key, 'UTF-8', 'UTF-8,SJIS,EUC-JP' ) . ' value: ' . mb_convert_encoding( $value, 'UTF-8', 'UTF-8,SJIS,EUC-JP' ) . "<br />\n";
- }
他の UA でも試してみましたが、Opear, IE6 は駄目でした。特に Opera 3 は酷く、ロケーションバーにマルチバイト文字を入力してエンターキーを押すと URL エンコードどころか、激しく文字化けし、4 しかもその文字化けしたデータをそのまま URL としてサイトにアクセスします。なので、サイト側で解決しても駄目です
どうも、この問題は思っていたほど根が深いようです。時間がある時に調べてみたいと思います
WordPress の記事内に PHP コードを記述し、実行するプラグインがないかと検索してみました。Exec-PHP と runPHP の二つのプラグインが見つかりました
取り敢えず、後者の runPHP をインストール、ダッシュボードのプラグイン設定にて使用するように設定し、echo 文だけの PHP コードを記事に書き込み、投稿、閲覧しても何故か実行されません 1 次に前者の Exec-PHP をインストールし、同じようにテスト用の記事を閲覧するとこちらの方のプラグインは実行されました
このプラグインを入れておくだけでは面白くないので The people sending SPAM なるページを作って見ました。このページは WordPress に最初から同梱されているスパムブロッカーのプラグイン Akismet がスパムと判断したコメントの投稿者の IP アドレスを閲覧できるようにしたものです 2
Firefox 3 において keyconfig アドオンを使用してのショートカットキーの割り当てです。私は合わせて functions for keyconfig も使用しています
通常、新しいウィンドウにページのソースが表示されてしまいますが、それを新しいタブ内に表示するように変更
- var sourceURL = 'view-source:' + content.document.location.href;
- gBrowser.selectedTab = gBrowser.addTab( sourceURL );
なぜか CTRL + I を押しても、サイドバーにブックマークが表示されてしまうので、ページ情報ダイアログを表示するように変更
- BrowserPageInfo();
ファンクションキーでタブの切り替えを行いたいので変更
- gBrowser.mTabContainer.advanceSelectedTab(-1,true);
ファンクションキーでタブの切り替えを行いたいので変更
- gBrowser.mTabContainer.advanceSelectedTab(+1,true);
現在表示しているページの URL をクリップボードにコピーします
- var w = window._content;
- var d = w.document;
- var txt = d.location.href;
- const CLIPBOARD = Components.classes["@mozilla.org/widget/clipboardhelper;1"].getService(Components.interfaces.nsIClipboardHelper);
- CLIPBOARD.copyString(txt);
現在表示しているページのタイトルをクリップボードにコピーします
- var w = window._content;
- var d = w.document;
- var txt = d.title;
- const CLIPBOARD = Components.classes["@mozilla.org/widget/clipboardhelper;1"].getService(Components.interfaces.nsIClipboardHelper);
- CLIPBOARD.copyString(txt);
現在表示しているページの URL とタイトル等の情報を元に HTML のアンカー要素を生成し、クリップボードにコピーします。本サイトのアンカー要素の生成はコレで行っています
- var w = window._content;
- var d = w.document;
- /* var l = d.documentElement.attributes[0].value; */
- var l = '';
- var txt = '<a target="_blank" hreflang="' + l + '" href="' + d.location.href + '" title="' + d.title + '">' + d.title + '</a>';
- const CLIPBOARD = Components.classes["@mozilla.org/widget/clipboardhelper;1"].getService(Components.interfaces.nsIClipboardHelper);
- CLIPBOARD.copyString(txt);
3行目がコメントになってますが、ページの言語情報がページによってはうまく取得できないで、ここだけは手入力してます…('A`)
検索バーのサーチエンジンをキーボードの入力フォーカスを移す事なく切り替えます。トップの場合は最後の検索エンジンに切り替えます
- var search = document.getElementById("searchbar");
- var newIndex = search.engines.indexOf(search.currentEngine);
- if ( --newIndex < 0 ) newIndex = search.engines.length-1;
- search.currentEngine = search.engines[newIndex];
検索バーのサーチエンジンをキーボードの入力フォーカスを移す事なく切り替えます。最後の場合はトップの検索エンジンに切り替えます
- var search = document.getElementById("searchbar");
- var newIndex = search.engines.indexOf(search.currentEngine);
- if ( ++newIndex >= search.engines.length ) newIndex = 0;
- search.currentEngine = search.engines[newIndex];
前述の 検索バー切り替え↑ と 検索バー切り替え↓ と合わせて使うととても便利です
- var sel = window._content.getSelection( );
- var s = '';
- if ( !sel.rangeCount || sel.getRangeAt(0) == '' ) return ;
- for ( i = 0; i < sel.rangeCount; ++i ) {
- s += sel.getRangeAt(i).toString().replace( /^\s+|\s+$/g, '' ) + ' ';
- }
- s = s.replace(/[\+\s]+$/g,'');
- document.getElementById( "searchbar" ).doSearch(s, 'tab');
選択文字列(複数対応) を検索エンジン(googleの場合) で検索し、ページを新しいタブに表示します。14 行目を変更する事によって、他の検索エンジンや検索エンジンへ渡す URL パラメーターを変更できます
- var win = window._content;
- var doc = win.document;
- var sel = win.getSelection( );
- var s = '';
- var sURL = '';
- if ( !sel.rangeCount || sel.getRangeAt(0) == '' ) {
- return ;
- }
- for ( i = 0; i < sel.rangeCount; ++i ) {
- stmp = sel.getRangeAt(i).toString().replace( /^\s+|\s+$/g, '' );
- s += (encodeURIComponent(stmp) + '+').toString().replace(/%20/g,'+');
- }
- s = s.replace(/\++$/g,'');
- sURL = 'http://www.google.co.jp/search?q=' + s + '&lr=lang_ja&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:ja:official&client=firefox-a';
- gBrowser.selectedTab = gBrowser.addTab( sURL );
選択文字列の中に空白が含まれている場合のバグを修正 (11行目)
選択文字列(複数対応) を検索バーの入力ボックスへセットします
- var win = window._content;
- var doc = win.document;
- var sel = win.getSelection( );
- var s = '';
- if ( !sel.rangeCount || sel.getRangeAt(0) == '' ) {
- return ;
- }
- for ( i = 0; i < sel.rangeCount; ++i ) {
- s += sel.getRangeAt(i) + ' ';
- }
- document.getElementById("searchbar").value = s.replace(/^\s+|\s+$/g,'');
検索バーをクリアします
- document.getElementById("searchbar").value = "";
Firefox を再起動します
- const nsIAppStartup = Components.interfaces.nsIAppStartup;
- var os = Components.classes["@mozilla.org/observer-service;1"].getService(Components.interfaces.nsIObserverService);
- var cancelQuit = Components.classes["@mozilla.org/supports-PRBool;1"].createInstance(Components.interfaces.nsISupportsPRBool);
- os.notifyObservers(cancelQuit, "quit-application-requested", null);
- if (cancelQuit.data) return;
- Components.classes["@mozilla.org/toolkit/app-startup;1"].getService(nsIAppStartup).quit(nsIAppStartup.eRestart | nsIAppStartup.eAttemptQuit);
再起動時に終了時の状態復元が必要なければ、2~5行目は不要です