<?php
//-------------------------------------------------------------------------
// YW Guestbook
// string_utf8.php
//
// Version: 1.2
//-------------------------------------------------------------------------
// Copyright (c) 2005 YahooWebs
// http://www.yahoowebs.tk
//-------------------------------------------------------------------------
// This program is free software. You can redistribute it and/or modify
// it under the terms of the License that was distributed with this file!
//-------------------------------------------------------------------------
function vgb_maxlen () {
return 85;
}
function vgb_lenfactor () {
return 3;
}
function vgb_strlen ( $s ) {
return strlen(utf8_decode($s));
}
function vgb_string( $t ) {
// returns the string without invalid bytes in the current encoding
$t .= " ";
$i = 0;
$s = 0;
$o = "";
$b = "";
$n = strlen($t);
while ($i < $n) {
$x = $t[$i];
$xo = ord($x);
switch ($s) {
case 0: $i++;
if ($xo < 128)
$o .= $x;
elseif (($xo < 192) || ($xo > 253))
$o .= "?";
else {
$s = 1;
$b = $x;
$l = 1;
if ($xo > 223) {
$l++;
if ($xo > 239) {
$l++;
if ($xo > 247) {
$l++;
if ($xo > 251)
$l++;
}
}
}
}
break;
case 1: if (($xo < 128) || ($xo > 191)) {
for ($j=0;$j<strlen($b);$j++)
$o .= "?";
$s = 0;
}
else {
$i++;
$b .= $x;
$l--;
if ($l == 0) {
$o .= $b;
$s = 0;
}
}
}
}
return chop($o);
}
function vgb_wrapWords ( $t ) {
global $settings;
$maxcount = $settings['FORCEBREAK'];
if (($maxcount == 0) || ($t == ""))
return $t;
$t = str_replace(">",">>>>",str_replace("<",">>><",$t));
$o = "";
$inTag = false;
$save = false;
$count = 0;
$tlen = strlen($t);
$skip = 0;
for ($i=0;$i<$tlen;$i++)
if ($skip > 1) {
$skip--;
if ($save)
$buffer .= $t[$i];
}
elseif ($inTag) {
if ($t[$i] == '>') {
$inTag = false;
$tag = explode(" ",$buffer,2);
switch ($tag[0]) {
case "li":
case "pre":
case "/pre":
case "div":
case "/div":
case "ul":
case "/ul": $count = 0;
}
}
else
$buffer .= $t[$i];
$o .= $t[$i];
}
elseif ((ord($t[$i]) > 191) && (ord($t[$i]) < 254) && ($skip == 0)) {
$save = true;
$buffer = $t[$i];
$skip = 1;
if (ord($t[$i]) > 223) {
$skip++;
if (ord($t[$i]) > 239) {
$skip++;
if (ord($t[$i]) > 247) {
$skip++;
if (ord($t[$i]) > 251)
$skip++;
}
}
}
}
elseif ($t[$i] == '>' && ($skip == 0))
$skip = 3;
elseif (($t[$i] == '<') && ($skip == 0)) {
$o .= '<';
$buffer = "";
$inTag = true;
}
else {
if (vgb_isWhiteSpace($t[$i]) && !$save) {
$count = 0;
$o .= $t[$i];
}
else {
$count++;
if ($count > $maxcount) {
$count = 1;
$o .= ($settings['USEWBR']) ? "<wbr />" : " ";
}
if ($skip > 0) {
if ($save) {
$o .= $buffer.$t[$i];
$save = 0;
}
elseif ($t[$i] == '>')
$o .= ">";
else
$o .= "<";
$skip = 0;
}
else
$o .= $t[$i];
}
}
if ($save)
$o .= $buffer;
return $o;
}
function vgb_substr ( $t , $n ) {
if ($n == 0)
return "";
else {
$o = "";
$i = 0;
$m = strlen($t);
while ($i < $m) {
if ((ord($t[$i]) > 191) && (ord($t[$i]) < 254)) {
$x = 1;
if (ord($t[$i]) > 223) {
$x++;
if (ord($t[$i]) > 239) {
$x++;
if (ord($t[$i]) > 247) {
$x++;
if (ord($t[$i]) > 251)
$x++;
}
}
}
if (($x+$i) < $m) {
$v = 1;
for ($j=$i+1;$j<=($x+$i);$j++)
if ((ord($t[$j]) < 128) || (ord($t[$j]) > 191))
$v = 0;
if ($v)
for ($j=0;$j<$x;$j++) {
$o .= $t[$i];
$i++;
}
}
}
$o .= $t[$i];
$n--;
$i++;
if ($n == 0)
$i = $m;
}
return $o;
}
}
function vgb_nextchar( $in ) {
if (ord($in[0]) < 128)
return $in[0];
elseif (ord($in[0]) < 192)
return '?';
else {
$n = 1;
if (ord($in[0]) > 223) {
$n++;
if (ord($in[0]) > 239) {
$n++;
if (ord($in[0]) > 247) {
$n++;
if (ord($in[0]) > 251)
$n++;
}
}
}
if (strlen($in)<($n+1))
return '?';
$b = $in[0];
for ($i=1;$i<=$n;$i++)
if ((ord($in[$i]) < 128) || (ord($in[$i]) > 191))
return "?";
else
$b .= $in[$i];
return $b;
}
}
function vgb_ord ( $c ) {
if ($c == "")
return 0;
if (ord($c[0]) < 128)
return ord($c);
elseif ((ord($c[0]) < 192) || (ord($c[0]) > 253))
return 0;
else {
$n = 1;
if (ord($c[0]) > 223) {
$n++;
if (ord($c[0]) > 239) {
$n++;
if (ord($in[0]) > 247) {
$n++;
if (ord($in[0]) > 251)
$n++;
}
}
}
for ($i=1;$i<=$n;$i++)
if (($i > strlen($c)-1) || (ord($c[$i]) < 128) || (ord($c[$i]) > 191))
return 0;
switch ($n) {
case 1: return (ord($c[1])&63)+((ord($c[0])&31)<<6);
case 2: return (ord($c[2])&63)+((ord($c[1])&63)<<6)+((ord($c[0])&15)<<12);
case 3: return (ord($c[3])&63)+((ord($c[2])&63)<<6)+((ord($c[1])&63)<<12)
+((ord($c[0])&7)<<18);
case 4: return (ord($c[4])&63)+((ord($c[3])&63)<<6)+((ord($c[2])&63)<<12)
+((ord($c[1])&63)<<18)+((ord($c[0])&3)<<24);
case 5: return (ord($c[5])&63)+((ord($c[4])&63)<<6)+((ord($c[3])&63)<<12)
+((ord($c[2])&63)<<18)+((ord($c[1])&63)<<24)+((ord($c[0])&1)<<30);
}
return 0;
}
}
?>