V2C 使用法 [外部コマンド:スクリプト]

外部コマンドでRhino(イメージとしては、一般的なJavaScriptからWebブラウザに関係したオブジェクトを取り去ったもの)スクリプトを実行することができます。

v2.10.2 の変更点

・スレッドの履歴を取得できるようにした。

注意:履歴にスレッドが存在しない場合もlength0のArrayを返す。

・スレッドの新着境界位置を取得・設定できるようにした。

スレッドオブジェクトthに対して

・表示されている最初のレスのインデックスを取得・設定できるようにした。

スレッドオブジェクトthに対して

・自分の書き込みに自動で付くラベルを取得できるようにした。

スレッドオブジェクトthに対して

・自分の書き込みのインデックスを取得できるようにした。

スレッドオブジェクトthに対して

v2.10.1 の変更点

・レス表示タブを移動できるようにした。

・スレッドがどのカラムで開かれているかを取得できるようにした。

・HEADメソッドでHTTPのヘッダ情報を取得できるようにした。

v2c.createHttpRequest(u)で作成したオブジェクトhrに対して:

v2c.readURL()等でContent-Lengthが不明の場合のダウンロード上限を1MBから16MBに変更した。

v2.10.0 の変更点

・画像ダウンロードURLをスクリプトで変更できるようにした。

"V2C\iurlrpl.txt"(文字コードはUTF-8)に以下のフォーマットでURL変更スクリプトを登録してください。

[TAB]URLにマッチする正規表現[TAB]スクリプト指定

; some.uploader のURLを supld.js で変更する例
	http://some\.uploader/\w+	$SCRIPT supld.js

URL変更用スクリプト(文字コードはUTF-8)ではcheckURL(u,cx)を定義してください。

・板のスレ一覧(subject.txt)を変更できるようにした。

"V2C\script\system\subject.js"(文字コードはUTF-8)でcheckSubject(ss,bd,cx)を定義してください。

・スクリプトの設定や状態保存用のファイルパスを生成できるようにした。

v2.9.3 の変更点

・短縮URLを展開できるようにした。

・一部の設定ファイルを再読み込みできるようにした。

・システム系スクリプトを再読み込みできるようにした。

v2c.context.setPostMessage(s)をレスポップアップからも実行できるようにした。

v2c.context.insertToPostMessage(s),v2c.context.setFilteredRes(lr),v2c.context.setFilteredResIndex(li)もレスポップアップから実行可能です。

v2.9.2 の変更点

・URLによってProxyを変更できるようにした。

"V2C\script\system\proxy.js"(文字コードはUTF-8)でcheckProxy(u,p)を定義してください。

注意:

・「全体」に登録されたスクリプトのv2c.context.resは選択レスを返すように変更した。

これまではレス表示欄の一番上に表示されているレスを返していました。選択レスはレス表示設定「一般」タブ「表示」枠内の「選択レスを表示」をチェックすると、レス右側の赤色の線で表示されます。

・書き込み欄本文等の入力欄オブジェクトtcを文字列に変換する時にはtc.textを返すようにした。

v2.9.0 の変更点

・レス表示タブの非表示を再チェックできるようにした。

v2c.resPaneで取得できるレスペインオブジェクトrpに対して

res.addNGID(*)で非表示の再チェックを実行しないようにした。

非表示の再チェックが必要な場合はrp.checkNG(bd)を使用してください。

・ID文字列を板のNGIDに追加できるようにした。

板オブジェクトbdに対して

・2chのBBSオブジェクトを取得できるようにした。

・2chで板キーから板オブジェクトを取得できるようにした。

BBSオブジェクトbbsに対して:

・URLからスのスレッドオブジェクト取得を改善した。

・レスが透明非表示かどうかを取得できるようにした。

レスオブジェクトresに対して

v2.8.0 の変更点

・お気に入り関連の機能を追加した。

v2c.favoritesが返すオブジェクトfvsによってお気に入り全体に関する操作をすることができます。

お気に入りタブオブジェクトfavに対して:

fav.appendItem(f,o), fav.insertItem(f,o,i), fav.removeItem(o)oにはお気に入りアイテム・板・スレッドオブジェクトを使用できます。

