diff --git a/plugins/libcalendaring/libcalendaring.js b/plugins/libcalendaring/libcalendaring.js index 3f275806..5fad75df 100644 --- a/plugins/libcalendaring/libcalendaring.js +++ b/plugins/libcalendaring/libcalendaring.js @@ -371,7 +371,7 @@ function rcube_libcalendaring(settings) */ this.text2html = function(str, maxlen, maxlines) { - var html = Q(String(str)); + var html = Q($.trim(String(str))); // limit visible text length if (maxlen) { @@ -411,21 +411,35 @@ function rcube_libcalendaring(settings) // simple link parser (similar to rcube_string_replacer class in PHP) var utf_domain = '[^?&@"\'/\\(\\)\\s\\r\\t\\n]+\\.([^\x00-\x2f\x3b-\x40\x5b-\x60\x7b-\x7f]{2,}|xn--[a-z0-9]{2,})'; - var url1 = '.:;,', url2 = 'a-z0-9%=#@+?&/_~\\[\\]-'; + var url1 = '.;,', url2 = 'a-z0-9%=:#@+?&/_~\\[\\]-'; var link_pattern = new RegExp('([hf]t+ps?://)('+utf_domain+'(['+url1+']?['+url2+']+)*)', 'ig'); var mailto_pattern = new RegExp('([^\\s\\n\\(\\);]+@'+utf_domain+')', 'ig'); var link_replace = function(matches, p1, p2) { - var title = '', text = p2; - if (p2 && p2.length > 55) { - text = p2.substr(0, 45) + '...' + p2.substr(-8); - title = p1 + p2; + var title = '', suffix = ''; + if (p2 && p2.substr(-3) == '>') { + suffix = '>'; + p2 = p2.substr(0, p2.length - 3); } - return ''+p1+text+'' + var href = p1 + p2; + if (p2 && p2.length > 55) { + title = p1 + p2; + p2 = p2.substr(0, 45) + '...' + p2.substr(-8); + } + + return '' + p1 + p2 + '' + suffix + }; + + var mailto_replace = function(matches, p1, p2) { + // ignore links (created in link_replace() above + if (matches.match(/^(title|href)=/)) + return matches; + else + return '' + p1 + ''; }; return html .replace(link_pattern, link_replace) - .replace(mailto_pattern, '$1') + .replace(mailto_pattern, mailto_replace) .replace(/(mailto:)([^"]+)"/g, '$1$2" onclick="rcmail.command(\'compose\', \'$2\');return false"') .replace(/\n/g, "
"); };