From 6084d782f2e6e57248463bf10b99eeee543e0049 Mon Sep 17 00:00:00 2001
From: alecpl <alec@alec.pl>
Date: Sun, 14 Nov 2010 06:35:38 -0500
Subject: [PATCH] - Fix hanling of HTML entity strings in plai text messages

---
 CHANGELOG                      |    1 
 program/lib/html2text.php      |   10 +++-
 program/steps/mail/compose.inc |   17 +++++++-
 tests/html_to_text.php         |   46 +++++++++++++++++++++++
 4 files changed, 68 insertions(+), 6 deletions(-)

diff --git a/CHANGELOG b/CHANGELOG
index 4598069..ba6371b 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -69,6 +69,7 @@
 - Fix handling of folders with name "0" (#1487119)
 - Fix handling of folders with "<>" characters in name
 - jQuery 1.4.4
+- Fix handling of HTML entity strings in plain text messages
 
 RELEASE 0.4.2
 -------------
diff --git a/program/lib/html2text.php b/program/lib/html2text.php
index aa5df0e..3b98e8d 100644
--- a/program/lib/html2text.php
+++ b/program/lib/html2text.php
@@ -167,7 +167,6 @@
         '/&(apos|rsquo|lsquo|#8216|#8217);/i',   // Single quotes
         '/&gt;/i',                               // Greater-than
         '/&lt;/i',                               // Less-than
-        '/&(amp|#38);/i',                        // Ampersand
         '/&(copy|#169);/i',                      // Copyright
         '/&(trade|#8482|#153);/i',               // Trademark
         '/&(reg|#174);/i',                       // Registered
@@ -176,6 +175,7 @@
         '/&(bull|#149|#8226);/i',                // Bullet
         '/&(pound|#163);/i',                     // Pound sign
         '/&(euro|#8364);/i',                     // Euro sign
+        '/&(amp|#38);/i',                        // Ampersand: see _converter()
         '/[ ]{2,}/'                              // Runs of spaces, post-handling
     );
 
@@ -210,7 +210,6 @@
         "'",                                    // Single quotes
         '>',
         '<',
-        '&',
         '(c)',
         '(tm)',
         '(R)',
@@ -219,6 +218,7 @@
         '*',
         '£',
         'EUR',                                  // Euro sign. � ?
+        '|+|amp|+|',                            // Ampersand: see _converter()
         ' '                                     // Runs of spaces, post-handling
     );
 
@@ -502,7 +502,11 @@
         $text = preg_replace_callback($this->callback_search, array('html2text', '_preg_callback'), $text);
 
         // Remove unknown/unhandled entities (this cannot be done in search-and-replace block)
-        $text = preg_replace('/&#?[a-z0-9]{2,7};/i', '', $text); 
+        $text = preg_replace('/&([a-zA-Z0-9]{2,6}|#[0-9]{2,4});/', '', $text);
+
+        // Convert "|+|amp|+|" into "&", need to be done after handling of unknown entities
+        // This properly handles situation of "&amp;quot;" in input string
+        $text = str_replace('|+|amp|+|', '&', $text);
 
         // Strip any other HTML tags
         $text = strip_tags($text, $this->allowed_tags);
diff --git a/program/steps/mail/compose.inc b/program/steps/mail/compose.inc
index 471649c..3f2b8c5 100644
--- a/program/steps/mail/compose.inc
+++ b/program/steps/mail/compose.inc
@@ -646,9 +646,20 @@
   $out .= $msgtype->show();
 
   // If desired, set this textarea to be editable by TinyMCE
-  if ($isHtml) $attrib['class'] = 'mce_editor';
-  $textarea = new html_textarea($attrib);
-  $out .= $textarea->show($MESSAGE_BODY);
+  if ($isHtml) {
+    $attrib['class'] = 'mce_editor';
+    $textarea = new html_textarea($attrib);
+    $out .= $textarea->show($MESSAGE_BODY);
+  }
+  else {
+    $textarea = new html_textarea($attrib);
+    $out .= $textarea->show('');
+    // quote plain text, inject into textarea
+    $table = get_html_translation_table(HTML_SPECIALCHARS);
+    $MESSAGE_BODY = strtr($MESSAGE_BODY, $table);
+    $out = substr($out, 0, -11) . $MESSAGE_BODY . '</textarea>';
+  }
+
   $out .= $form_end ? "\n$form_end" : '';
 
   $OUTPUT->set_env('composebody', $attrib['id']);
diff --git a/tests/html_to_text.php b/tests/html_to_text.php
new file mode 100644
index 0000000..c1d40d9
--- /dev/null
+++ b/tests/html_to_text.php
@@ -0,0 +1,46 @@
+<?php
+
+/**
+ * Test class to test html2text class
+ *
+ * @package Tests
+ */
+class rcube_test_html2text extends UnitTestCase
+{
+
+    function __construct()
+    {
+        $this->UnitTestCase("HTML-to-Text conversion tests");
+
+    }
+
+    function test_html2text()
+    {
+        $data = array(
+            0 => array(
+                'title' => 'Test entry',
+                'in'    => '',
+                'out'   => '',
+            ),
+            1 => array(
+                'title' => 'Basic HTML entities',
+                'in'    => '&quot;&amp;',
+                'out'   => '"&',
+            ),
+            2 => array(
+                'title' => 'HTML entity string',
+                'in'    => '&amp;quot;',
+                'out'   => '&quot;',
+            ),
+        );
+
+        $ht = new html2text(null, false, false);
+
+        foreach ($data as $item) {
+            $ht->set_html($item['in']);
+            $res = $ht->get_text();
+            $this->assertEqual($item['out'], $res, $item['title']);
+        }
+    }
+
+}

--
Gitblit v1.9.1