[EXPERIMENTAL] 複数行のプラグイン引数を可能に

  • ページ: BugTrack2
  • 投稿者: henoheno
  • 優先順位: 普通
  • 状態: 着手
  • カテゴリー: 本体新機能
  • 投稿日: 2005-07-03 (日) 21:32:39
  • バージョン:

修正

この修正は広く評価を受けるための一時的なものであり、今後仕様が変更されたり、削除される事があります

定数 PKWKEXP_DISABLE_MULTILINE_PLUGIN_HACK を 0 にすることにより、有効となる実験的なコード(multiline_convert-16-for146.diff)を追加。

PukiWiki/1.4/ちょっと便利に/複数行のプラグイン引数を可能に の最新の成果ではあるものの、既存の「ページ書き換え方式」プラグインと干渉する事が判っています。PukiWikiのプラグインのような文字列を複数行の引数の中に書かないのであれば、それなりに動作するでしょう。

メッセージ

このBugTrackは、複数行のプラグイン引数を可能にするためのハックに対するポインタを与えるためのものです。最終的に話題をまとめる場所にもなるでしょう。

利用時に影響を受ける可能性のあるもの

  • plugin/article.inc.php
  • plugin/comment.inc.php
  • (plugin/edit.inc.php 見だし編集機能を使っている場合)
  • plugin/insert.inc.php
  • plugin/ls2.inc.php
  • plugin/memo.inc.php
  • plugin/paint.inc.php
  • plugin/pcomment.inc.php
  • plugin/vote.inc.php

文章データの処理方法案

  • ちょっと考えてみました。こんなんどうでしょう? -- 0 2005-12-24 (土) 12:47:52
    • ↓追加関数。
      function plugin_for_mph($line, $lines) {// for multiline plugin hack
      		$multi   = false;
      		$matches = array();
      		if (! PKWKEXP_DISABLE_MULTILINE_PLUGIN_HACK &&
      		    preg_match('/^#[^{]+(\{\{+)\s*$/', $line, $matches)) {
      			$multi = true;
      			$len   = strlen($matches[1]);
      			while (! empty($lines)) {
      				$next_line = $line .= array_shift($lines);
      				if (preg_match('/\}{' . $len . '}/', $next_line)) {
      					break;
      				}
      			}
      		}
      		return array($line, $lines, $multi);
      }
    • 例えば、memoプラグイン↓。
      diff -ur /org/plugin/memo.inc.php /dev/plugin/memo.inc.php
      --- /org/plugin/memo.inc.php
      +++ /dev/plugin/memo.inc.php
      @@ -22,15 +22,26 @@
      @@ -22,11 +22,12 @@
       	$postdata_old  = get_source($vars['refer']);
       	$postdata = '';
       	$memo_no = 0;
      -	foreach($postdata_old as $line) {
      -		if (preg_match("/^#memo\(?.*\)?$/i", $line)) {
      +	while (! empty($postdata_old)) {
      +		$line = array_shift($postdata_old);
      +		list($line, $postdata_old, $multi) = plugin_for_mph($line, $postdata_old);
      +		if (preg_match("/^#memo\(?.*\)?$/i", $line) && $multi == false) {
       			if ($memo_no == $vars['memo_no']) {
      -				$postdata .= '#memo(' . $memo_body . ')' . "\n";
      -				$line = '';
      +				$line = '#memo(' . $memo_body . ')' . "\n";
       			}
       			++$memo_no;
       		}
  • ただし、上記方法は自己書き換え型プラグインが複数行でない場合に限ります。 -- 0 2005-12-24 (土) 13:10:38
  • pcomment で “$reply == true” 時、読み込むテキストが以下のような場合にも注意が必要なようです。参考までに。 -- 0 2006-03-23 (木) 16:02:03
    - textA
    #multiline{{{
    - textB
    }}}
    • textB の md5 を書き込むが、convert_html($data) で <li> として返ってこないので置き換えが出来ないのが原因です。ここも回避しないとダメなようです。 -- 0 2006-03-23 (木) 16:03:14
  • また微妙な関数を考えてみました。参考までに↓ -- 0 2006-06-22 (木) 15:51:13
    // 前処理
    function multi2single($lines)
    {
    	if (PKWKEXP_DISABLE_MULTILINE_PLUGIN_HACK) {
    		return $lines;
    	}
    
    	$return_lines = array();
    	while (! empty($lines)) {
    		$line = array_shift($lines);
    
    		if (substr($line, 0, 1) == '#' &&
    		    preg_match('/^#[^{]+(\{\{+)\s*$/', $line, & $matches)) {
    			$len = strlen($matches[1]);
    			$line .= "\r";// Delimiter
    			while (! empty($lines)) {
    				$next_line = array_shift($lines);
    				if (preg_match('/\}{' . $len . '}/', rtrim($next_line, "\r\n")) {
    					$line .= $next_line ."\r";
    					break;
    				} else {
    					$line .= $next_line .= "\r";// Delimiter
    				}
    			}
    		}
    		$return_lines[] = $line;
    	}
    	return $return_lines;
    }
    
    // 後処理
    $lines = str_replace("\r", "\n", $lines);
    • 例えば memo プラグイン
      $postdata_old = multi2single($postdata_old);
      foreach($postdata_old as $line) {
          :
          :
          :
      }
      $postdata = str_replace("\r", "\n", $postdata);
  • 処理するデータを複数行とは無関係なものにします*1。後処理は少々強引ですが (^^; -- 0 2006-06-22 (木) 16:08:33

コメント

  • lib/convert_html.php と lib/make_link.php は基本的に、先に分解できるところまで分解・変換してしまうように処理をしていますが、ブロック型プラグインだけ実行が後回しになっているので、複数行のプラグイン引数内でプラグインを呼ぶと、表示順序(ソース上での出現順)と実際のカウント番号が合わなくなってしまうようです。(official:自作プラグイン/attachref.inc.php のコメント参照)
    YTable クラスで「toString() を呼ぶ前に、html形式に変換しているのはなぜか?」とコメントしているのを解決すれば、どうにかなるんですかね?(逆に周りに合わせて、Div::Div() でdo_plugin_convert() を実行するでも、一応は・・・ですけど) -- 2009-04-13 (月) 19:38:20

*1 #multi{{hoge}} の中身(hoge)とは干渉しないはずです

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2009-04-13 (月) 19:38:20
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.226 sec.

OSDN