外部コマンドでRhino(イメージとしては、一般的なJavaScriptからWebブラウザに関係したオブジェクトを取り去ったもの)スクリプトを実行することができます。
v2c.history.threads … レス表示履歴に存在するスレッドオブジェクトをJavaのArrayとして返す。
v2c.history.postThreads … レス表示履歴に存在する書き込んだことのあるスレッドオブジェクトをJavaのArrayとして返す。
注意:履歴にスレッドが存在しない場合もlengthが0のArrayを返す。
スレッドオブジェクトthに対して
th.newMarkResIndex … 新着境界直後のレスのインデックスを返す。新着境界が表示されていない場合は既得レス数を返す。(代入により設定可能。)
スレッドオブジェクトthに対して
th.viewResIndex … 表示されている最初のレスのインデックスを返す。(代入により設定可能。)
スレッドオブジェクトthに対して
th.postResLabel … そのスレッドで自分の書き込みに自動で付くラベルを返す。ラベルを自動で付けない場合はnullを返す。
スレッドオブジェクトthに対して
th.postResIndex … そのスレッドで自分の書き込みに自動で付くラベルが付いているレスのインデックスをJavaのArrayとして返す。注意:自分の書き込みが存在しない場合やラベルを自動で付けない場合もlengthが0のArrayを返す。
th.movePanelTo(ic,it) … スレッドオブジェクトthのレス表示タブをインデックスicのカラムのインデックスitのタブに移動する。ic・itが-1の場合は最後のカラム・タブに移動する。
th.columnIndex … スレッドオブジェクトthが開かれているカラムのインデックス(開かれていない場合は-1)を返す。
v2c.createHttpRequest(u)で作成したオブジェクトhrに対して:
hr.getHead() … HEADメソッドでHTTPのヘッダ情報を取得し、成功した時はtrueを返す。注意:hr.getContentsAs*()の後にhr.getHead()を実行すると、取得していたContentはクリアされる。hrがv2c.createHttpRequest(u,d)で作成されdがnullでない場合、hr.getHead()は常にfalseを返す。
v2c.readURL()等でContent-Lengthが不明の場合のダウンロード上限を1MBから16MBに変更した。
"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)を定義してください。
checkURL(u,cx) … ImageViewURLReplace.dat を適用する前に実行されます。uそのまま、または変更したURLを返してください。返り値がnullまたは空文字列の場合、ダウンロードは中断されます。
u … 元URL(javaのURLオブジェクト。)
cx … 追加条件を指定するためのオブジェクト。
cx.setRequestProperty(n,v) … 名前nのリクエストヘッダフィールドに値vを設定する。(cx.applyImageViewURLReplaceの値によらず最後に画像をダウンロードする時に適用される。)
cx.applyImageViewURLReplace … trueの時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;
}
"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. の時は実行されない。)
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.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)もレスポップアップから実行可能です。
"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.hostをnullに、p.portを0に設定する。)
例:
function checkProxy(u,p) {
  if (RegExp('^http://[0-9A-Za-z-]+\\.2ch\\.net/software/subject.txt$').test(u)) {
    p.host = 'localhost';
    p.port = 2020;
  }
}
注意:
checkProxy(u,p)は実行されません。
v2c.context.resは選択レスを返すように変更した。
これまではレス表示欄の一番上に表示されているレスを返していました。選択レスはレス表示設定「一般」タブ「表示」枠内の「選択レスを表示」をチェックすると、レス右側の赤色の線で表示されます。
tcを文字列に変換する時にはtc.textを返すようにした。
v2c.resPaneで取得できるレスペインオブジェクトrpに対して
rp.checkNG() … 全てのレス表示タブの非表示を再チェックする。
rp.checkNG(null) … rp.checkNG()と同じ。
rp.checkNG(th) … スレッドthのレス表示タブが表示されている場合そのレス表示タブの非表示を再チェックする。
rp.checkNG(bd) … 板bdに属するスレッドのレス表示タブの非表示を再チェックする。
res.addNGID(*)で非表示の再チェックを実行しないようにした。
非表示の再チェックが必要な場合はrp.checkNG(bd)を使用してください。
板オブジェクトbdに対して
bd.addNGID(id)・bd.addNGID(id,d)・bd.addNGID(id,d,t)・bd.addNGID(id,d,t,w) … 文字列idを板bdのNGIDに追加する。
d … idが出現した時刻(ミリ秒単位のUNIX TIME)。この時刻を含む日±αでNGIDが有効になる。dが0以下の場合はbd.addNGID(*)を実行した時刻からのオフセットと見做される。(デフォルト値は0)
bd.addNGID(id,-86400000); // 昨日のNGIDとして追加する例
t … trueの場合透明非表示(デフォルト値はfalse)
w … ウェイト(-9≦w≦9、デフォルト値は0)
idがNGIDに登録されている場合、その設定が
wより低い優先度の場合tとwの値が反映される。
wと同じウェイトかつwが0以下かつtがtrueの場合tの値が反映される。(透明非表示になる。)
tとwは無視される。
v2c.resPane.checkNG(bd)を実行してください。
bd.addNGID(*)は処理をスキップします。(何もしません。)
v2c.bbs2ch … 2chのBBSオブジェクト
BBSオブジェクトbbsに対して:
bbs.getBoard(k) … bbsが2chの場合、板キーがkの板オブジェクトを返す。板が存在しない時または2ch以外のBBSではnullを返す。(例:v2c.bbs2ch.getBoard('software'))
v2c.getThread(u,t),v2c.getThread(u,t,n) … V2CがuをスレッドのURLと認識できる場合に対応するスレッドオブジェクトthを返す。
t … thのスレタイが不明の場合スレタイとして使用される(デフォルト値null)
n … thのレス数がn以下の場合レス数として使用される(デフォルト値0)
レスオブジェクトresに対して
res.ngTransparent … resが透明非表示の場合にtrueを返す。
v2c.favoritesが返すオブジェクトfvsによってお気に入り全体に関する操作をすることができます。
fvs.count … お気に入りタブの総数。
fvs.getFavorite(i) … インデックスがiのお気に入りタブオブジェクトを返す。
fvs.createFavorite(s) … 名前がsのお気に入りタブを作成する。
お気に入りタブオブジェクトfavに対して:
fav.name … お気に入りタブの名前。
fav.root … お気に入りタブのルートフォルダオブジェクトを返す。
fav.contains(o) … oが板またはスレッドオブジェクトでfavがoを含む場合に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) … お気に入りフォルダfにoを追加する。
fav.insertItem(f,o,i) … お気に入りフォルダfのインデックスiにoを追加する。
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.childCount … oがフォルダの場合はフォルダに含まれる子アイテムの総数を、それ以外の場合は-1を返す。
o.getChild(i) … oがフォルダの場合はインデックスiの子アイテムを、それ以外の場合はnullを返す。
o.board … oが板の場合は板オブジェクトを、それ以外の場合はnullを返す。
o.thread … oがスレッドの場合はスレッドオブジェクトを、それ以外の場合はnullを返す。
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として新規に作成したスレッドオブジェクトを返す。(uがnullの場合はbdの現在のURLから取得したと見倣す。)スレタイt(デフォルト値null)とレス数n(デフォルト値0)を指定することもできます。
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.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.skipにtrueを設定して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(/</g,'<').replace(/>/g,'>').replace(/&/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()の動作を改善した。
レス表示欄の状態によっては更新しないことがあった問題を改善しました。
レスオブジェクトresに対して
res.setNGRes()・res.setNGRes(t) … resを非表示にする。t(デフォルトはfalse)がtrueの場合は透明非表示。
res.setNoNGRes() … resを常に表示する。
res.resetNGRes() … resの非表示設定をクリアする。
注意:rescheck.jsでは使用できません。
レスオブジェクトresに対して
res.addNGID()・res.addNGID(t)・res.addNGID(t,w) … resのIDをNGIDに追加する。
t … trueの場合透明(デフォルト値はfalse)
w … ウェイト(-9≦w≦9、デフォルト値は0)
res.removeNGID() … resのIDをNGIDから削除する。
注意:4文字以下のIDはNGIDに追加できません。またrescheck.jsでは使用できません。
v2c.exit() … V2Cを終了する。
v2c.restart() … V2Cを再起動する。再起動できない場合はそのまま制御を返す。
これらの関数の実行にはスクリプトにV2C終了の許可が必要です。(${SCRIPT:Rx})
th.updateAndWait() … スレッドthを更新した後更新完了まで待つ。何らかの制限のためスレッドを更新できなかった場合はfalseを返す。注意:th.updateAndWait()がEventDispatchThread(GUI処理用のスレッド)で実行された場合はスレッドを更新せずfalseを返す。
「設定」メニュー「外部コマンド…」の「スクリプト」タブで rescheck.js 等のシステム系スクリプトの実行パーミッションを設定することができます。右側の入力欄に左側のスクリプトに許可するパーミッション(外部コマンドにスクリプトを登録する時に指定する文字列と同じ)を入力してください。
レスオブジェクトresに対して:
res.source … resのソース(datの行)を返す。datファイルが存在しな場合はnullを返す。
res.url … resのURLを返す。対応するURLが存在しない場合はnullを返す。
res.twitter … resがTwitterのTweetの場合にtrueを返す。
res.retweet … resがリツイートされたTweetの場合にtrueを返す。
res.tweetID … resのTweetIDをjavaのLongとして返す。
res.user … resのユーザオブジェクトusrを返す。
usr.id … usrのユーザIDをjavaのLongとして返す。注意:Twitter検索とそれ以外ではユーザIDが違います。
usr.userName … usrのユーザ名を返す。
usr.name … usrの名前を返す。(res.nameと同じ。)
res.clientName … resが投稿されたクライアント名を返す。
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) … インデックスi(i+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,bbgはth.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)関連の改善
v2c.context.setPopupFocusable(true)でポップアップの文字列を選択できるようになります。)
v2c.context.thread等はnullになっています。)
スレッドオブジェクトthのレス表示タブが開いている場合、th.clearNewMark()で新着境界表示をクリアします。(レス表示タブが開いていない場合はth.resetUnread()を実行します。)
th.newMarkResCountはスレッドthの新着境界より後のレス数を返します。
bd.settingMapは板オブジェクトbdのSETTING.TXTをMap mとして返します。(mはnullの可能性があります。)例:2chのソフトウェア板の場合、m.get(null)、m.get('BBS_NONAME_NAME')はそれぞれ"software@soCCCncCosWvo"、"名無しさん@お腹いっぱい。"を返します。
v2c.browseURLDefExt(u) … URL u をデフォルト外部ブラウザで開く。注意:スクリプトに外部へのネットワーク接続の許可が必要です。(${SCRIPT:S})
v2c.boardsはV2Cに登録されている全板オブジェクトのArrayを返します。
スレッドオブジェクトthに対してth.lockはthのレス表示タブがロックされている場合にtrueを返します。(th.lockは代入により設定可能。)
th.close()でスレッドオブジェクトthのレス表示タブを閉じます。(レス表示タブが開いていない場合もエラーになりません。)
スレッドオブジェクトthに対してth.liveはthがdat落ちしていないと推測される場合にtrueを返します。
v2c.resLabels … V2Cで設定されているレスラベルのArrayを返します。
v2c.getResLabel(sn) … 名前がsnのレスラベル(存在しない場合はnull)を返します。
res.resLabel … レスresに設定されているレスラベル(設定されていない場合はnull)を返します。
res.setResLabel(rl) … レスresにレスラベルrlを設定します。rlがnullの場合はレスのラベルをクリアします。
res.setResLabelOfName(sn) … レスresに名前がsnのレスラベルを設定します。snがnullまたは空文字列の場合はレスのラベルをクリアしますが、それ以外で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を変更した時は「ファイル」メニューの「再読み込み」→「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)はレス表示タブのサイズが確定した時に実行されます。
注意:
"V2C\script\system\menu.js"(文字コードはUTF-8)でpopupMenuCreated(pm,sn)を定義してください。popupMenuCreated(pm,sn)はポップアップメニューが作成された時に実行されます。menu.jsを変更した時は「ファイル」メニューの「再読み込み」→「menu.js」で再読み込みすることができます。
pm … 作成されたポップアップメニュー(JPopupMenu)。
sn … 作成されたポップアップメニューの名前。
レス表示ポップアップメニューから「マーカーを引いたレスを抽出」を削除する例:
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.compSoundEnabledはtrueを返します。
v2c.browseURL(u),v2c.browseURLExt(u)に外部へのネットワーク接続の許可を必須にした。
bd.threadsWithLog … 板bd内のログのある全スレッドのArray(ログのあるスレッドが無い場合はlengthが0のArray)を返します。
v2c.copyFileInto(f,d) … ファイルfをフォルダdにコピーし、成功した場合にtrueを返します。フォルダdが存在しない場合には作成します。注意:ファイル読み書きの許可が必要です。(${SCRIPT:Frw})
v2c.copyFile(f0,f1) … ファイルf0をファイルf1にコピーし、成功した場合にtrueを返します。注意:ファイル読み書きの許可が必要です。(${SCRIPT:Frw})
bd.local … 板オブジェクトbdがローカル板の時にtrueを返します。
th.local … スレッドオブジェクトthがローカルスレッドの時にtrueを返します。
v2c.getLocalBoard(d) … フォルダがdのローカル板オブジェクト(該当するローカル板が存在しない場合はnull)を返します。
v2c.createResSeparator(s) … レスとレスの間に文字列sを表示するセパレータオブジェクトを作成します。セパレータオブジェクトは下のboard.createLocalThread(st,rl)で使用します。セパレータオブジェクトsepが表示する文字列はsep.text・sep.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.unreadがfalseを返すようになる。)
v2c.context.setCloseOnLinkClick(b) … bがfalseの時setPopupHTML()で表示したポップアップのリンクをクリックした時にそのポップアップを閉じません。(デフォルトはtrue。)またbがfalseの時redirectURL()によるポップアップはマウスポインタの位置に表示されます。
v2c.context.setDefaultCloseOnMouseExit(b) … setCloseOnMouseExit(b)のデフォルト値を設定します。スクリプトのどこかで一度実行しておくと、以後同じ値bのsetCloseOnMouseExit(b)を実行する必要がありません。
v2c.context.setCloseOnMouseExit(true) … setPopupTextやsetPopupHTMLで表示されたポップアップからマウスを外した時にそのポップアップを閉じます。
"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})。
マウスオーバーによってポップアップを表示する場合等に、同一のポップアップの複数表示を防止するために使用できます。
v2c.context.setPopupID(s) … setPopupTextやsetPopupHTMLで表示するポップアップに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ポップアップのサイズが増加する方向に変化した場合はポップアップのサイズを大きくするようにしました。
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()と同じ動作になりました。
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を返します。
スレッドオブジェクトthに対してth.styleFileは通常の掲示板ではth.styleDir\style.txtに、Twitterではth.styleDir\style_tw.txtになります。
checkRawText(res,cx)中で時間とIDのフィールドを取得できるようにした。
res.timeidで時間とIDを解析する前の文字列を取得します。
setPopupHTMLでポップアップした内容をポップアップメニューからコピーできるようにした。
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 を外部ブラウザで開く。
"V2C\script\system\rescheck.js"(文字コードはUTF-8)で必要な関数を定義します。ファイルを変更した時は「ファイル」メニューの「再読み込み」→「rescheck.js」で再読み込みすることができます。注意:スクリプト中で"_v2c_"で始まる名前は使用しないでください。
beginCheck(th,cx) … 他の関数より先に実行される。
th … スレッドオブジェクト。
cx … チェックに関する情報を保持するオブジェクト
cx.checkRawText … trueの場合テキスト置換関数checkRawText(res,cx)が各レスに対して実行される。実行を抑止したい場合はcx.setCheckRawText(false)を実行する。
cx.checkAA … trueの場合AA判定関数checkAA(res,cx)が各レスに対して実行される。実行を抑止したい場合はcx.setCheckAA(false)を実行する。
cx.checkNG … trueの場合NG指定関数checkNG(res,cx)が各レスに対して実行される。実行を抑止したい場合はcx.setCheckNG(false)を実行する。
cx.checkRawText・cx.checkAA・cx.checkNGは全てtrue、非表示の再チェック時はcx.checkNGのみtrue。
beginCheck(th,cx)の返り値がfalseまたはbooleanとしてfalseと評価される場合は以後の処理はスキップされます。
checkRawText(res,cx) … テキストの置換をするための関数。
res … レスオブジェクト。checkRawText(res,cx)中で有効なプロパティはnumber・index・name・mail・messageのみ。
res.setName(s) … 名前欄を文字列sに設定する。
res.setMail(s) … メール欄を文字列sに設定する。
res.setMessage(s) … 本文を文字列sに設定する。
cx … チェックに関する情報を保持するオブジェクト。cx.checkObjectでbeginCheck(th,cx)で返されたオブジェクトを取得することができます。
checkAA(res,cx) … AA判定をするための関数。
res … レスオブジェクト。
res.setAA(b) … bがtrueの場合このレスをAAレスと判定する。
cx … チェックに関する情報を保持するオブジェクト。cx.checkObjectでbeginCheck(th,cx)で返されたオブジェクトを取得することができます。
checkNG(res,cx) … 非表示判定をするための関数。
res … レスオブジェクト。
res.setNG(s)・res.setNG(s,t)・res.setNG(s,t,w) … このレスを非表示レスと判定する。
s … ラベル
t … trueの場合透明(デフォルト値はfalse)
w … ウェイト(-9≦w≦9、デフォルト値は0)
res.resetNG() … res.setNG()の非表示指定をクリアする。
res.weight … 非表示のウェイトを取得する。
cx … 判定に関する情報を保持するオブジェクト。cx.checkObjectでbeginCheck(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);
  }
}
レス読み込みの処理は以下のような順番になります。
beginCheck(th,cx) (cx.checkRawText・cx.checkAA・cx.checkNGがtrue)
checkRawText(th,cx)
checkAA(res,cx)
checkNG(res,cx)
endCheck(th,cx)
非表示の再チェックでは各レスに対してcheckNG(res,cx)だけが実行されます。
beginCheck(th,cx) (cx.checkNGがtrue)
checkNG(res,cx)
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>のみ。)
注意:
$SCRIPTのみ。コマンドの実行に必要な情報はv2c.contextオブジェクトから取得します。)
v2c.readURL()、v2c.alert()等。)
V2Cとのやりとりには変数v2cを使用します。
v2c.appDir … ランチャーのフォルダ(JWS版またはJARファイル直接起動の場合はnull)(javaのFileオブジェクト)
v2c.saveDir … V2C保存用フォルダ(javaのFileオブジェクト)
v2c.context … コマンドに関する情報を保持・設定するためのオブジェクト
v2c.resPane … レス表示ペインオブジェクト(2ペインモードでもnullではない)
v2c.beep() … beep音を鳴らす
v2c.setStatus(s)(または v2c.status = s) … ステータスバーにメッセージを表示する。スクリプトの実行が終了するとメッセージはクリアされるので、実行後もメッセージを残したい場合はv2c.context.setStatusBarText(s)を使用する。
v2c.alert(s) … ダイアログでメッセージsを表示する。
v2c.confirm(s) … 文字列sを「OK」・「Cancel」ボタン付きのダイアログに表示し、「OK」ボタンによりダイアログが閉じられた時のみtrueを返す
v2c.print(s) … sをスクリプトコンソールに追加する。(「表示」メニューの「スクリプトコンソール…」でスクリプトからのメッセージを出力するためのウィンドウが開く。スクリプトコンソールが開いていない時のメッセージは無視される。)
v2c.prompt(s,v) … 文字列sの下に初期値vの入力欄を表示し、「OK」ボタンによりダイアログが閉じられた時のみ入力欄の値を文字列として返す(その他の場合はnull)
v2c.println(s) … sをスクリプトコンソールに追加した後改行する。(同上)
v2c.getThread(u) … V2CがuをスレッドのURLと認識できる場合に対応するスレッドオブジェクトを返す。主に未取得スレッドのdatインポート用。
v2c.readURL(u) … u(URL文字列)の内容を取得する。プロトコルがHTTPでContent-Typeが"text/"で始まっている場合のみ内容が文字列として返される。
ファイル読み込み(ファイル読み込みの許可が必要 ${SCRIPT:Fr}):
v2c.readFile(f) … ファイルfをテキストファイルとして読み込んだ結果の文字列を返す(文字コードは適当に推測)
v2c.readFile(f,c) … ファイルfを文字コードcのテキストファイルとして読み込んだ結果の文字列を返す。
v2c.readStringFromFile(f) … v2c.readFile(f)と同じ
v2c.readStringFromFile(f,c) … v2c.readFile(f,c)と同じ
v2c.readLinesFromFile(f) … ファイルfをテキストファイルとして読み込んだ結果の文字列を行で分割したArrayを返す(文字コードは適当に推測、各行末の改行コードは削除される)
v2c.readLinesFromFile(f,c) … ファイルfを文字コードcのテキストファイルとして読み込んだ結果の文字列を改行で分割したArrayを返す(各行末の改行コードは削除される)
v2c.readBytesFromFile(f) … ファイルfの内容をバイト列(byte[])として返す
ファイル書き込み(ファイルが既に存在する場合は上書きされる。安全のためV2C保存用フォルダ(v2c.saveDir)直下のファイルへの書き込みはエラーになる。ファイル書き込みの許可が必要 ${SCRIPT:Fw}):
v2c.getScriptDataFile(fn) … スクリプトがデータを保存するためのパス(ファイル名はfn)をJavaのFileオブジェクトとして取得する。ファイルの場所はスクリプトフォルダ内の"scdata"フォルダ。
v2c.writeStringToFile(f,s) … ファイルfに文字列sを書き込む。(文字コードはデフォルトの文字コード。)
v2c.writeStringToFile(f,s,c) … ファイルfに文字列sを文字コードcで書き込む。
v2c.writeLinesToFile(f,sl) … ファイルfに文字列のArrayslを書き込む。(各行末には改行コードが追加される。文字コードはデフォルトの文字コード。)
v2c.writeLinesToFile(f,sl,c) … ファイルfに文字列のArrayslを文字コードcで書き込む。(各行末には改行コードが追加される。)
v2c.writeBytesToFile(f,bl) … ファイルfにバイト列bl(byte[])を書き込む。
コマンド実行(ファイル実行の許可が必要 ${SCRIPT:Fx}):
v2c.exec(s) … 文字列sをコマンドラインとして実行する。
v2c.exec(l) … lを引数のArrayとして実行する。lの最初の要素は実行ファイルへのパス。
選択テキスト関連(対象となるのは下の各関数が実行された時にキーボードフォーカスを持つテキスト入力コンポーネント。v2c.getSelectedText()はレス表示欄がキーボードフォーカスを持っている時はレス表示欄の選択テキストを返す。):
v2c.getSelectedText() … 選択テキストを取得
v2c.replaceSelectedText(s) … 選択テキストを置換文字列sで置換
v2c.contextからコマンドの実行に必要な情報を取得します。
v2c.context.argLine … 外部コマンド設定のスクリプトファイル名(とその後の空白)より後の文字列。(nullを返さずに""を返す。)
v2c.context.args … v2c.context.argLineを分割して作成した引数のArray(引数が存在しない時はnullを返さずにargs.length==0のArrayを返す。)
v2c.context.res … ポップアップメニューを表示した、またはマウスジェスチャを開始したレスオブジェクト
v2c.context.thread … スレッドに関する情報を保持するオブジェクト
v2c.context.link … リンクコマンドの対象リンクオブジェクト
v2c.context.links … 選択テキストに含まれるリンクオブジェクトのArray
v2c.context.selText … レス表示欄の選択テキスト
v2c.context.filteredResIndex … スクリプトが起動された時にレス表示欄に表示されていたレスのレス番号Array
v2c.context.checkedResIndex … スクリプトが起動された時にレス表示欄でチェックされていたレスのレス番号Array
v2c.context.setStatusBarText(s) … スクリプトの実行終了後に文字列sをステータスバーに表示
v2c.context.setClipboardText(s) … スクリプトの実行終了後に文字列sをクリップボードにコピー
v2c.context.setPopupText(s) … スクリプトの実行終了後に文字列sをポップアップ表示
v2c.context.setPopupHTML(s) … スクリプトの実行終了後に文字列sをHTMLとしてポップアップ表示する。注意:一部のGIFファイルを表示する時にCPU使用率が上昇したままになるという問題があります。
v2c.context.setPopupFocusable(b) … v2c.context.setPopupFocusable(true)を実行するとsetPopupText(s)・setPopupHTML(s)で表示したポップアップでキーボード入力ができるようになる。主にsetPopupHTML(s)で表示したフォームにキーボード入力する場合を想定している。
v2c.context.setMaxPopupWidth(n) … v2c.context.setPopupText(s)・v2c.context.setPopupHTML(s)のポップアップの最大幅をnに設定する
v2c.context.setRedirectURL(b) … スクリプト内で関数redirectURL(u)を定義しておきv2c.context.setRedirectURL(true)を実行すると、HTMLポップアップでリンクをクリックした時にredirectURL(u)(uはjavaのURLオブジェクト)が呼ばれます。redirectURL(u)がjavaのURLオブジェクトまたはURL文字列を返した場合に限りそのURLがWebブラウザで開かれます。
v2c.context.setTrapFormSubmission(b) … スクリプト内で関数formSubmitted(u,sm,sd)を定義しておきv2c.context.setTrapFormSubmission(true)を実行すると、HTMLポップアップでフォームを送信した時にformSubmitted(u,sm,sd)が呼ばれます。
v2c.context.closeOriginalPopup() … formSubmitted(u,sm,sd)内でv2c.context.closeOriginalPopup()を実行すると呼び出し元のポップアップウィンドウを閉じる。元のポップアップが既に閉じられている場合でもエラーにはならない
v2c.context.setFilteredRes(lr) … スクリプトの実行終了後lrで与えられたレスオブジェクトの列をレス表示欄で抽出して表示する。(レスは番号でソートした後重複を除いたものが表示されます。)
v2c.context.setFilteredResIndex(li) … スクリプトの実行終了後liで与えられた数字列をレスのインデックスとしてレス表示欄で抽出して表示する。(同上)
v2c.context.setPopupRes(lr) … lrで与えられたレスオブジェクトの列をスクリプトの実行終了後ポップアップ表示する。(同上)
v2c.context.setPopupResIndex(li) … liで与えられた数字列をレスのインデックスとしてスクリプトの実行終了後ポップアップ表示する。(同上)
v2c.context.setPostMessage(s) … スクリプトの実行終了後書き込み欄が開いていない場合は開き、書き込み欄の内容を文字列sで置き換える(レスポップアップから実行した場合は無視される)
v2c.context.insertToPostMessage(s) … スクリプトの実行終了後書き込み欄が開いていない場合は開き、書き込み欄のカーソル位置に文字列sを挿入する(レスポップアップから実行した場合は無視される)
スレッドオブジェクト th からスレッドに関する情報を取得します。未取得レス数は(th.resCount-th.localResCount)で、スレッド更新前のレス数は(th.localResCount-th.newResCount)で計算できます。
th.url … スレッドのURL(javaのURLオブジェクト)
th.title … スレッドタイトル
th.key … スレッドキー(文字列)
th.localFile … ローカルに保存されたログファイル(javaのFileオブジェクト)
th.localResCount … 既得レス数
th.resCount … th.localResCount、またはスレッド更新後に更新したスレ一覧にこのスレッドが含まれていた場合はそのレス数
th.newResCount … 新着レス数
th.speed … スレッドの1日当りのレス数
th.getRes(i) … インデックスがiのレスオブジェクト(nullの可能性がある)
th.styleDir … レス表示スタイルフォルダ(javaのFileオブジェクト)
th.board … 板に関する情報を保持するオブジェクト
th.update() … スレッドを更新する(外部へのネットワーク接続の許可が必要 ${SCRIPT:S})。実行にはth.update()の実行回数はスレ一覧の巡回数に加算され、残り巡回数が0の時は更新されない
update()はfalseを返す。
板オブジェクト bd から板に関する情報を取得します。
bd.url … 板のURL(javaのURLオブジェクト)
bd.key … 板キー(ソフトウェア板では"software")
bd.anonymousName … SETTING.TXTに設定されている名無し(存在しない場合は空文字列)
bd.allAnonymousName … SETTING.TXTに設定されている名無しとユーザが設定した名無しの列(存在しない場合はサイズ0の列)
レスオブジェクト res からレスに関する情報を取得します。name等で取得できる文字列はdatそのままではなく、レス表示欄に表示される文字列です。
res.number … レス番号
res.index … レス番号-1(最初のレスでは0)
res.name … 名前欄
res.mail … メール欄
res.date … 投稿時刻
res.time … 1970/01/01から投稿時刻までの経過時間(ミリ秒単位)、計算できない場合は0
res.id … ID
res.beID … BeのID(基礎番号)、存在しない場合は0
res.aux … 補助情報(まちBBSのIP等)
res.message … 本文
res.ng … レスが非表示の場合にtrue
res.refCount … 被参照数
res.idCount … 同じIDを持つレスの総数(スレッド内)
res.links … 本文に含まれるリンク(リンクオブジェクトの列)
res.refResIndex … レスを参照しているレスのレス番号のArray(参照しているレスが存在しない場合はnull)
リンクオブジェクト lnk のプロパティ
lnk.url … リンクのURL(javaのURLオブジェクト)
lnk.imageCacheFile … リンクの画像キャッシュファイル(キャッシュが存在しない場合はnull)(javaのFileオブジェクト)
レスペインオブジェクト rp のプロパティ
rp.tabCount … 開いているタブの数
rp.selectedIndex … 選択されているタブのインデックス
rp.selectedThread … 選択されているタブのスレッドオブジェクト
rp.getThread(i) … インデックスi(i+1番目)のタブに表示されているスレッドオブジェクト
rp.threads … レス表示ペインに表示されているスレッドオブジェクトのArray(レス表示タブが表示されていない場合はサイズ0のArrayを返す。Arrayの各要素はnullではない。)
デフォルトではスクリプトはSandBox内で実行され、例えばローカルファイルの読み込みを実行しようとすると例外が発生しスクリプトの実行が停止します。スクリプトにデフォルトで許可されていない動作を許可するには外部コマンド設定で最初の$SCRIPTを${SCRIPT:X}(Xは以下の文字を結合したもの)に変更します。
A … 以下の項目全てを許可。(FPSTと同等。)
F … ファイルに関する許可。Fに続いて以下の小文字を指定する。
r … ファイルの読み込みを許可。
w … ファイルへの書き込みを許可。
x … ファイルの実行を許可。
d … ファイルの削除を許可。
Fだけが指定された場合はFrwxdと同等。
P … Javaのシステムプロパティの読み取りを許可。
S … 外部へのネットワーク接続を許可。(v2c.readURL()だけは例外的にこのパーミッション無しに外部と接続できる。)
T … AWT(ウィンドウシステム)に関する許可。Tに続いて以下の小文字を指定する。
c … クリップボードへのアクセスを許可。
t … ウィンドウを常に前面に表示する設定(setAlwaysOnTop)を許可。
w … 右側に'!'マークを表示しないウィンドウの表示を許可。
Tだけが指定された場合はTctwと同等。
R … その他の許可。Rに続いて以下の小文字を指定する。(v2.7.0以降)
x … V2Cの終了を許可。
Rだけが指定された場合はRxと同等。(注意:将来項目追加の可能性があるのでRだけの指定はお勧めできません。)
スクリプトから外部のファイルの実行を許可する例: ${SCRIPT:Fx} exec.js
コマンドはV2Cとは別のプロセスで実行されます。
v2c.exec(s) … 文字列sをコマンドラインとして実行します。
v2c.exec(l) … lを引数のArrayとして実行します。lの最初の要素は実行ファイルへのパスを指定してください。
外部のファイルの実行には外部コマンド設定での許可が必要です。(前項参照)
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)が呼ばれます。
u … URL
sm … 'GET'または'POST'の文字列
sd … FORMのデータ
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オブジェクトを作成します。
v2c.createHttpRequest(u) … URLuをGETするHttpRequestオブジェクトを作成する。
v2c.createHttpRequest(u,d) … URLuに対してデータdをPOSTするHttpRequestオブジェクトを作成する。(dはそのまま送信されるので適切にencodeされている必要がある。)
HttpRequestオブジェクトhrのメソッド・プロパティは:
hr.setRequestProperty(n,v) … 名前nのリクエストヘッダフィールドに値vを設定する。
hr.getContentsAsBytes() … URLuから取得した内容(Javaのバイト列 byte[])
hr.getContentsAsString() … hr.getContentsAsBytes()を文字列に変換したもの
hr.responseCode … HTTPレスポンスコード
hr.responseMessage … HTTPレスポンスメッセージ
hr.contentType … Content-Typeの値
hr.date … Dateの値(1970/01/01からの経過時間(ミリ秒単位))
hr.lastModified … Last-Modifiedの値(1970/01/01からの経過時間(ミリ秒単位))
hr.allResponseHeaders … 全レスポンスヘッダ(JavaのMap)
hr.getResponseHeader(n) … 名前nのレスポンスヘッダフィールドの値(同名のフィールドが複数存在した場合は最後の値)
setRequestProperty(n,v)はgetContentsAs*()の前に、その他はgetContentsAs*()の後に実行する必要があります。
注意:HttpRequestオブジェクトを使用するにはスクリプトに外部へのネットワーク接続の許可が必要です。(${SCRIPT:S})
インポート先のスレッドオブジェクトは、v2c.getThread(u)で取得できます。
th.importDatFile(f) … ファイルfをインポート
th.importDatBytes(bl) … Javaのバイト列(byte[])blをインポート
例(エラー処理は省略):
// ${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());