markdown-maker 1.9.2 → 1.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/workflows/node.js.yml +1 -1
- package/build/cltool.d.ts +1 -0
- package/build/cltool.js +161 -0
- package/build/cltool.js.map +1 -0
- package/build/commands.d.ts +43 -0
- package/build/commands.js +223 -0
- package/build/commands.js.map +1 -0
- package/build/parse.d.ts +65 -0
- package/build/parse.js +281 -0
- package/build/parse.js.map +1 -0
- package/build/templates.d.ts +10 -0
- package/build/templates.js +20 -0
- package/build/templates.js.map +1 -0
- package/package.json +2 -2
- package/src/cltool.ts +11 -3
- package/src/commands.ts +44 -40
- package/src/parse.ts +13 -19
- package/src/templates/configTemplate.json +13 -0
- package/test/advanced.test.js +10 -8
- package/test/basic.test.js +11 -0
- package/test/errors.test.js +23 -1
- package/test/hooks.js +9 -0
- package/test/tester.test.js +12 -3
    
        package/build/parse.js
    ADDED
    
    | @@ -0,0 +1,281 @@ | |
| 1 | 
            +
            "use strict";
         | 
| 2 | 
            +
            Object.defineProperty(exports, "__esModule", { value: true });
         | 
| 3 | 
            +
            exports.splice = void 0;
         | 
| 4 | 
            +
            var fs = require("fs"); /* for handling reading of files */
         | 
| 5 | 
            +
            var path = require("path"); /* for handling file paths */
         | 
| 6 | 
            +
            var Colors = require("colors.ts"); /* for adding colours to strings */
         | 
| 7 | 
            +
            Colors.enable();
         | 
| 8 | 
            +
            var marked = require("marked");
         | 
| 9 | 
            +
            var commands_1 = require("./commands");
         | 
| 10 | 
            +
            var TargetType;
         | 
| 11 | 
            +
            (function (TargetType) {
         | 
| 12 | 
            +
                TargetType[TargetType["HTML"] = 0] = "HTML";
         | 
| 13 | 
            +
                TargetType[TargetType["MARKDOWN"] = 1] = "MARKDOWN";
         | 
| 14 | 
            +
            })(TargetType || (TargetType = {}));
         | 
| 15 | 
            +
            /* parse some md
         | 
| 16 | 
            +
             * recursively with extra options */
         | 
