disable comments $NB_COM_CLOSE = 2592000; # number of seconds after which comments are closed $NB_COM_MAX_SIZE = 2000; # max number of chars in a comment $o_umask = umask(0); # for mkdir() # Display the comment form function form($id) { global $NB_COM; $me = $_SERVER['PHP_SELF']; $author = $_POST['author']; $url = $_POST['url']; $com = $_POST['comment']; $epoch = id2epoch($id); if ($NB_COM == 0) { echo "

Comments are temporary closed

"; return; } if (closed($epoch)) { echo "

Comments are closed

"; echo "If you really, really want to comment, please "; echo "mail miek@miek.nl"; return; } if (strlen($url) == 0) { $url = "http://"; } echo <<Leave a Comment

Allowed bb tags: [b] [i] [s] [code] [quote] [url]

All comments are moderated

EOF; } # submit a comment function submit() { global $NB_COM_BASE; global $NB_COM; $link = "" . $_POST['author'] . ""; $com = bb_tags(strip_html_tags($_POST['comment'])); $dir = "$NB_COM_BASE/" . $_POST['comment_id'] . "/new/"; $ok = "$NB_COM_BASE/" . $_POST['comment_id'] . "/ok/"; if ($NB_COM == 1) { if (!file_exists($dir)) { mkdir($dir, 0775, TRUE); } if (!file_exists($ok)) { mkdir($ok, 0775, TRUE); } } $prefix = time() . "_"; $err = form_check(); $author = $_POST['author']; $date = strftime($NB_TIME, time()); if (!empty($err)) { # errors echo '
'; foreach($err as $e) { echo $e, "
"; } echo '
'; } else { echo '
'; echo "Your comment is submitted and awaits moderation"; if ($NB_COM != 1) { echo "Sorry, commenting is temporary disabled"; } echo '
'; $_POST['author'] = ""; $_POST['url'] = ""; $_POST['comment'] = ""; if ($NB_COM == 1) { $file = tempnam($dir, $prefix); chmod($file, 0640); file_put_contents($file, "$link\n$com"); } } echo <<
Submitted
$author
$date
$com
EOF; } # preview a submit function preview() { global $NB_TIME; $date = strftime($NB_TIME, time()); $author = "" . $_POST['author'] . ""; $com = bb_tags(strip_html_tags($_POST['comment'])); $err = form_check(); if (!empty($err)) { # errors echo '
'; foreach($err as $e) { echo $e, "
"; } echo '
'; } echo <<
Preview
$author
$date
$com
EOF; } # check $website starts with http:// does not contain ../'s function form_check() { global $NB_COM_MAX_SIZE; $err = array(); if (strlen($_POST['author']) == 0) { $err[] = "A name is required"; } if (strlen($_POST['comment']) > $NB_COM_MAX_SIZE) { $err[] = "Comment is too large"; $_POST['comment'] = substr($text, 0, $NB_COM_MAX_SIZE); } return $err; } # Check the comment directory for this article # return an array with the commens function gather($id) { global $NB_COM_BASE; global $NB_TIME; $dir="$NB_COM_BASE/$id/ok"; $comment = array(); $matched = array(); $contents = array(); $i = 0; foreach (glob("$dir/*") as $com) { # $matched[1] has epoch preg_match("/.*ok\/(.*)_/", $com, $matched); if (strlen($matched[1]) != 0) { $contents = explode("\n", file_get_contents($com)); $comment[$i]['author'] = $contents[0]; $comment[$i]['date'] = strftime($NB_TIME, $matched[1]); $comment[$i]['comment'] = implode("\n", array_slice($contents, 1)); $i++; } } return $comment; } # Give back the html of the given comments function show($comment) { $i = 0; echo ''; foreach ($comment as $com) { echo ""; if ($i % 2 == 0) { echo '
'; } else { echo '
'; } echo "$i"; echo '
'; echo $com['author']; echo "
"; echo $com['date']; echo '
'; echo '
' . $com['comment'] . "
"; echo '
'; echo "
\n"; $i++; } } # http://nadeausoftware.com/articles/2007/09/php_tip_how_strip_html_tags_web_page # Remove HTML tags, including invisible text such as style and # script code, and embedded objects. Add line breaks around # block-level tags to prevent word joining after tag removal. function strip_html_tags($text) { $text = preg_replace( array( # Remove invisible content '@]*?>.*?@siu', '@]*?>.*?@siu', '@]*?.*?@siu', '@]*?.*?@siu', '@]*?.*?@siu', '@]*?.*?@siu', '@]*?.*?@siu', '@]*?.*?@siu', '@]*?.*?@siu', # Add line breaks before and after blocks '@$1", $text); # [i] - italic $text = preg_replace("/\[i\]((.|\n)*?)\[\/i\]/", "$1", $text); # [s] - strike through $text = preg_replace("/\[s\]((.|\n)*?)\[\/s\]/", "$1", $text); # [code] - code examples $text = preg_replace("/\[code\]((.|\n)*?)\[\/code\]/", "$1", $text); # [quote] - quote something $text = preg_replace("/\[quote\]((.|\n)*?)\[\/quote\]/", "
$1
", $text); # [url]link[/url] $text = preg_replace("/\[url\]((.|\n)*?)\[\/url\]/", "$1", $text); # [url=domain]linkname[/url] $text = preg_replace("/\[url=(.*)\]((.|\n)*?)\[\/url\]/", "$2", $text); $text = nl2br($text); return $text; } # convert an article ID to epoch function id2epoch($id) { $m = array(); preg_match("/e(.*?)-(.*?)-(.*?)T(.*?)_(.*?)_(.*?)\.txt/", $id, $m); return strtotime($m[1] . "-" . $m[2] . "-" . $m[3] . " " . $m[4] . ":" . $m[5] . ":" . $m[6]); } # return FALSE when comments are OK, otherwise TRUE function closed($t) { global $NB_COM_CLOSE; if (time() - $t > $NB_COM_CLOSE) { return TRUE; } return FALSE; } # return a comment string in HTML # the string is with strike through if # commenting is closed otherwise it is # normal function commentstr($id, $permalink) { global $NB_COM; $epoch = id2epoch($id); $link = ""; if ($NB_COM != 1) { return "$linkComments: "; } if (closed($epoch)) { return "$linkComments: "; } else { return "${link}Comments: "; } } ?>