Merge pull request #6931 from matrix-org/t3chguy/fix/19350
commit
3417c03f41
|
@ -20,8 +20,9 @@ import { MatrixEvent } from "matrix-js-sdk/src/models/event";
|
||||||
import { walkDOMDepthFirst } from "./dom";
|
import { walkDOMDepthFirst } from "./dom";
|
||||||
import { checkBlockNode } from "../HtmlUtils";
|
import { checkBlockNode } from "../HtmlUtils";
|
||||||
import { getPrimaryPermalinkEntity } from "../utils/permalinks/Permalinks";
|
import { getPrimaryPermalinkEntity } from "../utils/permalinks/Permalinks";
|
||||||
import { PartCreator, Type } from "./parts";
|
import { Part, PartCreator, Type } from "./parts";
|
||||||
import SdkConfig from "../SdkConfig";
|
import SdkConfig from "../SdkConfig";
|
||||||
|
import { textToHtmlRainbow } from "../utils/colour";
|
||||||
|
|
||||||
function parseAtRoomMentions(text: string, partCreator: PartCreator) {
|
function parseAtRoomMentions(text: string, partCreator: PartCreator) {
|
||||||
const ATROOM = "@room";
|
const ATROOM = "@room";
|
||||||
|
@ -213,12 +214,12 @@ function prefixQuoteLines(isFirstNode, parts, partCreator) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function parseHtmlMessage(html: string, partCreator: PartCreator, isQuotedMessage: boolean) {
|
function parseHtmlMessage(html: string, partCreator: PartCreator, isQuotedMessage: boolean): Part[] {
|
||||||
// no nodes from parsing here should be inserted in the document,
|
// no nodes from parsing here should be inserted in the document,
|
||||||
// as scripts in event handlers, etc would be executed then.
|
// as scripts in event handlers, etc would be executed then.
|
||||||
// we're only taking text, so that is fine
|
// we're only taking text, so that is fine
|
||||||
const rootNode = new DOMParser().parseFromString(html, "text/html").body;
|
const rootNode = new DOMParser().parseFromString(html, "text/html").body;
|
||||||
const parts = [];
|
const parts: Part[] = [];
|
||||||
let lastNode;
|
let lastNode;
|
||||||
let inQuote = isQuotedMessage;
|
let inQuote = isQuotedMessage;
|
||||||
const state: IState = {
|
const state: IState = {
|
||||||
|
@ -233,7 +234,7 @@ function parseHtmlMessage(html: string, partCreator: PartCreator, isQuotedMessag
|
||||||
inQuote = true;
|
inQuote = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
const newParts = [];
|
const newParts: Part[] = [];
|
||||||
if (lastNode && (checkBlockNode(lastNode) || checkBlockNode(n))) {
|
if (lastNode && (checkBlockNode(lastNode) || checkBlockNode(n))) {
|
||||||
newParts.push(partCreator.newline());
|
newParts.push(partCreator.newline());
|
||||||
}
|
}
|
||||||
|
@ -288,7 +289,7 @@ function parseHtmlMessage(html: string, partCreator: PartCreator, isQuotedMessag
|
||||||
return parts;
|
return parts;
|
||||||
}
|
}
|
||||||
|
|
||||||
export function parsePlainTextMessage(body: string, partCreator: PartCreator, isQuotedMessage?: boolean) {
|
export function parsePlainTextMessage(body: string, partCreator: PartCreator, isQuotedMessage?: boolean): Part[] {
|
||||||
const lines = body.split(/\r\n|\r|\n/g); // split on any new-line combination not just \n, collapses \r\n
|
const lines = body.split(/\r\n|\r|\n/g); // split on any new-line combination not just \n, collapses \r\n
|
||||||
return lines.reduce((parts, line, i) => {
|
return lines.reduce((parts, line, i) => {
|
||||||
if (isQuotedMessage) {
|
if (isQuotedMessage) {
|
||||||
|
@ -300,19 +301,31 @@ export function parsePlainTextMessage(body: string, partCreator: PartCreator, is
|
||||||
parts.push(partCreator.newline());
|
parts.push(partCreator.newline());
|
||||||
}
|
}
|
||||||
return parts;
|
return parts;
|
||||||
}, []);
|
}, [] as Part[]);
|
||||||
}
|
}
|
||||||
|
|
||||||
export function parseEvent(event: MatrixEvent, partCreator: PartCreator, { isQuotedMessage = false } = {}) {
|
export function parseEvent(event: MatrixEvent, partCreator: PartCreator, { isQuotedMessage = false } = {}) {
|
||||||
const content = event.getContent();
|
const content = event.getContent();
|
||||||
let parts;
|
let parts: Part[];
|
||||||
|
const isEmote = content.msgtype === "m.emote";
|
||||||
|
let isRainbow = false;
|
||||||
|
|
||||||
if (content.format === "org.matrix.custom.html") {
|
if (content.format === "org.matrix.custom.html") {
|
||||||
parts = parseHtmlMessage(content.formatted_body || "", partCreator, isQuotedMessage);
|
parts = parseHtmlMessage(content.formatted_body || "", partCreator, isQuotedMessage);
|
||||||
|
if (content.body && content.formatted_body && textToHtmlRainbow(content.body) === content.formatted_body) {
|
||||||
|
isRainbow = true;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
parts = parsePlainTextMessage(content.body || "", partCreator, isQuotedMessage);
|
parts = parsePlainTextMessage(content.body || "", partCreator, isQuotedMessage);
|
||||||
}
|
}
|
||||||
if (content.msgtype === "m.emote") {
|
|
||||||
|
if (isEmote && isRainbow) {
|
||||||
|
parts.unshift(partCreator.plain("/rainbowme "));
|
||||||
|
} else if (isRainbow) {
|
||||||
|
parts.unshift(partCreator.plain("/rainbow "));
|
||||||
|
} else if (isEmote) {
|
||||||
parts.unshift(partCreator.plain("/me "));
|
parts.unshift(partCreator.plain("/me "));
|
||||||
}
|
}
|
||||||
|
|
||||||
return parts;
|
return parts;
|
||||||
}
|
}
|
||||||
|
|
|
@ -91,7 +91,8 @@ export default class EditorModel {
|
||||||
}
|
}
|
||||||
|
|
||||||
public clone(): EditorModel {
|
public clone(): EditorModel {
|
||||||
return new EditorModel(this._parts, this._partCreator, this.updateCallback);
|
const clonedParts = this.parts.map(p => this.partCreator.deserializePart(p.serialize()));
|
||||||
|
return new EditorModel(clonedParts, this._partCreator, this.updateCallback);
|
||||||
}
|
}
|
||||||
|
|
||||||
private insertPart(index: number, part: Part): void {
|
private insertPart(index: number, part: Part): void {
|
||||||
|
|
Loading…
Reference in New Issue