pixmicat - Rev 311

Subversion Repositories:
Rev:
<?php
/*
    mod_pmcadmin (假稱) - 擬FutabaLightPHP概念的管理介面 v超人柱 v1.7α
        - 一切起源於4chan DevBlog的一張irc2.png圖片
    Co-developed Roytam1 and scribe
   
    pmc_ajax2 - Test AJAX front-end
*/

include_once("./config.inc.php");
define('GZIP_COMPRESS_LEVEL', 4);

$mode = isset($_GET['mode']) ? $_GET['mode'] : '';
if(GZIP_COMPRESS_LEVEL){ ob_start(); ob_implicit_flush(0); } // 啟動Gzip壓縮緩衝
switch($mode){
    case 'list': // 顯示列表模式
        listxml(isset($_GET['no'])?$_GET['no']:0);
        break;
    default: // 預設情況
        loadhtml();
}
if(($Encoding = CheckSupportGZip()) && GZIP_COMPRESS_LEVEL){ // 啟動Gzip
    if(!ob_get_length()) exit; // 沒內容不必壓縮
    header('Content-Encoding: '.$Encoding);
    header('X-Content-Encoding-Level: '.GZIP_COMPRESS_LEVEL);
    header('Vary: Accept-Encoding');
    print gzencode(ob_get_clean(), GZIP_COMPRESS_LEVEL); // 壓縮內容
}else ob_end_flush(); // 沒壓縮,直接印出緩衝區內容

/* 檢查瀏覽器是否支援gzip壓縮方式 */
function CheckSupportGZip(){
    $HTTP_ACCEPT_ENCODING = isset($_SERVER['HTTP_ACCEPT_ENCODING']) ? $_SERVER['HTTP_ACCEPT_ENCODING'] : "";
    if(headers_sent()||connection_aborted()) return 0; // 已送出資料,取消
    if(!extension_loaded('zlib')) return 0; // 未啟動zlib函式庫無法壓縮
    if(strpos($HTTP_ACCEPT_ENCODING,'gzip')!==false) return "gzip";
    return 0;
}

/* XML頁頭結構 */
function xmlheader($status){
    header('Content-type: application/xml');
    print '<?xml version="1.0" encoding="UTF-8"?>
<pmc>
<status>'
.$status.'</status>
'
;
}

