RIGHT:&tag(解析,参考に,目次);
RIGHT:[[:t/解析]] [[:t/参考に]]

*目次 [#f7fa0ef8]
#lsx(new=true);
-[[その他>PukiWiki/1.3#misc]]
*関連 [#g4f3cf0f]
#lsx(tag=解析,new=true,except=^WikiEngine/PukiWiki/1.3(/.*)?$)
#ls

&aname(misc);
#br

*公式サイト [#b996dfd5]
**公式サイト [#b996dfd5]
[[http://pukiwiki.sourceforge.jp/>http://pukiwiki.sourceforge.jp/]]
*継承されているクラスを含むファイル [#r132f3b4]


**継承されているクラスを含むファイル [#r132f3b4]
lib\config.php
lib\convert_html.php
lib\diff.php
lib\make_link.php

※plugin\以下を除く。

 plugin\以下で継承されているクラスを含むファイル
 plugin\attach.inc.php
 plugin\dump.inc.php
 plugin\map.inc.php
 plugin\showrss.inc.php
 plugin\tracker.inc.php

ページ内のWikiTextはオブジェクト化される。
それ以外は非オブジェクト指向。

:ConfigTable|設定類のうちWiki上でできるもの
:Element|記法
:Link|リンク

…はオブジェクト化してある。
プラグインは記法の一部になっている。


*make_linkと関連のあるファイル [#g851e69f]
**make_linkと関連のあるファイル [#g851e69f]
lib\convert_html.php
lib\file.php
lib\html.php

require()の実行は全てlib\pukiwiki.phpで行われている。
*ページの編集はインスタンス構造の編集 [#i431b645]

**ページの編集はインスタンス構造の編集 [#i431b645]
ページの内容がElement系インスタンスの設計書になっている。
Element系のクラスにはBody、Div、Tableなどがある。
どのページもElement系インスタンスの1つ(Bodyインスタンス)として扱われ、ページ内のWiki記法もElement系インスタンスのどれかになる。
ブロック型Wiki記法には他のWiki記法を入れることができるが、これは入れ子構造のElement系インスタンスになる。

そういうわけで…
-ページはBodyインスタンスになる
-#brなどのWiki記法はElement系インスタンスのどれかになる
-Bodyインスタンスの中にはElement系インスタンスが複数入っている状態になる

#br

Wiki記法ごとに異なるHTMLが生成されるが、この差異がElement系サブクラスの違い。
Wiki記法はどれも引数を受けてHTMLを生成するが、こういった共通部分がElementというスーパークラスで定義されている。

#br

入れ子構造になったElement系インスタンスはDecoratorパターンになっており、HTML生成時にはその入れ子構造に対応したHTMLを生成するようになっている。

#br

[[Keyword:Decorator]]
※Decoratorパターンは「付け加え」のパターン。コードを複雑にせずに機能を付け加える。PukiWikiではWiki記法やプラグイン呼び出しの多重構造を実現するために用いられている。このパターンによって、新しいWiki記法やプラグインを追加するとき、何も工夫せずに他のWiki記法と入れ子構造にすることができる。
(全てのプラグインはElement系クラスの1つになるので、何も考えなくてもDecoratorパターンの一部になる)

#br

Element系クラスの中でも、Body((lib\convert_html.phpの中にある。))とDiv((lib\convert_html.phpの中にある。))は特別な機能を持つ。
-Bodyは他のElement系クラスを生成することができる。
-Divはブロック型プラグインを1つ担当して呼び出すことができる。
*概要 [#u9a47e54]
テキスト(ページの内容)→オブジェクト化→HTML化がPukiWikiの主な動作。
それ以外は一般的なWebアプリと同様な基礎部分と、プラグインになる。

PukiWiki本体はプラグインを呼び出すためのフレームワーク。本体から呼び出されたプラグインがPukiWikiの全機能を実現している。

#br

プラグイン部分はプラグインに一任されていて、制約はない。限られているのは呼び出される条件くらい。
プラグインを呼び出すにはページ内にプラグイン呼び出しのWiki記法を書いたり、URLクエリーにプラグイン名を書く必要がある。