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

  • ページ: BugTrack2
  • 投稿者: pai
  • 優先順位: 低
  • 状態: 却下
  • カテゴリー: 本体新機能
  • 投稿日: 2007-09-09 (日) 03:09:19
  • バージョン:

メッセージ

[ [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に文字列が埋め込まれていますので、検索もできますし、管理が容易です。

  • http://php.pa-i.org/index.php/demo/26/26/26.html 縦書き文字のサンプル
  • http://php.pa-i.org/index.php/demo/27/27/27.html 構文図のサンプル

タイプ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.ページ内のリンクやinputパーツをクリックすると、外部アプリケーションが起動して、ページの内容を処理した結果を画面に表示する。
  • 2.ページ内のリンクやinputパーツをクリックすると、外部アプリケーションが起動して、ページに書いたスクリプトを実行し、結果を画面に表示する。
  • 3.ページ内の画像が、指定した文字列から動的生成される。
  • 4.ページ内の画像が、ページの内容から動的生成される。

拡張する機能の内容

1.リンクをクリックして開いたページや、リンクされている画像などが、リンク元のページの内容を取得できる機能(目的1,2,4に対応)。

  • BugTrack2/267の方法で実現できる。
  • (1a)同一ページ中に複数のリンクがあった場合に、どのリンクがクリックされたか識別できるとよい(本ページのタイプ2)。

2.リンクや画像のクエリとして、エンコードした文字列を渡す機能。特に画像の場合、エンコード前の文字列をaltにも書き出す機能(目的3に対応)。

  • 典型的には、テーブルのセルに縦書き文字列を入れたい、など。個々に違う文字列から生成した画像をインラインで入れる必要がある。
  • 画像でなくリンクであれば、現状でもInterWikiで実現可能。

機能の表記方法

1.それぞれについて、専用のインラインプラグインを作成する。

2.機能の内容2について、下記の「bracket nameの拡張方法」を使用して、alias部分にクエリ文字列を記述する。

  • 異なるURLが多数ある場合に向いている。
  • 機能拡張が必要。

3.機能の内容2について、InterWikiを使用して、クエリ文字列を記述する。

  • 同じURLが多数ある場合に向いている。
  • 機能拡張が不要(ただし現状では画像には未対応)。
  • InterWikiNameの登録・管理が必要。

4.機能の内容1aについて、下記の「bracket nameの拡張方法」を使用して、クエリにページのURLと出現順番号を含める。

  • 異なるURLが多数ある場合に向いている。
  • 機能拡張が必要。
  • ページを表示してから外部アプリケーションを呼び出すまでの間にページが更新されてしまうと、正しく処理されない。
    • #commentプラグインは、パラメータにページのダイジェストとIDを持っているため、更新を検出することができ、1ページに複数書いた場合でも適切な箇所にコメントが挿入される。

bracket nameの拡張方法

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

  • 既存の名前空間と衝突しない。
  • URLに制限が増えない。
  • 機能が想像しにくい。

コメント

  • いつもアイデアの提案をありがとうございます。見出しに要約("これは何か")をつけていただきたいのですが、こんな感じで合っていますか? -- henoheno 2007-09-09 (日) 23:33:47
    • これでよいと思います。 -- pai 2007-09-12 (水) 02:03:32
  • この提案には二つの要素が入っている様に見えます: -- henoheno 2007-09-10 (月) 00:12:15
    • 記法の拡張については、「">" の数を増やして行く」という発想が興味深いです。ただ現在は、その行為がユーザーに与える印象と、それによって起きる結果(改造次第)にあまり関連が見られないので、このままではユーザーは、結果を覚えてから記法を覚えないといけなくなるでしょう。つまり「奥が深い(意味なく理解し辛い)」世界が一歩広がるような印象を受けています。linkについてどういった拡張ができるであろうか、というのを並べ挙げた上で、スマートなものをその形に採用できるならありがたいのですが。 -- henoheno 2007-09-10 (月) 00:10:23
    • 機能の拡張について: -- henoheno 2007-09-10 (月) 00:10:42
      • タイプ1の修正案は、今回のきっかけになっている画像の場合ではたまたま問題になりませんが、元のURIが "?" や "#" を含んでいると破綻しそうに見えます。そうならば、一般のURIに使えないとなるとインパクトが弱くなります。汎用的にできますか? -- henoheno 2007-09-10 (月) 00:13:46
      • タイプ2の修正案は、どうしてもreferer +α をGET methodで渡してどうにかしたいというニーズを持っていない人には意義が無いかのように見えます。また、これはInterWikiの改造によって実現するような方向のものではないでしょうか。なおrefererは普通Webブラウザから渡される(事になっている)ものですが、渡されない事もあるので、意味が無いとは思いません -- henoheno 2007-09-10 (月) 00:13:01
        • ----(これ以上ネストできない....)BugTrack2/267の「対象者」に、(wiki以外の)開発者向けの機能として、一般的な拡張方法がほしい旨書きました。特定のニーズを持っている人について、手離れよく対応したいという意図です。 -- pai 2007-09-12 (水) 02:25:19
      • あ、そんな事言い出したらタイプ1についてもInterWikiで実現するもののように見えてきた -- henoheno 2007-09-10 (月) 00:11:55
      • タイプ2 が付与するidは変動しかねない整数ですので、[ [alt#key>>>URI]] と書いたら、URI?#key とする位やらないと結果が安定しないと思います -- henoheno 2007-09-10 (月) 00:15:25
  • 調べてみたのですが、タイプ1はInterWikiでできました(画像にはなりませんが)。それ以外については検討してみます。タイプ2については、個人的には割り切っていますが、直近の節idを使う手もあります。ただし表の各行にリンクを入れたい場合には節idでは無理です。 -- pai 2007-09-10 (月) 02:18:51
  • タイプ1ですが、InterWikiに画像やインラインフレームを指定できるようにする拡張が考えられます。タイプ2について補足ですが、#commentはdigestを埋め込んでおり、また自分でid管理をしているので、1ページに複数の#commentがあっても正しく動作します。#bugtrackや#trackerはidがないので、どれかをsubmitすると全部に書き込まれます。 -- pai 2007-09-10 (月) 18:05:26
  • カスタマイズする入り口を用意しておいて、そこから先の世界は各自に任せる事で手離れを良くする、というのはまた一つの興味深い提案だと思います。ありがとうございます。 -- henoheno 2007-09-13 (木) 23:15:56
    • ただしここで挙げられている三件の発想や、その他の話題を「結びつける発想や工夫」が現状無いように見えています。単純にくっつけてしまうと、それだけ歪みが出てしまいますので、それらを上手く結びつける「デザイン」の観点からのご意見もお聞きしてみたいところです。開発者向けに記法のカスタマイズの余地を設ける世界と、一般ユーザーの一般作業の世界をバッティングさせてしまうとトラブルの元になるので、既存の記法に割り込ませてしまわないか、という提案はそれなりのリスクを覚えます。 -- henoheno 2007-09-13 (木) 23:26:49
    • なお、他のBugTrackも含めて、話題の見出しを具体的につけていただくと助かります。それぞれの独立したアイデアの組み合わせを考えるのが楽になるので、もし可能ならで結構です。li のネストが三段しか効かない理由とその利点欠点は、記法の改造を提案している立場になってしまったので、同じく余裕の範囲で構いませんので、検討し終わっておいて下さい。 -- henoheno 2007-09-13 (木) 23:30:44
    • 整理してみました。気づいた点があればお願いします。liのネストについては、----が水平線になるから、と理解しています。個人的にはこれで十分だと思っています。 -- pai 2007-09-18 (火) 19:49:09
    • 話題の明確化をありがとうございます。liが三段までしか絶対に行かないこのルールが成立したのは、限りなくささいな原因なのだろうとは思うのですが、深すぎる話題のネストを絶対に起こさせないというデザイン上の利点を持っていると思っています :) -- henoheno 2007-09-27 (木) 00:33:46
  • 本件は、現状のままであればデメリットがあったり、汎用化が足りていないように見えますので、「PukiWiki/1.4/ちょっと便利に」ネタに移動した方がいいかもしれません。 -- henoheno 2007-10-15 (月) 01:05:32
    • 了解しました。個人的にはメインラインに入ってくれないと「手離れが良く」ならないので、何か思いついたらまた書きます。 -- pai 2007-11-12 (月) 19:57:10


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

PukiWiki 1.5.2+ © 2001-2019 PukiWiki Development Team. Powered by PHP 5.6.40-0+deb8u7. HTML convert time: 0.225 sec.

OSDN