Fix textual message stripping new line (#7239)
This commit is contained in:
parent
5e77822bcc
commit
0afe141266
2 changed files with 39 additions and 11 deletions
|
@ -411,8 +411,9 @@ export interface IOptsReturnString extends IOpts {
|
||||||
export function bodyToHtml(content: IContent, highlights: string[], opts: IOptsReturnString): string;
|
export function bodyToHtml(content: IContent, highlights: string[], opts: IOptsReturnString): string;
|
||||||
export function bodyToHtml(content: IContent, highlights: string[], opts: IOptsReturnNode): ReactNode;
|
export function bodyToHtml(content: IContent, highlights: string[], opts: IOptsReturnNode): ReactNode;
|
||||||
export function bodyToHtml(content: IContent, highlights: string[], opts: IOpts = {}) {
|
export function bodyToHtml(content: IContent, highlights: string[], opts: IOpts = {}) {
|
||||||
const isHtmlMessage = content.format === "org.matrix.custom.html" && content.formatted_body;
|
const isFormattedBody = content.format === "org.matrix.custom.html" && content.formatted_body;
|
||||||
let bodyHasEmoji = false;
|
let bodyHasEmoji = false;
|
||||||
|
let isHtmlMessage = false;
|
||||||
|
|
||||||
let sanitizeParams = sanitizeHtmlParams;
|
let sanitizeParams = sanitizeHtmlParams;
|
||||||
if (opts.forComposerQuote) {
|
if (opts.forComposerQuote) {
|
||||||
|
@ -449,20 +450,23 @@ export function bodyToHtml(content: IContent, highlights: string[], opts: IOpts
|
||||||
if (opts.stripReplyFallback && formattedBody) formattedBody = ReplyChain.stripHTMLReply(formattedBody);
|
if (opts.stripReplyFallback && formattedBody) formattedBody = ReplyChain.stripHTMLReply(formattedBody);
|
||||||
strippedBody = opts.stripReplyFallback ? ReplyChain.stripPlainReply(plainBody) : plainBody;
|
strippedBody = opts.stripReplyFallback ? ReplyChain.stripPlainReply(plainBody) : plainBody;
|
||||||
|
|
||||||
bodyHasEmoji = mightContainEmoji(isHtmlMessage ? formattedBody : plainBody);
|
bodyHasEmoji = mightContainEmoji(isFormattedBody ? formattedBody : plainBody);
|
||||||
|
|
||||||
// Only generate safeBody if the message was sent as org.matrix.custom.html
|
// Only generate safeBody if the message was sent as org.matrix.custom.html
|
||||||
if (isHtmlMessage) {
|
if (isFormattedBody) {
|
||||||
isDisplayedWithHtml = true;
|
isDisplayedWithHtml = true;
|
||||||
safeBody = sanitizeHtml(formattedBody, sanitizeParams);
|
|
||||||
|
|
||||||
if (SettingsStore.getValue("feature_latex_maths")) {
|
safeBody = sanitizeHtml(formattedBody, sanitizeParams);
|
||||||
const phtml = cheerio.load(safeBody, {
|
const phtml = cheerio.load(safeBody, {
|
||||||
// @ts-ignore: The `_useHtmlParser2` internal option is the
|
// @ts-ignore: The `_useHtmlParser2` internal option is the
|
||||||
// simplest way to both parse and render using `htmlparser2`.
|
// simplest way to both parse and render using `htmlparser2`.
|
||||||
_useHtmlParser2: true,
|
_useHtmlParser2: true,
|
||||||
decodeEntities: false,
|
decodeEntities: false,
|
||||||
});
|
});
|
||||||
|
const isPlainText = phtml.html() === phtml.root().text();
|
||||||
|
isHtmlMessage = isFormattedBody && !isPlainText;
|
||||||
|
|
||||||
|
if (isHtmlMessage && SettingsStore.getValue("feature_latex_maths")) {
|
||||||
// @ts-ignore - The types for `replaceWith` wrongly expect
|
// @ts-ignore - The types for `replaceWith` wrongly expect
|
||||||
// Cheerio instance to be returned.
|
// Cheerio instance to be returned.
|
||||||
phtml('div, span[data-mx-maths!=""]').replaceWith(function(i, e) {
|
phtml('div, span[data-mx-maths!=""]').replaceWith(function(i, e) {
|
||||||
|
|
|
@ -282,6 +282,30 @@ describe("<TextualBody />", () => {
|
||||||
'!ZxbRYPQXDXKGmDnJNg:example.com</a></span> with vias</span>',
|
'!ZxbRYPQXDXKGmDnJNg:example.com</a></span> with vias</span>',
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('renders formatted body without html corretly', () => {
|
||||||
|
const ev = mkEvent({
|
||||||
|
type: "m.room.message",
|
||||||
|
room: "room_id",
|
||||||
|
user: "sender",
|
||||||
|
content: {
|
||||||
|
body: "escaped \\*markdown\\*",
|
||||||
|
msgtype: "m.text",
|
||||||
|
format: "org.matrix.custom.html",
|
||||||
|
formatted_body: "escaped *markdown*",
|
||||||
|
},
|
||||||
|
event: true,
|
||||||
|
});
|
||||||
|
|
||||||
|
const wrapper = mount(<TextualBody mxEvent={ev} />);
|
||||||
|
|
||||||
|
const content = wrapper.find(".mx_EventTile_body");
|
||||||
|
expect(content.html()).toBe(
|
||||||
|
'<span class="mx_EventTile_body" dir="auto">' +
|
||||||
|
'escaped *markdown*' +
|
||||||
|
'</span>',
|
||||||
|
);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
it("renders url previews correctly", () => {
|
it("renders url previews correctly", () => {
|
||||||
|
|
Loading…
Reference in a new issue