fav.removeAll()以下の関数を使用するスクリプトにはお気に入り変更の許可が必要です。(${SCRIPT:Vf}

お気に入りアイテムオブジェクトoに対して:

・V2Cに登録されていない板のURLから板オブジェクトを作成できるようにした。

・板オブジェクトとスレッドキーから未取得のスレッドオブジェクトを作成できるようにした。

・datインポート関連の機能追加

th.importDatFile(f),th.importDatBytes(bl)に引数を追加しました。

datからスレタイを取得できなかった場合にn(デフォルトはnull)がスレタイになり、o(デフォルトはtrue)がfalseの場合にはスレッドをレス表示欄で開きません。

・V2Cのオンライン状態を取得できるようにした。

・実行中のスレッドに中断要求が出ているかどうかを取得できるようにした。

・スクリプトによってスレ一覧に表示するスレッドを決められるようにした。

お気に入り・ツールバーにスクリプトを外部コマンドとして登録し、「アクション」に「スレ一覧で開く」を選択してください。コマンドを実行するとまずスクリプトが実行され、その後スクリプト内で関数getThreads(cx)が定義されている場合にはgetThreads(cx)が呼ばれます。

この機能の目的としては「ログから検索」や「Web検索」の拡張を想定しています。

ツールバーに登録したスレ一覧用スクリプトボタンのポップアップメニューから「定期更新チェック」を選択すると15分間隔で定期更新を開始します。定期更新中はコマンドボタンの文字が青色になり、更新結果に新規スレッドが存在するとボタンの文字が赤色になり定期更新を停止します。定期更新は更新回数が400回に達するか3回連続でエラーになっても停止します。

anago.2ch.netのソフトウェア板の過去ログ倉庫のスレッドをまとめて表示する例:

function getThreads(cx) {
  if (!v2c.online) {
    cx.skip = true;
    return null;
  }
  var sb='http://anago.2ch.net/software/';
  var bd=v2c.getBoard(sb);
  if (!bd) {
    cx.message = '板オブジェクトの取得に失敗';
    return null;
  }
  var su=sb+'kako/';
  var sk=v2c.readURL(su);
  if (v2c.interrupted) {
    return null;
  }
  if (!sk) {
    cx.message = su+'の取得に失敗';
    return null;
  }
  var thl=[],sul=[];
  var res=new RegExp('<A HREF="(o\\d+/subject.txt)">','gi');
  var rs;
  while (rs=res.exec(sk)) {
    sul.push(rs[1]);
  }
  cx.maxProgress = sul.length;
  for (var i=0; i<sul.length; i++) {
    var ss=v2c.readURL(su+sul[i]);
    if (v2c.interrupted) {
      return null;
    }
    if (!ss) {
      cx.message = su+sul[i]+'の取得に失敗';
      return null;
    }
    cx.progress = i+1;
    var ret=new RegExp('^(\\d+)\\.dat<>(.+) \\((\\d+)\\)$','gm');
    var rt;
    while (rt=ret.exec(ss)) {
      var st=rt[2].replace(/&lt;/g,'<').replace(/&gt;/g,'>').replace(/&amp;/g,'&');
      var th=bd.getThread(rt[1],sb,st,rt[3]);
      if (th) {
        thl.push(th);
      }
    }
  }
  return thl;
}
・スレッドに他のスレッドのプロパティをインポートできるようにした。

スレッドオブジェクトthに対して

th.updateAndWait()の動作を改善した。

レス表示欄の状態によっては更新しないことがあった問題を改善しました。

v2.7.3 の変更点

・[JRE7u1,6u29] スクリプトのパーミッション設定が無視される問題に対処した。

v2.7.2 の変更点

・レス指定の非表示ができるようにした。

レスオブジェクトresに対して

注意:rescheck.jsでは使用できません。

・IDをNGIDに追加・削除できるようにした。

レスオブジェクトresに対して

注意:4文字以下のIDはNGIDに追加できません。またrescheck.jsでは使用できません。

v2.7.0 の変更点

・[Win] スクリプトからV2Cを終了・再起動できるようにした。

これらの関数の実行にはスクリプトにV2C終了の許可が必要です。(${SCRIPT:Rx}

・スレッドを更新した後更新完了まで待つことができるようにした。

・システム系スクリプトの実行パーミッションを設定できるようにした。

「設定」メニュー「外部コマンド…」の「スクリプト」タブで rescheck.js 等のシステム系スクリプトの実行パーミッションを設定することができます。右側の入力欄に左側のスクリプトに許可するパーミッション(外部コマンドにスクリプトを登録する時に指定する文字列と同じ)を入力してください。

v2.6.0 の変更点

・レスに関して取得できる情報を追加した。

レスオブジェクトresに対して:

resがTweetでない場合、res.retweet以下の関数はnullまたはfalseを返します。

・レス表示欄のカラムオブジェクトを取得できるようにした。

レス表示欄オブジェクトをrpとして:

カラムオブジェクトcolに対してはレス表示欄と同様の以下の関数が使用可能:

・特定のレス表示欄カラムでスレッドを開くことができるようにした。

レス表示欄カラムオブジェクト col に対して:

・スクリプトの実行終了後次回のスクリプト実行までオブジェクトを記憶できるようにした。

以下の関数はスクリプトファイルのパスに関連付けられており、スクリプトの内容を変更してもスクリプトのパスを変更しない限り同じオブジェクトを参照することができます。オブジェクトが記憶されるのはV2Cが終了するまでの間です。

スクリプトの実行回数を表示する例:

var i=v2c.getScriptObject();
if (i) {
  i++;
} else {
  i = new Number(1);
}
v2c.setScriptObject(i);
v2c.alert(i+' 回目の実行');
・文字列をキーとしてオブジェクトを記憶できるようにした。

全てのスクリプトから同一キーsに対して同一のオブジェクトが参照されます。オブジェクトが記憶されるのはV2Cが終了するまでの間です。

・レスが名無しかどうかを設定できるようにした。

"V2C\script\system\rescheck.js"(文字コードはUTF-8)のcheckRawText(res,cx)内でres.setNanasi(true)で名無しとして、res.setNanasi(false)で名無し以外の名前としてそれぞれ扱いが固定されます。

2chの!ninja(と!denki)を名無しにする例:

var pn=java.util.regex.Pattern.compile('(?: </b>(?:忍法帖【Lv=\\d+,xxxPT?】|【(:?東|北|東北|関|北陸|中部|中国|四|九|沖縄)電 (?:<font color=red>)?(:?[.\\d]+|-)(:?</font>)? %】)<b> [  ]*)+');
function checkRawText(res,cx) {
  var sn=res.name;
  if (sn&&pn.matcher(sn).matches()) {
    res.setNanasi(true);
  }
}
・スクリプト開始時のマウスポインタ位置を取得できるようにした。

v2c.context.setPopupHTML(s)v2c.context.setPopupText(s)関連の改善

・レス表示欄の新着境界表示(NewMark)をクリアできるようにした。

スレッドオブジェクトthのレス表示タブが開いている場合、th.clearNewMark()で新着境界表示をクリアします。(レス表示タブが開いていない場合はth.resetUnread()を実行します。)

・スレッドの新着境界より後のレス数を取得できるようにした。

th.newMarkResCountはスレッドthの新着境界より後のレス数を返します。

・板のSETTING.TXTの内容をMapに変換して取得できるようにした。

bd.settingMapは板オブジェクトbdのSETTING.TXTをMap mとして返します。(mnullの可能性があります。)例:2chのソフトウェア板の場合、m.get(null)m.get('BBS_NONAME_NAME')はそれぞれ"software@soCCCncCosWvo"、"名無しさん@お腹いっぱい。"を返します。

・デフォルト外部ブラウザでURLを開くことができるようにした。

v2.5.2 の変更点

・全板オブジェクトのArrayを取得できるようにした。

v2c.boardsはV2Cに登録されている全板オブジェクトのArrayを返します。

・レス表示タブのロック状態を取得、及びロック(解除)できるようにした。

スレッドオブジェクトthに対してth.lockthのレス表示タブがロックされている場合にtrueを返します。(th.lockは代入により設定可能。)

・レス表示タブを閉じることができるようにした。

th.close()でスレッドオブジェクトthのレス表示タブを閉じます。(レス表示タブが開いていない場合もエラーになりません。)

・スレッドがdat落ちしているかどうかを取得できるようにした。

スレッドオブジェクトthに対してth.livethがdat落ちしていないと推測される場合にtrueを返します。

・formSubmittedのデータはUTF-8固定でエンコードするようにした。

・レス表示タブのポップアップメニュー名を"ResPaneTab"に変更した。

v2.5.1 の変更点

・レスラベル関連の機能を追加した。

rescheck.js内ではラベルを設定することはできません。

・スレッドの更新が完了した時にスクリプトを実行できるようにした。

"V2C\script\system\threadld.js"(文字コードはUTF-8)でthreadUpdated(th,cx)を定義してください。threadUpdated(th,cx)はスレッドの更新完了後更新音を再生する直前に実行されます。

threadld.jsを変更した時は「ファイル」メニューの「再読み込み」→「threadld.js」で再読み込みすることができます。

・スレッドの過去ログを取得できなかった時にスクリプトを実行できるようにした。

"V2C\script\system\getdat.js"(文字コードはUTF-8)でgetDat(th)を定義してください。getDat(th)はスレッドの過去ログを取得できなかった時に実行されます。(thはスレッドオブジェクト。)

getdat.jsを変更した時は「ファイル」メニューの「再読み込み」→「getdat.js」で再読み込みすることができます。

・書き込み欄関連の機能を追加した。

板オブジェクトbiからbi.openWritePanel()を、またはスレッドオブジェクトthからth.openWritePanel()th.mayOpenWritePanel()を実行すると、対応する書き込み欄を開いて書き込み欄オブジェクトを返します。(書き込み欄を開くことができなかった場合はnullを返す。)th.mayOpenWritePanel()はスレッドが書き込み可能な場合にのみ書き込み欄を開きます。
書き込み欄オブジェクトwpは:

・書き込み前に書き込み内容をチェック・変更できるようにした。

"V2C\script\system\post.js"(文字コードはUTF-8)でcheckBeforeCreateThread(wp)checkBeforePost(wp)を定義してください。

post.jsを変更した時は「ファイル」メニューの「再読み込み」→「post.js」で再読み込みすることができます。

・レス表示タブを作成した時にスクリプトを実行できるようにした。

"V2C\script\system\threadld.js"(文字コードはUTF-8)でpanelCreated(th)thはスレッドオブジェクト)を定義してください。panelCreated(th)はレス表示タブのサイズが確定した時に実行されます。

・ポップアップメニューを変更できるようにした。

注意:

  • メニュー項目のラベルやポップアップメニュー名は予告無く変更されることがあります。
  • popupMenuCreatedはSwingのポップアップメニューコンポーネントを直接操作するので使用には十分注意してください。

"V2C\script\system\menu.js"(文字コードはUTF-8)でpopupMenuCreated(pm,sn)を定義してください。popupMenuCreated(pm,sn)はポップアップメニューが作成された時に実行されます。menu.jsを変更した時は「ファイル」メニューの「再読み込み」→「menu.js」で再読み込みすることができます。

レス表示ポップアップメニューから「マーカーを引いたレスを抽出」を削除する例:

function popupMenuCreated(pm,sn) {
  if (sn=='ThreadPanel') {
    for (var i=pm.getComponentCount()-1; i>=0; i--) {
      var mi=pm.getComponent(i);
      if (!(mi instanceof javax.swing.JMenuItem)) { // セパレータ
        continue;
      }
      if (mi.getText().startsWith('マーカーを引いたレスを抽出')) {
        pm.remove(i);
        break;
      }
    }
  }
}

レス番号ポップアップメニューの「設定」の最初のセパレータまでの項目を展開する例:

function popupMenuCreated(pm,sn) {
  if (sn=='ResNum') {
    loop:
    for (var i=pm.getComponentCount()-1; i>=0; i--) {
      var mi=pm.getComponent(i);
      if (!(mi instanceof javax.swing.JMenuItem)) { // セパレータ
        continue;
      }
      if (mi.getText()=='設定') {
        // mi は javax.swing.JMenu
        for (var j=0; j<mi.getItemCount(); j++) {
          var mj=mi.getItem(j);
          if (!(mj instanceof javax.swing.JMenuItem)) { // セパレータ
            mi.remove(j);
            for (var k=j-1; k>=0; k--) {
              pm.insert(mi.getItem(k),i);
            }
            break loop;
          }
        }
        break;
      }
    }
  }
}

レス表示ポップアップメニューの抽出系の項目を下位メニューにまとめる例:

function popupMenuCreated(pm,sn) {
  if (sn=='ThreadPanel') {
    var ie=-1;
    for (var i=pm.getComponentCount()-1; i>=0; i--) {
      var mi=pm.getComponent(i);
      if (!(mi instanceof javax.swing.JMenuItem)) { // セパレータ
        continue;
      }
      var sl=mi.getText();
      if (ie<0) {
        if (sl.startsWith('抽出ダイアログ')) {
          ie = i;
        }
      } else {
        if (sl.startsWith('リンクを含むレスを抽出')) {
          var m=new javax.swing.JMenu('抽出');
          for (var j=ie; j>=i; j--) {
            m.insert(pm.getComponent(j),0);
          }
          pm.insert(m,i);
          break;
        }
      }
    }
  }
}

th.newResCountの返り値を変更した。

これまではスレッドthの新着境界より後のレス数を返していましたが、スレッドの更新後に新たに取得されたレス数を返すように変更しました。

・「更新完了音を再生する」設定を取得できるようにした。

「更新完了音を再生する」設定がオンの時にv2c.compSoundEnabledtrueを返します。

v2c.browseURL(u),v2c.browseURLExt(u)に外部へのネットワーク接続の許可を必須にした。

・スレッドオブジェクトからレスオブジェクトを取得できないことがある問題を修正した。

v2.5.0 の変更点

・板内のログのある全スレッドを取得できるようにした。

bd.threadsWithLog … 板bd内のログのある全スレッドのArray(ログのあるスレッドが無い場合はlengthが0のArray)を返します。

・コピー先のフォルダを指定してファイルをコピーできるようにした。

v2c.copyFileInto(f,d) … ファイルfをフォルダdにコピーし、成功した場合にtrueを返します。フォルダdが存在しない場合には作成します。注意:ファイル読み書きの許可が必要です。(${SCRIPT:Frw}

v2.4.2 の変更点

・ファイルをコピーできるようにした。

v2c.copyFile(f0,f1) … ファイルf0をファイルf1にコピーし、成功した場合にtrueを返します。注意:ファイル読み書きの許可が必要です。(${SCRIPT:Frw}

v2.4.0 の変更点

・ローカル板関連の機能を追加した。

・スレッドをレス表示欄で開くことができるようにした。

・板に関する機能を追加した。

・スレッドの未読状態を取得・リセットできるようにした。

・setPopupHTML()で表示したHTMLのリンククリックでポップアップを残せるようにした。

v2c.context.setCloseOnLinkClick(b)bfalseの時setPopupHTML()で表示したポップアップのリンクをクリックした時にそのポップアップを閉じません。(デフォルトはtrue。)またbfalseの時redirectURL()によるポップアップはマウスポインタの位置に表示されます。

・setCloseOnMouseExit(b)のデフォルト値を設定できるようにした。

v2c.context.setDefaultCloseOnMouseExit(b)setCloseOnMouseExit(b)のデフォルト値を設定します。スクリプトのどこかで一度実行しておくと、以後同じ値bsetCloseOnMouseExit(b)を実行する必要がありません。

v2.3.0 の変更点

・ポップアップからマウスを外した時にポップアップを閉じることができるようにした。

v2c.context.setCloseOnMouseExit(true)setPopupTextsetPopupHTMLで表示されたポップアップからマウスを外した時にそのポップアップを閉じます。

・新着画像ファイルダウンロードの設定をスレッド毎に変更できるようにした。

"V2C\script\system\imgcache.js"(文字コードはUTF-8)で必要な関数を定義します。ファイルを変更した時は「ファイル」メニューの「再読み込み」→「imgcache.js」で再読み込みすることができます。注意:スクリプト中で"_v2c_"で始まる名前は使用しないでください。

2chのデジカメ板でのみ新着画像をダウンロードする例(元の設定値は無視):

function getDownloadNewImagesLimit(th,ov) {
  if (th.bbs.is2ch && (th.board.url.path == '/dcamera/')) {
    ov.maxdays = 2; // 2日前まで
    ov.maximgs = 100; // 100枚まで
  } else {
    ov.maxdays = 0;
  }
}

・クリップボードにコピーされた文字列を取得できるようにした。

v2c.clipboardTextでクリップボードの文字列を取得できます。スクリプトにはクリップボードへのアクセス許可が必要です(${SCRIPT:Tc})。

v2.1.5 の変更点

・同一のポップアップが既に開かれているかどうかチェックできるようにした。

マウスオーバーによってポップアップを表示する場合等に、同一のポップアップの複数表示を防止するために使用できます。

例:

var sid='idstring';
function createPopupString() {
  if (v2c.context.getPopupOfID(sid)) {
    return;
  }
  var sp;
  //
  // spを構成
  //
  v2c.context.setPopupHTML(sp);
  v2c.context.setPopupID(sid);
}
・HTMLポップアップのサイズ計算を改善した。

HTMLポップアップのサイズが増加する方向に変化した場合はポップアップのサイズを大きくするようにしました。

v2.1.3 の変更点

・レス表示欄のタブに(HTML)テキストを表示できるようにした。

・板・スレッド・レスオブジェクトからBBSオブジェクトを取得できるようにした。

BBSオブジェクトbbsのプロパティは:

・[レス|Tweet]表示スタイルのファイルを取得できるようにした。

スレッドオブジェクトthに対してth.styleFileは通常の掲示板ではth.styleDir\style.txtに、Twitterではth.styleDir\style_tw.txtになります。

checkRawText(res,cx)中で時間とIDのフィールドを取得できるようにした。
res.timeidで時間とIDを解析する前の文字列を取得します。
setPopupHTMLでポップアップした内容をポップアップメニューからコピーできるようにした。

v2.0.2 の変更点

・URLからスレッドや板を開くことができるようにした。

v1.1.3 の変更点

・スクリプトによるレスのテキスト置換・AA判定・非表示判定ができるようにした。

"V2C\script\system\rescheck.js"(文字コードはUTF-8)で必要な関数を定義します。ファイルを変更した時は「ファイル」メニューの「再読み込み」→「rescheck.js」で再読み込みすることができます。注意:スクリプト中で"_v2c_"で始まる名前は使用しないでください。

下のような自明な関数は未定義にしておく方が実行速度が上がります。

function beginCheck(th,cx) {return true;}
function checkRawText(res,cx) {}
function checkAA(res,cx) {}
function checkNG(res,cx) {}
function endCheck(th,cx) {}

本文に特定の文字列を含むレスをAAレスと判定する例:

function checkAA(res,cx) {
  if (res.message.indexOf('( ・e・)')>=0) {
    res.setAA(true);
  }
}

レス読み込みの処理は以下のような順番になります。

  1. beginCheck(th,cx)cx.checkRawTextcx.checkAAcx.checkNGtrue
  2. 各レスについて以下の繰り返し
    1. "<>"によるフィールドの分離
    2. checkRawText(th,cx)
    3. ReplaceStr.txtによる置換
    4. レスの解析(時間・IDの分離や本文のリンク化等)
    5. 通常の非表示・キーワードのチェック
    6. checkAA(res,cx)
    7. checkNG(res,cx)
  3. endCheck(th,cx)

非表示の再チェックでは各レスに対してcheckNG(res,cx)だけが実行されます。

  1. beginCheck(th,cx)cx.checkNGtrue
  2. 各レスについて以下の繰り返し
    1. checkNG(res,cx)
  3. endCheck(th,cx)

・スクリプトを起動したコマンドのラベルを取得できるようにした。

v2c.context.commandLabelでそのスクリプトを起動したコマンドのラベル(ポップアップメニューに表示されている文字列)を取得できます。

・スクリプトの実行終了後指定したレスにジャンプできるようにした。

・レスの非表示に関する情報を取得できるようにした。

・「全体」コマンドでもレス表示欄の情報を取得できるようにした。

v2c.context.resはレス表示欄に最初に表示されているレスのレスオブジェクトを返します。(レス表示欄の上端を含むレス)

・リンクが画像リンクと思われるかどうかを取得できるようにした。

lnk.type_IMAGEはリンクオブジェクトlnkのURLが画像の拡張子で終わっているかまたはImageViewURLReplace.datにマッチする行がある場合にtrueを返します。

とりあえず使ってみる

以下はスクリプトの例としてかなり簡略化されたものです。より実用的なWikipediaのポップアップは1),2)を省略して3)で

$SCRIPT <wikipedia.js> i

と設定すると、V2Cに内蔵されているスクリプトが使用されます。(wikipedia.jsのソース

1) V2C保存用フォルダに"script"フォルダを作成する。

2) メモ帳等のエディタで以下の内容を"script"フォルダの"wikipedia.js"に保存する。(文字コードはUTF-8)

function createPopupString(sc,bh) {
  var vcx = v2c.context;
  var ss = vcx.selText;
  if (ss) {
    ss = ss.trim();
  }
  if (!ss||(ss.length()==0)) {
    v2c.alert('検索語を取得できませんでした。');
    return;
  }
  var su0 = 'http://'+sc+'.wikipedia.org/wiki/';
  var su = su0+encodeURIComponent(ss);
  var sh = v2c.readURL(su);
  if (!sh) {
    v2c.alert('ページを取得できませんでした。');
    return;
  }
  var mr = sh.match(new RegExp('<p>([^]+?)</p>','i'));
  if (!mr) {
    v2c.alert('説明を抽出できませんでした。');
    return;
  }
  var sr = mr[1];
  if (bh) {
    vcx.setPopupHTML('<html><head><base href="'+su0+'"></head><body><dl><dt>【<a href="'+su+'">'+ss+'</a>】<dd>'+sr+'</dl></body></html>');
  } else {
    vcx.setPopupText(sr.replace(/<[^>]+>/g,''));
  }
}

