[ [alias>URL]]で、aliasをURLに自動的に付加したり、URLにユニークなパラメータを与えたりするような機能拡張の提案です。BugTrack2/267のように、Refererを利用して外部アプリケーションと連携させることを想定しています。
[[テキスト>http://example.org/helper/text.php/.png]]
のようなリンクを書くと、通常は以下のようなHTMLが出力されます(BugTrack2/270に注意してください)。
<A href="http://example.org/helper/text.php/.png"> <IMG src="http://example.org/helper/text.php/.png" alt="テキスト"/> </A>
[[飾りつきテキスト>>http://example.org/helper/text.php/.png]]
のようなリンクを書いたときに、以下のようなHTMLが出力されるようにします(パッチ例では>>と指定するとこのモードになります)。実際にはクエリはURLエンコードされます。
<A href="http://example.org/helper/text.php/.png"> <IMG src="http://example.org/helper/text.php/.png?飾りつきテキスト" alt="飾りつきテキスト"/> </A>
text.phpは、渡された「飾りつきテキスト」を処理して、画像を返します。
私のページで申し訳ありませんが、以下のページではこれを利用して、altに書いたテキストやコマンドを画像に変換しています(ソースもダウンロードできます)。altに文字列が埋め込まれていますので、検索もできますし、管理が容易です。
[[グラフ>>>http://example.org/helper/graph.php/.png]]
のようなリンクを書いたときに、以下のようなHTMLが出力されるようにします(パッチ例では>>>と指定するとこのモードになります)。実際にはクエリはURLエンコードされます。
<A href="http://example.org/helper/graph.php/.png?http://example.org/wiki/index.php?FrontPage#1"> <IMG src="http://example.org/helper/graph.php/.png?http://example.org/wiki/index.php?FrontPage#1" alt="グラフ"/> </A>
ここで#1の部分は、ページ内でユニークな番号が割り当てられます。これにより、呼ばれたCGIはクエリからwikiのページを取得し、クエリと同じリンクが書かれた箇所を探すことができます。ページ内に同じURLを参照する画像が複数あった場合でも、どのリンクから呼び出されたかがわかりますので、リンクの直後の表を処理するようなことができます。
* 元旦におけるアクセスの集中について [[グラフ>>>http://example.org/helper/graph.php/.png]] // <A href=".../helper/graph.php/.png?http://example.org/wiki/index.php?FrontPage#1"> // <IMG src=".../helper/graph.php/.png?http://example.org/wiki/index.php?FrontPage#1" // alt="グラフ"/> // </A> になる。 |~日付|~アクセス数| |2007/01/01|100| |2007/01/02|200| |2007/01/03|300| |2007/01/04|400| [[グラフ>>>http://example.org/helper/graph.php/.png]] // <A href=".../helper/graph.php/.png?http://example.org/wiki/index.php?FrontPage#2"> // <IMG src=".../helper/graph.php/.png?http://example.org/wiki/index.php?FrontPage#2" // alt="グラフ"/> // </A> になる。 |~日付|~アクセス数| |2008/01/01|100| |2008/01/02|200| |2008/01/03|300| |2008/01/04|400| [[グラフ>>>http://example.org/helper/graph.php/.png]] // <A href=".../helper/graph.php/.png?http://example.org/wiki/index.php?FrontPage#3"> // <IMG src=".../helper/graph.php/.png?http://example.org/wiki/index.php?FrontPage#3" // alt="グラフ"/> // </A> になる。 |~日付|~アクセス数| |2009/01/01|100| |2009/01/02|200| |2009/01/03|300| |2009/01/04|400| ** old [[グラフ>>>http://example.org/helper/graph.php/.png]] // <A href=".../helper/graph.php/.png?http://example.org/wiki/index.php?FrontPage#4"> // <IMG src=".../helper/graph.php/.png?http://example.org/wiki/index.php?FrontPage#4" // alt="グラフ"/> // </A> になる。 |~日付|~アクセス数| |2006/01/01|100| |2006/01/02|200| |2006/01/03|300| |2006/01/04|400|
もちろん画像に限らず、リンクをクリックすることで何らかのアクションを起こすのでも構いません。
この方式は、ページ全体を処理するのに比べて、ページ内に古いコンテンツを残しておいても構わない点が優れています。
--- make_link.php.070907 2007-05-09 17:26:27.000000000 +0900 +++ make_link.php 2007-09-08 03:27:16.000000000 +0900 @@ -356,10 +356,10 @@ $s1 = $this->start + 1; return <<<EOD (\[\[ # (1) open bracket - ((?:(?!\]\]).)+) # (2) alias - (?:>|:) + ((?:(?!\]\]|>|:).)+) # (2) alias + ((?:>|:)+) # (3) type )? -( # (3) url +( # (4) url (?:(?:https?|ftp|news):\/\/|mailto:)[\w\/\@\$()!?&%#:;.,~'=*+-]+ ) (?($s1)\]\]) # close bracket @@ -367,15 +367,28 @@ } function get_count() - { - return 3; + { + return 4; } function set($arr, $page) { - list(, , $alias, $name) = $this->splice($arr); - return parent::setParam($page, htmlspecialchars($name), - '', 'url', $alias == '' ? $name : $alias); + global $script, $vars; + static $link_url_count = 0; + + list(, , $alias, $type, $name) = $this->splice($arr); + if ($alias == '') + $alias = $name; + switch (strlen($type)) { + case 2: + $name .= "?".urlencode($alias); + break; + case 3: + $url = $script."?".rawurlencode(isset($vars['page']) ? $vars['page'] : ''); + $name .= "?".urlencode($url."#".(++$link_url_count)); + break; + } + return parent::setParam($page, htmlspecialchars($name), '', 'url', $alias); } function toString()
下記のコメントを整理しつつ、説明を加えてみました。議論の進展に合わせて編集してください。
会社などで共有ファイルシステムとして使用する場合に、pukiwikiの改造なしに、サーバ上の外部アプリケーションでページの内容を処理するための一般的な方法がほしい。たとえば、以下のようなユーザーインターフェースが考えられる。
1.リンクをクリックして開いたページや、リンクされている画像などが、リンク元のページの内容を取得できる機能(目的1,2,4に対応)。
2.リンクや画像のクエリとして、エンコードした文字列を渡す機能。特に画像の場合、エンコード前の文字列をaltにも書き出す機能(目的3に対応)。
1.それぞれについて、専用のインラインプラグインを作成する。
2.機能の内容2について、下記の「bracket nameの拡張方法」を使用して、alias部分にクエリ文字列を記述する。
3.機能の内容2について、InterWikiを使用して、クエリ文字列を記述する。
4.機能の内容1aについて、下記の「bracket nameの拡張方法」を使用して、クエリにページのURLと出現順番号を含める。
1. /\[\[(alias)(>+)(url)\]\]/形式。
- ----(これ以上ネストできない....)BugTrack2/267の「対象者」に、(wiki以外の)開発者向けの機能として、一般的な拡張方法がほしい旨書きました。特定のニーズを持っている人について、手離れよく対応したいという意図です。 -- pai 2007-09-12 (水) 02:25:19