From 6084d782f2e6e57248463bf10b99eeee543e0049 Mon Sep 17 00:00:00 2001 From: alecpl Date: Sun, 14 Nov 2010 11:35:38 +0000 Subject: - 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(-) create mode 100644 tests/html_to_text.php diff --git a/CHANGELOG b/CHANGELOG index 45980694e..ba6371bad 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -69,6 +69,7 @@ CHANGELOG Roundcube Webmail - 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 aa5df0eab..3b98e8df7 100644 --- a/program/lib/html2text.php +++ b/program/lib/html2text.php @@ -167,7 +167,6 @@ class html2text '/&(apos|rsquo|lsquo|#8216|#8217);/i', // Single quotes '/>/i', // Greater-than '/</i', // Less-than - '/&(amp|#38);/i', // Ampersand '/&(copy|#169);/i', // Copyright '/&(trade|#8482|#153);/i', // Trademark '/&(reg|#174);/i', // Registered @@ -176,6 +175,7 @@ class html2text '/&(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 @@ class html2text "'", // Single quotes '>', '<', - '&', '(c)', '(tm)', '(R)', @@ -219,6 +218,7 @@ class html2text '*', '£', 'EUR', // Euro sign. € ? + '|+|amp|+|', // Ampersand: see _converter() ' ' // Runs of spaces, post-handling ); @@ -502,7 +502,11 @@ class html2text $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 "&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 471649c04..3f2b8c5d2 100644 --- a/program/steps/mail/compose.inc +++ b/program/steps/mail/compose.inc @@ -646,9 +646,20 @@ function rcmail_compose_body($attrib) $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 . ''; + } + $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 000000000..c1d40d930 --- /dev/null +++ b/tests/html_to_text.php @@ -0,0 +1,46 @@ +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' => '"&', + 'out' => '"&', + ), + 2 => array( + 'title' => 'HTML entity string', + 'in' => '&quot;', + 'out' => '"', + ), + ); + + $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']); + } + } + +} -- cgit v1.2.3