52 lines
1.4 KiB
TypeScript
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;
|
|
},
|
|
});
|
|
}
|