| 17 | 
            +
            var Parser = /** @class */ (function () {
         | 
| 18 | 
            +
                function Parser(filename, clargs, opts) {
         | 
| 19 | 
            +
                    /* this.working_directory */
         | 
| 20 | 
            +
                    this.file = filename;
         | 
| 21 | 
            +
                    if (!opts)
         | 
| 22 | 
            +
                        opts = {};
         | 
| 23 | 
            +
                    /* the parent parser */
         | 
| 24 | 
            +
                    this.parent = opts.parent;
         | 
| 25 | 
            +
                    this.line_num = 0;
         | 
| 26 | 
            +
                    this.wd = path.dirname(filename);
         | 
| 27 | 
            +
                    this.wd_full = path.resolve(this.wd);
         | 
| 28 | 
            +
                    /* finished blob */
         | 
| 29 | 
            +
                    this.blobs = {};
         | 
| 30 | 
            +
                    /* all options */
         | 
| 31 | 
            +
                    this.opts = {
         | 
| 32 | 
            +
                        defs: {},
         | 
| 33 | 
            +
                        secs: [],
         | 
| 34 | 
            +
                        args: [],
         | 
| 35 | 
            +
                        depth: 0,
         | 
| 36 | 
            +
                        verbose: false,
         | 
| 37 | 
            +
                        debug: false,
         | 
| 38 | 
            +
                        max_depth: 5,
         | 
| 39 | 
            +
                        use_underscore: false,
         | 
| 40 | 
            +
                        toc_level: 3,
         | 
| 41 | 
            +
                        allow_undefined: false,
         | 
| 42 | 
            +
                        html: false,
         | 
| 43 | 
            +
                        watch: false,
         | 
| 44 | 
            +
                        targetType: undefined,
         | 
| 45 | 
            +
                        only_warn: false,
         | 
| 46 | 
            +
                        parent: undefined,
         | 
| 47 | 
            +
                        isFileCallback: function (f) {
         | 
| 48 | 
            +
                            if (!fs.existsSync(f))
         | 
| 49 | 
            +
                                return false;
         | 
| 50 | 
            +
                            return fs.readFileSync(f, "utf-8") + "\n";
         | 
| 51 | 
            +
                        },
         | 
| 52 | 
            +
                    };
         | 
| 53 | 
            +
                    if (!clargs) {
         | 
| 54 | 
            +
                        clargs = {};
         | 
| 55 | 
            +
                    }
         | 
| 56 | 
            +
                    /* append all commandline arguments to this */
         | 
| 57 | 
            +
                    Object.assign(this.opts, clargs);
         | 
| 58 | 
            +
                    Object.assign(this.opts, opts);
         | 
| 59 | 
            +
                    this.raw = this.opts.isFileCallback(filename) || filename;
         | 
| 60 | 
            +
                }
         | 
| 61 | 
            +
                /**
         | 
| 62 | 
            +
                 * parse wrapper for handling
         | 
| 63 | 
            +
                 * preprocessing, parsing and postprocess
         | 
| 64 | 
            +
                 **/
         | 
| 65 | 
            +
                Parser.prototype.parse = function () {
         | 
| 66 | 
            +
                    (0, commands_1.load_extensions)(this);
         | 
| 67 | 
            +
                    if (this.opts.verbose || this.opts.debug) {
         | 
| 68 | 
            +
                        console.log(Colors.colors("magenta", "parsing " + this.file + ": depth=" + this.opts.depth));
         | 
| 69 | 
            +
                    }
         | 
| 70 | 
            +
                    if (this.opts.debug) {
         | 
| 71 | 
            +
                        console.log("Parsing options:");
         | 
| 72 | 
            +
                        console.log(this.opts);
         | 
| 73 | 
            +
                    }
         | 
| 74 | 
            +
                    /* reset sections for beginning parse */
         | 
| 75 | 
            +
                    if (this.opts.depth === 0)
         | 
| 76 | 
            +
                        this.opts.secs = [];
         | 
| 77 | 
            +
                    var __blob;
         | 
| 78 | 
            +
                    /* apply preproccessing to raw file */
         | 
| 79 | 
            +
                    __blob = this.preprocess(this.raw);
         | 
| 80 | 
            +
                    /* main parser instance call */
         | 
| 81 | 
            +
                    __blob = this.mainparse(__blob);
         | 
| 82 | 
            +
                    /**
         | 
| 83 | 
            +
                     * apply postprocessing after */
         | 
| 84 | 
            +
                    __blob = this.postprocess(__blob);
         | 
| 85 | 
            +
                    return __blob;
         | 
| 86 | 
            +
                };
         | 
| 87 | 
            +
                Parser.prototype.mainparse = function (blob) {
         | 
| 88 | 
            +
                    var _this = this;
         | 
| 89 | 
            +
                    if (this.opts.verbose || this.opts.debug) {
         | 
| 90 | 
            +
                        console.debug("beginning mainparse of '".concat(this.file, "'").blue);
         | 
| 91 | 
            +
                    }
         | 
| 92 | 
            +
                    /* main parser instance loop */
         | 
| 93 | 
            +
                    blob.split("\n").forEach(function (line, lnum) {
         | 
| 94 | 
            +
                        _this.line_num = lnum;
         | 
| 95 | 
            +
                        /* if line looks like a title */
         | 
| 96 | 
            +
                        var titleMatch = line.trim().match(/^(#+) (.+)$/);
         | 
| 97 | 
            +
                        if (titleMatch) {
         | 
| 98 | 
            +
                            if (_this.opts.verbose || _this.opts.debug)
         | 
| 99 | 
            +
                                console.log("found toc element: " + line);
         | 
| 100 | 
            +
                            /* implement toc level */
         | 
| 101 | 
            +
                            var level = titleMatch[1].length;
         | 
| 102 | 
            +
                            var title = titleMatch[2];
         | 
| 103 | 
            +
                            _this.opts.secs.push({ level: level, title: title });
         | 
| 104 | 
            +
                            if (_this.opts.debug) {
         | 
| 105 | 
            +
                                console.log("updated sections:", { level: level, title: title });
         | 
| 106 | 
            +
                            }
         | 
| 107 | 
            +
                        }
         | 
| 108 | 
            +
                    });
         | 
| 109 | 
            +
                    return this.parse_commands(blob, commands_1.commands.parse);
         | 
| 110 | 
            +
                };
         | 
| 111 | 
            +
                Parser.prototype.preprocess = function (blob) {
         | 
| 112 | 
            +
                    if (this.opts.verbose || this.opts.debug) {
         | 
| 113 | 
            +
                        console.debug("beginning preprocess of '".concat(this.file, "'").blue);
         | 
| 114 | 
            +
                    }
         | 
| 115 | 
            +
                    return this.parse_commands(blob, commands_1.commands.preparse);
         | 
| 116 | 
            +
                };
         | 
| 117 | 
            +
                Parser.prototype.postprocess = function (blob) {
         | 
| 118 | 
            +
                    if (this.opts.verbose || this.opts.debug) {
         | 
| 119 | 
            +
                        console.debug("beginning postprocess of '".concat(this.file, "'").blue);
         | 
| 120 | 
            +
                    }
         | 
| 121 | 
            +
                    blob = this.parse_commands(blob, commands_1.commands.postparse);
         | 
| 122 | 
            +
                    /* remove double empty lines */
         | 
| 123 | 
            +
                    blob = this.remove_double_blank_lines(blob);
         | 
| 124 | 
            +
                    blob = blob.trimEnd() + "\n\n";
         | 
| 125 | 
            +
                    return blob;
         | 
| 126 | 
            +
                };
         | 
| 127 | 
            +
                Parser.prototype.parse_commands = function (blob, commands) {
         | 
| 128 | 
            +
                    var _this = this;
         | 
| 129 | 
            +
                    commands.forEach(function (command) {
         | 
| 130 | 
            +
                        /* Add global flag to RegExp */
         | 
| 131 | 
            +
                        var re = new RegExp(command.validator.source, (command.validator.flags || "") + "g");
         | 
| 132 | 
            +
                        blob = blob.replace(re, function () {
         | 
| 133 | 
            +
                            var args = [];
         | 
| 134 | 
            +
                            for (var _i = 0; _i < arguments.length; _i++) {
         | 
| 135 | 
            +
                                args[_i] = arguments[_i];
         | 
| 136 | 
            +
                            }
         | 
| 137 | 
            +
                            return command.act(args, _this) || "";
         | 
| 138 | 
            +
                        });
         | 
| 139 | 
            +
                    });
         | 
| 140 | 
            +
                    return blob;
         | 
| 141 | 
            +
                };
         | 
| 142 | 
            +
                Parser.prototype.parse_all_commands = function (blob, commands) {
         | 
| 143 | 
            +
                    var _this = this;
         | 
| 144 | 
            +
                    Object.keys(commands).forEach(function (key) {
         | 
| 145 | 
            +
                        blob = _this.parse_commands(blob, commands[key]);
         | 
| 146 | 
            +
                    });
         | 
| 147 | 
            +
                    return blob;
         | 
| 148 | 
            +
                };
         | 
| 149 | 
            +
                Parser.prototype.titleId = function (title) {
         | 
| 150 | 
            +
                    var sep = this.opts.use_underscore ? "_" : "-";
         | 
| 151 | 
            +
                    title = title
         | 
| 152 | 
            +
                        .toLowerCase()
         | 
| 153 | 
            +
                        .replace(/[^\w\s]+/g, "")
         | 
| 154 | 
            +
                        .replace(/[\s_]+/g, sep);
         | 
| 155 | 
            +
                    return title;
         | 
| 156 | 
            +
                };
         | 
| 157 | 
            +
                Parser.prototype.gen_toc = function () {
         | 
| 158 | 
            +
                    var _this = this;
         | 
| 159 | 
            +
                    var __blob = [];
         | 
| 160 | 
            +
                    var tabSize = 2;
         | 
| 161 | 
            +
                    var beg = "* ";
         | 
| 162 | 
            +
                    var hor = " ".repeat(tabSize);
         | 
| 163 | 
            +
                    this.opts.secs.forEach(function (sec) {
         | 
| 164 | 
            +
                        if (sec.level > _this.opts.toc_level)
         | 
| 165 | 
            +
                            return;
         | 
| 166 | 
            +
                        var title = sec.title.replace(/_/g, " ");
         | 
| 167 | 
            +
                        title = _this.parse_all_commands(title, commands_1.commands);
         | 
| 168 | 
            +
                        var link = _this.titleId(title);
         | 
| 169 | 
            +
                        var __line = hor.repeat(Math.max(sec.level - 1, 0)) + beg + "[".concat(title, "](#").concat(link, ")");
         | 
| 170 | 
            +
                        __blob.push(__line);
         | 
| 171 | 
            +
                    });
         | 
| 172 | 
            +
                    return __blob.join("\n");
         | 
| 173 | 
            +
                };
         | 
| 174 | 
            +
                Parser.prototype.line_num_from_index = function (index) {
         | 
| 175 | 
            +
                    return this.raw.substring(0, index).split("\n").length + 1;
         | 
| 176 | 
            +
                };
         | 
| 177 | 
            +
                Parser.prototype.remove_double_blank_lines = function (blob) {
         | 
| 178 | 
            +
                    /* replace all triple newlines, and EOF by double newline */
         | 
| 179 | 
            +
                    blob = blob.replace(/(\r\n|\n){3,}/g, "\n\n");
         | 
| 180 | 
            +
                    return blob;
         | 
| 181 | 
            +
                };
         | 
| 182 | 
            +
                /* output the parsed document to bundle */
         | 
| 183 | 
            +
                Parser.prototype.to = function (bundleName, callback) {
         | 
| 184 | 
            +
                    var dir = path.dirname(bundleName);
         | 
| 185 | 
            +
                    if (callback === undefined)
         | 
| 186 | 
            +
                        callback = function () { };
         | 
| 187 | 
            +
                    if (!fs.existsSync(dir)) {
         | 
| 188 | 
            +
                        fs.mkdirSync(dir, { recursive: true });
         | 
| 189 | 
            +
                    }
         | 
| 190 | 
            +
                    if (!this.opts.html) {
         | 
| 191 | 
            +
                        this.get(TargetType.MARKDOWN, function (blob) {
         | 
| 192 | 
            +
                            fs.writeFile(bundleName, blob, function () { return callback(bundleName); });
         | 
| 193 | 
            +
                        });
         | 
| 194 | 
            +
                    }
         | 
| 195 | 
            +
                    else {
         | 
| 196 | 
            +
                        var htmlFileName_1 = bundleName.replace(".md", ".html");
         | 
| 197 | 
            +
                        fs.writeFile(htmlFileName_1, this.html(), function () { return callback(htmlFileName_1); });
         | 
| 198 | 
            +
                    }
         | 
| 199 | 
            +
                };
         | 
| 200 | 
            +
                Parser.prototype.html = function () {
         | 
| 201 | 
            +
                    var htmlFormatted = marked(this.get(TargetType.HTML));
         | 
| 202 | 
            +
                    if (this.opts.watch) {
         | 
| 203 | 
            +
                        return ("<script>w=new WebSocket(\"ws:localhost:7788\");w.addEventListener(\"message\",(e)=>{if(e.data==\"refresh\")location.reload();});</script>\n" +
         | 
| 204 | 
            +
                            htmlFormatted);
         | 
| 205 | 
            +
                    }
         | 
| 206 | 
            +
                    return htmlFormatted;
         | 
| 207 | 
            +
                };
         | 
| 208 | 
            +
                Parser.prototype.get = function (targetType, callback) {
         | 
| 209 | 
            +
                    /* If target type is undefined, markdown is the default */
         | 
| 210 | 
            +
                    if (targetType === undefined)
         | 
| 211 | 
            +
                        targetType = TargetType.MARKDOWN;
         | 
| 212 | 
            +
                    if (this.blobs[targetType]) {
         | 
| 213 | 
            +
                        if (callback) {
         | 
| 214 | 
            +
                            callback(this.blobs[targetType]);
         | 
| 215 | 
            +
                        }
         | 
| 216 | 
            +
                        return this.blobs[targetType];
         | 
| 217 | 
            +
                    }
         | 
| 218 | 
            +
                    else {
         | 
| 219 | 
            +
                        try {
         | 
| 220 | 
            +
                            this.opts.targetType = targetType;
         | 
| 221 | 
            +
                            var blob = this.parse();
         | 
| 222 | 
            +
                            this.opts.targetType = undefined;
         | 
| 223 | 
            +
                            if (callback)
         | 
| 224 | 
            +
                                callback(blob);
         | 
| 225 | 
            +
                            return blob;
         | 
| 226 | 
            +
                        }
         | 
| 227 | 
            +
                        catch (error) {
         | 
| 228 | 
            +
                            /* Compile a traceback of error */
         | 
| 229 | 
            +
                            var traceback = "";
         | 
| 230 | 
            +
                            var p = this;
         | 
| 231 | 
            +
                            do {
         | 
| 232 | 
            +
                                if (error instanceof commands_1.MDMError)
         | 
| 233 | 
            +
                                    traceback += "\n...on line ".concat(p.line_num_from_index(error.match.index), " in ").concat(p.file).grey(15);
         | 
| 234 | 
            +
                                else
         | 
| 235 | 
            +
                                    traceback += "\n...on line ".concat(p.line_num, " in ").concat(p.file).grey(15);
         | 
| 236 | 
            +
                                if (p.parent)
         | 
| 237 | 
            +
                                    p = p.parent;
         | 
| 238 | 
            +
                            } while (p.parent);
         | 
| 239 | 
            +
                            error.message += traceback;
         | 
| 240 | 
            +
                            /* only interested in node stacktrace when debugging */
         | 
| 241 | 
            +
                            if (!this.opts.debug)
         | 
| 242 | 
            +
                                error.stack = "";
         | 
| 243 | 
            +
                            if (this.opts.only_warn)
         | 
| 244 | 
            +
                                console.error(error);
         | 
| 245 | 
            +
                            else
         | 
| 246 | 
            +
                                throw error;
         | 
| 247 | 
            +
                        }
         | 
| 248 | 
            +
                    }
         | 
| 249 | 
            +
                };
         | 
| 250 | 
            +
                Parser.TOKEN = "#md";
         | 
| 251 | 
            +
                return Parser;
         | 
| 252 | 
            +
            }());
         | 
| 253 | 
            +
            function splice(str, startIndex, width, newSubStr) {
         | 
| 254 | 
            +
                var start = str.slice(0, startIndex);
         | 
| 255 | 
            +
                var end = str.slice(startIndex + width);
         | 
| 256 | 
            +
                return start + newSubStr + end;
         | 
| 257 | 
            +
            }
         | 
| 258 | 
            +
            exports.splice = splice;
         | 
| 259 | 
            +
            /* add extention to marked for classed blockquotes*/
         | 
| 260 | 
            +
            marked.use({
         | 
| 261 | 
            +
                renderer: {
         | 
| 262 | 
            +
                    blockquote: function (quote) {
         | 
| 263 | 
            +
                        /* find the ending, and if not, return the default */
         | 
| 264 | 
            +
                        var ending = quote.match(/\{(.+)\}\s*<\/p>/);
         | 
| 265 | 
            +
                        if (!ending)
         | 
| 266 | 
            +
                            return "<blockquote>".concat(quote, "</blockquote>");
         | 
| 267 | 
            +
                        var args = ending[1].split(" ");
         | 
| 268 | 
            +
                        var classes = args.filter(function (arg) { return arg.startsWith("."); });
         | 
| 269 | 
            +
                        var id = args.filter(function (arg) { return arg.startsWith("#"); });
         | 
| 270 | 
            +
                        var classNames = classes.map(function (c) { return c.slice(1); });
         | 
| 271 | 
            +
                        var classText = classes.length > 0 ? "class=\"".concat(classNames.join(" "), "\"") : "";
         | 
| 272 | 
            +
                        var idText = id.length > 0 ? "id=\"".concat(id[0].slice(1), "\"") : "";
         | 
| 273 | 
            +
                        /* remove the ending from the quote */
         | 
| 274 | 
            +
                        quote = quote.replace(/\{(.+)\}\s*<\/p>/, "</p>");
         | 
| 275 | 
            +
                        return "<blockquote ".concat(classText, " ").concat(idText, ">\n").concat(quote.trim(), "</blockquote>");
         | 
| 276 | 
            +
                    },
         | 
| 277 | 
            +
                },
         | 
| 278 | 
            +
            });
         | 
| 279 | 
            +
            module.exports = Parser;
         | 
| 280 | 
            +
            exports.default = Parser;
         | 
| 281 | 
            +
            //# sourceMappingURL=parse.js.map
         | 
| @@ -0,0 +1 @@ | |
| 1 | 
            +
            {"version":3,"file":"parse.js","sourceRoot":"","sources":["../src/parse.ts"],"names":[],"mappings":"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"}
         | 
| @@ -0,0 +1,10 @@ | |
| 1 | 
            +
            declare const templates: {
         | 
| 2 | 
            +
                [key: string]: string;
         | 
| 3 | 
            +
            };
         | 
| 4 | 
            +
            /**
         | 
| 5 | 
            +
             * Function to add a template to the templates object. Similar to definitions and variables, but reside as an extension.
         | 
| 6 | 
            +
             * @param name The name of the template
         | 
| 7 | 
            +
             * @param content The replacement string
         | 
| 8 | 
            +
             */
         | 
| 9 | 
            +
            export declare function new_template(name: string, content: string): void;
         | 
| 10 | 
            +
            export default templates;
         | 
| @@ -0,0 +1,20 @@ | |
| 1 | 
            +
            "use strict";
         | 
| 2 | 
            +
            Object.defineProperty(exports, "__esModule", { value: true });
         | 
| 3 | 
            +
            exports.new_template = void 0;
         | 
| 4 | 
            +
            var templates = {};
         | 
| 5 | 
            +
            /**
         | 
| 6 | 
            +
             * Function to add a template to the templates object. Similar to definitions and variables, but reside as an extension.
         | 
| 7 | 
            +
             * @param name The name of the template
         | 
| 8 | 
            +
             * @param content The replacement string
         | 
| 9 | 
            +
             */
         | 
| 10 | 
            +
            function new_template(name, content) {
         | 
| 11 | 
            +
                templates[name] = content;
         | 
| 12 | 
            +
            }
         | 
| 13 | 
            +
            exports.new_template = new_template;
         | 
| 14 | 
            +
            /* initialize default templates */
         | 
| 15 | 
            +
            var presentation_template = require("../src/templates/presentation.js");
         | 
| 16 | 
            +
            var mathjax_template = require("../src/templates/mathjax.js");
         | 
| 17 | 
            +
            new_template("presentation", presentation_template);
         | 
| 18 | 
            +
            new_template("mathjax", mathjax_template);
         | 
| 19 | 
            +
            exports.default = templates;
         | 
| 20 | 
            +
            //# sourceMappingURL=templates.js.map
         | 
| @@ -0,0 +1 @@ | |
| 1 | 
            +
            {"version":3,"file":"templates.js","sourceRoot":"","sources":["../src/templates.ts"],"names":[],"mappings":";;;AAAA,IAAM,SAAS,GAA8B,EAAE,CAAC;AAEhD;;;;GAIG;AACH,SAAgB,YAAY,CAAC,IAAY,EAAE,OAAe;IACtD,SAAS,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC;AAC9B,CAAC;AAFD,oCAEC;AAED,kCAAkC;AAClC,IAAM,qBAAqB,GAAG,OAAO,CAAC,kCAAkC,CAAC,CAAC;AAC1E,IAAM,gBAAgB,GAAG,OAAO,CAAC,6BAA6B,CAAC,CAAC;AAChE,YAAY,CAAC,cAAc,EAAE,qBAAqB,CAAC,CAAC;AACpD,YAAY,CAAC,SAAS,EAAE,gBAAgB,CAAC,CAAC;AAE1C,kBAAe,SAAS,CAAC"}
         | 
    
        package/package.json
    CHANGED
    
    | @@ -1,6 +1,6 @@ | |
| 1 1 | 
             
            {
         | 
| 2 2 | 
             
                "name": "markdown-maker",
         | 
| 3 | 
            -
                "version": "1. | 
| 3 | 
            +
                "version": "1.10.0",
         | 
| 4 4 | 
             
                "description": "",
         | 
| 5 5 | 
             
                "main": "src/cltool.ts",
         | 
| 6 6 | 
             
                "bin": {
         | 
| @@ -23,7 +23,7 @@ | |
| 23 23 | 
             
                    ]
         | 
| 24 24 | 
             
                },
         | 
| 25 25 | 
             
                "scripts": {
         | 
| 26 | 
            -
                    "test": "mocha",
         | 
| 26 | 
            +
                    "test": "mocha --require test/hooks.js",
         | 
| 27 27 | 
             
                    "test:yarn": "mocha",
         | 
| 28 28 | 
             
                    "bundle": "tsc --project tsconfig.json",
         | 
| 29 29 | 
             
                    "main": "node build/cltool.js document/main.md -o dist/bundle.md --debug",
         | 
    
        package/src/cltool.ts
    CHANGED
    
    | @@ -11,7 +11,7 @@ const { version } = require("../package.json"); /* package version number */ | |
| 11 11 | 
             
            const choki = require("chokidar");
         | 
| 12 12 |  | 
| 13 13 | 
             
            export const argParser = new ArgumentParser({
         | 
| 14 | 
            -
                description: "Markdown bundler, with extra options",
         | 
| 14 | 
            +
                description: "Markdown bundler, with extra options. Extension file is loaded from ./extensions.js, if it exists",
         | 
| 15 15 | 
             
                prog: "mdparse",
         | 
| 16 16 | 
             
            });
         | 
| 17 17 |  | 
| @@ -92,6 +92,14 @@ function main() { | |
| 92 92 | 
             
                    clargs = argParser.parse_args();
         | 
| 93 93 | 
             
                }
         | 
| 94 94 |  | 
| 95 | 
            +
                /* if src is init, create config file and exit */
         | 
| 96 | 
            +
                if (clargs.src == "init") {
         | 
| 97 | 
            +
                    const template = fs.readFileSync(path.join(__dirname, "..", "src", "templates", "configTemplate.json"));
         | 
| 98 | 
            +
                    fs.writeFileSync(configFileName, template);
         | 
| 99 | 
            +
                    fs.writeFileSync("main.md", "# Main\n");
         | 
| 100 | 
            +
                    return;
         | 
| 101 | 
            +
                }
         | 
| 102 | 
            +
             | 
| 95 103 | 
             
                /* helper method for calling parser */
         | 
| 96 104 | 
             
                const compile = (source, output, cb?) => {
         | 
| 97 105 | 
             
                    /* load data from file, if it exists,
         | 
| @@ -140,9 +148,8 @@ function main() { | |
| 140 148 |  | 
| 141 149 | 
             
                /* compile once */
         | 
| 142 150 | 
             
                if (!clargs.watch) compile(clargs.src, clargs.output);
         | 
| 143 | 
            -
             | 
| 144 151 | 
             
                /* watch the folder and recompile on change */
         | 
| 145 | 
            -
                 | 
| 152 | 
            +
                else {
         | 
| 146 153 | 
             
                    const srcDirName = path.dirname(clargs.src);
         | 
| 147 154 | 
             
                    console.log(`Watching ${srcDirName} for changes...`.yellow);
         | 
| 148 155 | 
             
                    server = new WebSocketServer({ port: 7788 });
         | 
| @@ -154,6 +161,7 @@ function main() { | |
| 154 161 | 
             
                        console.log(e.message);
         | 
| 155 162 | 
             
                    }
         | 
| 156 163 | 
             
                }
         | 
| 164 | 
            +
             | 
| 157 165 | 
             
            }
         | 
| 158 166 |  | 
| 159 167 | 
             
            /* main entrypoint */
         | 
    
        package/src/commands.ts
    CHANGED
    
    | @@ -42,7 +42,7 @@ export class Command { | |
| 42 42 | 
             
                constructor(
         | 
| 43 43 | 
             
                    validator: RegExp,
         | 
| 44 44 | 
             
                    acter: (match: RegExpMatchArray, parser: Parser) => string | void,
         | 
| 45 | 
            -
                    type: CommandType | 
| 45 | 
            +
                    type: CommandType
         | 
| 46 46 | 
             
                ) {
         | 
| 47 47 | 
             
                    this.type = type;
         | 
| 48 48 | 
             
                    this.validator = validator;
         | 
| @@ -71,7 +71,7 @@ export class Command { | |
| 71 71 | 
             
            new Command(
         | 
| 72 72 | 
             
                /(\s|^)<(.+)>/,
         | 
| 73 73 | 
             
                (match, parser) => `${match[1]}#mdvar<${match[2]}>`,
         | 
| 74 | 
            -
                CommandType.PREPARSE | 
| 74 | 
            +
                CommandType.PREPARSE
         | 
| 75 75 | 
             
            );
         | 
| 76 76 |  | 
| 77 77 | 
             
            /* mddef */
         | 
| @@ -80,7 +80,7 @@ new Command( | |
| 80 80 | 
             
                (match, parser) => {
         | 
| 81 81 | 
             
                    parser.opts.defs[match[1]] = match[2].replace("_", " ");
         | 
| 82 82 | 
             
                },
         | 
| 83 | 
            -
                CommandType.PARSE | 
| 83 | 
            +
                CommandType.PARSE
         | 
| 84 84 | 
             
            );
         | 
| 85 85 |  | 
| 86 86 | 
             
            /* mdvar */
         | 
| @@ -92,7 +92,7 @@ new Command( | |
| 92 92 | 
             
                        throw new Error(`Undefined variable: ${match[1]}`);
         | 
| 93 93 | 
             
                    return (value = value || `<${match[1]}>`);
         | 
| 94 94 | 
             
                },
         | 
| 95 | 
            -
                CommandType.PARSE | 
| 95 | 
            +
                CommandType.PARSE
         | 
| 96 96 | 
             
            );
         | 
| 97 97 |  | 
| 98 98 | 
             
            /** mdinclude */
         | 
| @@ -107,17 +107,31 @@ new Command( | |
| 107 107 | 
             
                    }
         | 
| 108 108 |  | 
| 109 109 | 
             
                    /* get the matching group */
         | 
| 110 | 
            -
                     | 
| 110 | 
            +
                    let [_, name, condition] = match;
         | 
| 111 111 |  | 
| 112 112 | 
             
                    /* implement conditional imports */
         | 
| 113 113 | 
             
                    if (condition && !parser.opts.args.includes(condition)) return;
         | 
| 114 114 |  | 
| 115 | 
            +
                    const fsstat = fs.lstatSync(path.join(parser.wd, name));
         | 
| 116 | 
            +
                    if (fsstat.isDirectory()) {
         | 
| 117 | 
            +
                        /* check if a file with the same name of the
         | 
| 118 | 
            +
                         * exists in the folder */
         | 
| 119 | 
            +
             | 
| 120 | 
            +
                        if (fs.existsSync(path.join(parser.wd, name, `${name}.md`))) {
         | 
| 121 | 
            +
                            name = path.join(name, `${name}.md`);
         | 
| 122 | 
            +
                        } else {
         | 
| 123 | 
            +
                            throw new Error(
         | 
| 124 | 
            +
                                `No entry file found in folder "${name}". Looking for "${name}.md"`
         | 
| 125 | 
            +
                            );
         | 
| 126 | 
            +
                        }
         | 
| 127 | 
            +
                    }
         | 
| 128 | 
            +
             | 
| 115 129 | 
             
                    const recursiveParser = new Parser(
         | 
| 116 130 | 
             
                        path.join(parser.wd, name),
         | 
| 117 131 | 
             
                        parser.opts,
         | 
| 118 132 | 
             
                        {
         | 
| 119 133 | 
             
                            parent: parser,
         | 
| 120 | 
            -
                        } | 
| 134 | 
            +
                        }
         | 
| 121 135 | 
             
                    );
         | 
| 122 136 |  | 
| 123 137 | 
             
                    /* keep the options the same */
         | 
| @@ -134,7 +148,7 @@ new Command( | |
| 134 148 | 
             
                    parser.opts.depth--;
         | 
| 135 149 | 
             
                    return blob;
         | 
| 136 150 | 
             
                },
         | 
| 137 | 
            -
                CommandType.PARSE | 
| 151 | 
            +
                CommandType.PARSE
         | 
| 138 152 | 
             
            );
         | 
| 139 153 |  | 
| 140 154 | 
             
            /* mdlabel */
         | 
| @@ -149,7 +163,7 @@ new Command( | |
| 149 163 | 
             
                    parser.opts.secs.push({ level, title });
         | 
| 150 164 | 
             
                    return `<span id="${link}"></span>`;
         | 
| 151 165 | 
             
                },
         | 
| 152 | 
            -
                CommandType.PREPARSE | 
| 166 | 
            +
                CommandType.PREPARSE
         | 
| 153 167 | 
             
            );
         | 
| 154 168 |  | 
| 155 169 | 
             
            /* mdref */
         | 
| @@ -163,7 +177,7 @@ new Command( | |
| 163 177 |  | 
| 164 178 | 
             
                        if (i === parser.opts.secs.length - 1)
         | 
| 165 179 | 
             
                            throw new Error(
         | 
| 166 | 
            -
                                `Reference to [${match[1]}] could not be resolved | 
| 180 | 
            +
                                `Reference to [${match[1]}] could not be resolved!`
         | 
| 167 181 | 
             
                            );
         | 
| 168 182 | 
             
                    }
         | 
| 169 183 |  | 
| @@ -174,12 +188,12 @@ new Command( | |
| 174 188 | 
             
                    else if (parser.opts.targetType === TargetType.MARKDOWN)
         | 
| 175 189 | 
             
                        return `[${match[1]}](#${link})`;
         | 
| 176 190 | 
             
                },
         | 
| 177 | 
            -
                CommandType.PARSE | 
| 191 | 
            +
                CommandType.PARSE
         | 
| 178 192 | 
             
            );
         | 
| 179 193 |  | 
| 180 194 | 
             
            /* mdtemplate */
         | 
| 181 195 | 
             
            new Command(
         | 
| 182 | 
            -
                /#mdtemplate<( | 
| 196 | 
            +
                /#mdtemplate<(\w+?)>/,
         | 
| 183 197 | 
             
                (match, parser) => {
         | 
| 184 198 | 
             
                    const template = match[1];
         | 
| 185 199 | 
             
                    const replacement = templates[template];
         | 
| @@ -190,49 +204,39 @@ new Command( | |
| 190 204 | 
             
                        throw new MDMError(`Template \"${template}\" not found!`, match);
         | 
| 191 205 | 
             
                    }
         | 
| 192 206 | 
             
                },
         | 
| 193 | 
            -
                CommandType.PARSE | 
| 207 | 
            +
                CommandType.PARSE
         | 
| 194 208 | 
             
            );
         | 
| 195 209 |  | 
| 196 210 | 
             
            new Command(
         | 
| 197 211 | 
             
                /#mdmaketoc(?:<>)?/,
         | 
| 198 212 | 
             
                (match, parser) => parser.gen_toc(),
         | 
| 199 | 
            -
                CommandType.POSTPARSE | 
| 213 | 
            +
                CommandType.POSTPARSE
         | 
| 200 214 | 
             
            );
         | 
| 201 215 |  | 
| 202 | 
            -
             | 
| 203 | 
            -
             | 
| 204 | 
            -
             | 
| 205 | 
            -
                if ( | 
| 206 | 
            -
             | 
| 216 | 
            +
            const loaded_extentions: fs.PathLike[] = [];
         | 
| 217 | 
            +
             | 
| 218 | 
            +
            function load_extension(parser: Parser, file: fs.PathLike) {
         | 
| 219 | 
            +
                if (loaded_extentions.includes(file)) return;
         | 
| 220 | 
            +
                if (fs.existsSync(file)) {
         | 
| 221 | 
            +
                    const extensions = requireRuntime(file);
         | 
| 222 | 
            +
                    loaded_extentions.push(file);
         | 
| 207 223 | 
             
                    extensions.main(new_template, new_command);
         | 
| 208 224 |  | 
| 209 225 | 
             
                    if (parser.opts.verbose)
         | 
| 210 | 
            -
                        console.log(
         | 
| 211 | 
            -
                            `Loaded global extensions from ${global_extensions_path}`
         | 
| 212 | 
            -
                                .yellow,
         | 
| 213 | 
            -
                        );
         | 
| 226 | 
            +
                        console.log(`Loaded extensions from ${file}`.yellow);
         | 
| 214 227 | 
             
                } else if (parser.opts.debug) {
         | 
| 215 | 
            -
                    console.log(
         | 
| 216 | 
            -
                        `No global extensions found at ${global_extensions_path}`.red,
         | 
| 217 | 
            -
                    );
         | 
| 228 | 
            +
                    console.log(`No extensions found at ${file}`.red);
         | 
| 218 229 | 
             
                }
         | 
| 230 | 
            +
            }
         | 
| 231 | 
            +
             | 
| 232 | 
            +
            export function load_extensions(parser: Parser) {
         | 
| 233 | 
            +
                /* global extention */
         | 
| 234 | 
            +
                const global_extensions_path = path.join(__dirname, "extensions.js");
         | 
| 235 | 
            +
                load_extension(parser, global_extensions_path);
         | 
| 219 236 |  | 
| 220 237 | 
             
                /* project extention */
         | 
| 221 238 | 
             
                const project_extensions_path = path.join(parser.wd_full, "extensions.js");
         | 
| 222 | 
            -
                 | 
| 223 | 
            -
                    const extensions = requireRuntime(project_extensions_path);
         | 
| 224 | 
            -
                    extensions.main(new_template, new_command);
         | 
| 225 | 
            -
             | 
| 226 | 
            -
                    if (parser.opts.verbose)
         | 
| 227 | 
            -
                        console.log(
         | 
| 228 | 
            -
                            `Loaded project extensions from ${project_extensions_path}`
         | 
| 229 | 
            -
                                .yellow,
         | 
| 230 | 
            -
                        );
         | 
| 231 | 
            -
                } else if (parser.opts.debug) {
         | 
| 232 | 
            -
                    console.log(
         | 
| 233 | 
            -
                        `No project extensions found at ${project_extensions_path}!`.red,
         | 
| 234 | 
            -
                    );
         | 
| 235 | 
            -
                }
         | 
| 239 | 
            +
                load_extension(parser, project_extensions_path);
         | 
| 236 240 | 
             
            }
         | 
| 237 241 |  | 
| 238 242 | 
             
            /**
         | 
| @@ -244,7 +248,7 @@ export function load_extensions(parser: Parser) { | |
| 244 248 | 
             
            export function new_command(
         | 
| 245 249 | 
             
                regex: RegExp,
         | 
| 246 250 | 
             
                acter: (match: RegExpMatchArray, parser: Parser) => string,
         | 
| 247 | 
            -
                type?: CommandType | 
| 251 | 
            +
                type?: CommandType
         | 
| 248 252 | 
             
            ) {
         | 
| 249 253 | 
             
                new Command(regex, acter, type || CommandType.PARSE);
         | 
| 250 254 | 
             
            }
         | 
    
        package/src/parse.ts
    CHANGED
    
    | @@ -258,27 +258,21 @@ class Parser { | |
| 258 258 | 
             
                /* output the parsed document to bundle */
         | 
| 259 259 | 
             
                to(bundleName: string, callback: (fileName: string) => void) {
         | 
| 260 260 | 
             
                    const dir = path.dirname(bundleName);
         | 
| 261 | 
            -
                     | 
| 262 | 
            -
                    if (callback === undefined) callback = () => {};
         | 
| 261 | 
            +
                    if (callback === undefined) callback = () => { };
         | 
| 263 262 |  | 
| 264 263 | 
             
                    if (!fs.existsSync(dir)) {
         | 
| 265 264 | 
             
                        fs.mkdirSync(dir, { recursive: true });
         | 
| 266 265 | 
             
                    }
         | 
| 267 | 
            -
             | 
| 268 | 
            -
             | 
| 269 | 
            -
             | 
| 270 | 
            -
             | 
| 271 | 
            -
                                called = true;
         | 
| 272 | 
            -
                            }
         | 
| 266 | 
            +
             | 
| 267 | 
            +
                    if (!this.opts.html) {
         | 
| 268 | 
            +
                        this.get(TargetType.MARKDOWN, (blob) => {
         | 
| 269 | 
            +
                            fs.writeFile(bundleName, blob, () => callback(bundleName));
         | 
| 273 270 | 
             
                        });
         | 
| 274 | 
            -
                    } | 
| 271 | 
            +
                    }
         | 
| 275 272 |  | 
| 276 | 
            -
                     | 
| 273 | 
            +
                    else {
         | 
| 277 274 | 
             
                        const htmlFileName = bundleName.replace(".md", ".html");
         | 
| 278 | 
            -
                        fs.writeFile(htmlFileName, this.html(), () =>  | 
| 279 | 
            -
                            if (!called) callback(htmlFileName);
         | 
| 280 | 
            -
                            called = true;
         | 
| 281 | 
            -
                        });
         | 
| 275 | 
            +
                        fs.writeFile(htmlFileName, this.html(), () => callback(htmlFileName));
         | 
| 282 276 | 
             
                    }
         | 
| 283 277 | 
             
                }
         | 
