Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                

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

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

v2.10.2 の変更点

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

  • v2c.history.threads … レス表示履歴に存在するスレッドオブジェクトをJavaのArrayとして返す。
  • v2c.history.postThreads … レス表示履歴に存在する書き込んだことのあるスレッドオブジェクトをJavaのArrayとして返す。

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

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

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

  • th.newMarkResIndex … 新着境界直後のレスのインデックスを返す。新着境界が表示されていない場合は既得レス数を返す。(代入により設定可能。)

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

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

  • th.viewResIndex … 表示されている最初のレスのインデックスを返す。(代入により設定可能。)

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

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

  • th.postResLabel … そのスレッドで自分の書き込みに自動で付くラベルを返す。ラベルを自動で付けない場合はnullを返す。

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

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

  • th.postResIndex … そのスレッドで自分の書き込みに自動で付くラベルが付いているレスのインデックスをJavaのArrayとして返す。注意:自分の書き込みが存在しない場合やラベルを自動で付けない場合もlength0のArrayを返す。

v2.10.1 の変更点

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

  • th.movePanelTo(ic,it) … スレッドオブジェクトthのレス表示タブをインデックスicのカラムのインデックスitのタブに移動する。icit-1の場合は最後のカラム・タブに移動する。

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

  • th.columnIndex … スレッドオブジェクトthが開かれているカラムのインデックス(開かれていない場合は-1)を返す。

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

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

  • hr.getHead()HEADメソッドでHTTPのヘッダ情報を取得し、成功した時はtrueを返す。注意:hr.getContentsAs*()の後にhr.getHead()を実行すると、取得していたContentはクリアされる。hrv2c.createHttpRequest(u,d)で作成されdnullでない場合、hr.getHead()は常にfalseを返す。

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

v2.10.0 の変更点

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

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

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

  • [TAB]はタブコードです。
  • 最初の[TAB]の前は将来の拡張用です。
  • スクリプト指定は外部コマンドと同じです。
  • "//"または";"で始まる行は無視されます。
  • 「ファイル」メニュー「再読み込み」→「ImageViewURLReplace.dat & iurlrpl.txt」で ImageViewURLReplace.dat と iurlrpl.txt の両方を再読み込みします。

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

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

  • checkURL(u,cx) … ImageViewURLReplace.dat を適用する前に実行されます。uそのまま、または変更したURLを返してください。返り値がnullまたは空文字列の場合、ダウンロードは中断されます。
    • u … 元URL(javaのURLオブジェクト。)
    • cx … 追加条件を指定するためのオブジェクト。
      • cx.setRequestProperty(n,v) … 名前nのリクエストヘッダフィールドに値vを設定する。(cx.applyImageViewURLReplaceの値によらず最後に画像をダウンロードする時に適用される。)
      • cx.applyImageViewURLReplacetrueの時checkURL(u,cx)が返したURLに対してさらに ImageViewURLReplace.dat を適用する。

    User-Agent を変更する例:

    function checkURL(u,cx) {
    	cx.applyImageViewURLReplace = true;
    	cx.setRequestProperty('User-Agent','Mozilla/5.0 (compatible)');
    	return u;
    }
    
・板のスレ一覧(subject.txt)を変更できるようにした。

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

  • checkSubject(ss,bd,cx) … subject.txtを取得した後解析する前に実行されます。ssそのまま、または変更した文字列を返してください。
    • ss … 取得したsubject.txt
    • bd … 板オブジェクト
    • cx … (現在はダミー)

    注意:

    • checkSubject(ss,bd,cx)はsubject.txtを実際に取得した時にのみ実行されます。(例えばHTTPレスポンスコードが 304 Not Modified. の時は実行されない。)
    • 現在ローカル板・Twitter仮想板でcheckSubject(ss,bd,cx)は実行されませんが、将来実行される可能性があります。

    ソフトウェア板でスレッド924を下げてスレタイの先頭に★を追加する例:

    function checkSubject(ss,bd,cx) {
      if (!bd.bbs.is2ch||(bd.key!='software')) {
        return ss;
      }
      var re=new RegExp('^(\\d+)\\.dat<>(.+) \\((\\d+)\\)$','gm');
      var ls=[],ls9=[];
      var rt;
      while (rt=re.exec(ss)) {
        if (rt[1][0]=='9') {
          ls9.push(rt[1]+'.dat<>★ '+rt[2]+' ('+rt[3]+')\n');
        } else {
          ls.push(rt[0]+'\n');
        }
      }
      return ls.concat(ls9).join('');
    }
    
・スクリプトの設定や状態保存用のファイルパスを生成できるようにした。

  • v2c.getScriptSubFile(n) … スクリプトファイル名から拡張子を除いたフォルダ内の名前nのファイルパスをjavaのFileオブジェクトとして返します。注意:スクリプトファイル名が'.'(ピリオド)を含まない場合やスクリプトファイル名が拡張子のみの場合はnullを返す。例: V2C\script\test.js から実行した v2c.getScriptSubFile('state.txt') は V2C\script\test\state.txt に相当するFileオブジェクトを返す。

v2.9.3 の変更点

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

  • v2c.expandShortURL(u,r) … URL uが短縮URLと思われる場合は展開し、それ以外の場合はuを返す。rの値により以下のように動作する:
    • true … V2C内部にURLを展開した結果のキャッシュが存在しない場合はネットワーク接続により展開する。注意:展開が終了するまでv2c.expandShortURL(u,true)はブロックします。展開にはスクリプトに外部へのネットワーク接続の許可は不必要です。
    • false … V2C内部のURLを展開した結果のキャッシュのみを参照する。

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

  • v2c.reloadSettingFile(s) … ファイル名sの設定ファイルを再読み込みする。現在再読み込みできるのは'samba24.txt', 'msgkw.txt', 'AAList.txt', 'ImageViewURLReplace.dat', 'ReplaceStr.txt', 'ReplaceStr_Tw.txt', 'URLExec.dat', 'URLExec2.dat', 'URLExec3.dat', 'NGBE.txt'で、'samba24.txt'は2chの'samba24.txt'を再読み込みする。例:v2c.reloadSettingFile('ImageViewURLReplace.dat')

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

  • v2c.reloadSystemScript(s) … ファイル名sのシステム系スクリプトを再読み込みする。例:v2c.reloadSystemScript('menu.js')

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)を定義してください。

  • checkProxy(u,p) … V2Cがネットワーク接続する前に実行されます。
    • u … javaのURLオブジェクト。
    • p … Proxy情報を保持するオブジェクト。ネットワーク設定でProxyを使用する設定になっている場合はその情報が設定されている。
      • p.host … Proxyのホスト名。(代入により設定可能。)
      • p.port … Proxyのポート番号。(代入により設定可能。)
      • p.direct() … 直接接続に設定する。(p.hostnullに、p.port0に設定する。)

    例:

    function checkProxy(u,p) {
      if (RegExp('^http://[0-9A-Za-z-]+\\.2ch\\.net/software/subject.txt$').test(u)) {
        p.host = 'localhost';
        p.port = 2020;
      }
    }
    

注意:

  • Proxy.txt内のProxyを選択してレスを書き込む時はcheckProxy(u,p)は実行されません。
  • proxy.jsを変更した時は「ファイル」メニューの「再読み込み」→「proxy.js」で再読み込みすることができます。

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

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

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

