"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
    return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.createMarkdownRenderer = void 0;
const markdown_it_1 = __importDefault(require("markdown-it"));
const parseHeader_1 = require("../utils/parseHeader");
const highlight_1 = require("./plugins/highlight");
const slugify_1 = require("./plugins/slugify");
const highlightLines_1 = require("./plugins/highlightLines");
const lineNumbers_1 = require("./plugins/lineNumbers");
const component_1 = require("./plugins/component");
const containers_1 = require("./plugins/containers");
const snippet_1 = require("./plugins/snippet");
const hoist_1 = require("./plugins/hoist");
const preWrapper_1 = require("./plugins/preWrapper");
const link_1 = require("./plugins/link");
const header_1 = require("./plugins/header");
const emoji = require('markdown-it-emoji');
const anchor = require('markdown-it-anchor');
const toc = require('markdown-it-table-of-contents');
exports.createMarkdownRenderer = (options = {}) => {
    const md = markdown_it_1.default({
        html: true,
        linkify: true,
        highlight: highlight_1.highlight,
        ...options
    });
    // custom plugins
    md.use(component_1.componentPlugin)
        .use(highlightLines_1.highlightLinePlugin)
        .use(preWrapper_1.preWrapperPlugin)
        .use(snippet_1.snippetPlugin)
        .use(hoist_1.hoistPlugin)
        .use(containers_1.containerPlugin)
        .use(header_1.extractHeaderPlugin)
        .use(link_1.linkPlugin, {
        target: '_blank',
        rel: 'noopener noreferrer',
        ...options.externalLinks
    })
        // 3rd party plugins
        .use(emoji)
        .use(anchor, {
        slugify: slugify_1.slugify,
        permalink: true,
        permalinkBefore: true,
        permalinkSymbol: '#',
        permalinkAttrs: () => ({ 'aria-hidden': true }),
        ...options.anchor
    })
        .use(toc, {
        slugify: slugify_1.slugify,
        includeLevel: [2, 3],
        format: parseHeader_1.parseHeader,
        ...options.toc
    });
    // apply user config
    if (options.config) {
        options.config(md);
    }
    if (options.lineNumbers) {
        md.use(lineNumbers_1.lineNumberPlugin);
    }
    // wrap render so that we can return both the html and extracted data.
    const render = md.render;
    const wrappedRender = (src) => {
        ;
        md.__data = {};
        const html = render.call(md, src);
        return {
            html,
            data: md.__data
        };
    };
    md.render = wrappedRender;
    return md;
};
//# sourceMappingURL=markdown.js.map