| 284 278 |  | 
| @@ -293,7 +287,7 @@ class Parser { | |
| 293 287 | 
             
                    return htmlFormatted;
         | 
| 294 288 | 
             
                }
         | 
| 295 289 |  | 
| 296 | 
            -
                get(targetType?: TargetType, callback | 
| 290 | 
            +
                get(targetType?: TargetType, callback?: (blob: string) => void): string {
         | 
| 297 291 | 
             
                    /* If target type is undefined, markdown is the default */
         | 
| 298 292 | 
             
                    if (targetType === undefined) targetType = TargetType.MARKDOWN;
         | 
| 299 293 | 
             
                    if (this.blobs[targetType]) {
         | 
| @@ -307,10 +301,10 @@ class Parser { | |
| 307 301 | 
             
                            let blob = this.parse();
         | 
| 308 302 | 
             
                            this.opts.targetType = undefined;
         | 
| 309 303 | 
             
                            if (callback) callback(blob);
         | 
| 310 | 
            -
                            return blob | 
| 304 | 
            +
                            return blob
         | 
| 311 305 | 
             
                        } catch (error) {
         | 
| 306 | 
            +
                            /* Compile a traceback of error */
         | 
| 312 307 | 
             
                            let traceback = "";
         | 
| 313 | 
            -
             | 
| 314 308 | 
             
                            let p: Parser = this;
         | 
| 315 309 |  | 
| 316 310 | 
             
                            do {
         | 
| @@ -324,7 +318,7 @@ class Parser { | |
| 324 318 |  | 
| 325 319 | 
             
                            error.message += traceback;
         | 
| 326 320 |  | 
| 327 | 
            -
                            /* only interested in stacktrace | 
| 321 | 
            +
                            /* only interested in node stacktrace when debugging */
         | 
| 328 322 | 
             
                            if (!this.opts.debug) error.stack = "";
         | 
| 329 323 |  | 
| 330 324 | 
             
                            if (this.opts.only_warn) console.error(error);
         | 
| @@ -345,7 +339,7 @@ export function splice( | |
| 345 339 | 
             
                return start + newSubStr + end;
         | 
| 346 340 | 
             
            }
         | 
| 347 341 |  | 
| 348 | 
            -
            /* add extention to marked */
         | 
| 342 | 
            +
            /* add extention to marked for classed blockquotes*/
         | 
| 349 343 | 
             
            marked.use({
         | 
| 350 344 | 
             
                renderer: {
         | 
| 351 345 | 
             
                    blockquote(quote) {
         |