Remove reply fallbacks (#1994)

As per MSC2781.
pull/2014/merge
Kévin Commaille 6 days ago committed by GitHub
parent 7ec9b7f2e1
commit 8ab2988824
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -0,0 +1 @@
Remove reply fallbacks, as per [MSC2781](https://github.com/matrix-org/matrix-spec-proposals/issues/2781).

@ -362,21 +362,19 @@ property under `m.new_content`.
#### Edits of replies #### Edits of replies
Some particular constraints apply to events which replace a A particular constraint applies to events which replace a [reply](#rich-replies):
[reply](#rich-replies). In particular: in contrast to the original reply, there should be no `m.in_reply_to` property
in the the `m.relates_to` object, since it would be redundant (see
* In contrast to the original reply, there should be no `m.in_reply_to` [Applying `m.new_content`](#applying-mnew_content) above, which notes that the
property in the the `m.relates_to` object, since it would be redundant (see original event's `m.relates_to` is preserved), as well as being contrary to the
[Applying `m.new_content`](#applying-mnew_content) above, which notes that spirit of the event relationships mechanism which expects only one "parent" per
the original event's `m.relates_to` is preserved), as well as being contrary event.
to the spirit of the event relationships mechanism which expects only one
"parent" per event. {{% boxes/note %}}
{{% changed-in v="1.13" %}}
* `m.new_content` should **not** contain any [reply In previous versions of the specification, events which replace a [reply](#rich-replies)
fallback](#fallbacks-for-rich-replies), could include a fallback in the `content`. This is no longer the case.
since it is assumed that any client which can handle edits can also display {{% /boxes/note %}}
replies natively. However, the `content` of the replacement event should provide
fallback content for clients which support neither rich replies nor edits.
An example of an edit to a reply is as follows: An example of an edit to a reply is as follows:
@ -385,15 +383,11 @@ An example of an edit to a reply is as follows:
"type": "m.room.message", "type": "m.room.message",
// irrelevant fields not shown // irrelevant fields not shown
"content": { "content": {
"body": "> <@alice:example.org> question\n\n* reply", "body": "* reply",
"msgtype": "m.text", "msgtype": "m.text",
"format": "org.matrix.custom.html",
"formatted_body": "<mx-reply><blockquote><a href=\"https://matrix.to/#/!somewhere:example.org/$event:example.org\">In reply to</a> <a href=\"https://matrix.to/#/@alice:example.org\">@alice:example.org</a><br />question</blockquote></mx-reply>* reply",
"m.new_content": { "m.new_content": {
"body": "reply", "body": "reply",
"msgtype": "m.text", "msgtype": "m.text",
"format": "org.matrix.custom.html",
"formatted_body": "reply"
}, },
"m.relates_to": { "m.relates_to": {
"rel_type": "m.replace", "rel_type": "m.replace",

@ -98,14 +98,12 @@ having appropriate closing tags, appropriate attributes (considering the
custom ones defined in this specification), and generally valid custom ones defined in this specification), and generally valid
structure. structure.
A special tag, `mx-reply`, may appear on rich replies (described below) {{% boxes/note %}}
and should be allowed if, and only if, the tag appears as the very first {{% changed-in v="1.13" %}}
tag in the `formatted_body`. The tag cannot be nested and cannot be In previous versions of the specification, [rich replies](#rich-replies) could
located after another tag in the tree. Because the tag contains HTML, an use a special tag, `mx-reply`. This is no longer the case. Clients SHOULD strip
`mx-reply` is expected to have a partner closing tag and should be this tag and its content. See the "Rich replies" section for more information.
treated similar to a `div`. Clients that support rich replies will end {{% /boxes/note %}}
up stripping the tag and its contents and therefore may wish to exclude
the tag entirely.
{{% boxes/note %}} {{% boxes/note %}}
A future iteration of the specification will support more powerful and A future iteration of the specification will support more powerful and

@ -1,14 +1,13 @@
### Rich replies ### Rich replies
{{% changed-in v="1.3" %}}
Rich replies are a Rich replies are a
special kind of [relationship](#forming-relationships-between-events) which special kind of [relationship](#forming-relationships-between-events) which
effectively quotes the referenced event for the client to render/process how effectively quotes the referenced event for the client to render/process how
it wishes. They are normally used with [`m.room.message`](#mroommessage) events. it wishes. They are normally used with [`m.room.message`](#mroommessage) events.
{{% boxes/note %}} {{% boxes/note %}}
{{% changed-in v="1.3" %}}
Until v1.3 of the spec, rich replies were limited to `m.room.message` events Until v1.3 of the spec, rich replies were limited to `m.room.message` events
which could represent an HTML-formatted body. As of v1.3 this is now expanded which could represent an HTML-formatted body. As of v1.3 this is now expanded
to *all* event types by dropping the requirement that an HTML-formatted body to *all* event types by dropping the requirement that an HTML-formatted body
@ -18,9 +17,24 @@ Additionally, a rich reply can reference any other event type as of v1.3.
Previously, a rich reply could only reference another `m.room.message` event. Previously, a rich reply could only reference another `m.room.message` event.
{{% /boxes/note %}} {{% /boxes/note %}}
When possible, events SHOULD include a [fallback representation](#fallbacks-for-rich-replies) {{% boxes/note %}}
to allow clients which do not render rich replies to still see something which {{% changed-in v="1.13" %}}
appears to be a quoted reply. In previous versions of the specification, rich replies could include a fallback
representation of the original message message in the `body` (using a prefix
sequence) and `formatted_body` (using a custom HTML element) for clients that do
not support rich replies. This is no longer the case, but clients SHOULD still
remove this fallback before rendering the event.
To strip the fallback on the `body`, the client should iterate over each
line of the string, removing any lines that start with the fallback
prefix sequence (`> `, including the trailing space) and stopping when
a line is encountered without the prefix.
To strip the fallback on the `formatted_body` of an `m.room.message` event with
a `format` of `org.matrix.custom.html`: if the`formatted_body` begins with an
`<mx-reply>` start tag, the client should remove the entirety of the
`<mx-reply>` element.
{{% /boxes/note %}}
Though rich replies form a relationship to another event, they do not Though rich replies form a relationship to another event, they do not
use `rel_type` to create this relationship. Instead, a subkey named `m.in_reply_to` use `rel_type` to create this relationship. Instead, a subkey named `m.in_reply_to`
@ -48,137 +62,6 @@ An example reply would be:
Note that the `event_id` of the `m.in_reply_to` object has the same requirements Note that the `event_id` of the `m.in_reply_to` object has the same requirements
as if it were to be under `m.relates_to` directly instead. as if it were to be under `m.relates_to` directly instead.
#### Fallbacks for rich replies
Some clients may not have support for rich replies and therefore need a
fallback to use instead. Clients that do not support rich replies should
render the event as if rich replies were not special.
Clients that do support rich replies SHOULD provide the fallback format on
replies, and MUST strip the fallback before rendering the reply. The
specific fallback text is different for each `msgtype`, however the
general format for the `body` is:
```text
> <@alice:example.org> This is the first line of the original body
> This is the second line
This is where the reply goes
```
The `formatted_body`, if present and using an associated `format` of
`org.matrix.custom.html`, should use the following template:
```html
<mx-reply>
<blockquote>
<a href="https://matrix.to/#/!somewhere:example.org/$event:example.org">In reply to</a>
<a href="https://matrix.to/#/@alice:example.org">@alice:example.org</a>
<br />
<!-- This is where the related event's HTML would be. -->
</blockquote>
</mx-reply>
This is where the reply goes.
```
If the related event does not have a `formatted_body`, the event's
`body` should be considered after encoding any HTML special characters.
Note that the `href` in both of the anchors use a [matrix.to
URI](/appendices#matrixto-navigation).
##### Stripping the fallback
Clients which support rich replies MUST strip the fallback from the
event before rendering the event. This is because the text provided in
the fallback cannot be trusted to be an accurate representation of the
event. After removing the fallback, clients are recommended to represent
the event referenced by `m.in_reply_to` similar to the fallback's
representation, although clients do have creative freedom for their user
interface. Clients should prefer the `formatted_body` over the `body`,
just like with other `m.room.message` events.
To strip the fallback on the `body`, the client should iterate over each
line of the string, removing any lines that start with the fallback
prefix ("&gt; ", including the space, without quotes) and stopping when
a line is encountered without the prefix. This prefix is known as the
"fallback prefix sequence".
To strip the fallback on the `formatted_body`, the client should remove
the entirety of the `mx-reply` tag.
##### Fallback for `m.text`, `m.notice`, and unrecognised message types
Using the prefix sequence, the first line of the related event's `body`
should be prefixed with the user's ID, followed by each line being
prefixed with the fallback prefix sequence. For example:
```text
> <@alice:example.org> This is the first line
> This is the second line
This is the reply
```
The `formatted_body` uses the template defined earlier in this section.
##### Fallback for `m.emote`
Similar to the fallback for `m.text`, each line gets prefixed with the
fallback prefix sequence. However an asterisk should be inserted before
the user's ID, like so:
```text
> * <@alice:example.org> feels like today is going to be a great day
This is the reply
```
The `formatted_body` has a subtle difference for the template where the
asterisk is also inserted ahead of the user's ID:
```html
<mx-reply>
<blockquote>
<a href="https://matrix.to/#/!somewhere:example.org/$event:example.org">In reply to</a>
* <a href="https://matrix.to/#/@alice:example.org">@alice:example.org</a>
<br />
<!-- This is where the related event's HTML would be. -->
</blockquote>
</mx-reply>
This is where the reply goes.
```
##### Fallback for `m.image`, `m.video`, `m.audio`, and `m.file`
The related event's `body` would be a file name, which may not be very
descriptive. The related event should additionally not have a `format`
or `formatted_body` in the `content` - if the event does have a `format`
and/or `formatted_body`, those fields should be ignored. Because the
filename alone may not be descriptive, the related event's `body` should
be considered to be `"sent a file."` such that the output looks similar
to the following:
```text
> <@alice:example.org> sent a file.
This is the reply
```
```html
<mx-reply>
<blockquote>
<a href="https://matrix.to/#/!somewhere:example.org/$event:example.org">In reply to</a>
<a href="https://matrix.to/#/@alice:example.org">@alice:example.org</a>
<br />
sent a file.
</blockquote>
</mx-reply>
This is where the reply goes.
```
For `m.image`, the text should be `"sent an image."`. For `m.video`, the
text should be `"sent a video."`. For `m.audio`, the text should be
`"sent an audio file"`.
#### Mentioning the replied to user #### Mentioning the replied to user
In order to notify users of the reply, it may be desirable to include the `sender` In order to notify users of the reply, it may be desirable to include the `sender`

@ -106,10 +106,6 @@ flag to `true`.
} }
``` ```
For `m.room.message` events represented this way, no [reply fallback](#fallbacks-for-rich-replies)
is specified. This allows thread-aware clients to discard the `m.in_reply_to` object entirely
when `is_falling_back` is `true`.
{{% boxes/note %}} {{% boxes/note %}}
Clients which are acutely aware of threads (they do not render threads, but are otherwise Clients which are acutely aware of threads (they do not render threads, but are otherwise
aware of the feature existing in the spec) can treat rich replies to an event with a `rel_type` aware of the feature existing in the spec) can treat rich replies to an event with a `rel_type`

Loading…
Cancel
Save