Trunk updated to 0.9 git-svn-id: http://kusabax.cultnet.net/svn/repo/stable@176 73d99b7e-4f53-4972-b7b7-2ecd3c4d89ee
326 lines
11 KiB
PHP
326 lines
11 KiB
PHP
<?php
|
|
/*
|
|
* This file is part of kusaba.
|
|
*
|
|
* kusaba is free software; you can redistribute it and/or modify it under the
|
|
* terms of the GNU General Public License as published by the Free Software
|
|
* Foundation; either version 2 of the License, or (at your option) any later
|
|
* version.
|
|
*
|
|
* kusaba is distributed in the hope that it will be useful, but WITHOUT ANY
|
|
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
|
* A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License along with
|
|
* kusaba; if not, write to the Free Software Foundation, Inc.,
|
|
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
* +------------------------------------------------------------------------------+
|
|
* Parse class
|
|
* +------------------------------------------------------------------------------+
|
|
* A post's message text will be passed, which will then be formatted and cleaned
|
|
* before being returned.
|
|
* +------------------------------------------------------------------------------+
|
|
*/
|
|
class Parse {
|
|
var $boardtype;
|
|
var $parentid;
|
|
var $id;
|
|
var $boardid;
|
|
|
|
function MakeClickable($txt) {
|
|
/* Make http:// urls in posts clickable */
|
|
$txt = preg_replace('#(http://|https://|ftp://)([^(\s<)]*)#', '<a href="\\1\\2">\\1\\2</a>', $txt);
|
|
|
|
return $txt;
|
|
}
|
|
|
|
function BBCode($string){
|
|
$patterns = array(
|
|
'`\[b\](.+?)\[/b\]`is',
|
|
'`\[i\](.+?)\[/i\]`is',
|
|
'`\[u\](.+?)\[/u\]`is',
|
|
'`\[s\](.+?)\[/s\]`is',
|
|
'`\[aa\](.+?)\[/aa\]`is',
|
|
'`\[spoiler\](.+?)\[/spoiler\]`is',
|
|
);
|
|
$replaces = array(
|
|
'<b>\\1</b>',
|
|
'<i>\\1</i>',
|
|
'<span style="border-bottom: 1px solid">\\1</span>',
|
|
'<strike>\\1</strike>',
|
|
'<div style="font-family: Mona,\'MS PGothic\' !important;">\\1</div>',
|
|
'<span class="spoiler" onmouseover="this.style.color=\'white\';" onmouseout="this.style.color=\'black\'">\\1</span>',
|
|
);
|
|
$string = preg_replace($patterns, $replaces , $string);
|
|
$string = preg_replace_callback('`\[code\](.+?)\[/code\]`is', array(&$this, 'code_callback'), $string);
|
|
|
|
return $string;
|
|
}
|
|
|
|
function code_callback($matches) {
|
|
$return = '<div style="white-space: pre !important;font-family: monospace !important;">'
|
|
. str_replace('<br />', '', $matches[1]) .
|
|
'</div>';
|
|
|
|
return $return;
|
|
}
|
|
|
|
function ColoredQuote($buffer, $boardtype) {
|
|
/* Add a \n to keep regular expressions happy */
|
|
if (substr($buffer, -1, 1)!="\n") {
|
|
$buffer .= "\n";
|
|
}
|
|
|
|
if ($boardtype==1) {
|
|
/* The css for text boards use 'quote' as the class for quotes */
|
|
$class = 'quote';
|
|
$linechar = '';
|
|
} else {
|
|
/* The css for imageboards use 'unkfunc' (???) as the class for quotes */
|
|
$class = 'unkfunc';
|
|
$linechar = "\n";
|
|
}
|
|
$buffer = preg_replace('/^(>[^>](.*))\n/m', '<span class="'.$class.'">\\1</span>' . $linechar, $buffer);
|
|
/* Remove the > from the quoted line if it is a text board */
|
|
if ($boardtype==1) {
|
|
$buffer = str_replace('<span class="'.$class.'">>', '<span class="'.$class.'">', $buffer);
|
|
}
|
|
|
|
return $buffer;
|
|
}
|
|
|
|
function ClickableQuote($buffer, $board, $boardtype, $parentid, $boardid, $ispage = false) {
|
|
global $thread_board_return;
|
|
$thread_board_return = $board;
|
|
$thread_board_id = $boardid;
|
|
|
|
/* Add html for links to posts in the board the post was made */
|
|
$buffer = preg_replace_callback('/>>([r]?[l]?[f]?[q]?[0-9,\-,\,]+)/', array(&$this, 'InterthreadQuoteCheck'), $buffer);
|
|
|
|
/* Add html for links to posts made in a different board */
|
|
$buffer = preg_replace_callback('/>>\/([a-z]+)\/([0-9]+)/', array(&$this, 'InterboardQuoteCheck'), $buffer);
|
|
|
|
return $buffer;
|
|
}
|
|
|
|
function InterthreadQuoteCheck($matches) {
|
|
global $tc_db, $ispage, $thread_board_return, $thread_board_id;
|
|
|
|
$lastchar = '';
|
|
// If the quote ends with a , or -, cut it off.
|
|
if(substr($matches[0], -1) == "," || substr($matches[0], -1) == "-") {
|
|
$lastchar = substr($matches[0], -1);
|
|
$matches[1] = substr($matches[1], 0, -1);
|
|
$matches[0] = substr($matches[0], 0, -1);
|
|
}
|
|
if ($this->boardtype != 1 && is_numeric($matches[1])) {
|
|
|
|
$query = "SELECT `parentid` FROM `".KU_DBPREFIX."posts` WHERE `boardid` = " . $this->boardid . " AND `id` = ".$tc_db->qstr($matches[1]);
|
|
$result = $tc_db->GetOne($query);
|
|
if ($result !== '') {
|
|
if ($result == 0) {
|
|
$realid = $matches[1];
|
|
} else {
|
|
$realid = $result;
|
|
}
|
|
} else {
|
|
return $matches[0];
|
|
}
|
|
|
|
$return = '<a href="'.KU_BOARDSFOLDER.$thread_board_return.'/res/'.$realid.'.html#'.$matches[1].'" onclick="return highlight(\'' . $matches[1] . '\', true);" class="ref|' . $thread_board_return . '|' .$realid . '|' . $matches[1] . '">'.$matches[0].'</a>'.$lastchar;
|
|
} else {
|
|
$return = $matches[0];
|
|
|
|
$postids = getQuoteIds($matches[1]);
|
|
if (count($postids) > 0) {
|
|
$realid = $this->parentid;
|
|
if ($realid === 0) {
|
|
if ($this->id > 0) {
|
|
$realid = $this->id;
|
|
}
|
|
}
|
|
if ($realid !== '') {
|
|
$return = '<a href="' . KU_BOARDSFOLDER . 'read.php';
|
|
if (KU_TRADITIONALREAD) {
|
|
$return .= '/' . $thread_board_return . '/' . $realid.'/' . $matches[1];
|
|
} else {
|
|
$return .= '?b=' . $thread_board_return . '&t=' . $realid.'&p=' . $matches[1];
|
|
}
|
|
$return .= '">' . $matches[0] . '</a>';
|
|
}
|
|
}
|
|
}
|
|
|
|
return $return;
|
|
}
|
|
|
|
function InterboardQuoteCheck($matches) {
|
|
global $tc_db;
|
|
|
|
$result = $tc_db->GetAll("SELECT `id`, `type` FROM `".KU_DBPREFIX."boards` WHERE `name` = ".$tc_db->qstr($matches[1])."");
|
|
if ($result[0]["type"] != '') {
|
|
$result2 = $tc_db->GetOne("SELECT `parentid` FROM `".KU_DBPREFIX."posts` WHERE `boardid` = " . $result[0]['id'] . " AND `id` = ".$tc_db->qstr($matches[2])."");
|
|
if ($result2 != '') {
|
|
if ($result2 == 0) {
|
|
$realid = $matches[2];
|
|
} else {
|
|
if ($result[0]['type'] != 1) {
|
|
$realid = $result2;
|
|
}
|
|
}
|
|
|
|
if ($result[0]["type"] != 1) {
|
|
return '<a href="'.KU_BOARDSFOLDER.$matches[1].'/res/'.$realid.'.html#'.$matches[2].'" class="ref|' . $matches[1] . '|' . $realid . '|' . $matches[2] . '">'.$matches[0].'</a>';
|
|
} else {
|
|
return '<a href="'.KU_BOARDSFOLDER.$matches[1].'/res/'.$realid.'.html" class="ref|' . $matches[1] . '|' . $realid . '|' . $realid . '">'.$matches[0].'</a>';
|
|
}
|
|
}
|
|
}
|
|
|
|
return $matches[0];
|
|
}
|
|
|
|
function Wordfilter($buffer, $board) {
|
|
global $tc_db;
|
|
|
|
$query = "SELECT * FROM `".KU_DBPREFIX."wordfilter`";
|
|
$results = $tc_db->GetAll($query);
|
|
foreach($results AS $line) {
|
|
$array_boards = explode('|', $line['boards']);
|
|
if (in_array($board, $array_boards)) {
|
|
$replace_word = $line['word'];
|
|
$replace_replacedby = $line['replacedby'];
|
|
|
|
$buffer = ($line['regex'] == 1) ? preg_replace($replace_word, $replace_replacedby, $buffer) : str_ireplace($replace_word, $replace_replacedby, $buffer);
|
|
}
|
|
}
|
|
|
|
return $buffer;
|
|
}
|
|
|
|
function CheckNotEmpty($buffer) {
|
|
$buffer_temp = str_replace("\n", "", $buffer);
|
|
$buffer_temp = str_replace("<br>", "", $buffer_temp);
|
|
$buffer_temp = str_replace("<br/>", "", $buffer_temp);
|
|
$buffer_temp = str_replace("<br />", "", $buffer_temp);
|
|
|
|
$buffer_temp = str_replace(" ", "", $buffer_temp);
|
|
|
|
if ($buffer_temp=="") {
|
|
return "";
|
|
} else {
|
|
return $buffer;
|
|
}
|
|
}
|
|
|
|
/* From http://us.php.net/wordwrap */
|
|
/*function CutWord($str, $maxLength, $char){
|
|
$wordEndChars = array(" ", "\n", "\r", "\f", "\v", "\0");
|
|
$count = 0;
|
|
$newStr = "";
|
|
$openTag = false;
|
|
for($i=0; $i<strlen($str); $i++){
|
|
$newStr .= $str{$i};
|
|
echo 'newstr: ' . $newStr . '<hr>' . "\n";
|
|
if($str{$i} == "<"){
|
|
$openTag = true;
|
|
continue;
|
|
}
|
|
if(($openTag) && ($str{$i} == ">")){
|
|
$openTag = false;
|
|
continue;
|
|
}
|
|
|
|
if(!$openTag){
|
|
if(!in_array($str{$i}, $wordEndChars)){//If not word ending char
|
|
$count++;
|
|
if($count==$maxLength){//if current word max length is reached
|
|
$newStr .= $char;//insert word break char
|
|
$count = 0;
|
|
}
|
|
}else{//Else char is word ending, reset word char count
|
|
$count = 0;
|
|
}
|
|
}
|
|
|
|
}//End for
|
|
die($newStr);
|
|
return $newStr;
|
|
}*/
|
|
|
|
/*function CutWord($txt, $where) {
|
|
if (empty($txt)) return false;
|
|
for ($c = 0, $a = 0, $g = 0; $c<strlen($txt); $c++) {
|
|
$d[$c+$g]=$txt[$c];
|
|
if ($txt[$c]!=' '&&$txt[$c]!=chr(10)) $a++;
|
|
else if ($txt[$c]==' '||$txt[$c]==chr(10)) $a = 0;
|
|
if ($a==$where) {
|
|
$g++;
|
|
$d[$c+$g]="\n";
|
|
$a = 0;
|
|
}
|
|
}
|
|
|
|
return implode("", $d);
|
|
}*/
|
|
|
|
function CutWord($txt, $where) {
|
|
$txt_split_primary = preg_split('/\n/', $txt);
|
|
$txt_processed = '';
|
|
$usemb = (function_exists('mb_substr') && function_exists('mb_strlen')) ? true : false;
|
|
|
|
foreach ($txt_split_primary as $txt_split) {
|
|
$txt_split_secondary = preg_split('/ /', $txt_split);
|
|
|
|
foreach ($txt_split_secondary as $txt_segment) {
|
|
$segment_length = ($usemb) ? mb_strlen($txt_segment) : strlen($txt_segment);
|
|
while ($segment_length > $where) {
|
|
if ($usemb) {
|
|
$txt_processed .= mb_substr($txt_segment, 0, $where) . "\n";
|
|
$txt_segment = mb_substr($txt_segment, $where);
|
|
|
|
$segment_length = mb_strlen($txt_segment);
|
|
} else {
|
|
$txt_processed .= substr($txt_segment, 0, $where) . "\n";
|
|
$txt_segment = substr($txt_segment, $where);
|
|
|
|
$segment_length = strlen($txt_segment);
|
|
}
|
|
}
|
|
|
|
$txt_processed .= $txt_segment . ' ';
|
|
}
|
|
|
|
$txt_processed = ($usemb) ? mb_substr($txt_processed, 0, -1) : substr($txt_processed, 0, -1);
|
|
$txt_processed .= "\n";
|
|
}
|
|
|
|
return $txt_processed;
|
|
}
|
|
|
|
function ParsePost($message, $board, $boardtype, $parentid, $boardid, $ispage = false) {
|
|
$this->boardtype = $boardtype;
|
|
$this->parentid = $parentid;
|
|
$this->boardid = $boardid;
|
|
|
|
$message = trim($message);
|
|
$message = $this->CutWord($message, (KU_LINELENGTH / 15));
|
|
$message = htmlspecialchars($message, ENT_QUOTES);
|
|
if (KU_MAKELINKS) {
|
|
$message = $this->MakeClickable($message);
|
|
}
|
|
$message = $this->ClickableQuote($message, $board, $boardtype, $parentid, $boardid, $ispage);
|
|
$message = $this->ColoredQuote($message, $boardtype);
|
|
/*if (KU_MARKDOWN) {
|
|
require KU_ROOTDIR . 'lib/markdown/markdown.php';
|
|
$message = Markdown($message);
|
|
}*/
|
|
$message = str_replace("\n", '<br />', $message);
|
|
$message = $this->BBCode($message);
|
|
$message = $this->Wordfilter($message, $board);
|
|
$message = $this->CheckNotEmpty($message);
|
|
|
|
return $message;
|
|
}
|
|
}
|
|
?>
|