[ [alias>URL]]でパラメータを渡す拡張

メッセージ

[ [alias>URL]]で、aliasをURLに自動的に付加したり、URLにユニークなパラメータを与えたりするような機能拡張の提案です。BugTrack2/267のように、Refererを利用して外部アプリケーションと連携させることを想定しています。


通常の状態

[[テキスト>http://example.org/helper/text.php/.png]]

のようなリンクを書くと、通常は以下のようなHTMLが出力されます(BugTrack2/270に注意してください)。

<A href="http&#x3a;//example.org/helper/text.php/.png">
<IMG src="http&#x3a;//example.org/helper/text.php/.png" alt="テキスト"/>
</A>

タイプ1: Anchor tag with URI?keyword prefix

[[飾りつきテキスト>>http&#x3a;//example.org/helper/text.php/.png]]

のようなリンクを書いたときに、以下のようなHTMLが出力されるようにします(パッチ例では>>と指定するとこのモードになります)。実際にはクエリはURLエンコードされます。

<A href="http&#x3a;//example.org/helper/text.php/.png">
<IMG src="http&#x3a;//example.org/helper/text.php/.png?飾りつきテキスト"
 alt="飾りつきテキスト"/>
</A>

text.phpは、渡された「飾りつきテキスト」を処理して、画像を返します。

私のページで申し訳ありませんが、以下のページではこれを利用して、altに書いたテキストやコマンドを画像に変換しています(ソースもダウンロードできます)。altに文字列が埋め込まれていますので、検索もできますし、管理が容易です。

タイプ2: Anchor tag with URI?referer#serial prefix

[[グラフ>>>http&#x3a;//example.org/helper/graph.php/.png]]

のようなリンクを書いたときに、以下のようなHTMLが出力されるようにします(パッチ例では>>>と指定するとこのモードになります)。実際にはクエリはURLエンコードされます。

<A href="http&#x3a;//example.org/helper/graph.php/.png?http&#x3a;//example.org/wiki/index.php?FrontPage#1">
<IMG src="http&#x3a;//example.org/helper/graph.php/.png?http&#x3a;//example.org/wiki/index.php?FrontPage#1"
 alt="グラフ"/>
</A>

ここで#1の部分は、ページ内でユニークな番号が割り当てられます。これにより、呼ばれたCGIはクエリからwikiのページを取得し、クエリと同じリンクが書かれた箇所を探すことができます。ページ内に同じURLを参照する画像が複数あった場合でも、どのリンクから呼び出されたかがわかりますので、リンクの直後の表を処理するようなことができます。

* 元旦におけるアクセスの集中について

[[グラフ>>>http&#x3a;//example.org/helper/graph.php/.png]]
// <A href=".../helper/graph.php/.png?http&#x3a;//example.org/wiki/index.php?FrontPage#1">
// <IMG src=".../helper/graph.php/.png?http&#x3a;//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&#x3a;//example.org/helper/graph.php/.png]]
// <A href=".../helper/graph.php/.png?http&#x3a;//example.org/wiki/index.php?FrontPage#2">
// <IMG src=".../helper/graph.php/.png?http&#x3a;//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&#x3a;//example.org/helper/graph.php/.png]]
// <A href=".../helper/graph.php/.png?http&#x3a;//example.org/wiki/index.php?FrontPage#3">
// <IMG src=".../helper/graph.php/.png?http&#x3a;//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&#x3a;//example.org/helper/graph.php/.png]]
// <A href=".../helper/graph.php/.png?http&#x3a;//example.org/wiki/index.php?FrontPage#4">
// <IMG src=".../helper/graph.php/.png?http&#x3a;//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と出現順番号を含める。

bracket nameの拡張方法

1. /\[\[(alias)(>+)(url)\]\]/形式。

コメント



トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2009-02-13 (金) 08:43:12
Site admin: PukiWiki Development Team

PukiWiki 1.5.4+ © 2001-2022 PukiWiki Development Team. Powered by PHP 8.2.12. HTML convert time: 0.225 sec.

SourceForge