ホームへ

2++拡張プラグイン仕様書

2++plugin Copyright (C) 2003, UK-taniyama.
第2版 r0.0.3

はじめに

 2++の拡張用plugin仕様書です。
 pluginは,nakkaさん作成のnScriptを利用しています。
 拡張子はns2,保存先は%log%/#としています。
 本仕様書は,2++ v0.6.9.7β以降をサポートしています。
プラグイン一覧も参照してください。
blog-プラグイン一覧も参照してください。
テスト用プラグイン一覧も参照してください。

2pluginヘッダ

ファイルの先頭の「//#」形式のコメントを2pluginヘッダとして利用します。
以下の項目を認識します。
//#INFO<tab>2++pluginの簡単な説明
//#VER<tab>バージョン番号(整数値)
//#AUTH<tab>作成者名
//#MAIL<tab>メール
//#COPY<tab>著作権
//#CATE<tab>板を挿入するカテゴリ
//#BRD<tab>ホスト名<tab>BBS<tab>BBSの説明
//#HLP<tab>説明

BBS-plugin 処理概要

 BBS機能を提供するプラグインです。
 
@板を表示するとき,issupportを実行し,選択された板を処理するpluginか判定。
 
A板の更新が実行されたとき,board_urlを実行し,板URLを取得。
Bboard_urlが返したURLに対して,HTTPリクエストを発行。
Cサーバからの応答に応じて,board_readを実行。
Dboard_readでは,応答結果からスレッドを検索し,thread_addを実行して登録する。
 
Eスレの更新が実行されたとき,thread_urlを実行し,スレURLを取得。
Fthread_urlが返したURLに対して,HTTPリクエストを発行。
Gサーバからの応答に応じて,thread_readを実行。
Hthread_readでは,応答結果からスレッドを検索し,message_addを実行して登録する。
 
と,いうことですが,出自が2chなのでこんな説明になっています。
標準のnewsサポートでは,板=記事一覧,スレ=記事と対応させています。また,スレには,複数発言あるのですが,newsサポートでは,スレ(=記事)に対して,1件の発言を対応させています。

blog-plugin 処理概要

 [!rss]にて[plugin]をチェックしたときに利用するプラグインです。
 blogの記事を解析する機能を提供します。
 ファイル名は,blog_ではじめてください。
 
@ファイル名をblog_xxxx.ns2とする。
 
A記事取得時に,blog_readを実行。
Bblog_readでは,記事を解析し,1を返却する。

BBS-plugin 拡張用関数

 pluginが用意すべき関数です。
 ★がついたのは必須です。

pluginがサポートしている?★ - issupport(host,bbs)

hostホスト名
bbsBBS名
戻り値!0:サポートしている。

漢字コード - char_set

戻り値0:SJIS,1:JIS,2:EUC,3:UTF8

EUCコードを入力とする? - iseuc()

戻り値!0:EUCコード。0:SJISコード(デフォルト)。

JISコードを入力とする? - isjis()

戻り値!0:JISコード。0:SJISコード(デフォルト)。
※iseuc優先です。

UTF8コードを入力とする? - isutf8()

戻り値!0:UTF8コード。0:SJISコード(デフォルト)。
※isjis・iseuc優先です。

News形式? - isnews()

戻り値!0:News形式(デフォルト)。0:BBS形式。
形式の相違はだいたい以下の通りです。
形式News形式BBS形式
スレッドのダウンロード1回無限
自動未読可(autonewsdown時)不可
番号リンクなしあり
※発言(=記事)が増えたり,変わったりしない場合には,News形式を指定するとよいでしょう。

番号リンク利用? - isnumlink()

戻り値!0:番号リンクあり(BBS形式デフォルト)。0:番号リンクなし(News形式デフォルト)。

固定フォントで表示 - isfixedfont()

戻り値!0:固定フォント。0:可変フォント(デフォルト)

