44 lines
1.2 KiB
TypeScript
44 lines
1.2 KiB
TypeScript
import TurndownService from "turndown";
|
|
|
|
/**
|
|
* A turndown plugin for removing incompatible nodes from tables.
|
|
*
|
|
* @param turndownService The TurndownService instance.
|
|
*/
|
|
export default function sanitizeTables(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("headingsInTables", {
|
|
filter(node) {
|
|
return (
|
|
["H1", "H2", "H3", "H4", "H5", "H6"].includes(node.nodeName) &&
|
|
inHtmlContext(node, "table")
|
|
);
|
|
},
|
|
replacement(content) {
|
|
return `**${content.trim()}**`;
|
|
},
|
|
});
|
|
|
|
turndownService.addRule("paragraphsInCells", {
|
|
filter(node) {
|
|
return node.nodeName === "P" && inHtmlContext(node, "table");
|
|
},
|
|
replacement(content) {
|
|
return content.trim();
|
|
},
|
|
});
|
|
}
|