外部コマンドで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());