板URLの取得★ - board_url(host,bbs)

hostホスト名
bbsBBS名
戻り値!0:板のURL
※詳細は,_config.ns2をご覧ください。

スレッドURLの取得★ - thread_url(host,bbs,key,num)

hostホスト名
bbsBBS名
keyスレッドの識別子
num開始番号(!isnews()のみ)
戻り値!0:板のURL

板の読み込み★ - board_read()

板(=記事一覧)の情報を解析して,スレッド(=記事)への情報をthread_add()を実行して登録してください。

スレッドの読み込み★ - thread_read()

スレッド(=記事)の情報を解析して,発言をmessage_addを実行して登録してください。
発言は1件であることが多いですが,複数回実行してもかまいません。

巡回可能? - cancruise()

戻り値0:巡回不可,1:巡回可能(デフォルト)
板一覧で板を巡回するか否かを指定します。

発言可能? - canpost()

戻り値0:発言不可(デフォルト),1:発言可能
発言を投稿できるか否かを返します
発言は,message_postで投稿します。

メッセージの投稿 - message_post(name,mail,message)

name名前
mailE-mail
mesage本文

設定変更 - config()

設定を変更するときに実行します。

BBS-plugin登録用関数

解析した結果を2++に登録するための関数です。
board_readではthread_addを,thread_readではmessage_addを実行することを期待しています。
#チェックを行っていないので,別の関数を実行すると予期せぬ結果になります。

スレッドの登録 - thread_add(title,dat)

板を解析(board_read)して発見したスレッドをthread_addを実行して登録します。
titleスレッド(=記事)のタイトル
datスレッドのdat情報
戻り値!0:板のURL

スレッドの登録 - thread_add(title,dat,name,mail,date,message)

スレッドとメッセージの登録を一緒に登録します。
titleスレッド(=記事)のタイトル
datスレッドのdat情報
nameメッセージのタイトル
mailメールアドレス(必要なければ0でよい。)
date日付
message発言内容
戻り値!0:板のURL

メッセージの登録 - message_add(name,mail,date,message,title)

nameメッセージのタイトル
mailメールアドレス(必要なければ0でよい。)
date日付
message発言内容
titleスレッドのタイトル
messageでは,<br>・<font color>・<b>のみ指定可能です。

HTMLから変換 - html2dat()

2ch形式のHTMLを入力として,変換して読み込みます。

板情報を追加 - board_add(category,host,bbs,title)

categoryカテゴリ
hostホスト
bbsBBS
titleタイトル

無変換 - read_through()

何も変換せずに,読み込みます。
board_readで2ch形式のsubject.txt,または,thread_readで2ch形式のdatのとき,この関数を実行してください。

blog-plugin 拡張用関数

板の読み込み★ - blog_read()

blogの記事を解析して,blogの情報を設定します。
 
戻り値0:解析失敗,1:解析成功

blog-plugin プロパティ関数

関数説明
blog_feed()GSblogのfeed-URL
blog_generator()Gblogの作成
blog_author(v)Sblogの著者
blog_date(v)Sblogの時間
blog_message(v)Sblogの本文
blog_title(v)Sblogのタイトル
blog_trackback(v)Sblogのトラックバック
記事は以下のように表示されます。
%blog_date%
%blog_title%(%blog_author%)
[feed] [trackback]
%blog_message%

htmlのmeta情報参照 - blog_meta(name)

metaタグのname属性を引数に指定したとき,content属性を返却します。
namemetaタグのname属性
戻り値metaタグのcontent属性
※generatorは,blog_generatorで参照可能。

htmlのlink情報参照 - blog_link(name)

linkタグのtype属性を引数に指定したとき,href属性を返却します。
namelinkタグのtype属性
戻り値linkタグのhref属性
※application/atom+xml(application/rss+xml)は,blog_feedで参照可能。

RDFの解析- blog_parse_rdf([comment])

