mirror of https://github.com/vector-im/riot-web
Apply strictNullChecks to Markdown.ts (#10623)
Co-authored-by: Kerry <kerrya@element.io>t3chguy/dedup-icons-17oct
parent
4c0efc5e68
commit
1d9df7ec51
|
@ -28,7 +28,11 @@ const ALLOWED_HTML_TAGS = ["sub", "sup", "del", "u"];
|
||||||
const TEXT_NODES = ["text", "softbreak", "linebreak", "paragraph", "document"];
|
const TEXT_NODES = ["text", "softbreak", "linebreak", "paragraph", "document"];
|
||||||
|
|
||||||
function isAllowedHtmlTag(node: commonmark.Node): boolean {
|
function isAllowedHtmlTag(node: commonmark.Node): boolean {
|
||||||
if (node.literal != null && node.literal.match('^<((div|span) data-mx-maths="[^"]*"|/(div|span))>$') != null) {
|
if (!node.literal) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (node.literal.match('^<((div|span) data-mx-maths="[^"]*"|/(div|span))>$') != null) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -57,9 +61,9 @@ function isMultiLine(node: commonmark.Node): boolean {
|
||||||
}
|
}
|
||||||
|
|
||||||
function getTextUntilEndOrLinebreak(node: commonmark.Node): string {
|
function getTextUntilEndOrLinebreak(node: commonmark.Node): string {
|
||||||
let currentNode = node;
|
let currentNode: commonmark.Node | null = node;
|
||||||
let text = "";
|
let text = "";
|
||||||
while (currentNode !== null && currentNode.type !== "softbreak" && currentNode.type !== "linebreak") {
|
while (currentNode && currentNode.type !== "softbreak" && currentNode.type !== "linebreak") {
|
||||||
const { literal, type } = currentNode;
|
const { literal, type } = currentNode;
|
||||||
if (type === "text" && literal) {
|
if (type === "text" && literal) {
|
||||||
let n = 0;
|
let n = 0;
|
||||||
|
@ -95,7 +99,7 @@ const innerNodeLiteral = (node: commonmark.Node): string => {
|
||||||
let literal = "";
|
let literal = "";
|
||||||
|
|
||||||
const walker = node.walker();
|
const walker = node.walker();
|
||||||
let step: commonmark.NodeWalkingStep;
|
let step: commonmark.NodeWalkingStep | null;
|
||||||
|
|
||||||
while ((step = walker.next())) {
|
while ((step = walker.next())) {
|
||||||
const currentNode = step.node;
|
const currentNode = step.node;
|
||||||
|
@ -166,7 +170,7 @@ export default class Markdown {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Break up text nodes on spaces, so that we don't shoot past them without resetting
|
// Break up text nodes on spaces, so that we don't shoot past them without resetting
|
||||||
if (node.type === "text") {
|
if (node.type === "text" && node.literal) {
|
||||||
const [thisPart, ...nextParts] = node.literal.split(/( )/);
|
const [thisPart, ...nextParts] = node.literal.split(/( )/);
|
||||||
node.literal = thisPart;
|
node.literal = thisPart;
|
||||||
text += thisPart;
|
text += thisPart;
|
||||||
|
@ -184,11 +188,11 @@ export default class Markdown {
|
||||||
}
|
}
|
||||||
|
|
||||||
// We should not do this if previous node was not a textnode, as we can't combine it then.
|
// We should not do this if previous node was not a textnode, as we can't combine it then.
|
||||||
if ((node.type === "emph" || node.type === "strong") && previousNode.type === "text") {
|
if ((node.type === "emph" || node.type === "strong") && previousNode?.type === "text") {
|
||||||
if (event.entering) {
|
if (event.entering) {
|
||||||
const foundLinks = linkify.find(text);
|
const foundLinks = linkify.find(text);
|
||||||
for (const { value } of foundLinks) {
|
for (const { value } of foundLinks) {
|
||||||
if (node.firstChild.literal) {
|
if (node?.firstChild?.literal) {
|
||||||
/**
|
/**
|
||||||
* NOTE: This technically should unlink the emph node and create LINK nodes instead, adding all the next elements as siblings
|
* NOTE: This technically should unlink the emph node and create LINK nodes instead, adding all the next elements as siblings
|
||||||
* but this solution seems to work well and is hopefully slightly easier to understand too
|
* but this solution seems to work well and is hopefully slightly easier to understand too
|
||||||
|
@ -205,10 +209,12 @@ export default class Markdown {
|
||||||
previousNode.insertAfter(emphasisTextNode);
|
previousNode.insertAfter(emphasisTextNode);
|
||||||
node.firstChild.literal = "";
|
node.firstChild.literal = "";
|
||||||
event = node.walker().next();
|
event = node.walker().next();
|
||||||
// Remove `em` opening and closing nodes
|
if (event) {
|
||||||
node.unlink();
|
// Remove `em` opening and closing nodes
|
||||||
previousNode.insertAfter(event.node);
|
node.unlink();
|
||||||
shouldUnlinkFormattingNode = true;
|
previousNode.insertAfter(event.node);
|
||||||
|
shouldUnlinkFormattingNode = true;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
logger.error(
|
logger.error(
|
||||||
"Markdown links escaping found too many links for following text: ",
|
"Markdown links escaping found too many links for following text: ",
|
||||||
|
@ -237,7 +243,7 @@ export default class Markdown {
|
||||||
public isPlainText(): boolean {
|
public isPlainText(): boolean {
|
||||||
const walker = this.parsed.walker();
|
const walker = this.parsed.walker();
|
||||||
|
|
||||||
let ev: commonmark.NodeWalkingStep;
|
let ev: commonmark.NodeWalkingStep | null;
|
||||||
while ((ev = walker.next())) {
|
while ((ev = walker.next())) {
|
||||||
const node = ev.node;
|
const node = ev.node;
|
||||||
if (TEXT_NODES.indexOf(node.type) > -1) {
|
if (TEXT_NODES.indexOf(node.type) > -1) {
|
||||||
|
@ -294,7 +300,7 @@ export default class Markdown {
|
||||||
|
|
||||||
renderer.link = function (node, entering) {
|
renderer.link = function (node, entering) {
|
||||||
const attrs = this.attrs(node);
|
const attrs = this.attrs(node);
|
||||||
if (entering) {
|
if (entering && node.destination) {
|
||||||
attrs.push(["href", this.esc(node.destination)]);
|
attrs.push(["href", this.esc(node.destination)]);
|
||||||
if (node.title) {
|
if (node.title) {
|
||||||
attrs.push(["title", this.esc(node.title)]);
|
attrs.push(["title", this.esc(node.title)]);
|
||||||
|
@ -312,10 +318,12 @@ export default class Markdown {
|
||||||
};
|
};
|
||||||
|
|
||||||
renderer.html_inline = function (node: commonmark.Node) {
|
renderer.html_inline = function (node: commonmark.Node) {
|
||||||
if (isAllowedHtmlTag(node)) {
|
if (node.literal) {
|
||||||
this.lit(node.literal);
|
if (isAllowedHtmlTag(node)) {
|
||||||
} else {
|
this.lit(node.literal);
|
||||||
this.lit(escape(node.literal));
|
} else {
|
||||||
|
this.lit(escape(node.literal));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -358,7 +366,7 @@ export default class Markdown {
|
||||||
};
|
};
|
||||||
|
|
||||||
renderer.html_block = function (node: commonmark.Node) {
|
renderer.html_block = function (node: commonmark.Node) {
|
||||||
this.lit(node.literal);
|
if (node.literal) this.lit(node.literal);
|
||||||
if (isMultiLine(node) && node.next) this.lit("\n\n");
|
if (isMultiLine(node) && node.next) this.lit("\n\n");
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue