*テンプレート内に置換文字設定 -ページ: BugTrack -投稿者: [[aru]] -優先順位: 低 -状態: 完了 -カテゴリー: 本体新機能 -投稿日: 2003-04-15 (火) 14:34:46 -バージョン: **メッセージ テンプレート内に置換文字(例えば$$)を設定しておくと~ その文字にページ名を置換してくれる機能がほしい~ 例えば~ >ページ名がほげほげでテンプレートを使用して作成する場合 -テンプレート #lookup(Yahoo,検索,$$) [[Yahoo:$$]] http://aaa.bbb.com/ccc/$$ ↓ -新ページ、ほげほげ #lookup(Yahoo,検索,ほげほげ) [[Yahoo:ほげほげ]] http://aaa.bbb.com/ccc/ほげほげ とか色々と展開が出来ると思うのですが、どうですか? ---- -うん、これテンプレートだけじゃなく普通のページにも対応できるとおもしろいかも -- &new{2003-04-17 (木) 13:56:03}; -私はlookupプラグインで第3引数に$thispageを指定すると、現在表示中のページが出るように改造して満足していたのですが、テンプレートで置換するアプローチの方が広がりがあって面白いですね。 -- [[にぶんのに]] &new{2003-04-17 (木) 23:50:10}; -ソース書き換え型のユーザー定義で何とかならないかな? -- [[reimy]] &new{2003-04-18 (金) 00:33:38}; ~pukiwiki.ini.php $str_rules = array( 'now\?' => format_date(UTIME), 'date\?' => get_date($date_format), 'time\?' => get_date($time_format), // '&now;' => format_date(UTIME), // '&date;' => get_date($date_format), // '&time;' => get_date($time_format), + '&page;' => $page, ); ~これで &page; と記述すると、書き込み時にそのページ名に置換される。[[れいみぃ・ヘルプ:http://reimy.com/?%E3%83%98%E3%83%AB%E3%83%97#page]] -うちでテストしてみたところ、すんなりうまくいきました。以下の手順で行なえばOKです。-- [[reimy]] &new{2003-04-18 (金) 04:02:15}; ++上記のpukiwiki.ini.phpでの定義を行なう前にテンプレートを作成する。その中でページ名に置換したい部分に &page; を記述しておく。 ++テンプレートをすべて保存した後、pukiwiki.ini.phpに '&page;' => $page. を記述する。 --テンプレート作成前にpukiwiki.ini.phpで定義してしまうと、テンプレートの&page;までが置換されてしまうので、順番を間違えないように。 -- [[reimy]] &new{2003-04-18 (金) 04:03:27}; -[[pukiwiki:質問箱]]にあった[[編集:./]]で現在のページを編集できないという問題も、[[編集:&page;]]とすることで編集可能。-- [[reimy]] &new{2003-04-18 (金) 15:23:44}; -これって結果オーライ的な感じだな。$pageってグローバルな変数じゃないようなので、こういう使い方するのはかなりお行儀悪い使い方かも。あとは[[ぱんだ]]さんに任せよう(^^;; -- [[reimy]] &new{2003-04-18 (金) 15:49:21}; -pukiwiki.ini.phpに '&page;' => $pageを書いてしまった後でテンプレートを作ることができないのは痛いですね。 -- [[ぱんだ]] &new{2003-04-21 (月) 18:33:10}; -テンプレート展開時に置換するユーザ定義ルールを別に作って、pukiwiki.ini.phpで自由に設定できるようにする、というのは。 -- [[ぱんだ]] &new{2003-04-21 (月) 18:34:45};~ こんな感じ(テストしていません。) pukiwiki.ini.php +///////////////////////////////////////////////// +// ユーザ定義ルール(テンプレート展開時に置換する) +$template_rules = array( + '$$' => $post['page']; // 駄目 ? :-) +); edit.inc.php if (array_key_exists('template_page',$post) and is_page($post['template_page'])) { $post['msg'] = join('',get_source($post['template_page'])); + $post['msg'] = make_template_rules($post['msg']); } html.php +// ユーザ定義ルール(テンプレート展開時に置換する) +function make_template_rules($str) +{ + global $template_rules; + + foreach($template_rules as $rule => $replace) + { + $rule = preg_quote($rule,'/'); + $str = preg_replace("/$rule/",$replace,$str); + } + return $str; +} -エラーになったので下記のように変更 -- [[reimy]] pukiwiki.ini.php +///////////////////////////////////////////////// +// ユーザ定義ルール(テンプレート展開時に置換する) +$template_rules = array( + '$$' => $post['page'], +); -しかし、変換してくれませんでした。 -- [[reimy]] &new{2003-04-21 (月) 20:18:28}; -上記コードは、編集の「雛形とするページ」を選んで「読込」を押したときに置換する仕掛けです。$auto_template_rulesによる置換(ほげ/ふがの作成時にほげ/templateを読み込む)では、1.3.xの頃から''$1''→''ほげ/ふが'',''$2''→''ほげ'',''$3''→''ふが''の文字列置換を行う仕掛けが組み込まれています。((先に言えって? すいません :) 今気づきました。)) -- [[ぱんだ]] &new{2003-04-22 (火) 09:46:04}; func.php/auto_template() $body = str_replace("\$$i",$matches[$i],$body); ←これ --これ、機能してます? $3を指定しても変換してくれないんですけど。 -- [[reimy]] &new{2003-04-22 (火) 12:18:56}; -:test/templateでは動いているようです。 [[:test/ほげ]] -- [[ぱんだ]] &new{2003-04-22 (火) 12:36:15}; --:templateではどうですか? -- [[reimy]] &new{2003-04-22 (火) 13:06:53}; $auto_template_func = 1; $auto_template_rules = array( '(.+)' => ':template' ); --括弧が一つなので、$1にページ名が入りますね。 -- [[ぱんだ]] &new{2003-04-22 (火) 13:22:59}; --階層化されたページも含めすべてのページで同一のtemplateを使うために上のように設定してるんですが、この場合、階層化されたページでも$1しか取得できないので、あまりおいしくないですね。templateを書き換えることはほとんどないので、下記のソース書き換え型のユーザー定義を使用することにします。-- [[reimy]] &new{2003-04-22 (火) 13:38:04}; -ソース書き換え型のユーザー定義のほうは下のようにしてみた。これはこれでtemplateと無関係に手入力のときにも使えるので重宝。 -- [[reimy]] &new{2003-04-22 (火) 13:10:35}; '&page;' => substr($page,strrpos('/'.$page,'/')), '&fpage;' => $page, ~階層化されたページ「hogehoge/hoge」で&page;は「hoge」を、&fpage;は「hogehoge/hoge」に置換する。 --なお、$pageが使えるのは1.4の場合だけの模様。1.3.4では…なんか方法を考えてください(^^;; -- [[reimy]] &new{2003-04-23 (水) 01:29:58}; -とりあえず、[[aru]]さんの要望については、$auto_template_rulesによる置換で実装済みということですので、解決ということでよろしいでしょうか? -- [[reimy]] &new{2003-04-23 (水) 01:31:45}; -[[cvs:func.php]]にちょっと手を入れました。 -- [[ぱんだ]] &new{2003-04-23 (水) 18:07:55};~ 従来はパターンがマッチした時点で、テンプレートページが存在しなくてもそれ以降のパターンを無視してしまう動作でしたが、 $auto_template_rules = array( '((.+)\/([^\/]+))' => '\2/template', // (1) '((.+)\/([^\/]+))' => 'template', // (2) '(()(.+))' => 'template' // (3) ); と書いておくと、以下のような順序でテンプレートを探すようにしました。 (1) : $1=hoge/fuga $2=hoge $3=fuga template=[[hoge/template]] (2) : $1=hoge/fuga $2=hoge $3=fuga template=[[template]] (3) : $1=fuga $2='' $3=fuga template=[[template]] -これで、スラッシュを含むページとそうでないページで、置換文字列の共通化がはかれると思います。 -おお! ありがとうございますm(__)m -- [[reimy]] &new{2003-04-23 (水) 21:46:30}; #comment