1: <?php
2: /**
3: * Smarty plugin
4: *
5: * @package Smarty
6: * @subpackage PluginsModifier
7: */
8: /**
9: * Smarty wordwrap modifier plugin
10: * Type: modifier
11: * Name: mb_wordwrap
12: * Purpose: Wrap a string to a given number of characters
13: *
14: * @link http://php.net/manual/en/function.wordwrap.php for similarity
15: *
16: * @param string $str the string to wrap
17: * @param int $width the width of the output
18: * @param string $break the character used to break the line
19: * @param boolean $cut ignored parameter, just for the sake of
20: *
21: * @return string wrapped string
22: * @author Rodney Rehm
23: */
24: function smarty_modifier_mb_wordwrap($str, $width = 75, $break = "\n", $cut = false)
25: {
26: // break words into tokens using white space as a delimiter
27: $tokens = preg_split('!(\s)!S' . Smarty::$_UTF8_MODIFIER, $str, -1, PREG_SPLIT_NO_EMPTY + PREG_SPLIT_DELIM_CAPTURE);
28: $length = 0;
29: $t = '';
30: $_previous = false;
31: $_space = false;
32: foreach ($tokens as $_token) {
33: $token_length = mb_strlen($_token, Smarty::$_CHARSET);
34: $_tokens = array($_token);
35: if ($token_length > $width) {
36: if ($cut) {
37: $_tokens = preg_split(
38: '!(.{' . $width . '})!S' . Smarty::$_UTF8_MODIFIER,
39: $_token,
40: -1,
41: PREG_SPLIT_NO_EMPTY + PREG_SPLIT_DELIM_CAPTURE
42: );
43: }
44: }
45: foreach ($_tokens as $token) {
46: $_space = !!preg_match('!^\s$!S' . Smarty::$_UTF8_MODIFIER, $token);
47: $token_length = mb_strlen($token, Smarty::$_CHARSET);
48: $length += $token_length;
49: if ($length > $width) {
50: // remove space before inserted break
51: if ($_previous) {
52: $t = mb_substr($t, 0, -1, Smarty::$_CHARSET);
53: }
54: if (!$_space) {
55: // add the break before the token
56: if (!empty($t)) {
57: $t .= $break;
58: }
59: $length = $token_length;
60: }
61: } elseif ($token === "\n") {
62: // hard break must reset counters
63: $length = 0;
64: }
65: $_previous = $_space;
66: // add the token
67: $t .= $token;
68: }
69: }
70: return $t;
71: }
72: