OSDN Git Service

Now this trunk equal 3.62 without documentation. We need to test for install and...
[nucleus-jp/nucleus-jp-ancient.git] / utf8 / nucleus / libs / COMMENT.php
1 <?php
2
3 /*
4  * Nucleus: PHP/MySQL Weblog CMS (http://nucleuscms.org/)
5  * Copyright (C) 2002-2007 The Nucleus Group
6  *
7  * This program is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License
9  * as published by the Free Software Foundation; either version 2
10  * of the License, or (at your option) any later version.
11  * (see nucleus/documentation/index.html#license for more info)
12  */
13 /**
14  * A class representing a single comment
15  *
16  * @license http://nucleuscms.org/license.txt GNU General Public License
17  * @copyright Copyright (C) 2002-2007 The Nucleus Group
18  * @version $Id$
19  * $NucleusJP: COMMENT.php,v 1.4 2006/07/17 20:03:44 kimitake Exp $
20  */
21 class COMMENT {
22
23         /**
24           * Returns the requested comment
25           * 
26           * @static
27           */
28         function getComment($commentid) {
29                 $query = 'SELECT `cnumber` AS commentid, `cbody` AS body, `cuser` AS user, `cmail` AS userid, `cemail` AS email, `cmember` AS memberid, `ctime`, `chost` AS host, `mname` AS member, `cip` AS ip, `cblog` AS blogid'
30                                         . ' FROM ' . sql_table('comment') . ' LEFT OUTER JOIN ' . sql_table('member') . ' ON `cmember` = `mnumber`'
31                                         . ' WHERE `cnumber` = ' . intval($commentid);
32                 $comments = sql_query($query);
33
34                 $aCommentInfo = sql_fetch_assoc($comments);
35                 if ($aCommentInfo) {
36                         $aCommentInfo['timestamp'] = strtotime($aCommentInfo['ctime']);
37                 }
38                 return $aCommentInfo;
39         }
40
41         /**
42           * Prepares a comment to be saved
43           *       
44           * @static
45           */
46         function prepare($comment) {
47                 $comment['user'] = strip_tags($comment['user']);
48                 $comment['userid'] = strip_tags($comment['userid']);
49                 $comment['email'] = strip_tags($comment['email']);
50
51                 // remove newlines from user; remove quotes and newlines from userid and email; trim whitespace from beginning and end
52                 $comment['user'] = trim(strtr($comment['user'], "\n", ' ') );
53                 $comment['userid'] = trim(strtr($comment['userid'], "\'\"\n", '-- ') );
54                 $comment['email'] = trim(strtr($comment['email'], "\'\"\n", '-- ') );
55                 
56                 // begin if: a comment userid is supplied, but does not have an "http://" or "https://" at the beginning - prepend an "http://"
57                 if ( !empty($comment['userid']) && (strpos($comment['userid'], 'http://') !== 0) && (strpos($comment['userid'], 'https://') !== 0) ) {
58                         $comment['userid'] = 'http://' . $comment['userid'];
59                 } // end if
60                 
61                 $comment['body'] = COMMENT::prepareBody($comment['body']);
62                 
63                 return $comment;
64         }
65
66         /**
67          * Prepares the body of a comment
68          *
69          * @ static
70          */             
71         function prepareBody($body) {
72                 # replaced ereg_replace() below with preg_replace(). ereg* functions are deprecated in PHP 5.3.0
73                 # original ereg_replace: ereg_replace("\n.\n.\n", "\n", $body);
74                 
75                 // convert Windows and Mac style 'returns' to *nix newlines
76                 $body = preg_replace("/\r\n/", "\n", $body);
77                 $body = preg_replace("/\r/", "\n", $body);
78                 
79                 // then remove newlines when too many in a row (3 or more newlines get converted to 1 newline)
80                 $body = preg_replace("/\n{3,}/", "\n\n", $body);
81                 
82                 // encode special characters as entities
83                 $body = htmlspecialchars($body);
84                 
85                 // trim away whitespace and newlines at beginning and end
86                 $body = trim($body);
87                 
88                 // add <br /> tags
89                 $body = addBreaks($body);
90                 
91                 // create hyperlinks for http:// addresses
92                 // there's a testcase for this in /build/testcases/urllinking.txt
93                 $replaceFrom = array(
94                         '/([^:\/\/\w]|^)((https:\/\/)([\w\.-]+)([\/\w+\.~%&?@=_:;#,-]+))/ie',
95                         '/([^:\/\/\w]|^)((http:\/\/|www\.)([\w\.-]+)([\/\w+\.~%&?@=_:;#,-]+))/ie',
96                         '/([^:\/\/\w]|^)((ftp:\/\/|ftp\.)([\w\.-]+)([\/\w+\.~%&?@=_:;#,-]+))/ie',
97                         '/([^:\/\/\w]|^)(mailto:(([a-zA-Z\@\%\.\-\+_])+))/ie'
98                 );
99                 $replaceTo = array(
100                         'COMMENT::createLinkCode("\\1", "\\2","https")',
101                         'COMMENT::createLinkCode("\\1", "\\2","http")',
102                         'COMMENT::createLinkCode("\\1", "\\2","ftp")',
103                         'COMMENT::createLinkCode("\\1", "\\3","mailto")'
104                 );
105                 $body = preg_replace($replaceFrom, $replaceTo, $body);
106                 
107                 return $body;
108         }
109
110         /**
111          * Creates a link code for unlinked URLs with different protocols
112          *
113          * @ static
114          */     
115         function createLinkCode($pre, $url, $protocol = 'http') {
116                 $post = '';
117
118                 // it's possible that $url ends contains entities we don't want,
119                 // since htmlspecialchars is applied _before_ URL linking
120                 // move the part of URL, starting from the disallowed entity to the 'post' link part
121                 $aBadEntities = array('&quot;', '&gt;', '&lt;');
122                 foreach ($aBadEntities as $entity) {
123                         $pos = strpos($url, $entity);
124                         if ($pos) {
125                                 $post = substr($url, $pos) . $post;
126                                 $url = substr($url, 0, $pos);
127
128                         }
129                 }
130
131                 // remove entities at end (&&&&)
132                 if (preg_match('/(&\w+;)+$/i', $url, $matches)) {
133                         $post = $matches[0] . $post;    // found entities (1 or more)
134                         $url = substr($url, 0, strlen($url) - strlen($post));
135                 }
136
137                 // move ending comma from url to 'post' part
138                 if (substr($url, strlen($url) - 1) == ',') {
139                         $url = substr($url, 0, strlen($url) - 1);
140                         $post = ',' . $post;
141                 }
142
143                 # replaced ereg() below with preg_match(). ereg* functions are deprecated in PHP 5.3.0
144                 # original ereg: ereg('^' . $protocol . '://', $url)
145                 if (!preg_match('#^' . $protocol . '://#', $url) )
146                 {
147                         $linkedUrl = $protocol . (($protocol == 'mailto') ? ':' : '://') . $url;
148                 }
149                 else
150                 {
151                         $linkedUrl = $url;
152                 }
153                 
154                 if ($protocol != 'mailto') {
155                         $displayedUrl = $linkedUrl;
156                 } else {
157                         $displayedUrl = $url;
158                 }
159                 return $pre . '<a href="'.$linkedUrl.'" rel="nofollow">'.shorten($displayedUrl,30,'...').'</a>' . $post;
160         }
161 }
162 ?>