!!!XML-RPCインターフェース version2 !!目的 *FSWikiにおいてXML-RPCによるデータのやりとりを可能にする *上とは全然関係ないのですが、Web上のテキストをクリック一つ(から二つ)でWikiに書き込めるようなツールの提供 !!ファイル構成 !主要ファイル :wiki_xmlrpc.cgi:サーバCGI。wiki.cgiと同じディレクトリに設置します。 :lib/WikiAPI.pm:APIスーパークラス。 :lib/WikiAPI/FSWiki.pm:FSWiki用モジュール(WikiAPI::ModFSWiki)を呼び出すためのサブクラス :lib/WikiAPI/ModFSWiki.pm:WikiAPI.pmとWiki.pmを取り持つアダプタみたいなもの :lib/WikiAPI/LinkParser.pm:linkList(後述)用のパーサ :lib/WikiAPI/FSWiki/Introspection.pm:イントロスペクション用ファイル !CPANモジュール群 *SOAP *XML *XMLRPC を利用しています。Perl5.00503、5.8、5.8 with mod_perl(Apache::Registry)で動作確認しています。lib以下にいれます。 !おまけ :wikigate.cgi:WikiMod.pmを利用した簡易インターフェース(XML-RPCとは関係ありません)。wiki.cgiと同じディレクトリに置きます。 !!設置方法  ファイルを展開して、稼働中のwikiディレクトリに一式入れます。標準で3.5.3以降対応ですが、一行書き直すだけで3.5.2でも動作するでしょう。 !!WikiAPI::FSWikiで使用可能API  下記以外にも一応インターフェースはありますが、FSWikiにはページのバージョンという概念がないと思うので、実装していません。また、ページのバージョンに関するデータは1を、ページの作者については空文字を返します。 array wiki.getRecentChanges( Date timestamp [,utf8 farmname] ) timestamp(UTC)以降変更されたページのリストを返します。WikiFarmに対応するため、第二引数(wikifarm名)をとれます。 戻り値:構造 { name, lastModified, author, version } の配列リファレンス(nameはutf8でエンコードされています。authorは常に空文字、versionは常に1)。 int wiki.getRPCVersionSupported() 戻り値:このAPIのバージョンを返します。 utf8 wiki.getPage( String pagename ) ページのソースを返します。ページにコロン':'が入っているとコロンより前部分がWikiFarmのパスになります。('farmname:pagename') 戻り値:ソーステキスト utf8 wiki.getPageHTML( String pagename ) HTMLレンダリングされたページを返します。ページにコロン':'が入っているとコロンより前部分がWikiFarmのパスになります('farmname:pagename')。 戻り値:レンダリング済みテキスト array wiki.getAllPages( [utf8 farmname] ) 全ページのリストを返します。WikiFarmに対応するため第二引数にFarm名をとれます。 戻り値:配列リファレンス(ページ名はutf8でエンコードされています)。 struct wiki.getPageInfo( utf8 pagename ) ページ情報を返します。 戻り値:構造 { name, lastModified, author, version }(nameはutf8でエンコードされています。authorは常に空文字、versionは常に1)。 array wiki.listLinks( utf8 pagename ) 与えられたページの全リンクを返します。 戻り値:構造 { page, type, href } の配列リファレンス(pageはリンク先の名前(utf8でエンコード)かURLです。typeはexternal(外部)かlocal(内部)hrefはリンク先のHREF)。 boolean wiki.putPage( utf8 pagename, utf8 content, struct attributes ) ページに内容を書き込みます。pagenameにコロン(:)を含めると前部分がWikiFarm名になります。pagenameはutf8でエンコードされている必要があります。現在の所、attributesで「下げ」指定ができます。{ minoredit => 0|1 } また、attributesにid,passを設定することで、ログインユーザとして書き込むことができます。 戻り値:成功時1、それ以外は0 !!wikigate.cgi用のパラメータ  主にWikiAPI::WikiModを利用するだけなので、XML-RPCとは関係ない代物です。 wikigate.cgi?method=addPage&page=Memo&sage=1&content=ほにゃらら などとやりますと、Memoというページにタイムスタンプを更新することなくテキストを追加できます。で、これを利用して[bookmarklet|http://bookmarklet.daa.jp/]をつくったりとかしたら便利かなあと。一応IE用に一つテスト用ファイルが含まれています。 :method:呼び出したい手続き名。APIと同じ名前を持ちますが、大文字小文字は関係有りません。また、addpageという値もとることができ、これはputpageと違い、既存のページに追加をします。自動で追加データの前に改行されます。 :page:ページ名。ページ名に':'をつけることで、コロンの前の部分がWikiFarm名になります。 :farm:WikiFarm名。このパラメータはrecentchanges、getallpagesに対してのみ有効です。 :day:recentchangesにおいて指定する過去の日数。day=3なら3日前からの更新ページの一覧が表示されます。 :sage:真値を設定することで、putpage、addpageにおけるタイムスタンプを更新しなくなります。 :add:真値を設定することで、putpageの場合でも追加書き込みにする。 :content:putpage、addpageで書き込むデータ。 :id:ログインユーザしか書き込めない設定の場合にputPage、addPageで使用するユーザid。 :pass:ログインユーザしか書き込めない設定の場合にputPage、addPage時で使用するパスワード。 !!注意 *wiki_xmlrpc.cgiを使用する際、XS版のJcode::Unicodeを利用しないと、レンタルサーバでは動かない可能性があります。 *wikigate.cgiからの利用だけなら、utf8を使わないのでたぶん大丈夫でしょう。 *管理者にしか見られないページは、見られません。 *wiki_xmlrpc.cgiが利用しているXML::Parser::Liteは公式にはPerl5.6以降対応となっているのですが、5.00503でも動作することを確認しています(必ずしも動くわけではないかもしれません)。[参照|http://www.semblog.org/msano/archives/000258.html] *3.5.2で利用する際は、WikiMod.pmのDESTROYDメソッドの一行をコメントアウトしてください。 sub DESTROY{ # ↓この一行をコメントアウト # $_[0]->exit(); # before 3.5.2, this must be commented out }