*テンプレート内に置換文字設定 [#vff3f3b1]

-ページ: BugTrack
-投稿者: [[aru]]
-優先順位: 低
-状態: 完了
-カテゴリー: 本体新機能
-投稿日: 2003-04-15 (火) 14:34:46
-バージョン: 

**メッセージ [#n6a072a6]
テンプレート内に置換文字(例えば$$)を設定しておくと~
その文字にページ名を置換してくれる機能がほしい~
例えば~
>ページ名がほげほげでテンプレートを使用して作成する場合
-テンプレート
 #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};
-[[official:質問箱]]にあった[[編集:./]]で現在のページを編集できないという問題も、[[編集:&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};
-テンプレート内に、date\?をおくことはできませんか? -- [[matto]] &new{2003-06-25 (水) 08:25:22};
--たとえば編集ページに「ユーザ定義ルールを置換しない」チェックボックスをつけて、チェックされた場合はpage_write()内でmake_str_rules()を呼び出さないようにする…などという細工が必要かと。 -- [[ぱんだ]] &new{2003-06-27 (金) 00:04:53};
--一時的にpukiwiki.ini.phpのdate\?の定義を//でコメント化したうえで、date\?を記入したテンプレートを作成・保存し、再びpukiwiki.ini.phpを元に戻すというのがいちばん現実的対応のような気が。どうせテンプレートなんて頻繁に書き換えるものじゃないし。 -- [[reimy]] &new{2003-06-27 (金) 01:04:13};
-逆転の発想で、テンプレート取り込み時にのみ変換するルールを作るというのはどうでしょう。&PAGE → &page にするような。 -- [[dai]] &new{2005-04-28 (木) 00:48:49};
-これすべて(2)のテンプレートが適用されちゃうんですが。hoge/template無視されます。 -- [[アッカ]] &new{2005-07-22 (金) 17:03:23};
-[[official:質問箱3/137]]にも書きましたが、ぱんださんの書かれたサンプルそのままだと配列のキーが同一なので上書きされてしまいますね。正規表現として同義&妥当で、配列のキーを変えるには、空文字列にヒットさせるか、コメントを使う方法があると思います。↓の感じで。 -- [[にぶんのに]] &new{2005-07-23 (土) 02:08:54};
 // コメントを使う例
 $auto_template_rules = array(
 	'((.+)\/([^\/]+))(?# 特定階層のみのテンプレート)' => '\2/template',
 	'((.+)\/([^\/]+))(?# 汎用テンプレート)' => 'template',
 	'(()(.+))'     => 'template'
 );
 // 空文字列にヒットさせる例
 $auto_template_rules = array(
 	'((.+)\/([^\/]+)).?' => '\2/template',
 	'((.+)\/([^\/]+)).?.?' => 'template',
 	'(()(.+))'     => 'template'
 );


#comment
//#comment

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Site admin: PukiWiki Development Team

PukiWiki 1.5.3+ © 2001-2020 PukiWiki Development Team. Powered by PHP 5.6.40-0+deb8u12. HTML convert time: 0.066 sec.

OSDN