UNPKG

yarle-evernote-to-md

Version:

Yet Another Rope Ladder from Evernote

90 lines (76 loc) 2.81 kB
import { filterByNodeName } from './filter-by-nodename'; import { getAttributeProxy } from './get-attribute-proxy'; import { unescapeMarkdown } from './replace-code-block'; const markdownBlock = '\n```\n'; const codeBlockFlag = '-en-codeblock:true'; const reMonospaceFont = /\b(Courier|Mono|Consolas|Console|Inconsolata|Pitch|Monaco|monospace)\b/; const deepestFont: (node: any) => string = node => { if (node.nodeType !== 1) { return null; } const children = node.childNodes; const numChildren = children.length; if (numChildren > 1) { return 'mixed'; } if (numChildren === 1) { const font = deepestFont(children[0]); if (font) { return font; } } const nodeProxy = getAttributeProxy(node); if (node.tagName === 'FONT') { return nodeProxy.face?.value; } const style = nodeProxy.style?.value; if (style) { const match = style.match(/font-family:([^;]+)/); if (match) { return match[1]; } } return null; }; const isMonospaceCodeBlock: (node: any) => boolean = node => { const nodeProxy = getAttributeProxy(node); const style = nodeProxy.style?.value; if (style && style.includes(codeBlockFlag)) { return true; } const font = deepestFont(node); return font && reMonospaceFont.test(font); }; /* export const monospaceCodeBlockRule = { filter: filterByNodeName('DIV'), replacement: (content: string, node: any) => { if (yarleOptions.monospaceIsCodeBlock && isMonospaceCodeBlock(node)) { return replaceMonospaceCodeBlock(content, node); } }, }; */ export const replaceMonospaceCodeBlock = (content: string, node: any): any => { if (isMonospaceCodeBlock(node)) { const previous = node.previousSibling; const previousIsBlock = previous && previous.tagName === node.tagName && isMonospaceCodeBlock(previous); const next = node.nextSibling; const nextIsBlock = next && next.tagName === node.tagName && isMonospaceCodeBlock(next); if (previousIsBlock || nextIsBlock) { content = previousIsBlock ? `\n${content}` : `${markdownBlock}${content}`; content = nextIsBlock ? `${content}\n` : `${content}${markdownBlock}`; return content; } content = unescapeMarkdown(content); return content.trim() ? `${markdownBlock}${content}${markdownBlock}` : content; } if (node.parentElement && isMonospaceCodeBlock(node.parentElement) && node.parentElement.firstElementChild === node) { return content; } if (node.parentElement && isMonospaceCodeBlock(node.parentElement)) { return `\n${content}`; } return node.isBlock ? `\n${content}\n` : content; };