Add a space after quote marks.
[banana.git] / banana / message.func.inc.php
index 1628f37..9a59103 100644 (file)
@@ -41,7 +41,7 @@ function banana_quote($line, $level, $mark = '>')
     $lines = explode("\n", $line);
     $quote = str_repeat($mark, $level);
     foreach ($lines as &$line) {
-        $line = $quote . $line;
+        $line = $quote . ' ' . $line;
     }
     return implode("\n", $lines);
 }
@@ -72,30 +72,50 @@ function banana_unflowed($text)
     return $text;
 }
 
-function banana_wordwrap($text, $quote_level)
+function banana_wordwrap($text, $quote_level = 0)
 {
     if ($quote_level > 0) {
         $length = Banana::$msgshow_wrap - $quote_level - 1;
         return banana_quote(wordwrap($text, $length), $quote_level);
-    
     }
     return wordwrap($text, Banana::$msgshow_wrap);
 }
 
 function banana_catchFormats($text)
 {
-    $formatting = Array('/' => 'em', // match / first in order not to match closing markups </...> <> </>
-                        '_' => 'u',
-                        '*' => 'strong');
+    $formatting = Array('em' => array('\B\/\b', '\b\/\B'),
+                        'u' =>  array('\b_', '_\b'),
+                        'strong' => array('\B\*\b', '\b\*\B'));
     $url = Banana::$msgshow_url;
     preg_match_all("/$url/ui", $text, $urls);
-    $text = str_replace($urls[0], "&&&urls&&&", $text);
-    foreach ($formatting as $limit=>$mark) {
-        $limit = preg_quote($limit, '/');
-        $text = preg_replace('/' . $limit . '(\S+?)' . $limit . '/us',
+    $urls = $urls[0];
+    $replace = $urls;
+    rsort($replace);
+    $text = str_replace($replace, "&&&urls&&&", $text);
+    foreach ($formatting as $mark=>$limit) {
+        list($ll, $lr) = $limit;
+        $text = preg_replace('/' . $ll . '(\w+?)' . $lr . '/us',
                              "<$mark>\\1</$mark>", $text);
     }
-    return preg_replace('/&&&urls&&&/e', 'array_shift($urls[0])', $text);
+    return preg_replace('/&&&urls&&&/e', 'array_shift($urls)', $text);
+}
+
+/** Build a flowed text from plain text
+ */
+function banana_flow($text)
+{
+    $lines = explode("\n", $text);
+    $text  = '';
+    while (!is_null($line = array_shift($lines))) {
+        if ($line != '-- ') {
+            $level = 0;
+            $line  = banana_removeQuotes($line, $level);
+            $text .= rtrim(str_replace("\n", " \n", banana_wordwrap($line, $level))) . "\n";
+        } else {
+            $text .= $line . "\n";
+        }
+    }
+    return $text;
 }
 
 // {{{ URL Catcher tools
@@ -123,7 +143,7 @@ function banana__catchMailLink($email)
     $mid = '<' . $email . '>';
     if (isset(Banana::$spool->ids[$mid])) {
         return Banana::$page->makeLink(Array('group' => Banana::$group,
-                                             'artid' => Banana::$spool->ids[$mid],
+                                             'artid' => Banana::$spool->ids[$mid]->id,
                                              'text'  => $email));
     } elseif (strpos($email, '$') !== false) {
         return $email;
@@ -187,7 +207,7 @@ function banana_plainTextToHtml($text, $strict = true)
     $text = banana_catchURLs($text);
     $text = banana_catchQuotes($text, $strict);
     $text = banana_catchSignature($text);
-    return banana_cleanHtml('<pre>' . $text . '</pre>');
+    return '<pre>' . $text . '</pre>';
 }
 
 function banana_wrap($text, $base_level = 0, $strict = true)
@@ -203,7 +223,7 @@ function banana_wrap($text, $base_level = 0, $strict = true)
             if (!empty($buffer)) {
                 $text  .= banana_wordwrap(implode("\n", $buffer), $level + $base_level) . "\n";
                 $buffer = array();
-            }    
+            }
             $level  = $lvl;
         }
         $buffer[] = $line;
@@ -214,23 +234,27 @@ function banana_wrap($text, $base_level = 0, $strict = true)
     return $text;
 }
 
-function banana_formatPlainText(BananaMimePart &$part, $base_level = 0)
+function banana_formatPlainText(BananaMimePart $part, $base_level = 0)
 {
     $text = $part->getText();
     if ($part->isFlowed()) {
         $text = banana_unflowed($text);
     }
-    $text = banana_wrap($text, $base_level, $part->isFlowed());
-    return banana_plainTextToHtml($text, $part->isFlowed());
+    if (function_exists('hook_formatPart') && ($ret = hook_formatPart($text, $part, $base_level))) {
+        return $ret;
+    } else {
+        $text = banana_wrap($text, $base_level, $part->isFlowed());
+        return banana_plainTextToHtml($text, $part->isFlowed());
+    }
 }
 
-function banana_quotePlainText(BananaMimePart &$part)
+function banana_quotePlainText(BananaMimePart $part)
 {
     $text = $part->getText();
     if ($part->isFlowed()) {
         $text = banana_unflowed($text);
     }
-    return banana_wrap($text, 1);
+    return banana_quote($text, 1);
 }
 
 // }}}
