diff --git a/ChangeLog b/ChangeLog index f9f81746a..057c22cfa 100644 --- a/ChangeLog +++ b/ChangeLog @@ -6,6 +6,8 @@ is not found since the range has not changed either. Finally, the first character before the url might also be a tab or a cr, so we match it against the "urlAfterEndingChars" custom NSCharacterSet. + ([NSString -stringByDetectingURLs]): modified to handle email + addresses and add a correct "mailto:" link. 2007-05-15 Wolfgang Sourdeau diff --git a/SoObjects/SOGo/NSString+Utilities.m b/SoObjects/SOGo/NSString+Utilities.m index e5912afbb..987ad47c7 100644 --- a/SoObjects/SOGo/NSString+Utilities.m +++ b/SoObjects/SOGo/NSString+Utilities.m @@ -113,12 +113,12 @@ static NSMutableCharacterSet *urlAfterEndingChars = nil; if (!urlNonEndingChars) { urlNonEndingChars = [NSMutableCharacterSet new]; - [urlNonEndingChars addCharactersInString: @"&=,.:;\t \r\n"]; + [urlNonEndingChars addCharactersInString: @">&=,.:;\t \r\n"]; } if (!urlAfterEndingChars) { urlAfterEndingChars = [NSMutableCharacterSet new]; - [urlAfterEndingChars addCharactersInString: @"\t \r\n"]; + [urlAfterEndingChars addCharactersInString: @"&;<\t \r\n"]; } start = refRange.location; @@ -142,30 +142,44 @@ static NSMutableCharacterSet *urlAfterEndingChars = nil; return NSMakeRange (start, length); } -- (NSString *) stringByDetectingURLs +- (void) _handleURLs: (NSMutableString *) selfCopy + textToMatch: (NSString *) match + prefix: (NSString *) prefix { - NSMutableString *selfCopy; NSRange httpRange, currentURL, rest; NSString *urlText, *newUrlText; - unsigned int length; + unsigned int length, matchLength; - selfCopy = [NSMutableString stringWithString: self]; - - httpRange = [selfCopy rangeOfString: @"://"]; + matchLength = [match length]; + httpRange = [selfCopy rangeOfString: match]; while (httpRange.location != NSNotFound) { currentURL = [selfCopy _rangeOfURLInRange: httpRange]; urlText = [selfCopy substringFromRange: currentURL]; - newUrlText = [NSString stringWithFormat: @"%@", - urlText, urlText]; - [selfCopy replaceCharactersInRange: currentURL - withString: newUrlText]; + if ([urlText length] > matchLength) + { + newUrlText = [NSString stringWithFormat: @"%@", + prefix, urlText, urlText]; + [selfCopy replaceCharactersInRange: currentURL + withString: newUrlText]; + rest.location = currentURL.location + [newUrlText length]; + } + else + rest.location = currentURL.location + currentURL.length; length = [selfCopy length]; - rest.location = currentURL.location + [newUrlText length]; rest.length = length - rest.location; - httpRange = [selfCopy rangeOfString: @"://" + httpRange = [selfCopy rangeOfString: match options: 0 range: rest]; } +} + +- (NSString *) stringByDetectingURLs +{ + NSMutableString *selfCopy; + + selfCopy = [NSMutableString stringWithString: self]; + [self _handleURLs: selfCopy textToMatch: @"://" prefix: @""]; + [self _handleURLs: selfCopy textToMatch: @"@" prefix: @"mailto:"]; return selfCopy; } diff --git a/UI/WebServerResources/MailerUI.js b/UI/WebServerResources/MailerUI.js index 12907bd93..e8f9dee5e 100644 --- a/UI/WebServerResources/MailerUI.js +++ b/UI/WebServerResources/MailerUI.js @@ -635,7 +635,18 @@ function configureLinksInMessage() { parentDiv)[0]; var anchors = div.getElementsByTagName('a'); for (var i = 0; i < anchors.length; i++) - anchors[i].addEventListener("click", onMessageAnchorClick, false); + if (anchors[i].href.substring(0,7) == "mailto:") { + anchors[i].addEventListener("click", onEmailAddressClick, false); + anchors[i].addEventListener("contextmenu", onEmailAddressClick, + false); + } + else + anchors[i].addEventListener("click", onMessageAnchorClick, false); +} + +function onEmailAddressClick(event) { + onMenuClick(event, 'addressMenu'); + event.preventDefault(); } function onMessageAnchorClick (event) {