Skip to content

Commit 0438f99

Browse files
author
Jiang Shang
committed
优化 parseInline
1 parent a370b6f commit 0438f99

File tree

4 files changed

+136
-238
lines changed

4 files changed

+136
-238
lines changed

dist/Parser.js

Lines changed: 76 additions & 159 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,11 @@ var Parser = (function () {
6565
}, {
6666
key: 'hook',
6767
value: function hook(type, callback) {
68-
this.hooks[type].push(callback);
68+
if (this.hooks[type]) {
69+
this.hooks[type].push(callback);
70+
} else {
71+
this.hooks[type] = [callback];
72+
}
6973
}
7074

7175
/**
@@ -220,20 +224,20 @@ var Parser = (function () {
220224
}, {
221225
key: 'parseInline',
222226
value: function parseInline(text) {
227+
var _this3 = this;
228+
223229
var whiteList = arguments.length <= 1 || arguments[1] === undefined ? '' : arguments[1];
224230

225231
text = this.call('beforeParseInline', text);
226232
var _this = this;
227233
// code
228-
text = text.replace(/(^|[^\\])(`+)(.+?)\2/g, function () {
229-
var codeMatches = /(^|[^\\])(`+)(.+?)\2/g.exec(text);
230-
return codeMatches[1] + _this.makeHolder('<code>' + _this.htmlspecialchars(codeMatches[3]) + '</code>');
234+
text = text.replace(/(^|[^\\])(`+)(.+?)\2/g, function (match, p1, p2, p3) {
235+
return p1 + _this.makeHolder('<code>' + _this.htmlspecialchars(p3) + '</code>');
231236
});
232237

233238
// link
234-
text = text.replace(/<(https?:\/\/.+)>/ig, function () {
235-
var linkMatches = /<(https?:\/\/.+)>/ig.exec(text);
236-
return '<a href="' + linkMatches[1] + '">' + linkMatches[1] + '</a>';
239+
text = text.replace(/<(https?:\/\/.+)>/ig, function (match, p1) {
240+
return '<a href="' + p1 + '">' + p1 + '</a>';
237241
});
238242

239243
// encode unsafe tags
@@ -252,35 +256,31 @@ var Parser = (function () {
252256

253257
// footnote
254258
var footnotePattern = /\[\^((?:[^\]]|\]|\[)+?)\]/g;
255-
256-
text = text.replace(footnotePattern, function () {
257-
var footnoteMatches = text.match(footnoteMatches);
258-
var id = _this.footnotes.indexOf(footnoteMatches[1]);
259+
text = text.replace(footnotePattern, function (match, p1, p2) {
260+
var id = _this.footnotes.indexOf(p1);
259261

260262
if (id === -1) {
261263
id = _this.footnotes.length + 1;
262-
_this.footnotes[id] = footnoteMatches[1];
264+
_this.footnotes[id] = _this3.parseInline(p1);
263265
}
264266

265267
return _this.makeHolder('<sup id="fnref-' + id + '"><a href="#fn-' + id + '" class="footnote-ref">' + id + '</a></sup>');
266268
});
267269

268270
// image
269271
var imagePattern1 = /!\[((?:[^\]]|\]|\[)*?)\]\(((?:[^\)]|\)|\()+?)\)/;
270-
var imageMatches1 = imagePattern1.exec(text);
271-
text = text.replace(imagePattern1, function () {
272-
var escaped = _this.escapeBracket(imageMatches1[1]);
273-
var url = _this.escapeBracket(imageMatches1[2]);
272+
text = text.replace(imagePattern1, function (match, p1, p2) {
273+
var escaped = _this.escapeBracket(p1);
274+
var url = _this.escapeBracket(p2);
274275
return _this.makeHolder('<img src="' + url + '" alt="' + escaped + '" title="' + escaped + '">');
275276
});
276277

277278
var imagePattern2 = /!\[((?:[^\]]|\]|\[)*?)\]\[((?:[^\]]|\]|\[)+?)\]/;
278-
var imageMatches2 = imagePattern2.exec(text);
279-
text = text.replace(imagePattern2, function () {
280-
var escaped = _this.escapeBracket(imageMatches2[1]);
279+
text = text.replace(imagePattern2, function (match, p1, p2) {
280+
var escaped = _this.escapeBracket(p1);
281281
var result = '';
282-
if (_this.definitions[imageMatches2[2]]) {
283-
result = '<img src="' + _this.definitions[imageMatches2[2]] + '" alt="' + escaped + '" title="' + escaped + '">';
282+
if (_this.definitions[p2]) {
283+
result = '<img src="' + _this.definitions[p2] + '" alt="' + escaped + '" title="' + escaped + '">';
284284
} else {
285285
result = escaped;
286286
}
@@ -289,28 +289,24 @@ var Parser = (function () {
289289

290290
// link
291291
var linkPattern1 = /\[((?:[^\]]|\]|\[)+?)\]\(((?:[^\)]|\)|\()+?)\)/;
292-
var linkMatches1 = linkPattern1.exec(text);
293-
294-
text = text.replace(linkPattern1, function () {
295-
var escaped = _this.escapeBracket(linkMatches1[1]);
296-
var url = _this.escapeBracket(linkMatches1[2]);
292+
text = text.replace(linkPattern1, function (match, p1, p2) {
293+
var escaped = _this.parseInline(_this.escapeBracket(p1));
294+
var url = _this.escapeBracket(p2);
297295
return _this.makeHolder('<a href="' + url + '">' + escaped + '</a>');
298296
});
299297

300298
var linkPattern2 = /\[((?:[^\]]|\]|\[)+?)\]\[((?:[^\]]|\]|\[)+?)\]/;
301-
var linkMatches2 = linkPattern2.exec(text);
302-
text = text.replace(linkPattern2, function () {
303-
var escaped = _this.escapeBracket(linkMatches2[1]);
299+
text = text.replace(linkPattern2, function (match, p1, p2) {
300+
var escaped = _this.parseInline(_this.escapeBracket(p1));
304301

305-
var result = _this.definitions[linkMatches2[2]] ? '<a href="' + _this.definitions[linkMatches2[2]] + '">' + escaped + '</a>' : escaped;
302+
var result = _this.definitions[p2] ? '<a href="' + _this.definitions[p2] + '">' + escaped + '</a>' : escaped;
306303

307304
return _this.makeHolder(result);
308305
});
309306

310307
// escape
311-
text = text.replace(/\\(`|\*|_|~)/, function () {
312-
var escapeMatches = /\\(`|\*|_|~)/.exec(text);
313-
return _this.makeHolder(_this.htmlspecialchars(escapeMatches[1]));
308+
text = text.replace(/\\(`|\*|_|~)/g, function (match, p1) {
309+
return _this.makeHolder(_this.htmlspecialchars(p1));
314310
});
315311

316312
// strong and em and some fuck
@@ -353,7 +349,7 @@ var Parser = (function () {
353349
var emptyCount = 0;
354350
// analyze by line
355351
for (var key in lines) {
356-
key = parseInt(key); // ES6 的 bug for key in Array 循环时返回的 key 是字符串,不是 int
352+
key = parseInt(key); // ES6 的 for key in Array 循环时返回的 key 是字符串,不是 int
357353
var line = lines[key];
358354
// code block is special
359355
if (matches = line.match(/^(\s*)(~|`){3,}([^`~]*)$/i)) {
@@ -446,6 +442,7 @@ var Parser = (function () {
446442
// pre
447443
case /^ {4}/.test(line):
448444
emptyCount = 0;
445+
449446
if (this.isBlock('pre')) {
450447
this.setBlock(key);
451448
} else if (this.isBlock('normal')) {
@@ -687,31 +684,11 @@ var Parser = (function () {
687684
}, {
688685
key: 'parsePre',
689686
value: function parsePre(lines) {
690-
var _iteratorNormalCompletion2 = true;
691-
var _didIteratorError2 = false;
692-
var _iteratorError2 = undefined;
693-
694-
try {
695-
for (var _iterator2 = lines[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
696-
var line = _step2.value;
697-
698-
line = this.htmlspecialchars(line.substr(4));
699-
}
700-
} catch (err) {
701-
_didIteratorError2 = true;
702-
_iteratorError2 = err;
703-
} finally {
704-
try {
705-
if (!_iteratorNormalCompletion2 && _iterator2['return']) {
706-
_iterator2['return']();
707-
}
708-
} finally {
709-
if (_didIteratorError2) {
710-
throw _iteratorError2;
711-
}
712-
}
713-
}
687+
var _this4 = this;
714688

689+
lines.forEach(function (line, ind) {
690+
lines[ind] = _this4.htmlspecialchars(line.substr(4));
691+
});
715692
var str = lines.join('\n');
716693

717694
return (/^\s*$/.test(str) ? '' : '<pre><code>' + str + '</code></pre>'
@@ -782,6 +759,8 @@ var Parser = (function () {
782759
}, {
783760
key: 'parseList',
784761
value: function parseList(lines) {
762+
var _this5 = this;
763+
785764
var html = '';
786765
var minSpace = 99999;
787766
var rows = [];
@@ -802,93 +781,50 @@ var Parser = (function () {
802781

803782
var found = false;
804783
var secondMinSpace = 99999;
805-
var _iteratorNormalCompletion3 = true;
806-
var _didIteratorError3 = false;
807-
var _iteratorError3 = undefined;
808-
809-
try {
810-
for (var _iterator3 = rows[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) {
811-
var row = _step3.value;
812-
813-
if (Array.isArray(row) && row[0] != minSpace) {
814-
secondMinSpace = Math.min(secondMinSpace, row[0]);
815-
found = true;
816-
}
784+
rows.forEach(function (row) {
785+
if (Array.isArray(row) && row[0] != minSpace) {
786+
secondMinSpace = Math.min(secondMinSpace, row[0]);
787+
found = true;
817788
}
818-
} catch (err) {
819-
_didIteratorError3 = true;
820-
_iteratorError3 = err;
821-
} finally {
822-
try {
823-
if (!_iteratorNormalCompletion3 && _iterator3['return']) {
824-
_iterator3['return']();
825-
}
826-
} finally {
827-
if (_didIteratorError3) {
828-
throw _iteratorError3;
829-
}
830-
}
831-
}
832-
789+
});
833790
secondMinSpace = found ? 0 : minSpace;
834791

835792
var lastType = '';
836793
var leftLines = [];
837794

838-
var _iteratorNormalCompletion4 = true;
839-
var _didIteratorError4 = false;
840-
var _iteratorError4 = undefined;
841-
842-
try {
843-
for (var _iterator4 = rows[Symbol.iterator](), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) {
844-
var row = _step4.value;
795+
rows.forEach(function (row) {
796+
if (Array.isArray(row)) {
797+
var _row = _slicedToArray(row, 4);
845798

846-
if (Array.isArray(row)) {
847-
var _row = _slicedToArray(row, 4);
799+
var space = _row[0];
800+
var type = _row[1];
801+
var line = _row[2];
802+
var text = _row[3];
848803

849-
var space = _row[0];
850-
var type = _row[1];
851-
var line = _row[2];
852-
var text = _row[3];
853-
854-
if (space !== minSpace) {
855-
var pattern = new RegExp("^\s{" + secondMinSpace + "}");
856-
leftLines.push(line.replace(pattern, ''));
857-
} else {
858-
if (lastType !== type) {
859-
if (lastType.length) {
860-
html += '</' + lastType + '>';
861-
}
862-
863-
html += '<' + type + '>';
804+
if (space !== minSpace) {
805+
var pattern = new RegExp("^\s{" + secondMinSpace + "}");
806+
leftLines.push(line.replace(pattern, ''));
807+
} else {
808+
if (lastType !== type) {
809+
if (lastType.length) {
810+
html += '</' + lastType + '>';
864811
}
865812

866-
if (leftLines.length) {
867-
html += "<li>" + this.parse(leftLines.join("\n")) + "</li>";
868-
}
813+
html += '<' + type + '>';
814+
}
869815

870-
leftLines = [text];
871-
lastType = type;
816+
if (leftLines.length) {
817+
html += "<li>" + _this5.parse(leftLines.join("\n")) + "</li>";
872818
}
873-
} else {
874-
var pattern = new RegExp("^\s{" + secondMinSpace + "}");
875-
leftLines.push(row.replace(pattern, ''));
876-
}
877-
}
878-
} catch (err) {
879-
_didIteratorError4 = true;
880-
_iteratorError4 = err;
881-
} finally {
882-
try {
883-
if (!_iteratorNormalCompletion4 && _iterator4['return']) {
884-
_iterator4['return']();
885-
}
886-
} finally {
887-
if (_didIteratorError4) {
888-
throw _iteratorError4;
819+
820+
leftLines = [text];
821+
lastType = type;
889822
}
823+
} else {
824+
var pattern = new RegExp("^\s{" + secondMinSpace + "}");
825+
leftLines.push(row.replace(pattern, ''));
890826
}
891-
}
827+
});
892828

893829
if (leftLines.length) {
894830
html += "<li>" + this.parse(leftLines.join("\n")) + ('</li></' + lastType + '>');
@@ -905,7 +841,7 @@ var Parser = (function () {
905841
}, {
906842
key: 'parseTable',
907843
value: function parseTable(lines, value) {
908-
var _this3 = this;
844+
var _this6 = this;
909845

910846
var _value = _slicedToArray(value, 2);
911847

@@ -984,7 +920,7 @@ var Parser = (function () {
984920
html += ' align="' + aligns[key] + '"';
985921
}
986922

987-
html += '>' + _this3.parseInline(text) + ('</' + tag + '>');
923+
html += '>' + _this6.parseInline(text) + ('</' + tag + '>');
988924
});
989925

990926
html += '</tr>';
@@ -1030,10 +966,10 @@ var Parser = (function () {
1030966
}, {
1031967
key: 'parseNormal',
1032968
value: function parseNormal(lines) {
1033-
var _this4 = this;
969+
var _this7 = this;
1034970

1035971
lines = lines.map(function (line) {
1036-
return _this4.parseInline(line);
972+
return _this7.parseInline(line);
1037973
});
1038974

1039975
var str = lines.join("\n").trim();
@@ -1091,30 +1027,11 @@ var Parser = (function () {
10911027
}, {
10921028
key: 'parseHtml',
10931029
value: function parseHtml(lines, type) {
1094-
var _iteratorNormalCompletion5 = true;
1095-
var _didIteratorError5 = false;
1096-
var _iteratorError5 = undefined;
1097-
1098-
try {
1099-
for (var _iterator5 = lines[Symbol.iterator](), _step5; !(_iteratorNormalCompletion5 = (_step5 = _iterator5.next()).done); _iteratorNormalCompletion5 = true) {
1100-
var line = _step5.value;
1030+
var _this8 = this;
11011031

1102-
line = this.parseInline(line, this.specialWhiteList[type] ? this.specialWhiteList[type] : '');
1103-
}
1104-
} catch (err) {
1105-
_didIteratorError5 = true;
1106-
_iteratorError5 = err;
1107-
} finally {
1108-
try {
1109-
if (!_iteratorNormalCompletion5 && _iterator5['return']) {
1110-
_iterator5['return']();
1111-
}
1112-
} finally {
1113-
if (_didIteratorError5) {
1114-
throw _iteratorError5;
1115-
}
1116-
}
1117-
}
1032+
lines.forEach(function (line) {
1033+
line = _this8.parseInline(line, _this8.specialWhiteList[type] ? _this8.specialWhiteList[type] : '');
1034+
});
11181035

11191036
return lines.join("\n");
11201037
}
@@ -1285,7 +1202,7 @@ var Parser = (function () {
12851202
prev[2] = current[2];
12861203
this.blocks[this.pos - 1] = prev;
12871204
this.current = prev[0];
1288-
unset(this.blocks[this.pos]);
1205+
this.blocks.splice(this.pos, 1);
12891206
this.pos--;
12901207

12911208
return this;

0 commit comments

Comments
 (0)