yarle-evernote-to-md
Version:
Yet Another Rope Ladder from Evernote
63 lines (52 loc) • 2.26 kB
text/typescript
import { filterByNodeName } from './filter-by-nodename';
import { getAttributeProxy } from './get-attribute-proxy';
import { LanguageFactory } from './../../outputLanguages/LanguageFactory';
import { yarleOptions } from './../../yarle';
const isCodeBlock = (node: any) => {
const nodeProxy = getAttributeProxy(node);
const codeBlockFlag = '-en-codeblock:true';
return nodeProxy.style && nodeProxy.style.value.indexOf(codeBlockFlag) >= 0;
};
const getIntendNumber = (node: any): number => {
const nodeProxy = getAttributeProxy(node);
const paddingAttr = 'padding-left:';
let intendNumber = 0;
if (nodeProxy.style && nodeProxy.style.value.indexOf(paddingAttr) >= 0) {
intendNumber = Math.floor(nodeProxy.style.value.split(paddingAttr)[1].split('px')[0] / 20);
}
return intendNumber;
};
export const unescapeMarkdown = (s: string): string => s.replace(/\\(.)/g, '$1');
export const codeBlockRule = {
filter: filterByNodeName('DIV'),
replacement: (content: string, node: any) => {
return replaceCodeBlock(content, node);
},
};
export const replaceCodeBlock = (content: string, node: any): any => {
const nodeProxy = getAttributeProxy(node);
const intend = getIntendNumber(node);
content = `${'\t'.repeat(intend)}${content}`;
if (isCodeBlock(node)) {
// turndown has already escaped markdown chars (and all '\') in content;
// reverse that to avoid extraneous backslashes in code block.
content = unescapeMarkdown(content);
const langaugeFactory = new LanguageFactory();
const targetLanguage = langaugeFactory.createLanguage(yarleOptions.outputFormat)
return `${targetLanguage.codeBlock}${content}${targetLanguage.codeBlock}`;
}
if (node.parentElement && isCodeBlock(node.parentElement) && node.parentElement.firstElementChild === node) {
return `${content}`;
}
if (node.parentElement && isCodeBlock(node.parentElement)) {
return `\n${content}`;
}
const childHtml = node.innerHTML;
/*return node.isBlock
? childHtml !== '<br>'
? `\n${content}\n`
: `${content}`
: `${content}`;
*/
return node.isBlock ? `\n${content}\n` : content;
};