markdown-maker 1.9.2 → 1.10.0
Sign up to get free protection for your applications and to get access to all the features.
- 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) {
|