UNPKG

hackmd-to-html-cli

Version:

A node.js CLI tool for converting HackMD markdown to HTML.

147 lines 7.7 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.parseFenceCodeParams = parseFenceCodeParams; exports.MarkdownItFenceX = MarkdownItFenceX; const plantUML_1 = require("./plantUML"); const fretboard_1 = require("./fretboard"); const papaparse_1 = __importDefault(require("papaparse")); const token_1 = require("./token"); // modified from // https://github.com/hackmdio/codimd/blob/develop/public/js/lib/markdown/utils.js // eslint-disable-next-line @typescript-eslint/no-explicit-any function parseFenceCodeParams(lang) { const attrMatch = lang.match(/{(.*)}/); // eslint-disable-next-line @typescript-eslint/no-explicit-any const params = new Map(); if (attrMatch && attrMatch.length >= 2) { const attrs = attrMatch[1]; const paraMatch = attrs.match(/([#.](\S+?)\s)|((\S+?)\s*=\s*("(.+?)"|'(.+?)'|\[[^\]]*\]|\{[}]*\}|(\S+)))/g); paraMatch === null || paraMatch === void 0 ? void 0 : paraMatch.forEach(param => { param = param.trim(); if (param[0] === '#') { params.set('id', param.slice(1)); } else if (param[0] === '.') { if (!params.get('class')) params.set('class', []); params.set('class', params.get('class').concat(param.slice(1))); } else { const offset = param.indexOf('='); const id = param.substring(0, offset).trim().toLowerCase(); let val = param.substring(offset + 1).trim(); const valStart = val[0]; const valEnd = val[val.length - 1]; if (['"', "'"].indexOf(valStart) !== -1 && ['"', "'"].indexOf(valEnd) !== -1 && valStart === valEnd) { val = val.substring(1, val.length - 1); } if (id === 'class') { if (params.get('class')) params.set('class', []); params.set('class', params.get('class').concat(val)); } else { params.set(id, val); } } }); } // convert "true" (string) to true (boolean) params.forEach((val, key) => { if (val === 'true') { params.set(key, true); } else if (val === 'false') { params.set(key, false); } }); return params; } // eslint-disable-next-line @typescript-eslint/no-unused-vars function MarkdownItFenceX(md, opts) { function codeX(state) { for (let i = 0; i < state.tokens.length; i++) { const token = state.tokens[i]; if (token.type === 'fence') { const params = token.info.split(' '); if (params[0] === 'csvpreview') { const config = parseFenceCodeParams(params.slice(1).join(' ')); const res = papaparse_1.default.parse(token.content.trim(), Object.fromEntries(config)); const newTokens = []; newTokens.push(new token_1.MyToken('csvtable_open', 'table', 1)); if (config.has('header') && config.get('header')) { // render the header of table if (res.data.length == 0) continue; const keys = Object.keys(res.data[0]); newTokens.push(new token_1.MyToken('csvtable_tr_open', 'tr', 1)); for (let j = 0; j < keys.length; j++) { newTokens.push(new token_1.MyToken('csvtable_th_open', 'th', 1)); const content = new token_1.MyToken('text', '', 0); content.content = keys[j]; newTokens.push(content); newTokens.push(new token_1.MyToken('csvtable_th_close', 'th', -1)); } newTokens.push(new token_1.MyToken('csvtable_tr_close', 'tr', -1)); for (let j = 0; j < res.data.length; j++) { const row = res.data[j]; const values = Object.values(row); newTokens.push(new token_1.MyToken('csvtable_tr_open', 'tr', 1)); for (let k = 0; k < keys.length; k++) { newTokens.push(new token_1.MyToken('csvtable_td_open', 'td', 1)); const content = new token_1.MyToken('text', '', 0); content.content = values[k]; newTokens.push(content); newTokens.push(new token_1.MyToken('csvtable_td_close', 'td', -1)); } newTokens.push(new token_1.MyToken('csvtable_tr_close', 'tr', -1)); } } else { for (let j = 0; j < res.data.length; j++) { const row = res.data[j]; const values = Object.values(row); newTokens.push(new token_1.MyToken('csvtable_tr_open', 'tr', 1)); for (let k = 0; k < values.length; k++) { newTokens.push(new token_1.MyToken('csvtable_td_open', 'td', 1)); const content = new token_1.MyToken('text', '', 0); content.content = values[k]; newTokens.push(content); newTokens.push(new token_1.MyToken('csvtable_td_close', 'td', -1)); } newTokens.push(new token_1.MyToken('csvtable_tr_close', 'tr', -1)); } } newTokens.push(new token_1.MyToken('csvtable_close', 'table', -1)); state.tokens = md.utils.arrayReplaceAt(state.tokens, i, newTokens); } else if (params[0] === 'plantuml') { const p = new plantUML_1.PlantUML(); const url = p.generateURL('@startuml\n' + token.content.trim() + '\n@enduml'); const newTokens = [token]; token.attrPush(['style', 'display:none;']); const img = new token_1.MyToken('plantuml_img', 'img', 0); img.attrs = [['src', 'https://ptuml.hackmd.io/svg/' + url], ['class', 'language-plantuml-img'], ['data-url', url]]; newTokens.push(img); state.tokens = md.utils.arrayReplaceAt(state.tokens, i, newTokens); } else if (params[0] === 'fretboard') { const config = parseFenceCodeParams(params.slice(1).join(' ')); const title = config.get('title'); const type = config.get('type'); const rendered = (0, fretboard_1.renderFretBoard)(token.content, { title: title, type: type }); const fret = new token_1.MyToken('html_block', 'div', 0); fret.content = rendered; state.tokens = md.utils.arrayReplaceAt(state.tokens, i, [fret]); } } } } md.core.ruler.push('codeX', codeX); } //# sourceMappingURL=fencex.js.map