OSDN Git Service

PDO対応
[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                 {
37                         $aCommentInfo['timestamp'] = strtotime($aCommentInfo['ctime']);
38                 }
39                 return $aCommentInfo;
40         }
41
42         /**
43           * Prepares a comment to be saved
44           *       
45           * @static
46           */
47         function prepare($comment) {
48                 $comment['user'] = strip_tags($comment['user']);
49                 $comment['userid'] = strip_tags($comment['userid']);
50                 $comment['email'] = strip_tags($comment['email']);
51
52                 // remove quotes and newlines from user and userid
53                 $comment['user'] = strtr($comment['user'], "\'\"\n",'-- ');
54                 $comment['userid'] = strtr($comment['userid'], "\'\"\n",'-- ');
55                 $comment['email'] = strtr($comment['email'], "\'\"\n",'-- ');
56
57                 $comment['body'] = COMMENT::prepareBody($comment['body']);
58
59                 return $comment;
60         }
61
62         /**
63          * Prepares the body of a comment
64          *
65          * @ static
66          */             
67         function prepareBody($body) {
68
69                 // remove newlines when too many in a row
70                 $body = ereg_replace("\n.\n.\n","\n",$body);
71
72                 // encode special characters as entities
73                 $body = htmlspecialchars($body);
74
75                 // trim away whitespace and newlines at beginning and end
76                 $body = trim($body);
77
78                 // add <br /> tags
79                 $body = addBreaks($body);
80
81                 // create hyperlinks for http:// addresses
82                 // there's a testcase for this in /build/testcases/urllinking.txt
83                 $replaceFrom = array(
84                         '/([^:\/\/\w]|^)((https:\/\/)([\w\.-]+)([\/\w+\.~%&?@=_:;#,-]+))/ie',
85                         '/([^:\/\/\w]|^)((http:\/\/|www\.)([\w\.-]+)([\/\w+\.~%&?@=_:;#,-]+))/ie',
86                         '/([^:\/\/\w]|^)((ftp:\/\/|ftp\.)([\w\.-]+)([\/\w+\.~%&?@=_:;#,-]+))/ie',
87                         '/([^:\/\/\w]|^)(mailto:(([a-zA-Z\@\%\.\-\+_])+))/ie'
88                 );
89                 $replaceTo = array(
90                         'COMMENT::createLinkCode("\\1", "\\2","https")',
91                         'COMMENT::createLinkCode("\\1", "\\2","http")',
92                         'COMMENT::createLinkCode("\\1", "\\2","ftp")',
93                         'COMMENT::createLinkCode("\\1", "\\3","mailto")'
94                 );
95                 $body = preg_replace($replaceFrom, $replaceTo, $body);
96
97                 return $body;
98         }
99
100         /**
101          * Creates a link code for unlinked URLs with different protocols
102          *
103          * @ static
104          */     
105         function createLinkCode($pre, $url, $protocol = 'http') {
106                 $post = '';
107
108                 // it's possible that $url ends contains entities we don't want,
109                 // since htmlspecialchars is applied _before_ URL linking
110                 // move the part of URL, starting from the disallowed entity to the 'post' link part
111                 $aBadEntities = array('&quot;', '&gt;', '&lt;');
112                 foreach ($aBadEntities as $entity)
113                 {
114                         $pos = strpos($url, $entity);
115                         if ($pos)
116                         {
117                                 $post = substr($url, $pos) . $post;
118                                 $url = substr($url, 0, $pos);
119
120                         }
121                 }
122
123                 // remove entities at end (&&&&)
124                 if (preg_match('/(&\w+;)+$/i', $url, $matches)) {
125                         $post = $matches[0] . $post;    // found entities (1 or more)
126                         $url = substr($url, 0, strlen($url) - strlen($post));
127                 }
128
129                 // move ending comma from url to 'post' part
130                 if (substr($url, strlen($url) - 1) == ',')
131                 {
132                         $url = substr($url, 0, strlen($url) - 1);
133                         $post = ',' . $post;
134                 }
135
136                 if (!ereg('^'.$protocol.'://',$url))
137                         $linkedUrl = $protocol . (($protocol == 'mailto') ? ':' : '://') . $url;
138                 else
139                         $linkedUrl = $url;
140
141
142                 if ($protocol != 'mailto')
143                         $displayedUrl = $linkedUrl;
144                 else
145                         $displayedUrl = $url;
146                 return $pre . '<a href="'.$linkedUrl.'" rel="nofollow">'.shorten($displayedUrl,30,'...').'</a>' . $post;
147         }
148
149 }
150
151 ?>