take list nesting into account for indenting

This commit is contained in:
Bruno Windels 2019-06-21 11:40:27 +02:00
parent d3b552411c
commit 503d702f47

View file

@ -70,7 +70,7 @@ function parseCodeBlock(n, partCreator) {
return parts; return parts;
} }
function parseElement(n, partCreator) { function parseElement(n, partCreator, state) {
switch (n.nodeName) { switch (n.nodeName) {
case "A": case "A":
return parseLink(n, partCreator); return parseLink(n, partCreator);
@ -86,12 +86,18 @@ function parseElement(n, partCreator) {
return partCreator.plain(`\`${n.textContent}\``); return partCreator.plain(`\`${n.textContent}\``);
case "DEL": case "DEL":
return partCreator.plain(`<del>${n.textContent}</del>`); return partCreator.plain(`<del>${n.textContent}</del>`);
case "LI": case "LI": {
const indent = " ".repeat(state.listDepth - 1);
if (n.parentElement.nodeName === "OL") { if (n.parentElement.nodeName === "OL") {
return partCreator.plain(` 1. `); return partCreator.plain(`${indent}1. `);
} else { } 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: default:
// don't textify block nodes we'll decend into // don't textify block nodes we'll decend into
if (!checkDecendInto(n)) { if (!checkDecendInto(n)) {
@ -161,6 +167,7 @@ function parseHtmlMessage(html, partCreator) {
const parts = []; const parts = [];
let lastNode; let lastNode;
let inQuote = false; let inQuote = false;
const state = {};
function onNodeEnter(n) { function onNodeEnter(n) {
if (checkIgnored(n)) { if (checkIgnored(n)) {
@ -178,7 +185,7 @@ function parseHtmlMessage(html, partCreator) {
if (n.nodeType === Node.TEXT_NODE) { if (n.nodeType === Node.TEXT_NODE) {
newParts.push(...parseAtRoomMentions(n.nodeValue, partCreator)); newParts.push(...parseAtRoomMentions(n.nodeValue, partCreator));
} else if (n.nodeType === Node.ELEMENT_NODE) { } else if (n.nodeType === Node.ELEMENT_NODE) {
const parseResult = parseElement(n, partCreator); const parseResult = parseElement(n, partCreator, state);
if (parseResult) { if (parseResult) {
if (Array.isArray(parseResult)) { if (Array.isArray(parseResult)) {
newParts.push(...parseResult); newParts.push(...parseResult);
@ -207,8 +214,14 @@ function parseHtmlMessage(html, partCreator) {
if (checkIgnored(n)) { if (checkIgnored(n)) {
return; return;
} }
if (n.nodeName === "BLOCKQUOTE") { switch (n.nodeName) {
inQuote = false; case "BLOCKQUOTE":
inQuote = false;
break;
case "OL":
case "UL":
state.listDepth -= 1;
break;
} }
lastNode = n; lastNode = n;
} }