HTML内のコメントに埋めこまれた,rdf:Descriptionの情報を解析します。
属性プロパティ関数
trackback:pingblog_trackback
dc:titleblog_title
dc:creatorblog_author
dc:dateblog_date
commentコメント。省略した場合,コメントタグを検索して,解析します。
戻り値0:解析失敗。1:解析成功。

情報取得用関数

 board_read・thread_read・blog_read実行中に接続先の情報を取得するのに利用します。
関数説明
url()URL
host()ホスト名(board_url・thread_urlのhost引数と同じ)
bbs()BBS名(board_url・thread_urlのbbs引数と同じ)
key()スレッドの識別子(thread_urlのbbs引数と同じ)
num()開始番号(thread_urlのnum引数と同じ)

HTTP関数

 httpのリクエストを発行する時に利用する関数です。
#2pdkは,未対応です。

GET - http_GET(url,func)

urlhttpで受信するurlを指定する。相対URLも指定可能。
func解析用関数名。
戻り値funcの戻り値。
※解析用関数には,status-codeを渡します。
※解析用関数で返した文字列が,http_GETの返り値となります。
※詳細は,tenki.ns2をご覧ください。

POST - http_POST(url,query,func)

urlhttpで受信するurlを指定する。相対URLも指定可能。
queryクエリ文字列をハッシュ形式で指定します。
func解析用関数名。
戻り値funcの戻り値。
※解析用関数には,status-codeを渡します。
※解析用関数で返した文字列が,http_POSTの返り値となります。
※詳細は,megabbs.ns2をご覧ください。

2.ini用関数

 2.iniから設定値を参照・設定する関数です。
#2pdkでは,2pdk.iniを利用します。

設定値を参照 - ini_get(section,entry,value)

sectionセクション
entryエントリ
valueデフォルト値(省略可)

設定値を設定 - ini_set(section,entry,value)

sectionセクション
entryエントリ
value

設定値を削除 - ini_clear(section[,entry])

sectionセクション
entryエントリ(省略可)

HTML解析用関数

サーバから取得したHTMLの内容を解析するための関数です。

HTMLの要素の種類

HTMLの各要素を以下の定数値で定義しています。
※これらの値は,2++の中で定義しています。
HTML_ERROR0エラーがあった
HTML_START_DOCUMENT1HTMLの最初(初期状態)
HTML_END_DOCUMENT2HTMLの最後(終了状態)
HTML_TEXT3テキスト要素
HTML_COMMENT4コメント
HTML_START_TAG5開始タグ
HTML_END_TAG6閉じタグ

html_next - 次の要素へ移動

この関数を利用して,HTML内の要素を順次解析します。
戻り値要素の種類

html_isend - HTMLの終端か否か

戻り値1:HTMLの終端(HTML_ERROR,または,HTML_END_DOCUMENT)

html_text - テキスト要素の取得

戻り値テキスト(HTML_TEXTの時のみ有効)
※html_plainと異なり&lt;等<に変換される。

html_plain - 生テキスト要素の取得

戻り値生テキスト(HTML_TEXTの時のみ有効)
※html_textと異なり&lt;等がそのまま得られる。

html_tag - タグ名の取得

戻り値タグ名(HTML_START_TAG・HTML_END_TAGの時のみ有効)

html_attr(name) - 属性の取得

戻り値属性(HTML_START_TAGの時のみ有効)

html_comment(name) - コメントの取得

戻り値コメント(HTML_COMMENTの時のみ有効)
※<!-- comment -->のとき<!と>だけ除去され-- comment --が返ります。

html_go(value,count) - 取得

value検索する要素の値
count検索する回数(省略可)
戻り値1:見つかった。0:見つからずに終了した。
valueの書式は以下のとおりです。
開始タグ<tag[@attr[=value]]>
終了タグ</tag>
コメント<!value>
文字列value
※html_go( "<div>")とすると,<div>に移動します。
※html_go( "<div@class=text>")とすると,<div class=text>に移動します。
※html_go( "<div>",2)とすると,2個目の<div>に移動します。

