diff options
Diffstat (limited to 'include/smarty/libs/plugins/shared.mb_wordwrap.php')
-rw-r--r-- | include/smarty/libs/plugins/shared.mb_wordwrap.php | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/include/smarty/libs/plugins/shared.mb_wordwrap.php b/include/smarty/libs/plugins/shared.mb_wordwrap.php new file mode 100644 index 000000000..ba3498c70 --- /dev/null +++ b/include/smarty/libs/plugins/shared.mb_wordwrap.php @@ -0,0 +1,83 @@ +<?php +/** + * Smarty shared plugin + * + * @package Smarty + * @subpackage PluginsShared + */ + +if(!function_exists('smarty_mb_wordwrap')) { + + /** + * 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_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; + + foreach ($tokens as $_token) { + $token_length = mb_strlen($_token, Smarty::$_CHARSET); + $_tokens = array($_token); + if ($token_length > $width) { + // remove last space + $t = mb_substr($t, 0, -1, Smarty::$_CHARSET); + $_previous = false; + $length = 0; + + if ($cut) { + $_tokens = preg_split('!(.{' . $width . '})!S' . Smarty::$_UTF8_MODIFIER, $_token, -1, PREG_SPLIT_NO_EMPTY + PREG_SPLIT_DELIM_CAPTURE); + // broken words go on a new line + $t .= $break; + } + } + + 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 && $token_length < $width) { + $t = mb_substr($t, 0, -1, Smarty::$_CHARSET); + } + + // add the break before the token + $t .= $break; + $length = $token_length; + + // skip space after inserting a break + if ($_space) { + $length = 0; + continue; + } + } else if ($token == "\n") { + // hard break must reset counters + $_previous = 0; + $length = 0; + } else { + // remember if we had a space or not + $_previous = $_space; + } + // add the token + $t .= $token; + } + } + + return $t; + } + +} +?>
\ No newline at end of file |