参照:V2C 使用法 外部コマンド:スクリプト
V2Cにはスクリプトと、System系スクリプトがあり次の違いがあります。
スクリプトは様々な理由からエラーの発生や不具合が生じる可能性があります。スクリプトFAQを参考にしてください。
自分で修正できない人は、どのスクリプトでエラーが出るかをエラーメッセージも添えてスクリプトスレに報告してください。
(エラーメッセージはメニューの「表示」→「最後のエラーメッセージ」から取得できます。)
誰かが修正してくれるかもしれません。
また、自分で修正できる方はスクリプトスレで修正版を公開していただけると助かります。
参照:V2C 使用法 外部コマンド設定
ここではスクリプトのひとつ、tree.jsを例に解説します。
【登録場所】に従って登録した場所から、スクリプトを実行することができます。具体的な使用場所については、外部コマンドを参照してください。
レスが表示されてる上(レス番の上ではないので注意!)で右クリックしてください。ポップアップメニューに自分が付けたラベル名(上記設定の通りであれば「被参照レスでツリー表示」)が追加されてるはずです。それクリックすると、右クリックした場所のレスに対するツリーが表示されます。なお、被参照レスでない場合は表示されません。
いちいち右クリック→選択という操作が面倒だという場合は、マウスジェスチャに登録することもできます。上のスクリプト設定のときにIDを設定しておくと、マウスジェスチャのレス表示のトコに追加されてるはずです。([10] レス表示 みたいな感じ)それを設定してやればマウスジェスチャで起動できます。
ツールバーボタンのボタン登録領域を右クリック、もしくはお気に入りのフォルダを右クリックから「コマンドの登録…」で登録できます。
これらからのみ使用可能な専用スクリプト(スレッド一覧表示可能な拡張検索)もあります.
(T20100813からURLExec.dat経由でも使用できるようになりました。詳細は「マウスオーバー」から)
このtree.jsは、動的にHTMLを作ってそれをV2Cがポップアップで表示してるだけなので、中をいじれば自分の好きなようにレイアウトを変えられます。スクリプトはただのテキストファイルなので、tree.jsをUTF-8で開けるテキストエディタで開いて書き換えればOK。
例えば、tree.jsの下のほうにあるCSSの設定の下記の行で、x-smallをmediumにすると文字が大きくなります。
body{margin:5px 0 5px 5px; font-size: x-small;}
通常、スクリプトでのポップアップはクリックしないと閉じませんが、R20101119よりマウス移動だけで閉じる事が可能となりました。
ただし、スクリプト内に専用の設定を記述する必要があります。(少なくとも2010/11/19以前にリリースされたスクリプトは設定されていないはず)
自分で設定し直す場合は以下のようにすれば有効にできます。
// 適用したいスクリプトをテキストエディタ(文字コードはUTF-8)で開いて v2c.context.setDefaultCloseOnMouseExit(true);// を先頭行に追加し、保存する。
通常は上記で問題ないですが、各ポップアップ毎に設定を変えたい場合は下記のようにしてください。
// 適用したいスクリプトをテキストエディタ(文字コードはUTF-8)で開いて setPopupText(***)// か setPopupHTML(***)// という行を探して(***は何かしらの文字列)、その真下に v2c.context.setCloseOnMouseExit(true); //という行を追加し、保存する。
// 適用したいスクリプトをテキストエディタ(文字コードはUTF-8)で開いて setPopupText(***)// か setPopupHTML(***)// という行を探して(***は何かしらの文字列)、その真下に v2c.context.setPopupFocusable(true);// という行を追加し、保存する。
選択文字列に対する右クリックメニューはコピーと外部コマンド以外の選択メニューは出ません。
また、コピペでは一部改行されない等の制限があります。
さらに、一部の外部コマンドはエラーが出て使用できない可能性があります(v2c.context.thread等がnullになるため)
ここではスクリプトのひとつ、rescheck.jsを使用した例として、1つのレスに複数のURLがある場合で行頭に連番を振る機能を解説します。
起動に成功すれば、所定の動作で条件が合えば機能が自動実行します。
更新して新着レスを取得するなどすれば、設定例だと、URLの行頭に番号が振られるはずです。
'/'または'\'を区切り文字として
サブフォルダ内のスクリプトファイルを指定することができます。
//scriptフォルダ内にtestという名前のフォルダを作りそこに格納する $SCRIPT test/example.js
パス区切り記号としての¥(バックスラッシュ)が1つしかない可能性があります。
WindowsのFirefoxで2chのHPを表示させる例: v2c.exec('"C:\\Program Files\\Mozilla Firefox\\firefox.exe" http://www.2ch.net/');
と言ったように、¥は2つ記述する必要があります。
パーミッションの設定が間違っている可能性が高いです。
下記の外部コマンド登録例でいうとFの部分です。
${SCRIPT:F} hoge.js
各スクリプトで指定する文字は異なります。
基本的にスクリプトファイル(~.js)の中に設定法が書いてあるはずなので、設定が間違っていないか確認して下さい。
マウスオーバーでスクリプトを起動するようにしている場合は、URLExec2.dat内の記述も間違っていないか確認して下さい。
post.js等のフォルダに保存するだけで適用されるシステム系スクリプトの場合は、「外部コマンド」→「スクリプト」タブからパーミッション設定を確認してください。
V2Cの最新機能の可能性があります。V2Cを更新してください。
テスト版の場合は更新チェックの対象にならないため本スレ,スクリプトスレで作者のレスを探してください。
スクリプトの修正が必要となります。
1.7.0_01(1.6.0_29)以降に採用されているRhinoが更新されたためecma-262 5th準拠となりホストオブジェクトは拡張禁止(常にObject.isExtensible()==true)となりました。
このためホストオブジェクトに新たなプロパティを追加するコードではエラーが発生し、部分修正が必要となります。
書きかけの項目です。加筆、訂正募集中。 |
Rhino1.7R3のバイトコードコンパイラにはバグがあって無限ループに陥ることがあるのでシステムプロパティrhino.opt.levelを変更してはいけません。
v2cparms.txtでauxargs=-Drhino.opt.level=<-1以外>とか絶対やらないように。
V2Cが返す値はJavaのオブジェクトであるためスクリプトから扱うにはjavascriptの型に変換する必要があります。
とくに文字列は注意が必要でswitch文では比較に==ではなく===が行われるためjavascriptの文字列とjavaの文字列はマッチしません。
switch(th.board.key){ case "software":// コレではマッチしない }
//java to javascript as type string var jsKey = String(th.board.key); switch(jsKey){ case "software":// javascriptの文字列ならマッチする }
配列もjavaの配列なのでいつものおまじないが必要。
#highlight(javascript){{
var refResIndex = Array.prototype.slice.call(res.refResIndex);}}
OpenJDKとmozillaの実装の差異についてはここを参照。
ただし、バージョンに関してOpenJDK版は1.7R3がリリースされる前にリポジトリから取ってきたようなのでリポジトリのタグ1.7R3やリリースされた配布物とは違います。
どのリビジョンかは不明ですがOpenJDKが利用しているソース以降のバグフィックスや機能追加、仕様変更などは反映されていません。
そのためデフォルトの言語バージョンは1.8ですがRhinoのjavascript1.8実装は段階的に行なわれているのでOpenJDKのRhinoでは利用できない言語機能が沢山あります。
1.7R3がリリースされて1年以上経つのでバグも沢山ありますが踏んじゃった場合自分で辿るしかありません。
どのリビジョンかは不明ですがOpenJDKが利用しているソース以降のバグフィックスや機能追加、仕様変更などは反映されていません。
これに関連してconst定義するとバインディングは行なわれ再定義も不可能ですが値が常にundefinedになります。
rhinoにはjavaと通信するためのLiveConnectという仕様があります。
Packagesという変数にjavaのパッケージが含まれているので"Packages." + FQCN(完全修飾クラス名)でjavaのクラスにアクセスできます。
よく使われるパッケージはトップレベルにすでに定義済みです。自分でインポートする場合はJavaImporterを使います。
importPackageやimportClassはトップレベルを汚染しメモリリークするので使用は控えましょう。
また、java beansプロパティに準拠したメソッドはプレフィックスset/getと関数呼び出しの括弧を省略し代入と参照の形で書くことが出来ます。
//自分でインポート var swingNameSpace = JavaImporter(Packages.javax.swing); //よく使われるパッケージは定義済み var f = new javax.swing.JFrame("test"); //自分でインポートしたパッケージを参照 var btn = new swingNameSpace.JButton(test); //beans property access f.visible f.visible = true;
LiveConnectではメソッド呼び出し時に期待される型が異なるとエラーになります。
メソッドのオーバーロードが存在する場合がそれにあたりますが、そのときは明示的にオーバーロードを解決する必要があります。
オーバーロードの明示的解決にはブランケット記法を用いてobj["メソッド名(シグネチャ)"]と書きます。
var f = new javax.swing.JFrame("test"); //シグネチャは完全に一致する必要がある f["setVisible(boolean)"](true)
LiveConnectの詳細な仕様はここ
javaの現行バージョンが7となったのでjava7前提の話。
また、同じスクリプトが何度も実行されるときキャッシュされている可能性があります。
OpenJDKのRhinoは1.7R4で入った最適化が入る前のバージョンなので最適化が入った部分を比べると2~5倍程度遅い。
そのうち特にV2Cに関わる部分は文字列操作やLiveConnect、ついで型変換や正規表現と多岐にわたります。ここら辺で上記の差が生まれます。
文字列を結合するときはjava.lang.StringBuilderを使うか配列に代入して最後にArray.prototype.joinすると早い。
var buff1 = new java.lang.StringBuilder(); //foo var buff2=[]; //bar buff1.toString(); buff2.join("");
ただし数千ループくらいなら結合演算子だろうがStringBuilderだろうが配列だろうが変わらない。