html_go(type,value) - 移動

type検索する要素の種類
value検索する要素の値(省略可)
戻り値1:見つかった。0:見つからずに終了した。
※たとえば,<a>に移動するには,html_go(HTML_START_TAG,"a")と指定します。

html_pull(value) - 取得

指定した位置までテキスト形式に変換して取得します。
value検索する要素の値
戻り値見つかった位置までのテキスト値。
valueの書式は以下のとおりです。
開始タグ<tag[@attr[=value]]>
終了タグ</tag>
コメント<!value>
文字列value
※html_pull( "<div>")すると,<div>までのテキストを取得します。
※html_pull( "<div@class=text>")すると,<div class=text>までのテキストを取得します。

html_pull(type,value) - 取得

指定した位置までテキスト形式に変換して取得します。
type検索する要素の種類
value検索する要素の値(省略可)
戻り値見つかった位置までのテキスト値。
※「<b>太</b><i>斜</i></a>」に対して,html_pull(HTML_END_TAG,"a")を指定すると,「太斜」というテキストが取得できます。

html_resolve(url) - URL解決

解析中のHTML内の相対URLを絶対URLに解決します。
url相対URL
戻り値絶対URL

ダイアログ用関数

 ダイアログを操作するための関数です。情報は,iniファイルに保存します。

ダイアログを作成する - dlg_new([section,[label]])

section値を保持するセクション名(省略時プラグイン名)
label表示するダイアログ名(省略時プラグイン名)
戻り値ダイアログオブジェクト

ダイアログを表示する - dlg_show(dlg)

dlgダイアログオブジェクト

ダイアログの文字列値 - dlg_str(dlg,entry[,label])

dlgダイアログオブジェクト
entry値のエントリ名
label値の説明(省略時entry)

ダイアログのパスワード - dlg_password(dlg,entry[,label])

dlgダイアログオブジェクト
entry値のエントリ名
label値の説明(省略時entry)

ダイアログの数値 - dlg_int(dlg,entry[,label])

dlgダイアログオブジェクト
entry値のエントリ名
label値の説明(省略時entry)

ダイアログのブール値 - dlg_bool(dlg,entry[,label])

dlgダイアログオブジェクト
entry値のエントリ名
label値の説明(省略時entry)

ダイアログの選択 - dlg_select(dlg,entry,label[,option]+)

dlgダイアログオブジェクト
entry値のエントリ名
label値の説明
option+選択肢(複数指定)

ダイアログのセパレータ - dlg_separator(dlg[,label])

dlgダイアログオブジェクト
labelラベル

プロパティシートの作成 - sheet_new([section,[label]])

section値を保持するセクション名(省略時プラグイン名)
label表示するダイアログ名(省略時プラグイン名)
戻り値プロパティシートオブジェクト

プロパティページの作成 - page_new(sheet,label)

 プロパティシートオブジェクトに対して,page_new()を実行して,プロパティページオブジェクト(=ダイアログオブジェクト)を取得してください。
 取得したプロパティページオブジェクトに対して,ダイアログ関数を実行して,ページの内容を設定してください。
sheetプロパティシートオブジェクト
labelプロパティページのタイトル
戻り値プロパティページオブジェクト(=ダイアログオブジェクト)

プロパティシートの表示 - sheet_show(sheet)

sheetプロパティシートオブジェクト

擬似スレッド

スレッド一覧に表示されるが,巡回せずに特殊な動作を行う擬似スレッドがあります。
※詳細は,_config.ns2をご覧ください。

?$%name% - 文字列入力

文字列の入力を行う擬似スレッドです。
  1. 現在の値は,my_get(%name%)で参照できます。
  2. タイトルには,:を含めてはいけない。
  3. タイトルは,%title%:%現在の値%の形式で表示します。

