'use strict'; const support = require('./support'); const contract = require('./contract'); const { safeProperty, safeChoice } = require('./safe-property'); const diagramEncoder = require('./diagram-encoder'); class MarkdownItKrokiCore { constructor(md) { this._md = md; } setOptions(opt) { this._entrypoint = safeProperty(opt, "entrypoint", "string", 'https://kroki.io'); this._containerClass = safeProperty(opt, "containerClass", "string", "kroki-image-container"); this._imageFormat = safeProperty(opt, "imageFormat", "string", "svg"); this._imageFormat = safeChoice(this._imageFormat, support.imageFormats, "svg"); this._entrypoint = require('url').parse(this._entrypoint).href; contract.toBeClassName(this._containerClass, "containerClass must be className."); return this; } use() { // if _md has `marpit` property then use tag this._marpAutoScaling = this._md['marpit'] !== undefined; this._defaultFence = this._md.renderer.rules.fence; this._md.renderer.rules.fence = (tokens, idx, options, env, self) => this.krokiFencePlugin(tokens, idx, options, env, self); } static readLanguageAndAltText(info) { if (!info) return { language: '', alt: '' }; const trimed = info.trim(); const langFound = /[\s|\[]/.exec(trimed); const altFound = /\[.*?\]/.exec(trimed); return { language: langFound ? trimed.substring(0, langFound.index) : trimed, alt: altFound ? altFound[0].replace('[', '').replace(']', '') : '' }; } buildEmbedHTML(langAndAlt, diagramCode) { // alt build url const url = diagramEncoder.generateUrl( this._entrypoint, langAndAlt.language, this._imageFormat, diagramCode); // sanitize alt const alt = langAndAlt.alt ? this._md.utils.escapeHtml(langAndAlt.alt) : undefined; // build img tag const imgTag = langAndAlt.alt ? `${alt}` : ``; // build container contents const containerContents = this._marpAutoScaling ? `${imgTag}` : imgTag; // build embed HTML return `

${containerContents}

`; } krokiFencePlugin(tokens, idx, options, env, self) { const info = this._md.utils.unescapeAll(tokens[idx].info) const langAndAlt = MarkdownItKrokiCore.readLanguageAndAltText(info); return support.languageSupports(langAndAlt.language) ? this.buildEmbedHTML(langAndAlt, tokens[idx].content) : this._defaultFence.call(self, tokens, idx, options, env, self); } } module.exports = { MarkdownItKrokiCore }