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