1 | const Lexer = require('./Lexer.js');
|
2 | const Parser = require('./Parser.js');
|
3 | const Renderer = require('./Renderer.js');
|
4 | const TextRenderer = require('./TextRenderer.js');
|
5 | const InlineLexer = require('./InlineLexer.js');
|
6 | const Slugger = require('./Slugger.js');
|
7 | const {
|
8 | merge,
|
9 | checkSanitizeDeprecation,
|
10 | escape
|
11 | } = require('./helpers.js');
|
12 | const {
|
13 | getDefaults,
|
14 | changeDefaults,
|
15 | defaults
|
16 | } = require('./defaults.js');
|
17 |
|
18 |
|
19 |
|
20 |
|
21 | function marked(src, opt, callback) {
|
22 |
|
23 | if (typeof src === 'undefined' || src === null) {
|
24 | throw new Error('marked(): input parameter is undefined or null');
|
25 | }
|
26 | if (typeof src !== 'string') {
|
27 | throw new Error('marked(): input parameter is of type '
|
28 | + Object.prototype.toString.call(src) + ', string expected');
|
29 | }
|
30 |
|
31 | if (callback || typeof opt === 'function') {
|
32 | if (!callback) {
|
33 | callback = opt;
|
34 | opt = null;
|
35 | }
|
36 |
|
37 | opt = merge({}, marked.defaults, opt || {});
|
38 | checkSanitizeDeprecation(opt);
|
39 | const highlight = opt.highlight;
|
40 | let tokens,
|
41 | pending,
|
42 | i = 0;
|
43 |
|
44 | try {
|
45 | tokens = Lexer.lex(src, opt);
|
46 | } catch (e) {
|
47 | return callback(e);
|
48 | }
|
49 |
|
50 | pending = tokens.length;
|
51 |
|
52 | const done = function(err) {
|
53 | if (err) {
|
54 | opt.highlight = highlight;
|
55 | return callback(err);
|
56 | }
|
57 |
|
58 | let out;
|
59 |
|
60 | try {
|
61 | out = Parser.parse(tokens, opt);
|
62 | } catch (e) {
|
63 | err = e;
|
64 | }
|
65 |
|
66 | opt.highlight = highlight;
|
67 |
|
68 | return err
|
69 | ? callback(err)
|
70 | : callback(null, out);
|
71 | };
|
72 |
|
73 | if (!highlight || highlight.length < 3) {
|
74 | return done();
|
75 | }
|
76 |
|
77 | delete opt.highlight;
|
78 |
|
79 | if (!pending) return done();
|
80 |
|
81 | for (; i < tokens.length; i++) {
|
82 | (function(token) {
|
83 | if (token.type !== 'code') {
|
84 | return --pending || done();
|
85 | }
|
86 | return highlight(token.text, token.lang, function(err, code) {
|
87 | if (err) return done(err);
|
88 | if (code == null || code === token.text) {
|
89 | return --pending || done();
|
90 | }
|
91 | token.text = code;
|
92 | token.escaped = true;
|
93 | --pending || done();
|
94 | });
|
95 | })(tokens[i]);
|
96 | }
|
97 |
|
98 | return;
|
99 | }
|
100 | try {
|
101 | opt = merge({}, marked.defaults, opt || {});
|
102 | checkSanitizeDeprecation(opt);
|
103 | return Parser.parse(Lexer.lex(src, opt), opt);
|
104 | } catch (e) {
|
105 | e.message += '\nPlease report this to https://github.com/markedjs/marked.';
|
106 | if ((opt || marked.defaults).silent) {
|
107 | return '<p>An error occurred:</p><pre>'
|
108 | + escape(e.message + '', true)
|
109 | + '</pre>';
|
110 | }
|
111 | throw e;
|
112 | }
|
113 | }
|
114 |
|
115 |
|
116 |
|
117 |
|
118 |
|
119 | marked.options =
|
120 | marked.setOptions = function(opt) {
|
121 | merge(marked.defaults, opt);
|
122 | changeDefaults(marked.defaults);
|
123 | return marked;
|
124 | };
|
125 |
|
126 | marked.getDefaults = getDefaults;
|
127 |
|
128 | marked.defaults = defaults;
|
129 |
|
130 |
|
131 |
|
132 |
|
133 |
|
134 | marked.Parser = Parser;
|
135 | marked.parser = Parser.parse;
|
136 |
|
137 | marked.Renderer = Renderer;
|
138 | marked.TextRenderer = TextRenderer;
|
139 |
|
140 | marked.Lexer = Lexer;
|
141 | marked.lexer = Lexer.lex;
|
142 |
|
143 | marked.InlineLexer = InlineLexer;
|
144 | marked.inlineLexer = InlineLexer.output;
|
145 |
|
146 | marked.Slugger = Slugger;
|
147 |
|
148 | marked.parse = marked;
|
149 |
|
150 | module.exports = marked;
|