hackmd-to-html-cli
Version:
A node.js CLI tool for converting HackMD markdown to HTML.
147 lines • 7.7 kB
JavaScript
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
;