<?php 
/** 
 * Smarty plugin 
 * 
 * @package    Smarty 
 * @subpackage PluginsModifier 
 */ 
/** 
 * Smarty wordwrap modifier plugin 
 * Type:     modifier<br> 
 * Name:     mb_wordwrap<br> 
 * Purpose:  Wrap a string to a given number of characters 
 * 
 
 * @link   http://php.net/manual/en/function.wordwrap.php for similarity 
 * 
 * @param  string  $str   the string to wrap 
 * @param  int     $width the width of the output 
 * @param  string  $break the character used to break the line 
 * @param  boolean $cut   ignored parameter, just for the sake of 
 * 
 * @return string  wrapped string 
 * @author Rodney Rehm 
 */ 
function smarty_modifier_mb_wordwrap($str, $width = 75, $break = "\n", $cut = false) 
{ 
    // break words into tokens using white space as a delimiter 
    $tokens = preg_split('!(\s)!S' . Smarty::$_UTF8_MODIFIER, $str, -1, PREG_SPLIT_NO_EMPTY + PREG_SPLIT_DELIM_CAPTURE); 
    $length = 0; 
    $t = ''; 
    $_previous = false; 
    $_space = false; 
 
    foreach ($tokens as $_token) { 
        $token_length = mb_strlen($_token, Smarty::$_CHARSET); 
        $_tokens = array($_token); 
        if ($token_length > $width) { 
            if ($cut) { 
                $_tokens = preg_split('!(.{' . $width . '})!S' . Smarty::$_UTF8_MODIFIER, 
                                      $_token, 
                                      -1, 
                                      PREG_SPLIT_NO_EMPTY + PREG_SPLIT_DELIM_CAPTURE); 
            } 
        } 
 
        foreach ($_tokens as $token) { 
            $_space = !!preg_match('!^\s$!S' . Smarty::$_UTF8_MODIFIER, $token); 
            $token_length = mb_strlen($token, Smarty::$_CHARSET); 
            $length += $token_length; 
 
            if ($length > $width) { 
                // remove space before inserted break 
                if ($_previous) { 
                    $t = mb_substr($t, 0, -1, Smarty::$_CHARSET); 
                } 
 
                if (!$_space) { 
                    // add the break before the token 
                    if (!empty($t)) { 
                        $t .= $break; 
                    } 
                    $length = $token_length; 
                } 
            } else if ($token === "\n") { 
                // hard break must reset counters 
                $length = 0; 
            } 
            $_previous = $_space; 
            // add the token 
            $t .= $token; 
        } 
    } 
 
    return $t; 
} 
 
 |