?#%name% - 数値入力

数値の入力を行う擬似スレッドです。
制限事項は,以下のとおりです。
  1. 現在の値は,my_get(%name%)で参照できます。
  2. タイトルには,:を含めてはいけない。
  3. タイトルは,%title%:%現在の値%の形式で表示します。

??%name% - トグル切り替え

ブール値のトグル動作の擬似スレッドです。
  1. 現在の値は,my_get(%name%)で参照できます。
  2. タイトルには,:を含めてはいけません。
  3. タイトルは,%title%:%現在の値%の形式で表示します。

?!%name%[:%param%] - 関数実行

プラグイン内の関数を実行します。

謝辞

補足

 要望・バグレポートは以下のところに連絡してください
mailto:QVE00513@nifty.com

履歴

2004-08-29 第2版 r0.0.3
2004-08-27 第2版 r0.0.2
2004-08-22 第2版 r0.0.1
2004-08-09 第1版 r0.0.13
2004-01-02 第1版 r0.0.12
2003-12-20 第1版 r0.0.11
2003-11-11 第1版 r0.0.10
2003-10-13 第1版 r0.0.9
2003-09-13 第1版 r0.0.8
2003-07-31 第1版 r0.0.7
2003-07-21 第1版 r0.0.6
2003-07-21 第1版 r0.0.5
2003-07-20 第1版 r0.0.4
2003-07-20 第1版 r0.0.3
2003-07-16 第1版 r0.0.2
2003-07-15 第1版 r0.0.1
2003-07-07 α17版
2003-07-06 α16版
2003-06-22 α15版
2003-06-21 α14版
2003-06-17 α13版
2003-06-16 α12版
2003-06-14 α11版
2003-06-09 α10版
2003-06-08 α9版
2003-06-07 α8版
2003-06-04 α7版
2003-06-02 α6版
2003-06-01 α5版
2003-05-29 α4版
2003-05-28 α3版
2003-05-25 α2版
2003-05-22 α1版

付録

2pdkについて

2++plugin developers kitで,2++プラグインの関数をテストするためのツールです。
board-htmlboard_readで解析するhtmlファイル(SJIS)を指定します。
thread-htmlthread_readで解析するhtmlファイル(SJIS)を指定します。
[tree]htmlファイルを木構造で表示します。
2+plugin2++プラグインのファイルを指定します。
[info]2++プラグインのヘッダを表示します。
hostboard_url・thread_urlのhostパラメタを指定します。
bbsboard_url・thread_urlのbbsパラメタを指定します。
keyboard_url・thread_urlのkeyパラメタを指定します。
[next]2++プラグインの#BRDヘッダの情報をhost・bbsに設定します。実行前に[info]を実行してください。
urlurl()の値を設定します。
[exec]urlのurlをIEで開きます。
[board_url]board_url関数を実行します。
[board_read]board_read関数を実行します。
[thread_url]thread_url関数を実行します。
[thread_read]thread_read関数を実行します。
[copy]エディットボックスの内容を転送します。[tree]後に実行するとよいでしょう。
[exit]終了します。エディットの内容をカレントディレクトリの2pdk.iniに保存します。

2pdkの簡単な使い方

@作りたいプラグインの一覧htmlと記事htmlのurlを確かめます。
A解析する一覧htmlと記事htmlをSJIS形式で用意して,board-html・thread-htmlに指定します。
Bベースとするsample.ns2をもとに,新しいプラグインファイルを作成し,2+pluginに指定します。
Cプラグインファイルの2pluginヘッダの情報に@のurlを元にいろいろ入れてあげます。
D#BRDに書いた情報を受理するようにissupportを作ります。
E解析する頁構成に応じて,iseuc・isjis・isnews・isnumlinkを調整します。
Fboard_urlの確認。[info][next][board_url]の順に押して,urlに@のurlが入るか確認します。だめだったら,function board_urlを調整しましょう。
Gboard_readの確認。

