NP_match
2007年3月14日
Nucleus 3.3 の<%if%>の新しい機能、doIf() を使ったプラグインの大まかな構想がほぼ決定。NP_ExtendedIf の後継となるもので、より高いパフォーマンスと機能が期待できる。この構想に従い、NP_ExtendedIf は引退させることになりそう(3.24より前のNucleus用に、wiki のページは置いておくけれども)。ちょっと勇み足かもしれないけれど、ここに公開。
このプラグインは、なるべく肥大化しない方向で、シンプルなソースコードになるように開発したい。おそらく、100行以下を一つの目安とすると思う。
(最新版の情報は、Wiki にあります。)
使用方法
単一のアイテムを選択しているときのみ実行する場合
複数のアイテムを指定したい場合
カテゴリー、サブカテゴリー指定の場合は、上記の『itemid』をそれぞれ『catid』もしくは『subcatid』と変更。
ブログのトップページなど、一部のページを表示しているときのみ実行する場合
URLに『?extendedif=xxx』が指定されているとき
注意:<%match(default,preg)%>などでメソッド指定した場合、以後の<%if(match)%>命令のすべてに適応される。2回目以降の<%if(match)%>命令で、元通り文字列として判定したい場合は、<%match(default,str)%>を実行する必要がある。
ソースコード
(4月18日改定。とりあえず、βバージョンとします。ver 0.1.x と ver 0.2.x では文法が異なります。)
このプラグインは、なるべく肥大化しない方向で、シンプルなソースコードになるように開発したい。おそらく、100行以下を一つの目安とすると思う。
(最新版の情報は、Wiki にあります。)
使用方法
単一のアイテムを選択しているときのみ実行する場合
<%if(match,itemid=256)%> (ここに表示したい内容を挿入) <%endif%>(アイテムidが256の時)
複数のアイテムを指定したい場合
<%if(match,itemid=^(64|128|256)$,ereg)%> (ここに表示したい内容を挿入) <%endif%>(アイテムid, 64, 128, 256の3つを指定する場合)
<%if(match,itemid>=100,int)%> <%if(match,itemid<=199,int)%> (ここに表示したい内容を挿入) <%endif%><%endif%>(アイテムid, 100から199までを指定する場合)
<%if(match,itemid=/^1[0-9]{2}$/,preg)%> (ここに表示したい内容を挿入) <%endif%>(アイテムid, 100から199までを指定する別の方法)
カテゴリー、サブカテゴリー指定の場合は、上記の『itemid』をそれぞれ『catid』もしくは『subcatid』と変更。
ブログのトップページなど、一部のページを表示しているときのみ実行する場合
<%if(match,REQUEST_URI=/blog/)%> (ここに表示したい内容を挿入) <%endif%>(URLが『http://www.sample.com/blog/』の時)
URLに『?extendedif=xxx』が指定されているとき
<%if(match,extendedif=xxx)%> (ここに表示したい内容を挿入) <%endif%>
注意:<%match(default,preg)%>などでメソッド指定した場合、以後の<%if(match)%>命令のすべてに適応される。2回目以降の<%if(match)%>命令で、元通り文字列として判定したい場合は、<%match(default,str)%>を実行する必要がある。
ソースコード
(4月18日改定。とりあえず、βバージョンとします。ver 0.1.x と ver 0.2.x では文法が異なります。)
<?php class NP_match extends NucleusPlugin { function getName() { return 'NP_match'; } function getMinNucleusVersion() { return 330; } function getAuthor() { return 'Katsumi'; } function getVersion() { return '0.2.3'; } function getURL() {return 'http://www.rad51.net/nucleus/index.php?itemid=265';} function getDescription() { return $this->getName().' plugin. Usage: <%if(match,name=str)%> etc.'; } function supportsFeature($what) { return ($what=='SqlTablePrefix')?1:0; } var $conf=array('method'=>'str', 'decode'=>'', 'data'=>''); var $securemode=false; function doSkinVar($skintype,$p1='',$p2=''){ switch($p1){ case 'default': $this->conf=$this->setting($p2); break; default: break; } } function doIf($p1,$p2=''){ global $HTTP_GET_VARS,$HTTP_SERVER_VARS; if (!is_array($_GET)) $_GET=&$HTTP_GET_VARS; if (!is_array($_SERVER)) $_SERVER=&$HTTP_SERVER_VARS; // Initialize if (!preg_match('/^([^<>=]+)([<>=]+)([\S\s]+)$/',$p1,$matches)) return $this->_error('Syntax error:'.$p1); list($p1,$name,$comp,$value)=$matches; if (!is_array( $matchconf=$this->setting($p2) )) return false; // Origin of data (Get $var from data) switch($matchconf['data']){ case 'get': if (isset($_GET[$name])) $var=$_GET[$name]; break; case 'globals': if (isset($GLOBALS[$name])) $var=$GLOBALS[$name]; break; case 'server': if (isset($_SERVER[$name])) $var=$_SERVER[$name]; break; default: if (isset($_GET[$name])) $var=$_GET[$name]; elseif (isset($GLOBALS[$name])) $var=$GLOBALS[$name]; elseif (isset($_SERVER[$name])) $var=$_SERVER[$name]; } if (!isset($var)) return false; // Decode the regular expression or not (convert $value that is encoded regular expression) switch($matchconf['decode']){ case 'rawurldecode': case 'urldecode': $value=call_user_func($matchconf['decode'],$value); default: break; } // Try matching switch($matchconf['method']){ case 'preg': case 'preg_match': case 'ereg': case 'eregi': return $this->_regexp($matchconf['method'],$value,$var); case 'int': case 'integer': $var=(int)$var; $var2=(int)$value; break; case 'float': case 'double': case 'real': $var=(float)$var; $var2=(float)$value; break; case 'str': case 'string': default: $var=(string)$var; $var2=(string)$value; break; } switch($comp){ case '=' : case '==': return ($var == $var2); case '!=': case '<>': return ($var != $var2); case '<=': case '=<': return ($var <= $var2); case '>=': case '=>': return ($var >= $var2); case '<' : return ($var < $var2); case '>' : return ($var > $var2); default: return $this->_error('Syntax error:'.$p1.' near "'.$comp.'"'); } } function _regexp($method,$value,$var){ if ($method=='preg') $method='preg_match'; if (($ret=@call_user_func($method,$value,$var))===false) return $this->_error('Regular expression error: "'.$value.'"'); return (bool)$ret; } function setting($value){ if (!$value) return $this->conf; $matchconf=$this->conf; foreach(explode('|',$value) as $each) if ($each) { switch (count( $each=explode('=',$each) )) { case 1: $matchconf['method']=$each[0]; break; case 2: $matchconf[$each[0]]=$each[1]; break; default: return $this->_error('Syntax error:'.$p1.' near "'.$each[0].'"'); } } return $matchconf; } function _error($msg){ echo '<!-- --><b>'.$this->getName().' - '.htmlspecialchars($msg).'</b>'; if ($this->securemode) exit; return false; } } ?>