Files
kusaba-x/inc/func/stringformatting.php
T
Sazpaimon 5bb2edf96e Fix a bug where a link would not be properly parsed if the character immediately after it isn't a space (for example, [spoiler]http://www.google.com[/spoiler])
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
2009-05-28 11:49:13 +00:00

318 lines
9.4 KiB
PHP

<?php
/**
* Format the display of the name and tripcode of a post
*
* @param string $name Name used in post
* @param string $email Email used in post
* @param string $tripcode Tripcode used in post
* @return string Generated name and tripcode html
*/
function formatDate($timestamp, $type = 'post', $locale = 'en', $email = '') {
$output = '';
if ($email != '') {
$output .= '<a href="mailto:' . $email . '">';
}
if ($type == 'post') {
if ($locale == 'ja') {
/* Format the timestamp japanese style */
$fulldate = strftime ("%Yy%mm%dd(DAYOFWEEK) %HH%MM%SS", $timestamp);
$dayofweek = strftime('%a', $timestamp);
/* I don't like this method, but I can't rely on PHP's locale settings to do it for me... */
switch ($dayofweek) {
case 'Sun':
$dayofweek = '&#26085;';
break;
case 'Mon':
$dayofweek = '&#26376;';
break;
case 'Tue':
$dayofweek = '&#28779;';
break;
case 'Wed':
$dayofweek = '&#27700;';
break;
case 'Thu':
$dayofweek = '&#26408;';
break;
case 'Fri':
$dayofweek = '&#37329;';
break;
case 'Sat':
$dayofweek = '&#22303;';
break;
default:
// The date must be in the correct language already, so let's convert it to unicode if it isn't already.
$dayofweek = mb_convert_encoding($dayofweek, "UTF-8", "JIS, eucjp-win, sjis-win");
break;
}
$fulldate = formatJapaneseNumbers($fulldate);
//Convert the symbols for year, month, etc to unicode equivalents. We couldn't do this above beause the numbers would be formatted to japanese.
$fulldate = str_replace(array("y","m","d","H","M","S"), array("&#24180;","&#26376;","&#26085;","&#26178;","&#20998;","&#31186;"), $fulldate);
$fulldate = str_replace('DAYOFWEEK', $dayofweek, $fulldate);
return $output.$fulldate.(($email != '') ? ('</a>') : (""));
} else {
/* Format the timestamp english style */
return $output.date('y/m/d(D)H:i', $timestamp).(($email != '') ? ('</a>') : (""));
}
}
return $output.date('y/m/d(D)H:i', $timestamp).(($email != '') ? ('</a>') : (""));
}
/**
* Format the provided input into a reflink, which follows the Japanese locale if it is set.
*/
function formatReflink($post_board, $post_thread_start_id, $post_id, $locale = 'en') {
$return = ' ';
$reflink_noquote = '<a href="' . KU_BOARDSFOLDER . $post_board . '/res/' . $post_thread_start_id . '.html#' . $post_id . '" onclick="return highlight(\'' . $post_id . '\');">';
$reflink_quote = '<a href="' . KU_BOARDSFOLDER . $post_board . '/res/' . $post_thread_start_id . '.html#i' . $post_id . '" onclick="return insert(\'>>' . $post_id . '\\n\');">';
if ($locale == 'ja') {
$return .= $reflink_quote . formatJapaneseNumbers($post_id) . '</a>' . $reflink_noquote . '番</a>';
} else {
$return .= $reflink_noquote . 'No.&nbsp;' . '</a>' . $reflink_quote . $post_id . '</a>';
}
return $return . "\n";
}
/**
* Calculate the different name and tripcode for the name field provided
*
* @param string $post_name Text entered in the Name field
* @return array Name and tripcode
*/
function calculateNameAndTripcode($post_name) {
global $tc_db;
if(ereg("(#|!)(.*)", $post_name, $regs)){
$cap = $regs[2];
$cap_full = '#' . $regs[2];
// {{{ Special tripcode check
$trips = unserialize(KU_TRIPS);
if (count($trips) > 0) {
if (isset($trips[$cap_full])) {
$forcedtrip = $trips[$cap_full];
return array(ereg_replace("(#)(.*)", "", $post_name), $forcedtrip);
}
}
// }}}
if (function_exists('mb_convert_encoding')) {
$recoded_cap = mb_convert_encoding($cap, 'SJIS', 'UTF-8');
if ($recoded_cap != '') {
$cap = $recoded_cap;
}
}
if (strpos($post_name, '#') === false) {
$cap_delimiter = '!';
} elseif (strpos($post_name, '!') === false) {
$cap_delimiter = '#';
} else {
$cap_delimiter = (strpos($post_name, '#') < strpos($post_name, '!')) ? '#' : '!';
}
if (ereg("(.*)(" . $cap_delimiter . ")(.*)", $cap, $regs_secure)) {
$cap = $regs_secure[1];
$cap_secure = $regs_secure[3];
$is_secure_trip = true;
} else {
$is_secure_trip = false;
}
$tripcode = '';
if ($cap != '') {
/* From Futabally */
$cap = strtr($cap, "&amp;", "&");
$cap = strtr($cap, "&#44;", ", ");
$salt = substr($cap."H.", 1, 2);
$salt = ereg_replace("[^\.-z]", ".", $salt);
$salt = strtr($salt, ":;<=>?@[\\]^_`", "ABCDEFGabcdef");
$tripcode = substr(crypt($cap, $salt), -10);
}
if ($is_secure_trip) {
if ($cap != '') {
$tripcode .= '!';
}
$secure_tripcode = md5($cap_secure . KU_RANDOMSEED);
if (function_exists('base64_encode')) {
$secure_tripcode = base64_encode($secure_tripcode);
}
if (function_exists('str_rot13')) {
$secure_tripcode = str_rot13($secure_tripcode);
}
$secure_tripcode = substr($secure_tripcode, 2, 10);
$tripcode .= '!' . $secure_tripcode;
}
$name = ereg_replace("(" . $cap_delimiter . ")(.*)", "", $post_name);
return array($name, $tripcode);
}
return $post_name;
}
/**
* Format a long message to be shortened if it exceeds the allowed length on a page
*
* @param string $message Post message
* @param string $board Board directory
* @param integer $threadid Thread ID
* @param boolean $page Is rendering for a page
* @return string The formatted message
*/
function formatLongMessage($message, $board, $threadid, $page) {
$output = '';
if ((strlen($message) > KU_LINELENGTH || count(explode('<br />', $message)) > 15) && $page) {
$message_exploded = explode('<br />', $message);
$message_shortened = '';
for ($i = 0; $i <= 14; $i++) {
if (isset($message_exploded[$i])) {
$message_shortened .= $message_exploded[$i] . '<br />';
}
}
if (strlen($message_shortened) > KU_LINELENGTH) {
$message_shortened = substr($message_shortened, 0, KU_LINELENGTH);
}
$message_shortened = closeOpenTags($message_shortened);
if (strrpos($message_shortened,"<") > strrpos($message_shortened,">")) {
//We have a partially opened tag we need to get rid of.
$message_shortened = substr($message_shortened, 0, strrpos($message_shortened,"<"));
}
$output = $message_shortened . '<div class="abbrev">' . "\n" .
' ' . sprintf(_gettext('Message too long. Click %shere%s to view the full text.'), '<a href="' . KU_BOARDSFOLDER . $board . '/res/' . $threadid . '.html">', '</a>') . "\n" .
'</div>' . "\n";
} else {
$output .= $message . "\n";
}
return $output;
}
/* Thanks milianw - php.net */
/**
* Closes all HTML tags left open
*
* @param string $html HTML to be checked
* @return string HTML with all tags closed
*/
function closeOpenTags($html){
/* Put all opened tags into an array */
preg_match_all("#<([a-z]+)( .*)?(?!/)>#iU", $html, $result);
$openedtags=$result[1];
/* Put all closed tags into an array */
preg_match_all("#</([a-z]+)>#iU", $html, $result);
$closedtags=$result[1];
$len_opened = count($openedtags);
/* All tags are closed */
if(count($closedtags) == $len_opened){
return $html;
}
$openedtags = array_reverse($openedtags);
/* Close tags */
for($i=0;$i<$len_opened;$i++) {
if ($openedtags[$i]!='br') {
if (!in_array($openedtags[$i], $closedtags)){
$html .= '</'.$openedtags[$i].'>';
} else {
unset($closedtags[array_search($openedtags[$i], $closedtags)]);
}
}
}
return $html;
}
/* By Darien Hager, Jan 2007 */
/**
* Find the string value of a pair of ords
*
* @param string $ords Ords
* @param string $encoding Encoding
* @return string String
*/
function ords_to_unistr($ords, $encoding = 'UTF-8'){
if (!function_exists('mb_convert_encoding')) {
return false;
}
/* Turns an array of ordinal values into a string of unicode characters */
$str = '';
for($i = 0; $i < sizeof($ords); $i++){
/* Pack this number into a 4-byte string
(Or multiple one-byte strings, depending on context.) */
$v = $ords[$i];
$str .= pack("N",$v);
}
$str = mb_convert_encoding($str,$encoding,"UCS-4BE");
return($str);
}
/**
* Find the ord value of a string
*
* @param string $str String
* @param string $encoding Encoding
* @return array Ords
*/
function unistr_to_ords($str, $encoding = 'UTF-8'){
if (!function_exists('mb_convert_encoding')) {
return false;
}
/* Turns a string of unicode characters into an array of ordinal values,
Even if some of those characters are multibyte. */
$str = mb_convert_encoding($str,"UCS-4BE",$encoding);
$ords = array();
/* Visit each unicode character */
for($i = 0; $i < mb_strlen($str,"UCS-4BE"); $i++){
/* Now we have 4 bytes. Find their total numeric value */
$s2 = mb_substr($str,$i,1,"UCS-4BE");
$val = unpack("N",$s2);
$ords[] = $val[1];
}
return($ords);
}
function processPost($id, $newthreadid, $oldthreadid, $board_from, $board_to, $boardid) {
global $tc_db;
$message = $tc_db->GetOne("SELECT `message` FROM " . KU_DBPREFIX . "posts WHERE `boardid` = " . $boardid . " AND `id` = " . $id . " LIMIT 1");
if ($message != '') {
$message_new = str_replace('/read.php/' . $board_from . '/' . $oldthreadid, '/read.php/' . $board_to . '/' . $newthreadid, $message);
if ($message_new != $message) {
$tc_db->GetOne("UPDATE " . KU_DBPREFIX . "posts SET `message` = " . $tc_db->qstr($message) . " WHERE `boardid` = " . $boardid . " AND `id` = " . $id);
}
}
}
?>