sitesearch.inc.php
<?php
function plugin_sitesearch_convert()
{
global $script, $vars;
//
// 機能: ホームページの内容をヒント付きで検索するプラグイン。
// とほほさん(http://www.tohoho-web.com/)作 wwwsearch.cgi Ver3.15から作成
// $Id: sitesearch.inc.php,v 1.2 2006/03/14
// Copyright(C) sfuji 2005-2006 All Rights Reseved.
// sfuji'URL : : http://sfuji.sakura.ne.jp
//
// =================================================================
// 初期化パラメータ
// =================================================================
//
// ★ 検索対象フォルダ(必須)
// 検索対象のフォルダ名を指定してください。http://~ のようなURLを指定す
// ることはできません。複数指定する場合はスペースで区切ってください。
// 右辺サンプル './../pukiwiki/wiki ./../htmldir ./../hogedirectory';
$target_dir = './../sfuji/wiki';
// ★ 検索対象ファイル
// 検索対象とするファイルの拡張子を指定します。
$suffix = "htm|html|txt";
// ★ [戻る]ボタン
// [戻る]のリンクをクリックされた時にジャンプする先のページを指定して
// ください。http://~ ではじまるURLも指定可能です。
$return_url = './index.php';
// ★ 検索対象ファイルの漢字コード
// 検索対象のファイルの漢字コードを指定してください。シフトJISの場合は "sjis"、
// EUCの場合は "euc"、JISコードや不明な場合は "unknown" を指定してください。
// sjis や euc の場合は検索が早くなります。
$kcode_file = "euc";
// ★ 検索結果ヒントの表示行数
// 検索結果に、ファイルの内容のヒントとして表示する行数を指定します。
$how_many_lines = 3; // マッチした行の前後何行を表示するか
// ★ 検索キーの表示
$HitCharColor = "#ffffff"; //検索キーの文字色
$HitCharBgcolor = "#3300CC"; //検索キーの背景色
//
// ★ menu欄に検索窓を置く場合は「#sitesearch」が記述されている頁を指定
// defaultでは「サイト内検索」の頁名となっています。
// menu欄に検索窓を置かない場合は使用しないので無視して下さい。
$disppage = "%A5%B5%A5%A4%A5%C8%C6%E2%B8%A1%BA%F7"; //検索結果を表示する頁
$menubarsize = 0; //MenuBarの横サイズが9emより小さい時は1に変更
//
// =================================================================
// 本体
// =================================================================
//
// 初期設定
//引数の取得
if (func_num_args() > 0) {
$array = func_get_args();
$menuwindow = $array[0];
if ($array[1] == "1") $dispofmenu = 1;
}
//pukiwikiを設置してあるディレクトリ取得
$pukiwikidir = DATA_HOME;
if (!$pukiwikidir) {
list( $ScRipt, $Query ) = explode( '\?', $_SERVER['REQUEST_URI'] );
$pukiwikidir = preg_replace('/(\/)(.*)(\/)(.*)/',"\$2",$ScRipt);
}
$hit_count = 0; // 見つかった件数
//----------------------------
// メインルーチン
//----------------------------
// MENUに検索窓がある場合の処理
// HTML文書を書き出す
if ($menuwindow == "menu") {
$ret = '<form method="post" action="' . $script . '?cmd=read&page='.$disppage.'">';
$ret .= '<input type="text" name="WORD" size=23 value=""><br>';
$ret .= '<input type="radio" name="ANDOR" value="and" checked>AND';
$ret .= '<input type="radio" name="ANDOR" value="or">OR';
if ($menubarsize) $ret .= '<br>';
$ret .= '<input type="submit" value="検索">';
$ret .= '</form>';
if ($dispofmenu) {
$ret .= '<ul>';
$ret .= '<li><small>このホームページの内容を検索します。</small>';
$ret .= '<li><small>複数の単語を入力する時は半角スペースで区切ってください。</small>';
$ret .= '</ul>';
}
return $ret;
}
// フォームからの入力データを読み込む
if ($_SERVER['REQUEST_METHOD'] == "POST"){
$word = trim($_POST["WORD"]);
if (preg_match('/[\x80-\xff]/i', $word)) {
$jflag = 1; // 日本語が含まれているフラグをセット
}
}
// HTML文書を書き出す
$ret = '<h3>サイト内検索</h3>';
$ret .= '<hr>';
$ret .= '<form method="post" action="' . $script . '?cmd=read&page=' . rawurlencode($vars['page']) . '">';
$ret .= '<nobr>';
$tmp = $word;
str_replace("&","&", $tmp);
str_replace("<","<", $tmp);
str_replace(">",">", $tmp);
str_replace("\"",""", $tmp);
$ret .= '<input type="text" name="WORD" size=25 value="'.$tmp.'">';
if ($_POST{'ANDOR'} == "or") {
$ret .= '<input type="radio" name="ANDOR" value="and">AND';
$ret .= '<input type="radio" name="ANDOR" value="or" checked>OR';
} else {
$ret .= '<input type="radio" name="ANDOR" value="and" checked>AND';
$ret .= '<input type="radio" name="ANDOR" value="or">OR';
}
$ret .= '<input type="submit" value="検索">';
$ret .= '</nobr>';
$ret .= '</form>';
$ret .= '<ul>';
$ret .= '<li>このホームページの内容を検索します。';
$ret .= '<li>複数の単語を入力する時は半角スペースで区切ってください。';
$ret .= '</ul>';
if ($return_url != "") {
$ret .= '<a href="' . $return_url . '">[戻る]</a>';
}
$ret .= '<hr>';
if ($_SERVER['REQUEST_METHOD'] == "GET") {
return $ret;
}
if ($_POST{'WORD'}) {
// メタ文字を無効化する
if (!$jflag) {
preg_replace('/([\+\*\.\?\^\$\[\-\]\|\(\)\\])/','', $word);
}
$word = trim($_POST["WORD"]);
# 検索語を分割する
$words = preg_explode('/ +/', $word);
# 検索する
$ret .= '<dl>';
$dirs = preg_explode('/ +/', $target_dir);
$TrgtDirSu = count($dirs);
for ($TrgtDir=0; $TrgtDir < $TrgtDirSu; $TrgtDir++) {
$files = glob("$dirs[$TrgtDir]/*");
$i=$j=0;
while($i<=count($files)){
if (filetype($files[$i]) == "file"){
if(preg_match("\.($suffix)",$files[$i])){
$site[$j] =$files[$i];
$reqret = search($site[$j],$dirs[$TrgtDir],$words,$how_many_lines,$pukiwikidir,$HitCharColor,$HitCharBgcolor);
if ($reqret) {
$ret .= $reqret;
$hit_count++;
}
$j++;
}
}
$i++;
}
}
$ret .= '</dl>';
}
if ($hit_count) {
$ret .= '<hr>';
$ret .= '<div>'.$hit_count.' 件みつかりました。</div>';
} else {
$ret .= '<div>1件もみつかりませんでした。</div>';
}
return $ret;
}
//
//-------------------------------------------------------
function search($filename, $dir,$words,$how_many_lines,$pukiwikidir,$HitCharColor,$HitCharBgcolor){
//-------------------------------------------------------
//
# 各種変数を初期化する
$reqret = "";
$wordflag = "";
$htmltitle = "";
$match_count = 0;
//検索するファイルを読み込む
$RecordCount = 0;
$fp = fopen($filename, "r");
while( !(feof($fp) ) ) {
$buf = fgets($fp, 1024);
$buf = rtrim($buf);
$lines[$RecordCount] = $buf;
$RecordCount++;
}
fclose($fp);
for ($i = 0; $i <= count($lines); $i++) {
$line = $lines[$i];
// タイトルを覚えておく
if ((!$htmltitle) && (preg_match('<title>',$line))){
$htmltitle = $line;
$htmltitle =preg_replace('/<[^>]*(>|$)/i','',$htmltitle);
}
if ((preg_match("\.htm",$filename)) ||
(preg_match("\.html",$filename))) {
$line = strip_tags($line);
}
//
//OR検索(FALSE)、AND検索(TRUE)
$b_type = FALSE;
if ($_POST['ANDOR'] == "and") {$b_type = TRUE;}
//検索結果、最初はFALSEで検索開始
$b_match = FALSE;
$matchesu = 0;
foreach ($words as $word) {
if (preg_match($word, $line, $regs)) { $matchesu++;}
}
if (($b_type) && ($matchesu== count($words))) { $b_match = TRUE;}
if ((!$b_type) && ($matchesu)) { $b_match = TRUE;}
//検索でヒットしました。
if (($b_match) && ($wordflag != "1"))
{
// 見つかったことを覚えておく
$wordflag = 1;
//
# 表示する
$authflag= TRUE; //v1.1 defaultでは閲覧OK
$UrlFileName = $wtarget = $filename;
$UrlFileName = str_replace($dir."/","", $UrlFileName);
if (preg_match('/wiki/',$filename)) {
$UrlFileName = str_replace(".txt","", $UrlFileName);
$UrlFileName = preg_match('/^[0-9a-f]+$/i', $UrlFileName) ?
pack('H*', (string)$UrlFileName) : $UrlFileName;
$wtarget = '"./../' . $pukiwikidir . '/?'.$UrlFileName.'"';
$authflag= check_readable($UrlFileName, false, false); //v1.1 閲覧制限のチェック
}
if ($authflag) { //v1.1 閲覧OK頁のみを表示
$reqret .= '<dt>■ <a href='.$wtarget.' target=out>';
if (!$htmltitle)
{$reqret .= $UrlFileName.'</a>';}
else {$reqret .= $htmltitle.'</a>';}
$reqret .= '</dt>';
$reqret .= '<dd>';
$imin = $i - $how_many_lines;
if ($imin < 0) { $imin = 0; }
$imax = $imin + $how_many_lines;
if ($imax > count($lines)) { $imax = count($lines); }
for ($j = $imin; $j <= $imax; $j++) {
$line = $lines[$j];
$line = preg_replace('/<[^>]*(>|$)/','', $line);
$tmp = $word;
if ($jflag) {
$tmp = preg_replace('/([\+\*\.\?\^\$\[\-\]\|\(\)\\])/','/\\$1/', $tmp);
}
foreach ($words as $w) {
$w2 = '/'.$w.'/i';
$line = preg_replace($w2,'<font color="' . $HitCharColor . '"><span style="background-color: '.$HitCharBgcolor.'" ><b>'.$w.'</b></span></font>', $line); //v1.1 反転文字を採用
}
if (preg_match('/\/wiki\//i',$filename)) {
$line = pukiwikiformat($line);
}
//
$reqret .= $line;
$reqret .= '</dd>';
}
} //v1.1 閲覧制限外頁の表示終了
} //検索でのヒット処理終了
}
return $reqret;
}
//
function pukiwikiformat($line){
$line = preg_replace('/^ +/','', $line);
$line = preg_replace('/^-+/','', $line);
$line = preg_replace('/^\*+/','', $line);
$line = preg_replace('/\[#.*\]/','', $line);
$line = str_replace("~","", $line);
$line = str_replace("[[","", $line);
$line = str_replace("]]","", $line);
$line = str_replace("|","|", $line);
$line = str_replace("&br;","", $line);
return $line;
}
//履歴
// v1.0 新規レリース 2005.12.27
// v1.1 閲覧・編集制限の頁を検索対象外にしました。 2006.01.02
// v1.1 検索文字を反転文字にしました。 2006.01.02
// v1.2 MENUに検索窓を設置した場合の処理を追記
?>