v2.9.0 の変更点

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

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

  • rp.checkNG() … 全てのレス表示タブの非表示を再チェックする。
  • rp.checkNG(null)rp.checkNG()と同じ。
  • rp.checkNG(th) … スレッドthのレス表示タブが表示されている場合そのレス表示タブの非表示を再チェックする。
  • rp.checkNG(bd) … 板bdに属するスレッドのレス表示タブの非表示を再チェックする。

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

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

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

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

  • bd.addNGID(id)bd.addNGID(id,d)bd.addNGID(id,d,t)bd.addNGID(id,d,t,w) … 文字列idを板bdのNGIDに追加する。
    • didが出現した時刻(ミリ秒単位のUNIX TIME)。この時刻を含む日±αでNGIDが有効になる。d0以下の場合はbd.addNGID(*)を実行した時刻からのオフセットと見做される。(デフォルト値は0
      bd.addNGID(id,-86400000); // 昨日のNGIDとして追加する例
      
    • ttrueの場合透明非表示(デフォルト値はfalse
    • w … ウェイト(-9≦w≦9、デフォルト値は0
    既にidがNGIDに登録されている場合、その設定が
    • wより低い優先度の場合twの値が反映される。
    • wと同じウェイトかつw0以下かつttrueの場合tの値が反映される。(透明非表示になる。)
    • その他の場合twは無視される。
    注意:
    • 追加したNGIDを既に表示されているレスに適用するにはv2c.resPane.checkNG(bd)を実行してください。
    • 非表示・キーワード設定ダイアログが表示されている間bd.addNGID(*)は処理をスキップします。(何もしません。)

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

  • v2c.bbs2ch … 2chのBBSオブジェクト

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

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

  • bbs.getBoard(k)bbsが2chの場合、板キーがkの板オブジェクトを返す。板が存在しない時または2ch以外のBBSではnullを返す。(例:v2c.bbs2ch.getBoard('software')

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

  • v2c.getThread(u,t),v2c.getThread(u,t,n) … V2CがuをスレッドのURLと認識できる場合に対応するスレッドオブジェクトthを返す。
    • tthのスレタイが不明の場合スレタイとして使用される(デフォルト値null
    • nthのレス数がn以下の場合レス数として使用される(デフォルト値0

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

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

  • res.ngTransparentresが透明非表示の場合にtrueを返す。

v2.8.0 の変更点

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

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

  • fvs.count … お気に入りタブの総数。
  • fvs.getFavorite(i) … インデックスがiのお気に入りタブオブジェクトを返す。
  • fvs.createFavorite(s) … 名前がsのお気に入りタブを作成する。

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

  • fav.name … お気に入りタブの名前。
  • fav.root … お気に入りタブのルートフォルダオブジェクトを返す。
  • fav.contains(o)oが板またはスレッドオブジェクトでfavoを含む場合にtrueを返す。
  • fav.removeAll() … お気に入りタブの内容をルートフォルダのみ残して全て登録解除する。
  • fav.clearFolder(f) … お気に入りフォルダfの内容を空にする。
  • fav.appendFolder(f,s) … お気に入りフォルダfに名前がsのフォルダを追加し、追加したフォルダオブジェクトを返す。
  • fav.insertFolder(f,s,i) … お気に入りフォルダfのインデックスiに名前がsのフォルダを挿入し、挿入したフォルダオブジェクトを返す。
  • fav.appendItem(f,o) … お気に入りフォルダfoを追加する。
  • fav.insertItem(f,o,i) … お気に入りフォルダfのインデックスioを追加する。
  • fav.removeItem(o)oの登録を解除する。

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

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

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

  • o.label … アイテムの名前。
  • o.childCountoがフォルダの場合はフォルダに含まれる子アイテムの総数を、それ以外の場合は-1を返す。
  • o.getChild(i)oがフォルダの場合はインデックスiの子アイテムを、それ以外の場合はnullを返す。
  • o.boardoが板の場合は板オブジェクトを、それ以外の場合はnullを返す。
  • o.threadoがスレッドの場合はスレッドオブジェクトを、それ以外の場合はnullを返す。

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

  • v2c.getBoard(u,n) … URLがuの板がV2Cに登録されている場合その板オブジェクトを返す。(v2c.getBoard(u)と同じ。)uが板のURLとして登録されていない場合はURLがuで名前がnの板を新規に作成して返す。

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

  • bd.getThread(k,u),bd.getThread(k,u,t),bd.getThread(k,u,t,n) … 板bdのスレッドキーkのスレッドを既に取得している場合そのスレッドオブジェクトを返す。(bd.getThread(k)と同じ。)それ以外の場合、uを移転前の板のURLとして新規に作成したスレッドオブジェクトを返す。(unullの場合はbdの現在のURLから取得したと見倣す。)スレタイt(デフォルト値null)とレス数n(デフォルト値0)を指定することもできます。

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

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

  • th.importDatFile(f,n),th.importDatFile(f,n,o) … ファイルfをdatとしてインポートする。
  • th.importDatBytes(bl,n),th.importDatBytes(bl,n,o) … Javaのバイト列(byte[])blをdatとしてインポートする。

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

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

  • v2c.online … V2Cがオンライン状態の時にtrueを返す。

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

  • v2c.interrupted … 外部からの中断要求(スレ一覧用スクリプトでユーザによる停止ボタンのクリック等)があった時にtrueを返す。(余談:内部的にはThread.currentThread().isInterrupted()を返しているだけです。)

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

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

  • getThreads(cx) … スレ一覧に表示するスレッドオブジェクトをjavascriptのArrayまたはjavaのListとして返してください。処理中にエラーにより中断した場合はcx.messageにエラーメッセージを設定し、nullを返してください。
    • cx.maxProgress=n … ステータスバーに表示する進捗状況表示の最大値nを正の整数で設定する。
    • cx.progress=v … ステータスバーに表示する進捗状況表示の現在値vを0以上の整数で設定する。
    • cx.message=s … エラーにより中断した場合にステータスバーに表示されるメーセージsを設定する。
    • cx.skip … V2Cがオンライン状態でない等の理由でスレ一覧に表示するスレッドのArrayを取得できない場合はcx.skiptrueを設定してreturnしてください。スレ一覧にはキャッシュされていた前回の結果が表示されます。

この機能の目的としては「ログから検索」や「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.importPropertyFrom(th0) … スレッドオブジェクトth0からプロパティをインポートする。インポートするプロパティは最後にインポートした時の設定が使用される。注意:スクリプトにプロパティ変更の許可が必要です。(${SCRIPT:Vp}

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

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

v2.7.3 の変更点

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

v2.7.2 の変更点

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

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

  • res.setNGRes()res.setNGRes(t)resを非表示にする。t(デフォルトはfalse)がtrueの場合は透明非表示。
  • res.setNoNGRes()resを常に表示する。
  • res.resetNGRes()resの非表示設定をクリアする。

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

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

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

  • res.addNGID()res.addNGID(t)res.addNGID(t,w)resのIDをNGIDに追加する。
    • ttrueの場合透明(デフォルト値はfalse
    • w … ウェイト(-9≦w≦9、デフォルト値は0
  • res.removeNGID()resのIDをNGIDから削除する。

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

v2.7.0 の変更点

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

  • v2c.exit() … V2Cを終了する。
  • v2c.restart() … V2Cを再起動する。再起動できない場合はそのまま制御を返す。

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

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

  • th.updateAndWait() … スレッドthを更新した後更新完了まで待つ。何らかの制限のためスレッドを更新できなかった場合はfalseを返す。注意:th.updateAndWait()がEventDispatchThread(GUI処理用のスレッド)で実行された場合はスレッドを更新せずfalseを返す。

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

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

v2.6.0 の変更点

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

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

  • res.sourceresのソース(datの行)を返す。datファイルが存在しな場合はnullを返す。
  • res.urlresのURLを返す。対応するURLが存在しない場合はnullを返す。
  • res.twitterresがTwitterのTweetの場合にtrueを返す。
  • res.retweetresがリツイートされたTweetの場合にtrueを返す。
  • res.tweetIDresのTweetIDをjavaのLongとして返す。
  • res.userresのユーザオブジェクトusrを返す。
    • usr.idusrのユーザIDをjavaのLongとして返す。注意:Twitter検索とそれ以外ではユーザIDが違います。
    • usr.userNameusrのユーザ名を返す。
    • usr.nameusrの名前を返す。(res.nameと同じ。)
  • res.clientNameresが投稿されたクライアント名を返す。

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

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

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

  • rp.columnCount … レス表示欄カラムの数を返す。
  • rp.columns … レス表示ペインに表示されているカラムオブジェクトのArrayを返す。
  • rp.selectedColumnIndex … 選択されているカラムのインデックスを返す。(代入により設定可能。)
  • rp.selectedColumn … 選択されているカラムオブジェクトを返す。

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

  • col.tabCount … 開いているタブの数を返す。
  • col.selectedIndex … 選択されているタブのインデックスを返す。
  • col.selectedThread … 選択されているタブのスレッドオブジェクトを返す。
  • col.getThread(i) … インデックスii+1番目)のタブに表示されているスレッドオブジェクトを返す。
  • col.threads … レス表示カラムに表示されているスレッドオブジェクトのArrayを返す。(レス表示タブが表示されていない場合はサイズ0のArrayを返す。Arrayの各要素はnullではない。)

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

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

  • col.openThread(th), col.openThread(th,bu), col.openThread(th,bu,bnt), col.openThread(th,bu,bnt,bbg) … (カラムの選択状態に関係無く)レス表示欄カラムcolでスレッドthを開きます。bu,bnt,bbgth.open(bu,bnt,bbg)の引数と同じです。注意:スレッドの更新にはスクリプトに外部へのネットワーク接続の許可が必要です。(${SCRIPT:S}

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

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

  • v2c.setScriptObject(v) … オブジェクトvを設定する。
  • v2c.getScriptObject()v2c.setScriptObject(v)で設定されたオブジェクトvを返す。

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

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

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

  • v2c.putProperty(s,v) … キーsに対してオブジェクトvを設定する。
  • v2c.getProperty(s) … キーsに対応するオブジェクトを返す。
  • v2c.removeProperty(s) … キーsに対応する設定を削除する。

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

"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.mousePos … スクリプト開始時のマウスポインタ位置をJavaのPoint pとして返します。X,Y座標はp.x,p.yです。

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

  • 選択した文字列をDragできるようにした。(v2c.context.setPopupFocusable(true)でポップアップの文字列を選択できるようになります。)
  • ポップアップで文字列が選択されている場合、ポップアップメニューから選択テキスト用外部コマンドを実行できるようにした。(注意:v2c.context.thread等はnullになっています。)

・レス表示欄の新着境界表示(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を開くことができるようにした。

  • v2c.browseURLDefExt(u) … URL u をデフォルト外部ブラウザで開く。注意:スクリプトに外部へのネットワーク接続の許可が必要です。(${SCRIPT:S}

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 の変更点

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

  • v2c.resLabels … V2Cで設定されているレスラベルのArrayを返します。
  • v2c.getResLabel(sn) … 名前がsnのレスラベル(存在しない場合はnull)を返します。
  • res.resLabel … レスresに設定されているレスラベル(設定されていない場合はnull)を返します。
  • res.setResLabel(rl) … レスresにレスラベルrlを設定します。rlnullの場合はレスのラベルをクリアします。
  • res.setResLabelOfName(sn) … レスresに名前がsnのレスラベルを設定します。snnullまたは空文字列の場合はレスのラベルをクリアしますが、それ以外でsnに該当するレスラベルが存在しない場合は何もしません。
  • rl.name … レスラベルrlの名前を返します

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

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

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

  • th … スレッドオブジェクト。
  • cx … スレッドの更新に関する情報を保持するオブジェクト
    • cx.numNewRes … 更新によって取得されたレス数。
    • cx.error … 更新中に何らかのエラーが発生した時にtrueを返します。
    • cx.soundName … V2Cの設定によって再生される予定のサウンドファイル名を返します。(サウンドファイルが指定されていない場合または「更新完了音を再生する」設定がオフの場合はnull。)
      cx.soundName = 'filename';
      で更新完了音を変更することができます。
    • cx.rounding … 巡回中にスレッドが更新された場合にtrueを返します。

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

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

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

  • getDat(th)はスレッドのログファイルの内容を返します。
    • byte[] … バイト列byte[]をログファイルの内容として保存します。
    • null … ログファイルを取得できなかったことを示します。
    • 上記以外 … 返されたオブジェクトを文字列に変換し、それをさらに掲示板の文字コードでバイト列に変換したものをログファイルの内容として保存します。
  • getDat(th)はしたらばやまちBBSでも実行されますが、V2Cのログ保存形式はしたらばではrawmode.cgiそのまま、まちBBSでもしたらばと同じ形式に変換しているので注意してください。
  • getdat.jsにはデフォルトでネットワーク接続("S")が許可されています。

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

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

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

  • wp.thread … スレッドオブジェクトを返します。注意:スレ立ての場合は板・BBSオブジェクト取得等の限られた用途でしか使用できません。
  • wp.title, wp.name, wp.mail, wp.message … それぞれ書き込み欄のスレタイ入力欄、名前欄、メール欄、本文入力欄に対応するオブジェクトを返します。入力欄オブジェクトtcは:
    • tc.copy … コピーします。
    • tc.paste … ペーストします。
    • tc.cut … カットします。
    • tc.text … 入力されているテキストを返します。(代入により設定可能。)
    • tc.selText … 選択範囲のテキストを返します。(代入により設定可能。)
    • tc.caretPos … キャレットの位置を整数で返します。(代入により設定可能。)
    • tc.selStart … 選択開始位置を整数で返します。(代入により設定可能。)
    • tc.selEnd … 選択終了位置を整数で返します。(代入により設定可能。)
    • tc.select(is,ie)isからieまでの範囲を選択します。
    選択位置の設定では-1をテキストの最後と解釈します。
  • wp.close() … 書き込み欄を閉じます。
  • wp.preview … 書き込みプレビューを表示している時trueを返します。(代入により設定可能。)
  • wp.sage … sageチェックボックスがチェックされている時trueを返します。(代入により設定可能。)

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

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

  • checkBeforeCreateThread(wp) … スレ立て時、V2Cが書き込み内容をチェックする前に実行されます。true以外を返すとスレ立て処理を中断します。
    • wp … 書き込み欄オブジェクト
  • checkBeforePost(wp) … 書き込み時、V2Cが書き込み内容をチェックする前に実行されます。true以外を返すと書き込み処理を中断します。
    • 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」で再読み込みすることができます。

  • pm … 作成されたポップアップメニュー(JPopupMenu)。
  • sn … 作成されたポップアップメニューの名前。
    • ThreadPanel … レス表示欄ポップアップメニュー
    • TwitterPanel … Tweet表示欄ポップアップメニュー
    • ResNum … レス番号ポップアップメニュー
    • ResCheck … レスのチェックポップアップメニュー
    • Name … 名前欄ポップアップメニュー
    • TwitterUserName … Twitterユーザ名ポップアップメニュー
    • Mail … メール欄ポップアップメニュー
    • Time … 投稿時間ポップアップメニュー
    • ID … IDポップアップメニュー
    • Aux … 補助情報ポップアップメニュー
    • Link … リンクポップアップメニュー
    • Thumbnail … サムネイル画像ポップアップメニュー
    • SelText … 選択テキストポップアップメニュー
    • SelTextLink … 選択範囲のリンクポップアップメニュー

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

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 の変更点

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

  • bd.local … 板オブジェクトbdがローカル板の時にtrueを返します。
  • th.local … スレッドオブジェクトthがローカルスレッドの時にtrueを返します。
  • v2c.getLocalBoard(d) … フォルダがdのローカル板オブジェクト(該当するローカル板が存在しない場合はnull)を返します。
  • v2c.createResSeparator(s) … レスとレスの間に文字列sを表示するセパレータオブジェクトを作成します。セパレータオブジェクトは下のboard.createLocalThread(st,rl)で使用します。セパレータオブジェクトsepが表示する文字列はsep.textsep.setText(s)で取得及び設定することができます。注意:表示文字列中のタブコードと改行はスペースに置換されます。
  • bd.createLocalThread(st,rl) … 内容がrl(レスオブジェクトまたはセパレータオブジェクトを要素とするArray)でスレタイがstのスレッドをローカル板bdに作成し、対応するスレッドオブジェクトを返します。注意:スレッドの作成にはスクリプトにファイル書き込みの許可が必要です。(${SCRIPT:Fw}

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

  • th.open(),th.open(bu),th.open(bu,bnt),th.open(bu,bnt,bbg) … スレッドオブジェクトthをレス表示欄で開きます。bu: trueの時更新する、bnt: trueの時新タブで開く、bbg: trueの時裏で開く。bu, bnt, bbgのデフォルト値はそれぞれtrue, true, false注意:スレッドの更新にはスクリプトに外部へのネットワーク接続の許可が必要です。(${SCRIPT:S}

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

  • v2c.getBoard(u) … URLがuの板オブジェクト(該当する板が存在しない場合はnull)を返します。
  • bd.name … 板オブジェクトbdの名前を返します。
  • bd.getThread(k) … 板オブジェクトbd内のスレッドキーがkのスレッドオブジェクト(該当するスレッドが存在しない場合はnull)を返します。

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

  • th.unread … スレッドオブジェクトthに未読レスが存在する時にtrueを返します。
  • th.resetUnread() … スレッドオブジェクトthの未読状態をリセットします。(th.unreadfalseを返すようになる。)

・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_"で始まる名前は使用しないでください。

  • getDownloadNewImagesLimit(th,ov) … スレッドを更新後、新着画像ファイルのダウンロードを開始する前に呼ばれる。返値は無視される。
    • th … スレッドオブジェクト。
    • ov … 新着画像ファイルダウンロードの設定を保持するオブジェクト
      • ov.maxdays … 初期値として「リンク・画像・動画」設定「新着画像ダウンロード」枠内の「D日前まで」のDが設定されています。必要に応じてこの値を変更してください。
      • ov.maximgs … 初期値として「リンク・画像・動画」設定「新着画像ダウンロード」枠内の「N枚まで」のNが設定されています。必要に応じてこの値を変更してください。

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 の変更点

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

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

  • v2c.context.setPopupID(s)setPopupTextsetPopupHTMLで表示するポップアップにID文字列 s を設定します。
  • v2c.context.getPopupOfID(s) … ID s が設定されたポップアップが表示中の場合はダミーオブジェクトを、表示していない場合はnullを返します。注意:将来はダミーオブジェクトではなくポップアップに関する情報を保持するオブジェクトを返す可能性があります。

例:

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)テキストを表示できるようにした。

  • v2c.context.setResPaneText(s,t,b) … スクリプトの実行終了後に文字列sをレス表示欄のタブ(タブ名t)に表示します。bは省略可能で、true(デフォルト)の時に新しいタブで表示します。
  • v2c.context.setResPaneHTML(s,t,b) … スクリプトの実行終了後に文字列sをHTMLとしてレス表示欄のタブ(タブ名t)に表示します。bは省略可能で、true(デフォルト)の時に新しいタブで表示します。注意:一部のGIFファイルを表示する時にCPU使用率が上昇したままになるという問題があります。
  • v2c.context.closeOriginalPanel()redirectURL(u)formSubmitted(u,sm,sd)内でv2c.context.closeOriginalPanel()を実行すると呼び出し元のレス表示欄タブまたはポップアップウィンドウを閉じる。元のレス表示欄タブまたはポップアップが既に閉じられている場合でもエラーにはならない。注意:v2c.context.closeOriginalPopup()v2c.context.closeOriginalPanel()と同じ動作になりました。

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

  • board.bbs … 板オブジェクトboardからBBSオブジェクトを返します。
  • thread.bbs … スレッドオブジェクトthreadからBBSオブジェクトを返します。
  • res.bbs … レスオブジェクトresからBBSオブジェクトを返します。

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

  • bbs.is2ch … BBSが2chの時にtrueを返します。
  • bbs.is2cheq … BBSが2ch互換の時にtrueを返します。
  • bbs.shitaraba … BBSがしたらばの時にtrueを返します。
  • bbs.machi … BBSがまちBBSの時にtrueを返します。
  • bbs.twitter … BBSがTwitterの時にtrueを返します。

・[レス|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からスレッドや板を開くことができるようにした。

  • v2c.openURL(u),v2c.openURL(u,bu),v2c.openURL(u,bu,bnt),v2c.openURL(u,bu,bnt,bbg) … URL u が板またはスレッドのURLの時にスレ一覧またはレス表示欄で開きます。bu: trueの時更新する、bnt: trueの時新タブで開く、bbg: trueの時裏で開く。bu, bnt, bbgのデフォルト値はそれぞれtrue, true, false注意:更新にはスクリプトに外部へのネットワーク接続の許可が必要です。(${SCRIPT:S}
  • v2c.browseURL(u) … URL u をブラウザで開く。JDICがインストールされている時は内部ブラウザで開く。
  • v2c.browseURLExt(u) … URL u を外部ブラウザで開く。

v1.1.3 の変更点

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

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

  • beginCheck(th,cx) … 他の関数より先に実行される。
    • th … スレッドオブジェクト。
    • cx … チェックに関する情報を保持するオブジェクト
      • cx.checkRawTexttrueの場合テキスト置換関数checkRawText(res,cx)が各レスに対して実行される。実行を抑止したい場合はcx.setCheckRawText(false)を実行する。
      • cx.checkAAtrueの場合AA判定関数checkAA(res,cx)が各レスに対して実行される。実行を抑止したい場合はcx.setCheckAA(false)を実行する。
      • cx.checkNGtrueの場合NG指定関数checkNG(res,cx)が各レスに対して実行される。実行を抑止したい場合はcx.setCheckNG(false)を実行する。
      スレッド読み込み時はcx.checkRawTextcx.checkAAcx.checkNGは全てtrue、非表示の再チェック時はcx.checkNGのみtrue
    beginCheck(th,cx)の返り値がfalseまたはbooleanとしてfalseと評価される場合は以後の処理はスキップされます。
  • checkRawText(res,cx) … テキストの置換をするための関数。
    • res … レスオブジェクト。checkRawText(res,cx)中で有効なプロパティはnumberindexnamemailmessageのみ。
      • res.setName(s) … 名前欄を文字列sに設定する。
      • res.setMail(s) … メール欄を文字列sに設定する。
      • res.setMessage(s) … 本文を文字列sに設定する。
    • cx … チェックに関する情報を保持するオブジェクト。cx.checkObjectbeginCheck(th,cx)で返されたオブジェクトを取得することができます。
  • checkAA(res,cx) … AA判定をするための関数。
    • res … レスオブジェクト。
      • res.setAA(b)btrueの場合このレスをAAレスと判定する。
    • cx … チェックに関する情報を保持するオブジェクト。cx.checkObjectbeginCheck(th,cx)で返されたオブジェクトを取得することができます。
  • checkNG(res,cx) … 非表示判定をするための関数。
    • res … レスオブジェクト。
      • res.setNG(s)res.setNG(s,t)res.setNG(s,t,w) … このレスを非表示レスと判定する。
        • s … ラベル
        • ttrueの場合透明(デフォルト値はfalse
        • w … ウェイト(-9≦w≦9、デフォルト値は0
      • res.resetNG()res.setNG()の非表示指定をクリアする。
      • res.weight … 非表示のウェイトを取得する。
    • cx … 判定に関する情報を保持するオブジェクト。cx.checkObjectbeginCheck(th,cx)で返されたオブジェクトを取得することができます。
  • endCheck(th,cx) … 一連のチェックの最後に実行される。
    • th … スレッドオブジェクト。
    • cx … チェックに関する情報を保持するオブジェクト

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

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.setResToJump(r) … スクリプトの実行終了後レスオブジェクトrのレスを表示する
  • v2c.context.setResIndexToJump(i) … スクリプトの実行終了後インデックスがiのレスを表示する

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

  • res.ngReason … 非表示の理由を示す文字列を取得する。非表示でない場合はnull
  • res.ngOrigin … 連鎖非表示の場合元となったレスオブジェクトを取得する。連鎖非表示でない場合はnull

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

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());