Aleksander Machniak
2014-05-18 59b765d83927cb9e81bf69656db3a7dbdc1b1b41
Don't remove links when html signature is converted to text (#1489621)
Fix so when switching editor mode original version of signature is used (#1488849)
5 files modified
72 ■■■■ changed files
CHANGELOG 2 ●●●●● patch | view | raw | blame | history
program/js/app.js 62 ●●●● patch | view | raw | blame | history
program/steps/mail/compose.inc 2 ●●● patch | view | raw | blame | history
tests/Framework/Html2text.php 5 ●●●●● patch | view | raw | blame | history
tests/Framework/Text2Html.php 1 ●●●● patch | view | raw | blame | history
CHANGELOG
@@ -20,6 +20,8 @@
- Add configurable LDAP_OPT_DEREF option (#1489864)
- Optimize some framed pages content for better performance (#1489792)
- Improve text messages display and conversion to HTML (#1488937)
- Don't remove links when html signature is converted to text (#1489621)
- Fix so when switching editor mode original version of signature is used (#1488849)
- Fix mbox files import
- Fix unintentional draft autosave request if autosave is disabled (#1489882)
- Fix malformed References: header in send/saved mail (#1489891)
program/js/app.js
@@ -3439,10 +3439,27 @@
  {
    this.stop_spellchecking();
    var input = $('#' + props.id);
    var ed, curr, content, result,
      // these non-printable chars are not removed on text2html and html2text
      // we can use them as temp signature replacement
      sig_mark = "\u0002\u0003",
      input = $('#' + props.id),
      signature = this.env.identity ? this.env.signatures[this.env.identity] : null,
      is_sig = signature && signature.text && signature.text.length > 1;
    if (props.mode == 'html')
      this.plain2html(input.val(), function(data) {
    if (props.mode == 'html') {
      content = input.val();
      // replace current text signature with temp mark
      if (is_sig)
        content = content.replace(signature.text, sig_mark);
      // convert to html
      result = this.plain2html(content, function(data) {
        // replace signature mark with html version of the signature
        if (is_sig)
          data = data.replace(sig_mark, '<div id="_rc_sig">' + signature.html + '</div>');
        input.val(data);
        tinyMCE.execCommand('mceAddControl', false, props.id);
@@ -3451,13 +3468,43 @@
            $(tinyMCE.get(props.id).getBody()).css('font-family', ref.env.default_font);
          }, 500);
      });
    else
      this.html2plain(tinyMCE.get(props.id).getContent(), function(data) {
    }
    else {
      ed = tinyMCE.get(props.id);
      if (is_sig) {
        // get current version of signature, we'll need it in
        // case of html2text conversion abort
        if (curr = ed.dom.get('_rc_sig'))
          curr = curr.innerHTML;
        // replace current signature with some non-printable characters
        // we use non-printable characters, because this replacement
        // is visible to the user
        // doing this after getContent() would be hard
        ed.dom.setHTML('_rc_sig', sig_mark);
      }
      // get html content
      content = ed.getContent();
      // convert html to text
      result = this.html2plain(content, function(data) {
        tinyMCE.execCommand('mceRemoveControl', false, props.id);
        // replace signture mark with text version of the signature
        if (is_sig)
          data = data.replace(sig_mark, "\n" + signature.text);
        input.val(data);
      });
    return true;
      // bring back current signature
      if (!result && curr)
        ed.dom.setHTML('_rc_sig', curr);
    }
    return result;
  };
  this.insert_response = function(key)
@@ -6834,7 +6881,8 @@
      || (format != 'html' && !(text.replace(/\xC2\xA0|\s/g, '')).length)
    ) {
      // without setTimeout() here, textarea is filled with initial (onload) content
      setTimeout(function() { if (func) func(''); }, 50);
      if (func)
        setTimeout(function() { func(''); }, 50);
      return true;
    }
program/steps/mail/compose.inc
@@ -611,7 +611,7 @@
                $text = $html = $sql_arr['signature'];
                if ($sql_arr['html_signature']) {
                    $h2t  = new rcube_html2text($sql_arr['signature'], false, false);
                    $h2t  = new rcube_html2text($sql_arr['signature'], false, true);
                    $text = trim($h2t->get_text());
                }
                else {
tests/Framework/Html2text.php
@@ -41,6 +41,11 @@
                'in'    => '<b><strong>&#347;</strong></b>',
                'out'   => 'Ś',
            ),
            6 => array(
                'title' => 'Don\'t remove non-printable chars',
                'in'    => chr(0x002).chr(0x003),
                'out'   => chr(0x002).chr(0x003),
            ),
        );
    }
tests/Framework/Text2Html.php
@@ -63,6 +63,7 @@
        $data[] = array(">aaaa \n>aaaa", "<blockquote>aaaa aaaa</blockquote>", $options);
        $data[] = array(">aaaa\n>aaaa", "<blockquote>aaaa<br>aaaa</blockquote>", $options);
        $data[] = array(">aaaa \n>bbbb\ncccc dddd", "<blockquote>aaaa bbbb</blockquote>cccc_dddd", $options);
        $data[] = array(chr(0x002).chr(0x003), chr(0x002).chr(0x003), $options);
        $options['flowed'] = false;
        $options['wrap']   = true;