ts-markdown
Version:
An extensible TypeScript markdown generator that takes JSON and creates a markdown document.
55 lines (54 loc) • 1.97 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.codeblock = exports.codeblockRenderer = void 0;
/**
* The renderer for codeblock entries.
*
* @param entry The codeblock entry
* @param options Document-level render options
* @returns Block-level codeblock markdown content
*/
const codeblockRenderer = (entry, options) => {
const fencing = options.useCodeblockFencing ?? entry.fenced;
if ('codeblock' in entry) {
let linePrefix = fencing ? '' : ' ';
let blockStart = fencing
? getCodeFenceOpen(fencing, entry.language) + '\n'
: '';
let blockEnd = fencing ? '\n' + getCodeFenceClose(entry, options) : '';
let codeBlock = typeof entry.codeblock === 'string'
? linePrefix + entry.codeblock.split('\n').join('\n' + linePrefix)
: entry.codeblock.map((line) => linePrefix + line).join('\n');
return {
markdown: `${blockStart}${codeBlock}${blockEnd}`,
blockLevel: true,
};
}
throw new Error('Entry is not a codeblock entry. Unable to render.');
};
exports.codeblockRenderer = codeblockRenderer;
function getCodeFenceOpen(fencing, language) {
let fenceCharacter = getCodeFenceCharacter(fencing);
let languageCharacter = language ?? '';
return fenceCharacter + fenceCharacter + fenceCharacter + languageCharacter;
}
function getCodeFenceCharacter(fencing) {
return fencing === '~' ? '~' : '`';
}
function getCodeFenceClose(entry, options) {
let fenceCharacter = getCodeFenceCharacter(entry.fenced ?? options.useCodeblockFencing);
return fenceCharacter + fenceCharacter + fenceCharacter;
}
/**
* Helper which creates a codeblock entry.
*
* @param options Entry-level options for this element.
* @returns a codeblock entry
*/
function codeblock(content, options) {
return {
codeblock: content,
...options,
};
}
exports.codeblock = codeblock;