$template) { if (preg_match("/$rule/",$page,$matches)) { $template_page = preg_replace("/$rule/",$template,$page); if (is_page($template_page)) { $body = join('',get_source($template_page)); // 見出しの固有ID部を削除 $body = preg_replace('/^(\*{1,3}.*)\[#[A-Za-z][\w-]+\](.*)$/m','$1$2',$body); // #freezeを削除 $body = preg_replace('/^#freeze\s*$/m','',$body); for ($i = 0; $i < count($matches); $i++) { $body = str_replace("\$$i",$matches[$i],$body); } break; } } } return $body; } // 検索語を展開する function get_search_words($words,$special=FALSE) { $retval = array(); // Perlメモ - 正しくパターンマッチさせる // http://www.din.or.jp/~ohzaki/perl.htm#JP_Match $eucpre = $eucpost = ''; if (SOURCE_ENCODING == 'EUC-JP') { $eucpre = '(? 0); if ($b_match xor $b_type) { break; } } if ($b_match) { $pages[$page] = get_filetime($page); } } if ($non_format) { return array_keys($pages); } $r_word = rawurlencode($word); $s_word = htmlspecialchars($word); if (count($pages) == 0) { return str_replace('$1',$s_word,$_msg_notfoundresult); } ksort($pages); $retval = "\n"; $retval .= str_replace('$1',$s_word,str_replace('$2',count($pages), str_replace('$3',count($_pages),$b_type ? $_msg_andresult : $_msg_orresult))); return $retval; } // プログラムへの引数のチェック function arg_check($str) { global $vars; return array_key_exists('cmd',$vars) and (strpos($vars['cmd'],$str) === 0); } // ページ名のエンコード function encode($key) { return ($key == '') ? '' : strtoupper(join('',unpack('H*0',$key))); } // ページ名のデコード function decode($key) { return ($key == '') ? '' : substr(pack('H*','20202020'.$key),4); } // [[ ]] を取り除く function strip_bracket($str) { if (preg_match('/^\[\[(.*)\]\]$/',$str,$match)) { $str = $match[1]; } return $str; } // ページ一覧の作成 function page_list($pages, $cmd = 'read', $withfilename=FALSE) { global $script,$list_index,$top; global $_msg_symbol,$_msg_other; global $pagereading_enable; // ソートキーを決定する。 ' ' < '[a-zA-Z]' < 'zz'という前提。 $symbol = ' '; $other = 'zz'; $retval = ''; if($pagereading_enable) { mb_regex_encoding(SOURCE_ENCODING); $readings = get_readings($pages); } $list = array(); foreach($pages as $file=>$page) { $r_page = rawurlencode($page); $s_page = htmlspecialchars($page,ENT_QUOTES); $passage = get_pg_passage($page); $str = "
  • $s_page$passage"; if ($withfilename) { $s_file = htmlspecialchars($file); $str .= "\n \n "; } $str .= "
  • "; if($pagereading_enable) { if(mb_ereg('^([A-Za-z])',mb_convert_kana($page,'a'),$matches)) { $head = $matches[1]; } elseif(mb_ereg('^([ァ-ヶ])',$readings[$page],$matches)) { $head = $matches[1]; } elseif (mb_ereg('^[ -~]|[^ぁ-ん亜-熙]',$page)) { $head = $symbol; } else { $head = $other; } } else { $head = (preg_match('/^([A-Za-z])/',$page,$matches)) ? $matches[1] : (preg_match('/^([ -~])/',$page,$matches) ? $symbol : $other); } $list[$head][$page] = $str; } ksort($list); $cnt = 0; $arr_index = array(); $retval .= "\n"; if ($list_index and $cnt > 0) { $top = array(); while (count($arr_index) > 0) { $top[] = join(" | \n",array_splice($arr_index,0,16))."\n"; } $retval = "
    \n". join("
    ",$top)."
    \n".$retval; } return $retval; } // テキスト整形ルールを表示する function catrule() { global $rule_page; if (!is_page($rule_page)) { return "

    sorry, $rule_page unavailable.

    "; } return convert_html(get_source($rule_page)); } // エラーメッセージを表示する function die_message($msg) { $title = $page = 'Runtime error'; $body = <<Runtime error Error message : $msg EOD; if(defined('SKIN_FILE') && file_exists(SKIN_FILE) && is_readable(SKIN_FILE)) { catbody($title,$page,$body); } else { header('Content-Type: text/html; charset=euc-jp'); print << $title $body EOD; } die(); } // 現在時刻をマイクロ秒で取得 function getmicrotime() { list($usec, $sec) = explode(' ',microtime()); return ((float)$sec + (float)$usec); } // 日時を得る function get_date($format,$timestamp = NULL) { $time = ($timestamp === NULL) ? UTIME : $timestamp; $time += ZONETIME; $format = preg_replace('/(?60,'h'=>24,'d'=>1); $time = max(0,(UTIME - $time) / 60); //minutes foreach ($units as $unit=>$card) { if ($time < $card) { break; } $time /= $card; } $time = floor($time).$unit; return $paren ? "($time)" : $time; } //を隠す function drop_submit($str) { return preg_replace( '/]+)type="(submit|button|image)"/i', 'read(); $ignorepages = $config->get('IgnoreList'); $forceignorepages = $config->get('ForceIgnoreList'); unset($config); $auto_pages = array_merge($ignorepages,$forceignorepages); foreach ($pages as $page) { if (preg_match("/^$WikiName$/",$page) ? $nowikiname : strlen($page) >= $autolink) { $auto_pages[] = $page; } } if (count($auto_pages) == 0) { return $nowikiname ? '(?!)' : $WikiName; } $auto_pages = array_unique($auto_pages); sort($auto_pages,SORT_STRING); $auto_pages_a = array_values(preg_grep('/^[A-Z]+$/i',$auto_pages)); $auto_pages = array_values(array_diff($auto_pages,$auto_pages_a)); $result = get_autolink_pattern_sub($auto_pages,0,count($auto_pages),0); $result_a = get_autolink_pattern_sub($auto_pages_a,0,count($auto_pages_a),0); return array($result,$result_a,$forceignorepages); } function get_autolink_pattern_sub(&$pages,$start,$end,$pos) { if ($end == 0) { return '(?!)'; } $result = ''; $count = 0; $x = (mb_strlen($pages[$start]) <= $pos); if ($x) { $start++; } for ($i = $start; $i < $end; $i = $j) { $char = mb_substr($pages[$i],$pos,1); for ($j = $i; $j < $end; $j++) { if (mb_substr($pages[$j],$pos,1) != $char) { break; } } if ($i != $start) { $result .= '|'; } if ($i >= ($j - 1)) { $result .= str_replace(' ','\\ ',preg_quote(mb_substr($pages[$i],$pos),'/')); } else { $result .= str_replace(' ','\\ ',preg_quote($char,'/')). get_autolink_pattern_sub($pages,$i,$j,$pos + 1); } $count++; } if ($x or $count > 1) { $result = '(?:'.$result.')'; } if ($x) { $result .= '?'; } return $result; } // pukiwiki.phpスクリプトのabsolute-uriを生成 function get_script_uri() { $script = (SERVER_PORT == 443 ? 'https://' : 'http://'); // scheme $script .= SERVER_NAME; // host $script .= (SERVER_PORT == 80 ? '' : ':' . SERVER_PORT); // port // SCRIPT_NAME が'/'で始まっていない場合(cgiなど) REQUEST_URIを使ってみる $path = SCRIPT_NAME; if ($path{0} != '/') { if (!isset($_SERVER['REQUEST_URI']) or $_SERVER['REQUEST_URI']{0} != '/') return FALSE; // REQUEST_URIをパースし、path部分だけを取り出す $parse_url = parse_url($script.$_SERVER['REQUEST_URI']); if (!isset($parse_url['path']) or $parse_url['path']{0} != '/') return FALSE; $path = $parse_url['path']; } $script .= $path; // path return $script; } /* 変数内のnull(\0)バイトを削除する PHPはfopen("hoge.php\0.txt")で"hoge.php"を開いてしまうなどの問題あり http://ns1.php.gr.jp/pipermail/php-users/2003-January/012742.html [PHP-users 12736] null byte attack 2003-05-16: magic quotes gpcの復元処理を統合 2003-05-21: 連想配列のキーはbinary safe */ function sanitize($param) { if (is_array($param)) { $result = array_map('sanitize',$param); } else { $result = str_replace("\0",'',$param); if (get_magic_quotes_gpc()) { $result = stripslashes($result); } } return $result; } // CSV形式の文字列を配列に function csv_explode($separator, $string) { $_separator = preg_quote($separator,'/'); if (!preg_match_all('/("[^"]*(?:""[^"]*)*"|[^'.$_separator.']*)'.$_separator.'/', $string.$separator, $matches)) { return array(); } $retval = array(); foreach ($matches[1] as $str) { $len = strlen($str); if ($len > 1 and $str{0} == '"' and $str{$len - 1} == '"') { $str = str_replace('""', '"', substr($str, 1, -1)); } $retval[] = $str; } return $retval; } // 配列をCSV形式の文字列に function csv_implode($glue, $pieces) { $_glue = ($glue != '') ? '\\'.$glue{0} : ''; $arr = array(); foreach ($pieces as $str) { if (ereg("[$_glue\"\n\r]",$str)) { $str = '"'.str_replace('"', '""', $str).'"'; } $arr[] = $str; } return join($glue, $arr); } //is_a //(PHP 4 >= 4.2.0) // //is_a -- Returns TRUE if the object is of this class or has this class as one of its parents if (!function_exists('is_a')) { function is_a($class, $match) { if (empty($class)) { return false; } $class = is_object($class) ? get_class($class) : $class; if (strtolower($class) == strtolower($match)) { return true; } return is_a(get_parent_class($class), $match); } } //array_fill //(PHP 4 >= 4.2.0) // //array_fill -- Fill an array with values if (!function_exists('array_fill')) { function array_fill($start_index,$num,$value) { $ret = array(); while ($num-- > 0) { $ret[$start_index++] = $value; } return $ret; } } //md5_file //(PHP 4 >= 4.2.0) // //md5_file -- Calculates the md5 hash of a given filename if (!function_exists('md5_file')) { function md5_file($filename) { if (!file_exists($filename)) { return FALSE; } $fd = fopen($filename, 'rb'); $data = fread($fd, filesize($filename)); fclose($fd); return md5($data); } } ?>