js-markdown
Version:
A markdown language js compiler.
107 lines (89 loc) • 2.59 kB
JavaScript
/**
* match a multi lines code block
*
* All text in code block will be escaped.
*
* (1) use 3 or more "`" or "~" for the first line, syntax like this:
*
* ```
* here is the code
* multi lines
* ```
*
* or
*
* ~~~
* another example
* ~~~
*
* (2) use a tab or 4 space or 1~3 spaces plus a tab for line start, syntax like this:
*
* here is the code
* multi lines
*
*/
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
var _Util = _interopRequireDefault(require("../../utils/Util"));
var _Str = _interopRequireDefault(require("../../utils/Str"));
/**
* exclude the condition that if there is a same identifier in the same line
* @param line
*/
function isInlineMatch(line) {
return line.match(/^([`~]{3,}).*\1/);
}
function parse(line, index, lines, renderTree) {
var result = line.match(/^([`~]{3,}| {4}|\t| {0,3}\t)\s*(.*?)(?:\n|$)/);
if (!result) {
return;
} // exclude inline code
if (isInlineMatch(line)) {
return;
}
if (result[1].includes('\t') || result[1].includes(' ')) {
// space or tab
var indentLen = result[1].length;
var codeContent = [result[2]];
index++;
for (var len = lines.length; index < len; index++) {
if (_Str["default"].trim(lines[index], ' \t') !== '' && !lines[index].startsWith(result[1])) {
break;
}
codeContent.push(lines[index].slice(indentLen));
}
return [{
type: 'BlockCode',
rawValue: _Str["default"].encodeHTML(_Util["default"].trimEndBlankLines(codeContent).join('\n')) + '\n'
}, index - 1];
} else {
// ``` or ~~~
var _codeContent = [];
index++;
for (var _len = lines.length; index < _len; index++) {
if (_Str["default"].trimEnd(lines[index], ' \t') === result[1]) {
break;
}
_codeContent.push(lines[index]);
}
return [{
type: 'BlockCode',
language: result[2],
rawValue: _Str["default"].encodeHTML(_Util["default"].trimEndBlankLines(_codeContent).join('\n'))
}, index];
}
}
function render() {
var data = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
var node = arguments.length > 1 ? arguments[1] : undefined;
return "<pre><code".concat(node.language ? " lang=\"".concat(node.language, "\"") : '', ">").concat(node.rawValue || '').concat(data, "</code></pre>");
}
var _default = {
parse: parse,
render: render
};
exports["default"] = _default;