@@ -281,15 +305,15 @@ function banana_cleanStyles($tag, $attributes)
     } else {
         $style = '';
     }
-    $attributes = str_replace("\n", ' ', stripslashes($attributes));
-    $attributes = str_replace('= "', '="', $attributes);
+    $attributes = str_replace(array("\n", "\r"), ' ', stripslashes($attributes));
+    $attributes = str_replace(array('= "', '= \''), array('="', '=\''), $attributes);
     foreach ($conv as $att=>$stl) {
         $pattern = '/\b' . preg_quote($att, '/') . '=([\'"])?(.+?)(?(1)\1|(?:$| ))/i';
         if (preg_match($pattern, $attributes, $matches)) {
             $attributes = preg_replace($pattern, '', $attributes);
             $val = $matches[2];
             if ($att == 'cellspacing' && strpos($style, 'border-collapse') === false) {
-                $style .= "border-collapse: separate; border-spacing: $val $val; ";
+                $style = "border-collapse: separate; border-spacing: $val $val; " . $style;
             } elseif ($att == 'cellpadding' && $tag == 'table') {
                 $td_style[0] = "$stl: {$val}px; ";
             } elseif ($att == 'style') {
@@ -297,11 +321,11 @@ function banana_cleanStyles($tag, $attributes)
                 $style .= "$val; ";
             } elseif ($att == 'size') {
                 $val = $size_conv[$val];
-                $style .= "$stl: $val; ";
+                $style = "$stl: $val; " . $style;
             } elseif (is_numeric($val)) {
-                $style .= "$stl: {$val}px; ";
+                $style = "$stl: {$val}px; " . $style;
             } else {
-                $style .= "$stl: $val; ";
+                $style = "$stl: $val; " . $style;
             }
         }
     }
@@ -330,7 +354,7 @@ function banana_filterCss($css)
     }
     return $css;
 }
-    
+
 /**
  * @return string
  * @param string
@@ -342,7 +366,7 @@ function banana_cleanHtml($source, $to_xhtml = false)
         $tidy_config = array('drop-empty-paras' => true,
                              'drop-proprietary-attributes' => true,
                              'hide-comments' => true,
-                             'logical-emphasis' => true, 
+                             'logical-emphasis' => true,
                              'output-xhtml' => true,
                              'replace-color' => true,
                              'join-classes'  => false,
@@ -356,6 +380,7 @@ function banana_cleanHtml($source, $to_xhtml = false)
             }
             tidy_set_encoding('utf8');
             $source = tidy_repair_string($source);
+
         } else { // Tidy 2.0
             $source = tidy_repair_string($source, $tidy_config, 'utf8');
         }
@@ -388,8 +413,8 @@ function banana_cleanHtml($source, $to_xhtml = false)
 
     // Use inlined style instead of old html attributes
     if ($to_xhtml) {
-        $source = preg_replace('/<(\/?\w+)(.*?)(\/?>)/uise', "'<\\1' . banana_cleanStyles('\\1', '\\2') . '\\3'", $source);
-    }    
+        $source = preg_replace('/<(\/?\w+)(.*?)(\/?>)/muise', "'<\\1' . banana_cleanStyles('\\1', '\\2') . '\\3'", $source);
+    }
     return preg_replace('/<(.*?)>/ie', "'<'.banana_removeEvilAttributes('\\1').'>'", $source);
 }
 
@@ -464,25 +489,25 @@ function banana_htmlToPlainText($res)
     $res = trim(strip_tags($res, '<div><br><p><blockquote>'));
     $res = preg_replace("@</?(br|p|div).*?>@si", "\n", $res);
     $res = banana__convertQuotes($res);
-    return banana_html_entity_decode($res);    
+    return banana_html_entity_decode($res);
 }
 
-function banana_formatHtml(BananaMimePart &$part)
+function banana_formatHtml(BananaMimePart $part)
 {
     $text = $part->getText();
     $text = banana_catchHtmlSignature($text);
     if (!Banana::$msgshow_externalimages) {
         $text = banana_hideExternalImages($text);
-    }    
+    }
     $text = banana_catchPartLinks($text);
     return banana_cleanHtml($text, true);
 }
 
-function banana_quoteHtml(BananaMimePart &$part)
+function banana_quoteHtml(BananaMimePart $part)
 {
     $text = $part->getText();
     $text = banana_htmlToPlainText($text);
-    return banana_wrap($text, 1);
+    return banana_quote($text, 1);
 }
 
 // }}}
@@ -521,7 +546,7 @@ function banana_richtextToHtml($source)
     return banana_cleanHtml($source);
 }
 
-function banana_formatRichText(BananaMimePart &$part)
+function banana_formatRichText(BananaMimePart $part)
 {
     $text = $part->getText();
     $text = banana_richtextToHtml($text);
@@ -529,12 +554,12 @@ function banana_formatRichText(BananaMimePart &$part)
     return banana_cleanHtml($text);
 }
 
-function banana_quoteRichtText(BananaMimePart &$part)
+function banana_quoteRichtText(BananaMimePart $part)
 {
     $text = $part->getText();
     $text = banana_richtextToHtml($text);
     $text = banana_htmlToPlainText($text);
-    return banana_wrap($text, 1);
+    return banana_quote($text, 1);
 }
 
 // }}}