diff --git a/Riot/Modules/MatrixKit/Utils/EventFormatter/MXKEventFormatter.m b/Riot/Modules/MatrixKit/Utils/EventFormatter/MXKEventFormatter.m index 1fd543a036..a7c24eafb5 100644 --- a/Riot/Modules/MatrixKit/Utils/EventFormatter/MXKEventFormatter.m +++ b/Riot/Modules/MatrixKit/Utils/EventFormatter/MXKEventFormatter.m @@ -32,6 +32,11 @@ static NSString *const kHTMLATagRegexPattern = @"([^<]*)"; static NSString *const kRepliedTextPattern = @".*
.*
(.*)
"; +// Tchap: modify regex to define reply pattern// The Tchap pattern takes in account: +// - a text can span on multiple lines -> (?s) modifier make regex '.' to match any char or newline char. +// - the pattern doesn't truncate any quoted user defined by tag at the begining of the replied to text +// else, truncating in first quoted users (if they exists) breaks the tyext rendering. +static NSString *const kTchapRepliedTextPattern = @"(?s).*
.*
(?:
[: ]*)*(.*)
"; @interface MXKEventFormatter () { @@ -2051,7 +2056,7 @@ - (NSString *)tchapTruncatedQuotedReplyFrom:(NSString *)fullQuotedReply { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ - htmlQuotedTextRegex = [NSRegularExpression regularExpressionWithPattern:kRepliedTextPattern + htmlQuotedTextRegex = [NSRegularExpression regularExpressionWithPattern:kTchapRepliedTextPattern options:NSRegularExpressionCaseInsensitive error:nil]; }); @@ -2074,6 +2079,23 @@ - (NSString *)tchapTruncatedQuotedReplyFrom:(NSString *)fullQuotedReply { if( quotedTextRange.location != NSNotFound && quotedTextRange.length > quotedTextMaxLength ) { NSRange truncatedRange = NSMakeRange(quotedTextRange.location + quotedTextMaxLength, quotedTextRange.length - quotedTextMaxLength); + + NSRange remainingRange = NSMakeRange(quotedTextRange.location, quotedTextMaxLength); + + // Check if truncation is in the middle of an HTML tag + NSRange lastOpeningTag = [fullQuotedReply rangeOfString:@"" options:NSBackwardsSearch range:remainingRange]; + + if( lastOpeningTag.location != NSNotFound && + (lastClosingTag.location == NSNotFound || lastOpeningTag.location > lastClosingTag.location) ) + { + // An opening tag has no closing tag. This can break the display of the message. + // Cut at the beginning of the incomplete tag. + NSUInteger excedentLength = truncatedRange.location - lastOpeningTag.location; + truncatedRange.location -= excedentLength; + truncatedRange.length += excedentLength; + } + return [fullQuotedReply stringByReplacingCharactersInRange:truncatedRange withString:@"…"]; } diff --git a/changelog.d/1056.bugfix b/changelog.d/1056.bugfix new file mode 100644 index 0000000000..7bf20272a6 --- /dev/null +++ b/changelog.d/1056.bugfix @@ -0,0 +1 @@ +Amélioration de la troncature des réponses à messages (certains messages tronqués apparaissaient vides). \ No newline at end of file