Fixed an extremely rare bug where a tag would be partially opened on the board page due to it being cut off by the log message filter. You'll probably never have this happen anyway. Thanks to Anonymo for both of these. git-svn-id: http://kusabax.cultnet.net/svn/repo/stable@180 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;
|
|
}
|
|
}
|
|
?>
|