diff --git a/src/editor/deserialize.js b/src/editor/deserialize.js index 7e4e82affe..6507a8dc12 100644 --- a/src/editor/deserialize.js +++ b/src/editor/deserialize.js @@ -70,7 +70,7 @@ function parseCodeBlock(n, partCreator) { return parts; } -function parseElement(n, partCreator) { +function parseElement(n, partCreator, state) { switch (n.nodeName) { case "A": return parseLink(n, partCreator); @@ -86,12 +86,18 @@ function parseElement(n, partCreator) { return partCreator.plain(`\`${n.textContent}\``); case "DEL": return partCreator.plain(`${n.textContent}`); - case "LI": + case "LI": { + const indent = " ".repeat(state.listDepth - 1); if (n.parentElement.nodeName === "OL") { - return partCreator.plain(` 1. `); + return partCreator.plain(`${indent}1. `); } else { - return partCreator.plain(` - `); + return partCreator.plain(`${indent}- `); } + } + case "OL": + case "UL": + state.listDepth = (state.listDepth || 0) + 1; + // es-lint-disable-next-line no-fallthrough default: // don't textify block nodes we'll decend into if (!checkDecendInto(n)) { @@ -161,6 +167,7 @@ function parseHtmlMessage(html, partCreator) { const parts = []; let lastNode; let inQuote = false; + const state = {}; function onNodeEnter(n) { if (checkIgnored(n)) { @@ -178,7 +185,7 @@ function parseHtmlMessage(html, partCreator) { if (n.nodeType === Node.TEXT_NODE) { newParts.push(...parseAtRoomMentions(n.nodeValue, partCreator)); } else if (n.nodeType === Node.ELEMENT_NODE) { - const parseResult = parseElement(n, partCreator); + const parseResult = parseElement(n, partCreator, state); if (parseResult) { if (Array.isArray(parseResult)) { newParts.push(...parseResult); @@ -207,8 +214,14 @@ function parseHtmlMessage(html, partCreator) { if (checkIgnored(n)) { return; } - if (n.nodeName === "BLOCKQUOTE") { - inQuote = false; + switch (n.nodeName) { + case "BLOCKQUOTE": + inQuote = false; + break; + case "OL": + case "UL": + state.listDepth -= 1; + break; } lastNode = n; }