Files
outline/server/utils/turndown/sanitizeLists.ts

52 lines
1.4 KiB
TypeScript

import TurndownService from "turndown";
/**
* A turndown plugin for removing incompatible nodes from lists.
*
* @param turndownService The TurndownService instance.
*/
export default function sanitizeLists(turndownService: TurndownService) {
function inHtmlContext(node: HTMLElement, selector: string) {
let currentNode = node;
// start at the closest element
while (currentNode !== null && currentNode.nodeType !== 1) {
currentNode = (currentNode.parentElement ||
currentNode.parentNode) as HTMLElement;
}
return (
currentNode !== null &&
currentNode.nodeType === 1 &&
currentNode.closest(selector) !== null
);
}
turndownService.addRule("headingsInLists", {
filter(node) {
return (
["H1", "H2", "H3", "H4", "H5", "H6"].includes(node.nodeName) &&
inHtmlContext(node, "LI")
);
},
replacement(content, node, options) {
if (!content.trim()) {
return "";
}
return options.strongDelimiter + content + options.strongDelimiter;
},
});
turndownService.addRule("strongInHeadings", {
filter(node) {
return (
(node.nodeName === "STRONG" || node.nodeName === "B") &&
["H1", "H2", "H3", "H4", "H5", "H6"].some((tag) =>
inHtmlContext(node, tag)
)
);
},
replacement(content) {
return content;
},
});
}