createPopupString('ja',true);

3) 外部コマンド設定ダイアログ「一般」タブで選択テキストコマンドに

$SCRIPT wikipedia.js

を設定する。(ラベル例: wikipediaポップアップ)

4) レス表示欄で調べたい文字列を選択してポップアップメニューから3)で設定したコマンドを選択する。

外部コマンドでの設定

外部コマンドに$SCRIPTとスクリプトファイル名を指定することにより、Rhinoスクリプトを実行することができます。(例: $SCRIPT sample.js

スクリプトファイルはV2C保存用フォルダの"script"フォルダに置いてください。

スクリプトファイル名を<>で囲むとV2Cの内部スクリプトを指定することができます。(現在は<wikipedia.js>のみ。)

注意:

スクリプトの実行

V2Cとのやりとりには変数v2cを使用します。

ファイル読み込み(ファイル読み込みの許可が必要 ${SCRIPT:Fr}):

ファイル書き込み(ファイルが既に存在する場合は上書きされる。安全のためV2C保存用フォルダ(v2c.saveDir)直下のファイルへの書き込みはエラーになる。ファイル書き込みの許可が必要 ${SCRIPT:Fw}):

コマンド実行(ファイル実行の許可が必要 ${SCRIPT:Fx}):

選択テキスト関連(対象となるのは下の各関数が実行された時にキーボードフォーカスを持つテキスト入力コンポーネント。v2c.getSelectedText()はレス表示欄がキーボードフォーカスを持っている時はレス表示欄の選択テキストを返す。):

v2c.contextからコマンドの実行に必要な情報を取得します。

スレッドオブジェクト th からスレッドに関する情報を取得します。未取得レス数は(th.resCount-th.localResCount)で、スレッド更新前のレス数は(th.localResCount-th.newResCount)で計算できます。

板オブジェクト bd から板に関する情報を取得します。

レスオブジェクト res からレスに関する情報を取得します。name等で取得できる文字列はdatそのままではなく、レス表示欄に表示される文字列です。

リンクオブジェクト lnk のプロパティ

レスペインオブジェクト rp のプロパティ

スクリプトに対するパーミッション設定

デフォルトではスクリプトはSandBox内で実行され、例えばローカルファイルの読み込みを実行しようとすると例外が発生しスクリプトの実行が停止します。スクリプトにデフォルトで許可されていない動作を許可するには外部コマンド設定で最初の$SCRIPT${SCRIPT:X}Xは以下の文字を結合したもの)に変更します。

スクリプトから外部のファイルの実行を許可する例: ${SCRIPT:Fx} exec.js

外部ファイルの実行

コマンドはV2Cとは別のプロセスで実行されます。

外部のファイルの実行には外部コマンド設定での許可が必要です。(前項参照)

WindowsのFirefoxで2chのHPを表示させる例:

v2c.exec('"C:\\Program Files\\Mozilla Firefox\\firefox.exe" http://www.2ch.net/');

または

v2c.exec(['C:\\Program Files\\Mozilla Firefox\\firefox.exe','http://www.2ch.net/']);

redirectURL(u)

redirectURL(u)のイメージは:

function redirectURL(u) {
  if (uを独自に処理したい) {
    uの処理; // setPopupHTML等
    return null;
  } else if (別のURLをWebブラウザで開きたい) {
    return 別のURL;
  } else {
    return u; // そのままWebブラウザで開く(デフォルトの動作)
  }
}

V2C内蔵のwikipedia.jsにもv2c.context.setRedirectURL(true)redirectURL(u)が使用されています。

formSubmitted(u,sm,sd)

setRedirectURL(b)redirectURL(u)とよく似た方式で、v2c.context.setTrapFormSubmission(true)を実行しておくとHTMLポップアップ内のFORMを送信する時にスクリプトのformSubmitted(u,sm,sd)が呼ばれます。

formSubmitted()の返り値によらずFORMは送信されません。v2c.context.setTrapFormSubmission(true)で設定された値はformSubmitted()を呼ぶ前にリセットされます。
使用例は:

function formSubmitted(u,sm,sd) {
  v2c.println('URL: '+u);
  v2c.println('method: '+sm);
  v2c.println('data: '+sd);
}

var vcx = v2c.context;
vcx.setPopupHTML('<html><body style="margin:10px;"><form action=""><input type="submit" value="action" name="name"></form></body></html>');
vcx.setTrapFormSubmission(true);

HttpRequestオブジェクト

HTTPのファイル取得でリクエストヘッダの設定やPOSTデータの送信ができます。

まず最初にHttpRequestオブジェクトを作成します。

HttpRequestオブジェクトhrのメソッド・プロパティは:

setRequestProperty(n,v)getContentsAs*()の前に、その他はgetContentsAs*()の後に実行する必要があります。

注意:HttpRequestオブジェクトを使用するにはスクリプトに外部へのネットワーク接続の許可が必要です。(${SCRIPT:S}

datファイルのインポート

インポート先のスレッドオブジェクトは、v2c.getThread(u)で取得できます。

例(エラー処理は省略):

// ${SCRIPT:FwS}
var hr=v2c.createHttpRequest(どこかのURL);
var bl=hr.getContentsAsBytes();
var th=v2c.getThread(スレURL);
th.importDatBytes(bl);

注意:importDat*を使用するにはスクリプトにファイル書き込みの許可が必要です。(${SCRIPT:Fw}

実行情報の表示スクリプト例

var vcx = v2c.context;
var vth = vcx.thread;

var sb = new java.lang.StringBuilder();

var ad=v2c.appDir;
if (ad) {
  sb.append('v2c.appDir: ');
  sb.append(ad);
  sb.append('\n');
}
sb.append('v2c.saveDir: ');
sb.append(v2c.saveDir);
sb.append('\nv2.context.argLine: ');
sb.append(vcx.argLine);
var ags=vcx.args;
for (var i=0; i<ags.length; i++) {
  sb.append('\nv2c.context.args[');
  sb.append(new Number(i));
  sb.append(']: ');
  sb.append(ags[i]);
}
if (vth) {
  sb.append('\nv2c.context.thread.url: ');
  sb.append(vth.url);
  var dn = vth.key;
  if (dn) {
    sb.append('\nv2c.context.thread.key: ');
    sb.append(dn);
  }
  var lf = vth.localFile;
  if (lf) {
    sb.append('\nv2c.context.thread.localFile: ');
    sb.append(lf);
  }
  var vbd = vth.board;
  if (vbd) {
    sb.append('\nv2c.context.thread.board.url: ');
    sb.append(vbd.url);
    sb.append('\nv2c.context.thread.board.key: ');
    sb.append(vbd.key);
  }
}
var ln = vcx.link;
if (ln) {
  sb.append('\nv2c.context.link.url: ');
  sb.append(ln.url);
  var icf = ln.imageCacheFile;
  if (icf) {
    sb.append('\nv2c.context.link.imageCacheFile: ');
    sb.append(icf);
  }
}
var lns = vcx.links;
if (lns) {
  for (var i=0; i<lns.length; i++) {
    sb.append('\nv2c.context.links[');
    sb.append(new Number(i));
    sb.append('].url: ');
    sb.append(lns[i].url);
  }
}

vcx.setPopupText(sb.toString());