UNPKG

js-markdown

Version:
107 lines (89 loc) 2.59 kB
/** * 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 * */ 'use strict'; 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;