/* XML列表結構 */
function xmlbody_list($no,$imgt,$imgext,$name,$email,$subject,$time,$comment,$res=''){
    print '<item id="'.$no.'">
<imgt>'
.$imgt.'</imgt>
<imgext>'
.($imgext?$imgext:'?').'</imgext>
<name><![CDATA['
.$name.']]></name>
<email><![CDATA[ '
.$email.']]></email>
<subject><![CDATA['
.$subject.']]></subject>
<time>'
.$time.'</time>
<comment><![CDATA['
.$comment.']]></comment>
'
.$res.'
</item>
'
;
}

function xmlbody_res($no,$imgt,$imgext,$name,$email,$subject,$time,$comment){
    return '<item id="'.$no.'">
<imgt>'
.$imgt.'</imgt>
<imgext>'
.($imgext?$imgext:'?').'</imgext>
<name><![CDATA['
.$name.']]></name>
<email><![CDATA[ '
.$email.']]></email>
<subject><![CDATA['
.$subject.']]></subject>
<time>'
.$time.'</time>
<comment><![CDATA['
.$comment.']]></comment>
</item>
'
;
}

/* XML進階資訊結構 */
function xmlbody_detail($name,$subject,$comment,$host){
    print '<name>'.$name.'</name>
<subject>'
.$subject.'</subject>
<host>'
.$host.'</host>
<comment><![CDATA['
.$comment.']]></comment>
'
;
}

/* XML頁尾結構 */
function xmlfooter(){
    print '</pmc>';
}

/* 讀取記錄並列表成XML */
function listxml($resno=0){
    $page = isset($_GET['page']) ? $_GET['page'] : 1;
        $tree = array_map('rtrim', file(TREEFILE));
        $counttree = count($tree);
    $data = file(LOGFILE);
    $ary_count = count($data);
        for($i = 0; $i < $ary_count; $i++){
                list($no,) = explode(",", $data[$i]);
                $lineindex[$no] = $i + 1; // 作成逆轉換標籤
        }
        $find = false;
        if($resno) {
                for($i = 0;$i<$counttree;$i++){
                        list($artno,) = explode(",",$tree[$i]);
                        if($artno==$resno){ $st = $i; $find = true; break; } // 先搜尋欲回應之原文章
                }
        if(!$find){ xmlheader('-Not Found'); xmlfooter(); exit; } // 無此筆資料
            $ary_pagedef = 1; // 一頁顯示筆數
            $ary_partstart = $st; // 換頁所讀的第一個號碼
            $ary_partend = $ary_partstart+1; // 換頁所讀的最後一個號碼
            $page_cnt = 1;
        }else{
            $ary_pagedef = PAGE_DEF; // 一頁顯示筆數
            $ary_partstart = ($page - 1) * $ary_pagedef; // 換頁所讀的第一個號碼
            $ary_partstart = ($ary_partstart >= $ary_count) ? $ary_count - $ary_pagedef : $ary_partstart; // 超過範圍
            $ary_partend = $page * $ary_pagedef; // 換頁所讀的最後一個號碼
            $ary_partend = ($ary_partend > $ary_count) ? $ary_count : $ary_partend; // 超過範圍
            $page_cnt = ceil($ary_count / $ary_pagedef);
    }
    xmlheader('+OK'); // 印出頁頭
    print '<thumbbase>'.THUMB_DIR.'</thumbbase>
<imgbase>'
.IMG_DIR.'</imgbase>
<pages>'
.$page_cnt.'</pages>'."\n";
    for($i = $ary_partstart; $i < $ary_partend; $i++){
                if(!isset($tree[$i])) continue;
                $treeline = explode(",", $tree[$i]);
                $treeline_count = count($treeline);

                $res='';$alert='';
                if(!$resno){
                        $s = $treeline_count - RE_DEF;
                        if($s<1) $s = 1;
                        elseif($s > 1) $alert .= "<br /><font color=\"#707070\">有回應 ".($s - 1)." 篇被省略。要閱讀所有回應請按下回應連結。</font>";
                }
                $RES_start = $resno?1:$s; // 分頁開始回應指標
                $RES_end = $treeline_count; // 分頁結束回應指標
                // 快要被刪除的提示
                if($lineindex[$treeline[0]]+1 >= LOG_MAX*0.95) $alert .= "<br /><font color=\"#f00000\"><b>這篇已經很舊了,不久後就會刪除。</b></font>";
                for($k = $RES_start; $k < $RES_end; $k++){
                        if(!isset($treeline[$k])) continue; // 未對應就略過
                        if(@!isset($data[$lineindex[$treeline[$k]] - 1])) continue; // 在$j之範圍外
                $idata = explode(",", $data[$lineindex[$treeline[$k]] - 1]);
                        $res.=xmlbody_res($idata[0], $idata[12], $idata[9], $idata[2], $idata[3], $idata[4], $idata[1], $idata[5]);
                }
                $res="<replies>".$res."</replies>";

                if(!isset($data[$lineindex[$treeline[0]] - 1])) continue; // 在$j之範圍外
        $idata = explode(",", $data[$lineindex[$treeline[0]] - 1]);
        xmlbody_list($idata[0], $idata[12], $idata[9], $idata[2], $idata[3], $idata[4], $idata[1], $idata[5].$alert,$res); // 印出列表結構

    }
    xmlfooter(); // 印出頁尾
}

/* 列出文章的進階資訊 */
function detail(){
    if(isset($_GET['no'])){ // 有no
        $tno = $_GET['no'];
        $tree = explode(',',implode(',', array_map('rtrim',file(TREEFILE))));
        if(!in_array($tno,$tree)){ xmlheader('-Not Found'); xmlfooter(); exit; } // 無此筆資料
        $line = file(LOGFILE);
        $countline = count($line);
        for($i = 0; $i < $countline; $i++){
            list($no,) = explode(",", $line[$i]);
            $lineindex[$no] = $i; // 作成逆轉換標籤
        }
        xmlheader('+OK');
        $line[$lineindex[$tno]] = explode(",", $line[$lineindex[$tno]]);
        $line[$lineindex[$tno]][2] = str_replace(array("<span class='Cname_admin'>","<span class='nor'>","</span>"), "", $line[$lineindex[$tno]][2]); // 名稱欄位
        //   0,   1,    2,     3,   4,   5,   6,    7,   8,   9,10,11,   12,  13
        // $no,$now,$name,$email,$sub,$com,$url,$host,$pwd,$ext,$w,$h,$time,$chk
        xmlbody_detail($line[$lineindex[$tno]][2], $line[$lineindex[$tno]][4], $line[$lineindex[$tno]][5], $line[$lineindex[$tno]][7]);
        xmlfooter();
    }else{
        xmlheader('-No Argument');
        xmlfooter();
    }
}

/* 印出介面 */
function loadhtml(){
    header('Content-Type: '.((strpos($_SERVER['HTTP_ACCEPT'],'application/xhtml+xml')!==FALSE) ? 'application/xhtml+xml' : 'text/html'));
    readfile("pmc_ajax2.htm.tmpl");
}

/* 要求輸入密碼畫面 */
function enterpass(){
    header('Content-Type: '.((strpos($_SERVER['HTTP_ACCEPT'],'application/xhtml+xml')!==FALSE) ? 'application/xhtml+xml' : 'text/html'));
    print '<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="zh-tw">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta http-equiv="Content-Language" content="zh-tw" />
<title>請登入</title>
</head>
<body>
<form action="'
.$_SERVER['PHP_SELF'].'?mode=admin" method="POST">
<input type="hidden" name="notmd5" value="true" />
請輸入管理者密碼:<input type="password" name="pass" /> <input type="submit" value="認証" />
</form>
</body>
</html>'
;
}
?>