markdown_it.js

Sun, 06 Sep 2020 22:12:52 +0300

author
Tuomo Valkonen <tuomov@iki.fi>
date
Sun, 06 Sep 2020 22:12:52 +0300
changeset 35
2f927eae429b
parent 33
55d738116fac
child 36
6e3c3dd86b2f
permissions
-rwxr-xr-x

Don't auto-create directories that will be empty

#!/usr/bin/env node
/*eslint no-console:0*/

var fs = require('fs');
var hljs = require('highlight.js');

var katexOptions = {
    throwOnError: false,
    macros: {
        "\\iprod": "{\\langle #1, #2\\rangle}",
        "\\grad": "\\nabla",
        "\\isect": "\\cap",
        "\\union": "\\cup",
        "\\Isect": "\\bigcap",
        "\\Union": "\\bigcup",
        "\\supp": "\\mathop{\\mathrm{supp}}",
        "\\sign": "\\mathop{\\mathrm{sign}}",
        "\\Id": "\\mathop{\\mathrm{Id}}",
        "\\linear": "\\mathbb{L}"
    }
};

// process.argv[0] seems to be the node executable itself
if(process.argv.length<=2 || process.argv.length>4){
    console.error(`Usage: ${process.argv[1]} input_file [katex_options.json]`)
    process.exit(1);
}
if(process.argv.length>3){
    katexOptions = JSON.parse(fs.readFileSync(process.argv[3]));
}

fs.readFile(process.argv[2], 'utf8', function (err, input) {
    var output, md;

    if(err){
        console.error(err.stack || err.message || String(err));
        process.exit(1);
    }

    try{
        // Replace local links to .md by .html.
        var re_nonlocal=/^[a-zA-Z0-9]*:\/\//;
        var re_md_to_html=/^(.*)\.md$/;
        var md = require('markdown-it')({
                html: true,
                xhtmlOut: true,
                breaks: false,
                linkify: true,
                highlight: function (str, lang) {
                    if (lang && hljs.getLanguage(lang)) {
                        try{
                            return hljs.highlight(lang, str).value;
                        } catch (__){}
                    }
                    return '';
                },
                replaceLink: function (link, env) {
                    if(link.match(re_nonlocal)){
                        return link;
                    }else{
                        return link.replace(re_md_to_html, "$1.html");
                    }
                }
            })
        var mk = require('@neilsustc/markdown-it-katex');
        var mm = require('markdown-it-mark');
        var mr = require('markdown-it-replace-link');
        md.use(mk, katexOptions).use(mm).use(mr);
        output = md.render(input);
    } catch(e) {
        console.error(e.stack || e.message || String(e));
        process.exit(1);
    }

    process.stdout.write(output);
});

mercurial