|
|
|
@ -163,7 +163,7 @@ class rcube_text2html
|
|
|
|
|
// find/mark quoted lines...
|
|
|
|
|
for ($n=0, $cnt=count($text); $n < $cnt; $n++) {
|
|
|
|
|
$flowed = false;
|
|
|
|
|
if ($this->config['flowed'] && ord($text[0]) == $flowed_char) {
|
|
|
|
|
if ($this->config['flowed'] && ord($text[$n][0]) == $flowed_char) {
|
|
|
|
|
$flowed = true;
|
|
|
|
|
$text[$n] = substr($text[$n], 1);
|
|
|
|
|
}
|
|
|
|
@ -259,17 +259,24 @@ class rcube_text2html
|
|
|
|
|
|
|
|
|
|
// replace spaces with non-breaking spaces
|
|
|
|
|
if ($is_flowed) {
|
|
|
|
|
$text = preg_replace_callback('/(^|[^ ])( +)/', function($matches) {
|
|
|
|
|
if (!strlen($matches[2])) {
|
|
|
|
|
return str_repeat($nbsp, strlen($matches[2]));
|
|
|
|
|
$pos = 0;
|
|
|
|
|
$diff = 0;
|
|
|
|
|
$len = strlen($nbsp);
|
|
|
|
|
$copy = $text;
|
|
|
|
|
|
|
|
|
|
while (($pos = strpos($text, ' ', $pos)) !== false) {
|
|
|
|
|
if ($pos == 0 || $text[$pos-1] == ' ') {
|
|
|
|
|
$copy = substr_replace($copy, $nbsp, $pos + $diff, 1);
|
|
|
|
|
$diff += $len - 1;
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
return $matches[1] . ' ' . str_repeat($nbsp, strlen($matches[2])-1);
|
|
|
|
|
$pos++;
|
|
|
|
|
}
|
|
|
|
|
}, $text);
|
|
|
|
|
|
|
|
|
|
$text = $copy;
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
$text = str_replace(' ', $nbsp, $text);
|
|
|
|
|
// make the whole line non-breakable
|
|
|
|
|
$text = str_replace(array(' ', '-'), array($nbsp, '-⁠'), $text);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return $text;
|
|
|
|
|