Subversion Repositories ALCASAR

Rev

Details | Last modification | View Log

Rev Author Line No. Line
2809 rexy 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
}