PyukiWiki仕様書（仮）

        "PyukiWiki" ver 0.2.1-beta4-dev1 $$
        Copyright (C) 2005-2012 PukiWiki Developers Team
        Copyright (C) 2004-2012 Nekyo (Based on PukiWiki, YukiWiki)
        License: GPL version 3 or (at your option) any later version
        and/or Artistic version 1 or later version.
        Based on YukiWiki http://www.hyuki.com/yukiwiki/
        and PukiWiki http://pukiwiki.sfjp.jp/
        URL:
        http://pyukiwiki.info/

        MAIL:
        <nanami (at) daiba (dot) cx> (注：バーチャル女の子です)

        $Id$
        This text file written UTF-8 Codeset

目次

  • PyukiWiki仕様書（仮）
  • 目次
  • 注意
  • CGI起動
  • ディレクトリ構成
  • 主な本体ファイル構成
  • 主なperlモジュール構成
  • 主なExplugin構成
  • 主なプラグイン構成
  • explugin仕様情報
      □ 初期化
      □ 有効になっているexpluginの強制読み込み
      □ リソースの読み込み
      □ JavaScript、CSSの読み込み
      □ 初期化時の返り値（ハッシュ）
  • プラグイン仕様情報
      □ 初期化
      □ リソースの読み込み
      □ JavaScript、CSSの読み込み
      □ inlineメソッド
      □ convertメソッド
      □ actionメソッド
      □ actionメソッドの返り値（ハッシュ）
  • 内部変数仕様情報
  • JavaScript関数仕様一覧
      □ ua
      □ ln
      □ sins
      □ sinss
      □ gid
      □ ou
      □ keyCode
      □ getClientWidth
      □ getClientHeight
      □ getDocHeight
      □ getScrollY
      □ ar
      □ defined
      □ replaceAll
      □ http
          ☆ okfunc
          ☆ errfunc
          ☆ httpreq
      □ ev.add
      □ ev.del
      □ ev.ex
      □ debug
  • XS簡易仕様書
      □ 目次
      □ 実装目標
      □ インストール等
      □ perl XSモジュールの作成方法
      □ ファイル内容

注意

突然、何らかの理由で、仕様変更を行なうことがあります。
この説明書は、参考までで、内容を保障するものではありません。

CGI起動

CGIは、通常の index.cgi形式、及び、nph-index.cgi形式で起動されます。 mod_perl環
境で動作はしますが、あくまで互換環境での動作となります。

多くの環境変数が Apacheに依存していますが、一部のみIISで動作確認は行なわれてい
ます。

urlhack.inc.cgi Explugin は、PATH_INFO、または、404 ステータスの戻り値の、
REDIRECT_URL を参照して、ページ名を決定します。PATH_INFOのが汎用性が高い分、制
限がありますが、REDIRECT_URLのが、自由度が高く設定できます。

ディレクトリ構成

  • attach
    添付ファイル（添付画像も直接参照します）
  • backup
    バックアップ
  • blib
    perl XSモジュール
  • cache
    システムキャッシュ
  • counter
    アクセスカウンター
  • diff
    差分
  • image
    画像
  • info
    情報ディレクトリ
  • lib
    本体、perlモジュール、Explugin
  • links
    逆リンク用（拡張）
  • logs
    アクセスログ保存用（拡張）
  • plugin
    プラグイン
  • resource
    リソース
  • session
    予約
  • skin
    スキンファイル、JavaScript、CSSファイル
  • trackback
    トラックバック保存用（拡張）
  • user
    予約
  • wiki
    Wiki文書
  • wikidb
    内部のURL短縮用（拡張）

主な本体ファイル構成

  • index.cgi
    wrapper
  • lib/wiki.cgi
    本体起動
  • lib/wiki_init.cgi
    初期化用
  • lib/wiki_auth.cgi
    認証モジュール
  • lib/wiki_db.cgi
    データベース
  • lib/wiki_func.cgi
    汎用関数
  • lib/wiki_html.cgi
    HTML生成
  • lib/wiki_http.cgi
    HTTPモジュール
  • lib/wiki_link.cgi
    リンク用モジュール
  • lib/wiki_plugin.cgi
    プラグイン用モジュール
  • lib/wiki_spam.cgi
    スパムフィルターモジュール
  • lib/wiki_skin.cgi
    スキンモジュール
  • lib/wiki_sub.cgi
    自動生成される内部サブルーチン定義スクリプト
  • lib/wiki_version.cgi
    バージョン記述のためのモジュール
  • lib/wiki_wiki.cgi
    その他のモジュール
  • lib/wiki_write.cgi
    書き込み用モジュール

主なperlモジュール構成

  • lib/Algorithm/Diff.pm
    差分生成用
  • lib/AWS 以下
    アクセスログ、ユーザーエイジェント振り分け用
  • lib/Digest/Perl/MD5.pm
    Pure Perl MD5モジュール
  • lib/File 以下
    ファイル判定用モジュール
  • lib/HTTP/Lite.pm
    簡易HTTPクライアント(未使用）
  • lib/IDNA/Punycode.pm
    国際化ドメイン用モジュール（URLでも使用）
  • lib/Jcode.pm、lib/Jocde 以下
    Jcode.pm
  • lib/Time/Local.pm
    Time::Local
  • lib/Nana/Cache.pm
    キャッシュ管理モジュール
  • lib/Nana/Cookie.pm
    クッキー管理モジュール
  • lib/Nana/Enc.pm
    簡易暗号化モジュール
  • lib/Nana/File.pm
    ファイルアクセスモジュール
  • lib/Nana/GZIP.pm
    gzip圧縮、解凍モジュール
  • lib/Nana/HTMLOpt.pm
    HTML最適化モジュール
  • lib/Nana/HTTP.pm
    HTTPアクセスモジュール
  • lib/Nana/HTTPCompress.pm
    HTTP gzip圧縮出力モジュール
  • lib/Nana/Lock.pm
    ファイルロックモジュール
  • lib/Nana/Logs.pm
    アクセスログ解析モジュール
  • lib/Nana/Mail.pm
    メール送信モジュール
  • lib/Nana/MD5.pm
    互換MD5生成wrapperモジュール
  • lib/Nana/Pod2Wiki.pm
    perl pod 簡易変換モジュール
  • lib/Nana/RemoteHost.pm
    リモートホスト取得モジュール
  • lib/Nana/Search.pm
    あいまい検索モジュール
  • lib/Nana/ServerInfo.pm
    サーバー情報取得モジュール
  • lib/Nana/YukiWikiDB.pm
    ロック対策済 YukiWikiDBモジュール
  • lib/Nana/YukiWikiDB_GZIP.pm
    ↑のgzip圧縮対応版
  • lib/Yuki/DiffText.pm
    Diff.pm を共用した差分生成モジュール
  • lib/Yuki/RSS.pm
    RSS1.0モジュール
  • lib/Yuki/YukiWikiDB.pm
    YukiWikiDB.pm のオリジナル

主なExplugin構成

  • lib/aguse.inc.pl
    リンク先チェッカー
  • lib/antispam.inc.pl
    メールアドレス簡易暗号化
  • lib/antispamwiki.inc.pl
    簡易アンチスパム
  • lib/authadmin_cookie.inc.pl
    管理者パスワードのcookie簡易保存
  • lib/autometarobot.inc.pl
    自動ロボット向けキーワード抽出
  • lib/canonical.inc.pl
    重複URL防止
  • lib/captcha.inc.pl
    CAPTCHAスパム対策
  • lib/debug.inc.pl
    デバッグ（develのみ）
  • lib/iecompatiblehack.inc.pl
    IEの互換表示ボタンをなくす
  • lib/lang.inc.pl
    国際化対応モジュール
  • lib/linktrack.inc.pl
    外部リンク簡易トラッキングモジュール
  • lib/logs.inc.pl
    アクセスログ取得モジュール
  • lib/ogp.inc.pl
    Open Graph Protocol モジュール
  • lib/pathmenu.inc.pl
    階層下に MenuBar等を作れるモジュール
  • lib/ping.inc.pl
    Weblog ping
  • lib/punyurl.inc.pl
    国際化ドメインURLに対応する
  • lib/setting.inc.pl
    閲覧者設定機能
  • lib/slashpage.inc.pl
    階層下のページ名を容易にリンクする
  • lib/trackback.inc.pl
    トラックバック
  • lib/urlhack.inc.pl
    URL改造
  • lib/xframe.inc.pl
    frame、iframe等でページを表示できないようにする

主なプラグイン構成

執筆中

explugin仕様情報

初期化

  • plugin_NAME_init メソッドを起動する
  • expluginが有効になっていると、必ず起動されます。
  • 引数はありませんので、$::form から読み出す必要があります。
  • グローバルに変数以外の記述を行なわないで下さい。

有効になっているexpluginの強制読み込み

依存関係で、先に読み込む必要があるexpluginは、以下のようにして読み出すことがで
きる。

&exec_explugin_sub("explugin name") ;

リソースの読み込み

&read_resource で読み込まれます。

プラグインと同じ名前のファイルであれば、指定しなくても自動読み込みをします。

JavaScript、CSSの読み込み

&jscss_include で読み込まれます。

プラグインと同じ名前のファイルであれば、指定しなくても自動読み込みをします。

初期化時の返り値（ハッシュ）

  • init
    1を指定することで、正常終了したことを通知する。
  • func
    上書きする関数
  • value
    上書きする変数名
  • msg
    タイトル
  • body
    文書本体
  • header
    <head>〜</head>の内容
  • http_header
    HTTPヘッダー
  • cssheader
    生のCSS
  • jsheader
    JavaScriptファイル読み込み後に実行するJavaScript文
  • jsheadervalue
    ページ表示後すぐに実行するJavaScript文
  • bodytag
    <body> の中の文
  • last_func
    ページを表示後に実行する関数
  • 返り値サンプル

return('init'=>1, func=>'override1,override2',
  'jsheader'=>$javascript, 'lastfunc'=>'&lastcallback;');

プラグイン仕様情報

初期化

メソッドを用いて初期化することはできません。

グローバルに記述することで、初期化することが可能です。

リソースの読み込み

&read_resource で読み込まれます。

プラグインと同じ名前のファイルであれば、指定しなくても自動読み込みをします。

JavaScript、CSSの読み込み

&jscss_include で読み込まれます。

プラグインと同じ名前のファイルであれば、指定しなくても自動読み込みをします。

inlineメソッド

&plugin(...) ; で呼び出されます。

引数は、上記の ... の中身のテキストが入ります。

sub plugin_NAME_inline {
my @arg=split(/,/,shift);

戻り値は、文字列で、HTMLを返すことにより表示されます。

return $html;

convertメソッド

#plugin (...) で呼び出されます。

引数は、上記の ... の中身のテキストが入ります。

sub plugin_NAME_convert {
my @arg=split(/,/,shift);

戻り値は、文字列で、HTMLを返すことにより表示されます。

return $html;

actionメソッド

URLの cmd=pluginname で呼び出されます。

引数はありませんので、$::form から読み出す必要があります。

actionメソッドの返り値（ハッシュ）

  • msg
    タイトル
  • body
    文書本体
  • header
    <head>〜</head>の内容
  • http_header
    HTTPヘッダー
  • cssheader
    生のCSS
  • jsheader
    JavaScriptファイル読み込み後に実行するJavaScript文
  • jsheadervalue
    ページ表示後すぐに実行するJavaScript文
  • bodytag
    <body> の中の文
  • ispage
    ページであることを返す
  • notviewmenu
    予約

内部変数仕様情報

  • $::HTTP_HEADER
    HTTPヘッダー
  • $::IN_HEAD
    <head>〜</head>
  • $::IN_JSHEADVALUE
    最初に実行されるJavaScript
  • $::IN_JSHEAD
    JavaScriptファイル読み込み後に実行されるJavaScript
  • $::IN_CSSHEAD
    生のCSS
  • $::IN_CSSFILES
    CSSファイル一覧
  • $::IN_JSFILES
    JavaScriptファイル一覧
  • $::IN_JSLOADER
    JavaScriptローダーのHTMLが入る
  • $::IN_BODY
    <body>の中に入る
  • $::IN_TITLE
    タイトルタグ
  • $::IN_META_ROBOTS
    ロボット制御
  • %::functions
    グローバル関数の一覧
  • %::database
    wiki/
  • %::infobase
    info/
  • %::diffbase
    diff/
  • %::backupbase
    backup/
  • %::resource
    リソース
  • %::form
    フォーム (GET/POST共用）
  • $::is_xhtml
    XHTMLであれば1
  • $::version
    バージョン
  • $::version_number
    バージョン数値（Majer×10000+Miner×100+Sub)

JavaScript関数仕様一覧

common.???.jsにある関数一覧です。

ua

入力
    (ブラウザー名)
出力
    true、false

使用中のブラウザーの種類を返します。
以下のオプションが選択できます。

MSIE、FIREFOX、GECKO、CHROME、SAFARI、WINDOWS、MACOS、VERSION、MAGERVERSION

ln

入力
    (langname),(string),(langname),(string)...
出力
    string

言語セレクターです。
langnameは、en、ja、stringは、対応する言語の出力する文字列です。

sins

入力
    エレメントオブジェクト, HTML
出力
    なし

エレメントオブジェクトにinnerhtmlをします。

sinss

入力
    エレメントオブジェクトの文字列, HTML
出力
    なし

エレメントオブジェクトの文字列にinnerhtmlをします。

gid

入力
    エレメントオブジェクトの文字列
出力
    エレメントオブジェクト

エレメントオブジェクトを返します。(getElementById)

ou

入力
    URL,target
出力
    なし

window.openをします。targetの文字列を"b"とすると、"_blank" に入れ替わります。

keyCode

入力
    イベント
出力
    キーコード

入力されたキーボードのコードを返します。

getClientWidth

入力
    なし
出力
    ウィンドウの幅

ブラウザーの幅を返します。

getClientHeight

入力
    なし
出力
    ウィンドウの高さ

ブラウザーの高さを返します。

getDocHeight

入力
    なし
出力
    ドキュメントの高さ

表示されているページの高さを返します。

getScrollY

入力
    なし
出力
    現在位置

表示されている位置を返します。

ar

入力
    なし
出力
    new Arrayの返り値 new Array を行ないます。

defined

入力
    オブジェクト、変数
出力
    true, false 指定したオブジェクト、または変数が存在するか確認します。

replaceAll

入力
    文字変数、置換前文字、置換後文字
出力
    文字 replaceの全文字対象です。

http

入力
    メソッド, URL, POSTするデータ, 正常時のコールバック関数, 異常時のコールバッ
    ク関数
出力
    なし

http非同期クライアントです。コールバック関数は、以下の通りの引数です。

okfunc

入力
    HTTPステータス, レスポンステキスト
出力
    なし

errfunc

入力
    HTTPステータス, レスポンステキスト
出力
    なし

httpreq

入力
    なし
出力
    http object ブラウザーのhttpクライアントオブジェクトを返します

ev.add

入力
    イベント名, 実行する関数（文字列）, 実行する関数のパラメータ
出力
    なし

イベントハンドラーです。対応しているイベントは以下の通り

  • onload
  • onkeypress
  • onkeydown
  • onkeyup
  • onclick
  • onbeforeunload
  • oncontextmenu

ev.del

入力
    イベント名, 実行する関数（文字列）
出力
    なし

イベントを削除します

ev.ex

入力
    イベント名
出力
    なし

イベントを強制実行します。

debug

入力
    メッセージ
出力
    なし

デバッグログをtextareaフォーム、及び、console.logに出力します。

XS簡易仕様書

現在、XSモジュールは、devel版のみのテスト実装です。

        "PyukiWiki" ver 0.2.1-beta4-dev1 $$
        Copyright (C) 2005-2012 PukiWiki Developers Team
        Copyright (C) 2004-2012 Nekyo (Based on PukiWiki, YukiWiki)
        License: GPL version 3 or (at your option) any later version
        and/or Artistic version 1 or later version.
        Based on YukiWiki http://www.hyuki.com/yukiwiki/
        and PukiWiki http://pukiwiki.sfjp.jp/
        URL:
        http://pyukiwiki.info/

        MAIL:
        <nanami (at) daiba (dot) cx> (注：バーチャル女の子です)

        $Id$
        This text file written UTF-8 Codeset

目次

  • PyukiWiki仕様書（仮）
  • 目次
  • 注意
  • CGI起動
  • ディレクトリ構成
  • 主な本体ファイル構成
  • 主なperlモジュール構成
  • 主なExplugin構成
  • 主なプラグイン構成
  • explugin仕様情報
      □ 初期化
      □ 有効になっているexpluginの強制読み込み
      □ リソースの読み込み
      □ JavaScript、CSSの読み込み
      □ 初期化時の返り値（ハッシュ）
  • プラグイン仕様情報
      □ 初期化
      □ リソースの読み込み
      □ JavaScript、CSSの読み込み
      □ inlineメソッド
      □ convertメソッド
      □ actionメソッド
      □ actionメソッドの返り値（ハッシュ）
  • 内部変数仕様情報
  • JavaScript関数仕様一覧
      □ ua
      □ ln
      □ sins
      □ sinss
      □ gid
      □ ou
      □ keyCode
      □ getClientWidth
      □ getClientHeight
      □ getDocHeight
      □ getScrollY
      □ ar
      □ defined
      □ replaceAll
      □ http
          ☆ okfunc
          ☆ errfunc
          ☆ httpreq
      □ ev.add
      □ ev.del
      □ ev.ex
      □ debug
  • XS簡易仕様書
      □ 目次
      □ 実装目標
      □ インストール等
      □ perl XSモジュールの作成方法
      □ ファイル内容

実装目標

make installxs をするだけで、あとは何も考えずに、PyukiWikiが高速化する仕組みを
作る

インストール等

make buildxs
    ビルドする
make testxs
    テストする
make installxs
    インストールをする。blibにファイルコピーをするだけです。
    perlモジュール側の make installは使用しないで下さい。
make deinstallxs
    アンインストールをする。(blibを単純に削除するだけです。）
make cleanxs
    作業ディレクトリを削除する。
    作業ファイル名を生成する為に、一度、perl Makefile.PL を実行します。

perl XSモジュールの作成方法

cd src
h2xs -An Name::ModuleName

cd Name-ModuleName
editor ModuleName.xs（とりあえず１行書き換える）

#include "ppport.h"
↓
#include "../xsmake/ppport.h"

editor Makefile.PL （全部書き換える）

use 5.008100;
use ExtUtils::MakeMaker;

require "../xsmake/pyukiwikixs.pl";

&writemakefile(
        Module=>"Name::ModuleName",
        File=>"lib/Name/ModuleName.pm",
        Author=>'作者',
);

ファイル内容

  • xsファイルには、可能な限りプロトタイプを指定する。
  • xsファイルの中には、C言語コードを最小限しか記述しない
    （call、jmp、ret命令相当のオーバーヘッドは出ますが、ここは気にしないで構い
    ません）
  • 関数の本体は、xs_funcname.c の中に記述する。
  • xs_funcname.c に記述できる関数名は、xs_funcname とする
  • その他、C言語コードは、視認性より、速度を優先して記述する。
    わかりにくい部分は、コメントで記述すると良いかもしれません。