pluginの基礎

同梱しているsample.ns2や,公開されているプラグインのソースを参考にすると良いでしょう。
ただし,複雑なことをやってるのもあるので,ニュース形式の簡単なものの作り方を簡単に記述します。

もっとも簡単なboard_read

<a>タグで囲まれた,文字列をタイトルとして登録するには,↓の用にします。
while( html_go( HTML_START_TAG, "a")){
  href = html_attr( "href");
  title = html_pull( HTML_END_TAG, "a");
  thread_add( title, href);
}
hrefの唯一性は保証しているので,何も考えずにつっこんでも大丈夫です。

ちょっと賢いboard_read

これでは,余分なリンクを拾ってしまうことがあるので,フィルタリングします。
フィルタリングの方針としては,以下のような方針があります。
 一覧の前に,決まったコメントがあったり,決まったタグがあったりする場合には,html_go()関数ではじめに移動するとよいです。
 たとえば,<!-- list -->であれば,html_go(HTML_COMMENT,"-- list --")することで,一気に移動できます。
 <li><a>のように,箇条書きになっているところもあります。この場合,<a>タグで回すのではなく,<li>タグでまわすほうがよいです。
while( html_go( HTML_START_TAG, "li")){
  if( html_next()!=HTML_START_TAG || html_tag()!="a") continue;
  //ここには,<li><a>の時来る。
  href = html_attr( "href");
  title = html_pull( HTML_END_TAG, "a");
  thread_add( title, href);
}
 もしくは,
while( html_go( HTML_START_TAG, "li")){
  if( !html_go( HTML_START_TAG, "a")) continue;
  //ここには,<li><a>の時来る。
  href = html_attr( "href");
  title = html_pull( HTML_END_TAG, "a");
  thread_add( title, href);
}
の用にします。
2つの違いは,必ず連続してるか,連続してないこともあるかの違いです。
構成がどの程度かっちりしているかによって,判断します。
#多くの場合,下の方法で問題ないです。上の方法だと,空白文字があったりしても弾かれます。
 記事のURLの形式が決まっている場合,URLと文字列マッチングをして確認するのが良い場合もあります。
 たとえば,ローカルの絶対パスのみ有効とするには,'/'で始まっていればよいので,
  if( left( href, 1)!="/") continue;
のようなフィルタリングが利用できます。
 また,".html"でなければならないときは,
  if( right( href, 5)!=".html") continue;
です。
 他には,正規表現を使って,マッチングを取る方法もありますが,そのへんは適宜ということで。

もっとも簡単なthread_read

記事のタイトルと本文さえあればいいので,…<title>タイトル</title>…<body>本文</body>…の形式であれば,↓の用にします。
if( !html_go( HTML_START_TAG, "title")) return;
title = html_pull( HTML_END_TAG, "title");
if( !html_go( HTML_START_TAG, "body")) return;
message = html_pull( HTML_END_TAG, "body");
message_add( title, 0, " ", message, title);

賢くするには…

賢くするには,いろいろな方法があります。
 
まず,message_addでは,一部のhtmlタグをサポートしています。
これらをつかって,見栄えを調整することができます。
 
つぎに,board_readの説明に示したとおり,html_go()・html_pull()を使って,必要な部分を切り出すことを考えましょう。
その他,いろんなことをしたい場合には,公開されているpluginも参照してください。

2chリンク

階層的なリンク構造を実現するために,2chリンクが使えます。
2chリンクにはいろいろな形式がありますが,プラグインでは,p:/<host>/#@#/<bbs>/<key>の形式を利用するとよいでしょう。
これをはっておくと,板(<host>,<bbs>)に,スレ(<host>,<bbs>,<key>)が追加されます。

ホームへ
更新日:2004-12-26 QVE00513@nifty.com inserted by FC2 system