pixmicat - Blame information for rev 311

Subversion Repositories:
Rev:
Rev Author Line No. Line
311 roytam1 1 <?php
2 // Revision : 2006/10/23 22:59
3  
4 /* 輸出表頭 */
5 function head(&$dat, $style=''){
6         header('Content-Type: '.((strpos($_SERVER['HTTP_ACCEPT'],'application/xhtml+xml')!==FALSE) ? 'application/xhtml+xml' : 'text/html').'; charset=utf-8'); // 如果瀏覽器支援XHTML標準MIME就輸出
7         $dat .= '<?xml version="1.0" encoding="UTF-8"?>
8 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
9 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="zh-tw">
10 <head>
11 <meta http-equiv="Pragma" content="no-cache" />
12 <meta http-equiv="Expires" content="Sat, 1 Jan 2000 00:00:00 GMT" />
13 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
14 <meta http-equiv="Content-Language" content="zh-tw" />
15 <title>'.TITLE.'</title>
16 <link rel="stylesheet" type="text/css" href="mainstyle.css" />'.$style.'
17 <!--[if IE]><script type="text/javascript" src="iedivfix.js"></script><![endif]-->
18 <script type="text/javascript" src="mainscript.js"></script>
19 <script type="text/javascript">
20 // <![CDATA[
21 var ext="'.ALLOW_UPLOAD_EXT.'".toUpperCase().split("|");
22 // ]]>
23 </script>
24 </head>
25 <body>
26  
27 <div id="header">
28 <div id="toplink">
29 [<a href="'.HOME.'" rel="_top">回首頁</a>]
30 ';
31         if(USE_SEARCH) $dat .= '[<a href="'.PHP_SELF.'?mode=search">搜尋</a>]'."\n";
32         $dat .= TOP_LINKS.'
33 [<a href="'.PHP_SELF.'?mode=status">系統資訊</a>]
34 [<a href="'.PHP_SELF.'?mode=admin">管理區</a>]
35 [<a href="'.PHP_SELF2.'?">重新整理</a>]
36 </div>
37 <br />
38 <h1>'.TITLE.'</h1>
39 <hr class="top" />
40 </div>
41  
42 ';
43 }
44  
45 /* 發表用表單輸出 */
46 function form(&$dat, $resno){
47         global $ADDITION_INFO;
48         $msg = '';
49         if($resno){
50                 $msg .= '
51 [<a href="'.PHP_SELF2.'?'.time().'">回到版面</a>]
52 <div class="bar_reply">回應模式</div>';
53         }
54         if(USE_FLOATFORM && !$resno) $msg .= "\n".'[<span id="show" class="hide" onmouseover="showform();" onclick="showform();">投稿</span><span id="hide" class="show" onmouseover="hideform();" onclick="hideform();">隱藏表單</span>]';
55         $dat .= '<form action="'.PHP_SELF.'" method="post" enctype="multipart/form-data" onsubmit="return c();" id="postform_main">
56 <div id="postform">'.$msg.'
57 <input type="hidden" name="mode" value="regist" />
58 <input type="hidden" name="MAX_FILE_SIZE" value="'.(MAX_KB * 1024).'" />
59 <input type="hidden" name="upfile_path" value="" />
60 ';
61         if($resno) $dat .= '<input type="hidden" name="resto" value="'.$resno.'" />'."\n";
62         $dat .= '<div style="text-align: center;">
63 <table cellpadding="1" cellspacing="1" id="postform_tbl" style="margin: 0px auto; text-align: left;">
64 <tr><td class="Form_bg"><b>名 稱</b></td><td><input class="hide" type="text" name="name" value="spammer" /><input type="text" name="'.FT_NAME.'" id="fname" size="28" /></td></tr>
65 <tr><td class="Form_bg"><b>E-mail</b></td><td><input type="text" name="'.FT_EMAIL.'" id="femail" size="28" /><input type="text" class="hide" name="email" value="foo@foo.bar" /></td></tr>
66 <tr><td class="Form_bg"><b>標 題</b></td><td><input class="hide" value="DO NOT FIX THIS" type="text" name="sub" /><input type="text" name="'.FT_SUBJECT.'" id="fsub" size="28" /><input type="submit" name="sendbtn" value="送 出" /></td></tr>
67 <tr><td class="Form_bg"><b>內 文</b></td><td><textarea name="'.FT_COMMENT.'" id="fcom" cols="48" rows="4" style="width: 400px; height: 80px;"></textarea><textarea name="com" class="hide" cols="48" rows="4">EID OG SMAPS</textarea></td></tr>
68 ';
69         if(RESIMG || !$resno){
70                 $dat .= '<tr><td class="Form_bg"><b>附加圖檔</b></td><td><input type="file" name="upfile" id="fupfile" size="25" /> <input class="hide" type="checkbox" name="reply" value="yes" />[<input type="checkbox" name="noimg" id="noimg" value="on" /><label for="noimg">無貼圖</label>]';
71                 if(USE_UPSERIES) $dat .= ' [<input type="checkbox" name="up_series" id="up_series" value="on"'.((isset($_GET["upseries"]) && $resno)?' checked="checked"':'').' /><label for="up_series">連貼機能</label>]'; // 啟動連貼機能
72                 $dat .= '</td></tr>'."\n";
73         }
74         if(USE_CATALOG) $dat .= '<tr><td class="Form_bg"><b>類別標籤</b></td><td><input type="text" name="catalog" size="28" /><small>(請以 , 逗號分隔多個標籤)</small></td></tr>'."\n";
75         $dat .= '<tr><td class="Form_bg"><b>刪除用密碼</b></td><td><input type="password" name="pwd" size="8" maxlength="8" value="" /><small>(刪除文章用。英數字8字元以內)</small></td></tr>
76 <tr><td colspan="2">
77 <div id="postinfo">
78 <ul>
79 <li>可附加圖檔類型:GIF, JPG, PNG,瀏覽器才能正常附加圖檔</li>
80 <li>附加圖檔最大上傳資料量為 '.MAX_KB.' KB。當回文時E-mail填入sage為不推文功能</li>
81 <li>當檔案超過寬 '.MAX_W.' 像素、高 '.MAX_H.' 像素時會自動縮小尺寸顯示</li>'."\n";
82         if(STORAGE_LIMIT) $dat .= "<li>目前附加圖檔使用量大小: ".total_size()." KB / ".STORAGE_MAX." KB</li>\n";
83         $dat .= $ADDITION_INFO.'
84 </ul>
85 <noscript><div>*您選擇關閉了JavaScript,但這對您的瀏覽及發文應無巨大影響</div></noscript>
86 </div>
87 </td></tr>
88 </table>
89 </div>
90 <script type="text/javascript">l2();</script>
91 <hr />
92 </div>
93 </form>
94 ';
95         if(USE_FLOATFORM && !$resno) $dat .= '<script type="text/javascript">hideform();</script>'."\n\n";
96 }
97  
98 /* 輸出頁尾文字 */
99 function foot(&$dat){
100         global $time1;
101         $dat .= '<div id="footer">
102 <!-- GazouBBS v3.0 --><!-- ふたば改0.8 --><!-- Pixmicat! -->
103 <small>- <a href="http://php.s3.to" rel="_top">GazouBBS</a> + <a href="http://www.2chan.net/" rel="_top">futaba</a> + <a href="http://pixmicat.openfoundry.org/" rel="_blank">Pixmicat!</a> -</small>
104 Runtime :'.(getMicrotime()-$time1).'
105 <script type="text/javascript">preset();</script>
106 </div>
107  
108 </body>
109 </html>';
110 }
111  
112 /* 網址自動連結 */
113 function auto_link($proto){
114         return preg_replace('/(https?|ftp|news)(:\/\/[\w\+\$\;\?\.\{\}%,!#~*\/:@&=_-]+)/u', '<a href="$1$2" rel="_blank">$1$2</a>', $proto);
115 }
116  
117 /* 引用標註 */
118 function quoteLight($comment){
119         return preg_replace('/(^|<br \/>)((?:&gt;|>).*?)(?=<br \/>|$)/u', '$1<span style="color: '.RE_COL.';">$2</span>', $comment);
120 }
121  
122 /* 輸出錯誤畫面 */
123 function error($mes, $dest=''){
124         if(is_file($dest)) unlink($dest);
125         head($dat);
126         echo $dat;
127         echo '<div id="error">
128 <div style="text-align: center; font-size: 1.5em; font-weight: bold;">
129 <span style="color: red;">'.$mes.'</span><p />
130 <a href="'.PHP_SELF2.'?'.time().'">回到版面</a> <a href="javascript:history.back();">回上頁</a>
131 </div>
132 <hr />
133 </div>
134 ';
135         die("</body>\n</html>");
136 }
137  
138 /* 判斷是否採用Proxy連線 */
139 function proxy_connect($port){
140         $a = ""; $b = "";
141         $fp = @fsockopen($_SERVER["REMOTE_ADDR"], $port, $a, $b, 2);
142         if(!$fp){ return 0; }else{ return 1; }
143 }
144  
145 /* 生成預覽圖:需要開啟GD模組 (GD 2.0.28以上) */
146 function thumb($path, $tim, $ext, $in_w, $in_h, $out_w, $out_h){
147         if(!function_exists('ImageCreateTrueColor')) return; // GD未開或版本太舊
148         $fname = $path.$tim.$ext;
149         $thumb_dir = THUMB_DIR; // 預覽圖儲存目錄位置
150  
151         // 取得原附加圖檔之長寬及類型
152         switch($ext){
153                 case '.gif': // GIF
154                         $im_in = @ImageCreateFromGIF($fname);
155                         break;
156                 case '.jpg': // JPEG
157                 $im_in = @ImageCreateFromJPEG($fname);
158                         break;
159                 case '.png': // PNG
160                         $im_in = @ImageCreateFromPNG($fname);
161                         break;
162                 case '.bmp': // BMP
163                         $im_in = @ImageCreateFromBMP($fname);
164                         break;
165                 default: return; // GD不支援的類型
166         }
167         if(!$im_in) return; // GD不支援的類型
168         // 生成預覽圖圖像
169         $im_out = ImageCreateTrueColor($out_w, $out_h);
170         ImageCopyResampled($im_out, $im_in, 0, 0, 0, 0, $out_w, $out_h, $in_w, $in_h); // 重取樣並縮小
171         // 儲存預覽圖
172         ImageJPEG($im_out, $thumb_dir.$tim.'s.jpg', THUMB_Q);
173         chmod($thumb_dir.$tim.'s.jpg', 0666);
174         // 刪除暫存之圖檔
175         ImageDestroy($im_in);
176         ImageDestroy($im_out);
177 }
178  
179 /* ImageCreateFromBMP : 讓GD可處理BMP圖檔
180 此為修改後最適化版本。原出處:http://www.php.net/imagecreate#53879
181 原作宣告:
182 *****************************
183 Function: ImageCreateFromBMP
184 Author: DHKold
185 Contact: admin@dhkold.com
186 Date: The 15th of June 2005
187 Version: 2.0B
188 *****************************/
189 function ImageCreateFromBMP($filename){
190         // 序章:以二進位模式開啟檔案流
191         if(!$f1 = fopen($filename, 'rb')) return FALSE;
192  
193         // 第一步:讀取BMP檔頭
194         $FILE = unpack('vfile_type/Vfile_size/Vreserved/Vbitmap_offset', fread($f1, 14));
195         if($FILE['file_type']!=19778) return FALSE; // BM
196  
197         // 第二步:讀取BMP資訊
198         // 僅支援BITMAPINFOHEADER,不支援BITMAPV4HEADER及BITMAPV5HEADER
199         $BMP = unpack('Vheader_size/Vwidth/Vheight/vplanes/vbits_per_pixel/Vcompression/Vsize_bitmap/Vhoriz_resolution/Vvert_resolution/Vcolors_used/Vcolors_important', fread($f1, 40));
200         $BMP['colors'] = pow(2, $BMP['bits_per_pixel']);
201         if($BMP['size_bitmap']==0) $BMP['size_bitmap'] = $FILE['file_size'] - $FILE['bitmap_offset'];
202         $BMP['bytes_per_pixel'] = $BMP['bits_per_pixel'] / 8;
203         $BMP['decal'] = ($BMP['width'] * $BMP['bytes_per_pixel'] / 4);
204         $BMP['decal'] -= floor($BMP['width'] * $BMP['bytes_per_pixel'] / 4);
205         $BMP['decal'] = 4 - (4 * $BMP['decal']);
206         if($BMP['decal']==4) $BMP['decal'] = 0;
207  
208         // 第三步:讀取色盤資訊
209         $PALETTE = array();
210         if($BMP['colors'] < 16777216) $PALETTE = unpack('V'.$BMP['colors'], fread($f1, $BMP['colors'] * 4));
211  
212         // 第四步:變換每一個畫素
213         // 尚不支援32bit, 32bit with BITFIELDS, 8bit with RLE8, 4bit with RLE4等格式
214         $IMG = fread($f1, $BMP['size_bitmap']);
215         $VIDE = chr(0);
216  
217         $res = ImageCreateTrueColor($BMP['width'], $BMP['height']);
218         $P = 0;
219         $Y = $BMP['height'] - 1;
220         while($Y >= 0){
221                 $X = 0;
222                 while($X < $BMP['width']){
223                         switch($BMP['bits_per_pixel']){
224                                 case 24: $COLOR = unpack('V', substr($IMG, $P, 3).$VIDE); break;
225                                 case 16: $COLOR = unpack('n', substr($IMG, $P, 2)); break;
226                                 case 8: $COLOR = unpack('n', $VIDE.substr($IMG, $P, 1)); break;
227                                 case 4:
228                                         $COLOR = unpack('n', $VIDE.substr($IMG, floor($P), 1));
229                                         if(($P*2)%2==0) $COLOR[1] = ($COLOR[1] >> 4);
230                                         else $COLOR[1] = ($COLOR[1] & 0x0F);
231                                         break;
232                                 case 1:
233                                         $COLOR = unpack('n', $VIDE.substr($IMG, floor($P), 1));
234                                         switch(($P * 8) % 8){
235                                                 case 0: $COLOR[1] = $COLOR[1] >> 7; break;
236                                                 case 1: $COLOR[1] = ($COLOR[1] & 0x40) >> 6; break;
237                                                 case 2: $COLOR[1] = ($COLOR[1] & 0x20) >> 5; break;
238                                                 case 3: $COLOR[1] = ($COLOR[1] & 0x10) >> 4; break;
239                                                 case 4: $COLOR[1] = ($COLOR[1] & 0x8) >> 3; break;
240                                                 case 5: $COLOR[1] = ($COLOR[1] & 0x4) >> 2; break;
241                                                 case 6: $COLOR[1] = ($COLOR[1] & 0x2) >> 1; break;
242                                                 case 7: $COLOR[1] = ($COLOR[1] & 0x1);
243                                         }
244                                         break;
245                                 default:
246                                         return FALSE;
247                         }
248                         if($BMP['bits_per_pixel']!=24) $COLOR[1] = $PALETTE[$COLOR[1]+1];
249                         ImageSetPixel($res, $X, $Y, $COLOR[1]);
250                         $X++;
251                         $P += $BMP['bytes_per_pixel'];
252                 }
253                 $Y--;
254                 $P += $BMP['decal'];
255         }
256  
257         // 終章:關閉檔案,回傳新圖像
258         fclose($f1);
259         return $res;
260 }
261  
262 /* 文字修整 */
263 function CleanStr($str, $IsAdmin=false){
264         $str = trim($str); // 去除前後多餘空白
265         if(get_magic_quotes_gpc()) $str = stripslashes($str); // "\"斜線符號去除
266         if(!($IsAdmin && CAP_ISHTML)) $str = preg_replace('/&(#[0-9]+|[a-z]+);/i', "&$1;", htmlspecialchars($str)); // 非管理員或管理員自己取消HTML使用:HTML標籤禁用
267         else{ // 管理員開啟HTML
268                 $str = str_replace('>', '&gt;', $str); // 先將每個 > 都轉碼
269                 $str = preg_replace('/(<.*?)&gt;/', '$1>', $str); // 如果有<...&gt;則轉回<...>成為正常標籤
270         }
271         return $str;
272 }
273  
274 /* 適用UTF-8環境的擬substr,取出特定數目字元
275 原出處:Sea Otter (?不確定) @ 2005.05.10 */
276 function str_cut($str, $maxlen=20){
277     $i = $l = 0; $len = strlen($str); $f = true; $return_str = $str;
278         while($i < $len){
279                 if(ord($str{$i}) < 0x80){ $l++; $i++; }
280                 elseif(ord($str{$i}) < 0xe0){ $l++; $i += 2; }
281                 elseif(ord($str{$i}) < 0xf0){ $l += 2; $i += 3; }
282                 elseif(ord($str{$i}) < 0xf8){ $l++; $i += 4; }
283         elseif(ord($str{$i}) < 0xfc){ $l++; $i += 5; }
284                 elseif(ord($str{$i}) < 0xfe){ $l++; $i += 6; }
285                 if(($l >= $maxlen) && $f){
286                         $return_str = substr($str, 0, $i);
287                         $f = false;
288                 }
289                 if(($l > $maxlen) && ($i <= $len)){
290                         $return_str = $return_str.'…';
291                         break;
292                 }
293     }
294         return $return_str;
295 }
296  
297 /* 檢查瀏覽器和伺服器是否支援gzip壓縮方式 */
298 function CheckSupportGZip(){
299         $HTTP_ACCEPT_ENCODING = isset($_SERVER['HTTP_ACCEPT_ENCODING']) ? $_SERVER['HTTP_ACCEPT_ENCODING'] : '';
300         if(headers_sent() || connection_aborted()) return 0; // 已送出資料,取消
301         if(!extension_loaded('zlib') && !function_exists('gzencode') || !function_exists('ob_start') || !function_exists('ob_get_clean')) return 0; // 伺服器相關的套件或函式無法使用,取消
302         if(strpos($HTTP_ACCEPT_ENCODING, 'gzip')!==false) return 'gzip';
303         return 0;
304 }
305  
306 /* 使用DNSBL (RBL) 伺服器檢查是否為黑名單 */
307 function DNSBLQuery(){
308         global $DNSBLservers, $DNSBLWHlist;
309         $flag = '';     $addr = $_SERVER['REMOTE_ADDR'];
310         if(DNSBL_CHECK && $addr != '127.0.0.1'){
311                 if(array_search($addr, $DNSBLWHlist)!==FALSE) return false; // IP位置在白名單內
312                 $rev = implode('.', array_reverse(explode('.', $addr)));
313                 $maxcount = count($DNSBLservers);
314                 if(DNSBL_CHECK < $maxcount) $maxcount = DNSBL_CHECK;
315                 for($i = 0; $i < $maxcount; $i++){
316                         $query = $rev.'.'.$DNSBLservers[$i].'.'; // 最後面加個點可以防止某些問題
317                         $result = gethostbyname($query);
318                         if($result && ($result != $query)){ $flag = $DNSBLservers[$i]; break; }
319                 }
320         }
321         if($flag) error("您所使用的連線($addr) 已被 DNSBL($flag) 列為封鎖名單!<br />".'詳情: <a href="http://openrbl.org/client/#'.$addr.'" rel="_blank">Openrbl DNSBL RBL Blacklist Lookup</a>');
322 }
323 ?>