テンプレート内に置換文字設定

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

メッセージ

テンプレート内に置換文字(例えば$$)を設定しておくと
その文字にページ名を置換してくれる機能がほしい
例えば

ページ名がほげほげでテンプレートを使用して作成する場合

  • テンプレート
    #lookup(Yahoo,検索,$$)
    [[Yahoo:$$]]
    http://aaa.bbb.com/ccc/$$
  • 新ページ、ほげほげ
    #lookup(Yahoo,検索,ほげほげ)
    [[Yahoo:ほげほげ]]
    http://aaa.bbb.com/ccc/ほげほげ
    とか色々と展開が出来ると思うのですが、どうですか?

  • うん、これテンプレートだけじゃなく普通のページにも対応できるとおもしろいかも -- 2003-04-17 (木) 13:56:03
  • 私はlookupプラグインで第3引数に$thispageを指定すると、現在表示中のページが出るように改造して満足していたのですが、テンプレートで置換するアプローチの方が広がりがあって面白いですね。 -- にぶんのに 2003-04-17 (木) 23:50:10
  • ソース書き換え型のユーザー定義で何とかならないかな? -- reimy 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; と記述すると、書き込み時にそのページ名に置換される。れいみぃ・ヘルプ

  • うちでテストしてみたところ、すんなりうまくいきました。以下の手順で行なえばOKです。-- reimy 2003-04-18 (金) 04:02:15
    1. 上記のpukiwiki.ini.phpでの定義を行なう前にテンプレートを作成する。その中でページ名に置換したい部分に &page; を記述しておく。
    2. テンプレートをすべて保存した後、pukiwiki.ini.phpに '&page;' => $page. を記述する。
    • テンプレート作成前にpukiwiki.ini.phpで定義してしまうと、テンプレートの&page;までが置換されてしまうので、順番を間違えないように。 -- reimy 2003-04-18 (金) 04:03:27
  • official:質問箱にあった編集:./で現在のページを編集できないという問題も、編集:&page;とすることで編集可能。-- reimy 2003-04-18 (金) 15:23:44
  • これって結果オーライ的な感じだな。$pageってグローバルな変数じゃないようなので、こういう使い方するのはかなりお行儀悪い使い方かも。あとはぱんださんに任せよう(^^;; -- reimy 2003-04-18 (金) 15:49:21
  • pukiwiki.ini.phpに '&page;' => $pageを書いてしまった後でテンプレートを作ることができないのは痛いですね。 -- ぱんだ 2003-04-21 (月) 18:33:10
  • テンプレート展開時に置換するユーザ定義ルールを別に作って、pukiwiki.ini.phpで自由に設定できるようにする、というのは。 -- ぱんだ 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 2003-04-21 (月) 20:18:28
  • 上記コードは、編集の「雛形とするページ」を選んで「読込」を押したときに置換する仕掛けです。$auto_template_rulesによる置換(ほげ/ふがの作成時にほげ/templateを読み込む)では、1.3.xの頃から$1ほげ/ふが,$2ほげ,$3ふがの文字列置換を行う仕掛けが組み込まれています。*1 -- ぱんだ 2003-04-22 (火) 09:46:04
    func.php/auto_template()
     $body = str_replace("\$$i",$matches[$i],$body); ←これ
    • これ、機能してます? $3を指定しても変換してくれないんですけど。 -- reimy 2003-04-22 (火) 12:18:56
  • :test/templateでは動いているようです。 :test/ほげ? -- ぱんだ 2003-04-22 (火) 12:36:15
    • :templateではどうですか? -- reimy 2003-04-22 (火) 13:06:53
      $auto_template_func = 1;
      $auto_template_rules = array(
      '(.+)' => ':template'
      );
    • 括弧が一つなので、$1にページ名が入りますね。 -- ぱんだ 2003-04-22 (火) 13:22:59
    • 階層化されたページも含めすべてのページで同一のtemplateを使うために上のように設定してるんですが、この場合、階層化されたページでも$1しか取得できないので、あまりおいしくないですね。templateを書き換えることはほとんどないので、下記のソース書き換え型のユーザー定義を使用することにします。-- reimy 2003-04-22 (火) 13:38:04
  • ソース書き換え型のユーザー定義のほうは下のようにしてみた。これはこれでtemplateと無関係に手入力のときにも使えるので重宝。 -- reimy 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 2003-04-23 (水) 01:29:58
  • とりあえず、aru?さんの要望については、$auto_template_rulesによる置換で実装済みということですので、解決ということでよろしいでしょうか? -- reimy 2003-04-23 (水) 01:31:45
  • cvs:func.phpにちょっと手を入れました。 -- ぱんだ 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 2003-04-23 (水) 21:46:30
  • テンプレート内に、date\?をおくことはできませんか? -- matto? 2003-06-25 (水) 08:25:22
    • たとえば編集ページに「ユーザ定義ルールを置換しない」チェックボックスをつけて、チェックされた場合はpage_write()内でmake_str_rules()を呼び出さないようにする…などという細工が必要かと。 -- ぱんだ 2003-06-27 (金) 00:04:53
    • 一時的にpukiwiki.ini.phpのdate\?の定義を//でコメント化したうえで、date\?を記入したテンプレートを作成・保存し、再びpukiwiki.ini.phpを元に戻すというのがいちばん現実的対応のような気が。どうせテンプレートなんて頻繁に書き換えるものじゃないし。 -- reimy 2003-06-27 (金) 01:04:13
  • 逆転の発想で、テンプレート取り込み時にのみ変換するルールを作るというのはどうでしょう。&PAGE → &page にするような。 -- dai? 2005-04-28 (木) 00:48:49
  • これすべて(2)のテンプレートが適用されちゃうんですが。hoge/template無視されます。 -- アッカ? 2005-07-22 (金) 17:03:23
  • official:質問箱3/137にも書きましたが、ぱんださんの書かれたサンプルそのままだと配列のキーが同一なので上書きされてしまいますね。正規表現として同義&妥当で、配列のキーを変えるには、空文字列にヒットさせるか、コメントを使う方法があると思います。↓の感じで。 -- にぶんのに 2005-07-23 (土) 02:08:54
    // コメントを使う例
    $auto_template_rules = array(
    	'((.+)\/([^\/]+))(?# 特定階層のみのテンプレート)' => '\2/template',
    	'((.+)\/([^\/]+))(?# 汎用テンプレート)' => 'template',
    	'(()(.+))'     => 'template'
    );
    // 空文字列にヒットさせる例
    $auto_template_rules = array(
    	'((.+)\/([^\/]+)).?' => '\2/template',
    	'((.+)\/([^\/]+)).?.?' => 'template',
    	'(()(.+))'     => 'template'
    );

*1 先に言えって? すいません :) 今気づきました。

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2005-07-23 (土) 02:27:41
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.406 sec.

OSDN