@danilandreev/material-docs
Version:
material-docs - react framework for easy creating documentation site in material design style.
279 lines (227 loc) • 12.3 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = generateMaterialDocsFromMarkdown;
var _react = _interopRequireDefault(require("react"));
var _Header = _interopRequireDefault(require("../components/Header"));
var _List = _interopRequireDefault(require("../components/List/List"));
var _ListItem = _interopRequireDefault(require("../components/ListItem/ListItem"));
var _Code = _interopRequireDefault(require("../components/Code/Code"));
var _Link = _interopRequireDefault(require("../components/Link"));
var _Bold = _interopRequireDefault(require("../components/Bold/Bold"));
var _Italic = _interopRequireDefault(require("../components/Italic/Italic"));
var _Image = _interopRequireDefault(require("../components/Image/Image"));
var _Table = _interopRequireDefault(require("../components/Table"));
var _TableHead = _interopRequireDefault(require("../components/TableHead"));
var _TableBody = _interopRequireDefault(require("../components/TableBody"));
var _TableRow = _interopRequireDefault(require("../components/TableRow"));
var _TableCell = _interopRequireDefault(require("../components/TableCell"));
var _Block = _interopRequireDefault(require("../components/Block/Block"));
var _CodeSpan = _interopRequireDefault(require("../components/CodeSpan/CodeSpan"));
var _ExpansionCode = _interopRequireDefault(require("../components/ExpansionCode/ExpansionCode"));
var _DemoWithCode = _interopRequireDefault(require("../components/DemoWithCode/DemoWithCode"));
var _Typography = _interopRequireDefault(require("@material-ui/core/Typography"));
var _Divider = _interopRequireDefault(require("@material-ui/core/Divider"));
var _marked = _interopRequireDefault(require("marked"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
/**
* fixShieldedText - fixes bug with shielded symbols in text after using lexer.
* @function
* @param {string} text
* @return {string}
*/
function fixShieldedText(text) {
if (typeof text !== "string") return "";
return text.replace(/'+/g, "'").replace(/"+/g, "\"").replace(/<+/g, "<").replace(/>/g, ">");
}
/**
* generateMaterialDocsFromMarkdown - function, designed to generate Material Docs based layout from markdown text.
* @function
* @param {string} input Markdown based text. Will be parsed and interpreted.
* @param {object} storage Object with additional information. Will be used in components with additional setup.
* @param {string} key Component key
* @return JSX.Element
* @throws TypeError
*/
function generateMaterialDocsFromMarkdown(input) {
var storage = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
var key = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1;
if (!(typeof input === "string" || _typeof(input) === "object")) throw new TypeError("MaterialDocs: incorrect type of input param, expected \"object | string\", got \"".concat(_typeof(input), "\""));
var tokens = input;
if (typeof input === "string") {
tokens = _marked.default.lexer(input);
}
return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, {
key: "markdown-token-".concat(key)
}, tokens.map(function (token, tokenId) {
switch (token.type) {
case "heading":
return /*#__PURE__*/_react.default.createElement(_Header.default, {
heading: token.depth,
key: "heading-token-".concat(tokenId)
}, token.tokens && generateMaterialDocsFromMarkdown(token.tokens, storage, tokenId + key));
case "text":
return token.tokens ? generateMaterialDocsFromMarkdown(token.tokens, tokenId + key) : /*#__PURE__*/_react.default.createElement("span", {
key: "text-token-".concat(tokenId)
}, fixShieldedText(token.text));
case "paragraph":
return /*#__PURE__*/_react.default.createElement(_Typography.default, {
key: "paragraph-token-".concat(tokenId)
}, token.tokens && generateMaterialDocsFromMarkdown(token.tokens, storage, tokenId + key));
case "list":
return /*#__PURE__*/_react.default.createElement(_List.default, {
key: "list-token-".concat(tokenId)
}, token.items && generateMaterialDocsFromMarkdown(token.items, storage, tokenId + key));
case "list_item":
return /*#__PURE__*/_react.default.createElement(_ListItem.default, {
key: "list-item-token-".concat(tokenId)
}, token.tokens && generateMaterialDocsFromMarkdown(token.tokens, storage, tokenId + key));
case "code":
try {
var setting = JSON.parse(token.lang);
var _setting$type = setting.type,
type = _setting$type === void 0 ? "code" : _setting$type,
_setting$language = setting.language,
language = _setting$language === void 0 ? "javascript" : _setting$language;
if (type !== "expansion-code" && type !== "code" && type !== "demo-with-code") console.error("MaterialDocs: incorrect type of code block setting field \"type\", expected \"expansion-code | code | demo-with-code\" got ".concat(type));
if (language && typeof language !== "string") console.error("MaterialDocs: incorrect type of code block setting field \"language\", expected \"string\" got ".concat(_typeof(language)));
switch (setting.type) {
case "expansion-code":
{
var name = setting.name,
collapsedHeight = setting.collapsedHeight,
theme = setting.theme;
if (theme && typeof theme !== "string") console.error("MaterialDocs: incorrect type of code block setting field \"theme\", expected \"string\" got ".concat(_typeof(theme)));
return /*#__PURE__*/_react.default.createElement(_ExpansionCode.default, {
language: language,
name: name,
collapsedHeight: collapsedHeight,
key: "code-token-".concat(tokenId),
theme: theme
}, token.text);
break;
}
case "demo-with-code":
{
var defaultExpanded = setting.defaultExpanded,
text = setting.text,
_name = setting.name,
_theme = setting.theme;
if (_theme && typeof _theme !== "string") console.error("MaterialDocs: incorrect type of code block setting field \"theme\", expected \"string\" got ".concat(_typeof(_theme)));
if (text && typeof text !== "string") console.error("MaterialDocs: incorrect type of code block setting field \"text\", expected \"string\" got ".concat(_typeof(text)));
var Demo = null;
if (typeof setting.demo === "string") {
Demo = storage[setting.demo];
}
return /*#__PURE__*/_react.default.createElement(_DemoWithCode.default, {
language: language,
defaultExpanded: defaultExpanded,
code: token.text,
name: _name,
theme: _theme,
key: "code-token-".concat(tokenId)
}, Demo || null);
break;
}
default:
{
var _theme2 = setting.theme;
if (_theme2 && typeof _theme2 !== "string") console.error("MaterialDocs: incorrect type of code block setting field \"theme\", expected \"string\" got ".concat(_typeof(_theme2)));
return /*#__PURE__*/_react.default.createElement(_Code.default, {
language: language,
key: "code-token-".concat(tokenId),
theme: _theme2
}, token.text);
}
}
} catch (error) {
if (error instanceof SyntaxError) {
return /*#__PURE__*/_react.default.createElement(_Code.default, {
language: token.lang,
key: "code-token-".concat(tokenId)
}, token.text);
} else {
throw error;
}
}
return /*#__PURE__*/_react.default.createElement(_Code.default, {
language: token.lang,
key: "code-token-".concat(tokenId)
}, token.text);
case "codespan":
return /*#__PURE__*/_react.default.createElement(_CodeSpan.default, {
key: "codespan-token-".concat(tokenId)
}, token.text);
case "link":
{
var href = token.href,
_text = token.text,
_tokens = token.tokens;
var settings = {};
try {
settings = JSON.parse(_text);
if (typeof settings.text === "string") settings.tokens = _marked.default.lexer(settings.text);
} catch (e) {
settings = {
tokens: _tokens
};
} finally {
settings.href = href;
}
return /*#__PURE__*/_react.default.createElement(_Link.default, {
href: settings.href,
page: settings.page,
key: "link-token-".concat(tokenId)
}, settings.tokens && generateMaterialDocsFromMarkdown(settings.tokens, storage, tokenId + key));
}
case "br":
return /*#__PURE__*/_react.default.createElement("br", {
key: "br-token-".concat(tokenId)
});
case "hr":
return /*#__PURE__*/_react.default.createElement(_Divider.default, {
key: "hr-token-".concat(tokenId)
});
case "strong":
return /*#__PURE__*/_react.default.createElement(_Bold.default, {
key: "strong-token-".concat(tokenId)
}, token.tokens && generateMaterialDocsFromMarkdown(token.tokens, storage, tokenId + key));
case "em":
return /*#__PURE__*/_react.default.createElement(_Italic.default, {
key: "em-token-".concat(tokenId)
}, token.tokens && generateMaterialDocsFromMarkdown(token.tokens, storage, tokenId + key));
case "image":
return /*#__PURE__*/_react.default.createElement(_Image.default, {
src: token.href,
alt: token.text,
key: "image-token-".concat(tokenId)
});
case "table":
var header = token.tokens.header;
var cells = token.tokens.cells;
return /*#__PURE__*/_react.default.createElement(_Table.default, {
key: "table-token-".concat(tokenId)
}, /*#__PURE__*/_react.default.createElement(_TableHead.default, null, /*#__PURE__*/_react.default.createElement(_TableRow.default, null, header.map(function (cell, index) {
return /*#__PURE__*/_react.default.createElement(_TableCell.default, {
key: "markdown-table-head-cell-".concat(index)
}, /*#__PURE__*/_react.default.createElement(_Bold.default, null, cell && generateMaterialDocsFromMarkdown(cell, storage, tokenId + key)));
}))), /*#__PURE__*/_react.default.createElement(_TableBody.default, null, cells.map(function (row, index) {
return /*#__PURE__*/_react.default.createElement(_TableRow.default, {
key: "markdown-table-row-".concat(index)
}, row.map(function (cell, index) {
return /*#__PURE__*/_react.default.createElement(_TableCell.default, {
key: "markdown-table-cell-".concat(index)
}, cell && generateMaterialDocsFromMarkdown(cell, storage, tokenId + key));
}));
})));
case "blockquote":
return /*#__PURE__*/_react.default.createElement(_Block.default, {
key: "blockquote-token-".concat(tokenId)
}, token.tokens && generateMaterialDocsFromMarkdown(token.tokens, storage, tokenId + key));
default:
return null;
}
}));
}