UNPKG

@yuntijs/ui

Version:

☁️ Yunti UI - an open-source UI component library for building Cloud Native web apps

277 lines (264 loc) 10.6 kB
import _toConsumableArray from "@babel/runtime/helpers/esm/toConsumableArray"; function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; } import { $convertFromMarkdownString, $convertToMarkdownString, ELEMENT_TRANSFORMERS, MULTILINE_ELEMENT_TRANSFORMERS, TEXT_FORMAT_TRANSFORMERS, TEXT_MATCH_TRANSFORMERS } from '@lexical/markdown'; import { $createHorizontalRuleNode, $isHorizontalRuleNode, HorizontalRuleNode } from '@lexical/react/LexicalHorizontalRuleNode'; import { $createTableCellNode, $createTableNode, $createTableRowNode, $isTableCellNode, $isTableNode, $isTableRowNode, TableCellHeaderStates, TableCellNode, TableNode, TableRowNode } from '@lexical/table'; import { $isParagraphNode, $isTextNode } from 'lexical'; import { CHECK_LIST, ORDERED_LIST, UNORDERED_LIST } from "./transformers"; // 扩展参考 https://github.com/facebook/lexical/blob/main/packages/lexical-playground/src/plugins/MarkdownTransformers/index.ts // import { // $createEquationNode, // $isEquationNode, // EquationNode, // } from '../../nodes/EquationNode'; // import {$createImageNode, $isImageNode, ImageNode} from '../../nodes/ImageNode'; // import {$createTweetNode, $isTweetNode, TweetNode} from '../../nodes/TweetNode'; // import emojiList from '../../utils/emoji-list'; export var HR = { dependencies: [HorizontalRuleNode], export: function _export(node) { return $isHorizontalRuleNode(node) ? '***' : null; }, regExp: /^(---|\*\*\*|___)\s?$/, replace: function replace(parentNode, _1, _2, isImport) { var line = $createHorizontalRuleNode(); // TODO: Get rid of isImport flag if (isImport || parentNode.getNextSibling() !== null) { parentNode.replace(line); } else { parentNode.insertBefore(line); } line.selectNext(); }, type: 'element' }; // export const IMAGE: TextMatchTransformer = { // dependencies: [ImageNode], // export: (node) => { // if (!$isImageNode(node)) { // return null; // } // return `![${node.getAltText()}](${node.getSrc()})`; // }, // importRegExp: /!(?:\[([^[]*)\])(?:\(([^(]+)\))/, // regExp: /!(?:\[([^[]*)\])(?:\(([^(]+)\))$/, // replace: (textNode, match) => { // const [, altText, src] = match; // const imageNode = $createImageNode({ // altText, // maxWidth: 800, // src, // }); // textNode.replace(imageNode); // }, // trigger: ')', // type: 'text-match', // }; // export const EMOJI: TextMatchTransformer = { // dependencies: [], // export: () => null, // importRegExp: /:([a-z0-9_]+):/, // regExp: /:([a-z0-9_]+):$/, // replace: (textNode, [, name]) => { // const emoji = emojiList.find((e) => e.aliases.includes(name))?.emoji; // if (emoji) { // textNode.replace($createTextNode(emoji)); // } // }, // trigger: ':', // type: 'text-match', // }; // export const EQUATION: TextMatchTransformer = { // dependencies: [EquationNode], // export: (node) => { // if (!$isEquationNode(node)) { // return null; // } // return `$${node.getEquation()}$`; // }, // importRegExp: /\$([^$]+?)\$/, // regExp: /\$([^$]+?)\$$/, // replace: (textNode, match) => { // const [, equation] = match; // const equationNode = $createEquationNode(equation, true); // textNode.replace(equationNode); // }, // trigger: '$', // type: 'text-match', // }; // export const TWEET: ElementTransformer = { // dependencies: [TweetNode], // export: (node) => { // if (!$isTweetNode(node)) { // return null; // } // return `<tweet id="${node.getId()}" />`; // }, // regExp: /<tweet id="([^"]+?)"\s?\/>\s?$/, // replace: (textNode, _1, match) => { // const [, id] = match; // const tweetNode = $createTweetNode(id); // textNode.replace(tweetNode); // }, // type: 'element', // }; // Very primitive table setup var TABLE_ROW_REG_EXP = /^\|(.+)\|\s?$/; var TABLE_ROW_DIVIDER_REG_EXP = /^(\| ?:?-*:? ?)+\|\s?$/; export var TABLE = { dependencies: [TableNode, TableRowNode, TableCellNode], export: function _export(node) { if (!$isTableNode(node)) { return null; } var output = []; var _iterator = _createForOfIteratorHelper(node.getChildren()), _step; try { for (_iterator.s(); !(_step = _iterator.n()).done;) { var row = _step.value; var rowOutput = []; if (!$isTableRowNode(row)) { continue; } var isHeaderRow = false; var _iterator2 = _createForOfIteratorHelper(row.getChildren()), _step2; try { for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) { var cell = _step2.value; // It's TableCellNode so it's just to make flow happy if ($isTableCellNode(cell)) { rowOutput.push($convertToMarkdownString(PLAYGROUND_TRANSFORMERS, cell).replaceAll('\n', '\\n').trim()); if (cell.__headerState === TableCellHeaderStates.ROW) { isHeaderRow = true; } } } } catch (err) { _iterator2.e(err); } finally { _iterator2.f(); } output.push("| ".concat(rowOutput.join(' | '), " |")); if (isHeaderRow) { output.push("| ".concat(rowOutput.map(function (_) { return '---'; }).join(' | '), " |")); } } } catch (err) { _iterator.e(err); } finally { _iterator.f(); } return output.join('\n'); }, regExp: TABLE_ROW_REG_EXP, replace: function replace(parentNode, _1, match) { // Header row if (TABLE_ROW_DIVIDER_REG_EXP.test(match[0])) { var _table = parentNode.getPreviousSibling(); if (!_table || !$isTableNode(_table)) { return; } var _rows = _table.getChildren(); var lastRow = _rows.at(-1); if (!lastRow || !$isTableRowNode(lastRow)) { return; } // Add header state to row cells var _iterator3 = _createForOfIteratorHelper(lastRow.getChildren()), _step3; try { for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) { var cell = _step3.value; if (!$isTableCellNode(cell)) { continue; } cell.setHeaderStyles(TableCellHeaderStates.ROW, TableCellHeaderStates.ROW); } // Remove line } catch (err) { _iterator3.e(err); } finally { _iterator3.f(); } parentNode.remove(); return; } var matchCells = mapToTableCells(match[0]); if (matchCells === null) { return; } var rows = [matchCells]; var sibling = parentNode.getPreviousSibling(); var maxCells = matchCells.length; while (sibling) { if (!$isParagraphNode(sibling)) { break; } if (sibling.getChildrenSize() !== 1) { break; } var firstChild = sibling.getFirstChild(); if (!$isTextNode(firstChild)) { break; } var cells = mapToTableCells(firstChild.getTextContent()); if (cells === null) { break; } maxCells = Math.max(maxCells, cells.length); rows.unshift(cells); var _previousSibling = sibling.getPreviousSibling(); sibling.remove(); sibling = _previousSibling; } var table = $createTableNode(); for (var _i = 0, _rows2 = rows; _i < _rows2.length; _i++) { var _cells = _rows2[_i]; var tableRow = $createTableRowNode(); table.append(tableRow); for (var i = 0; i < maxCells; i++) { tableRow.append(i < _cells.length ? _cells[i] : $createTableCell('')); } } var previousSibling = parentNode.getPreviousSibling(); if ($isTableNode(previousSibling) && getTableColumnsSize(previousSibling) === maxCells) { previousSibling.append.apply(previousSibling, _toConsumableArray(table.getChildren())); parentNode.remove(); } else { parentNode.replace(table); } table.selectEnd(); }, type: 'element' }; function getTableColumnsSize(table) { var row = table.getFirstChild(); return $isTableRowNode(row) ? row.getChildrenSize() : 0; } var $createTableCell = function $createTableCell(textContent) { textContent = textContent.replaceAll('\\n', '\n'); var cell = $createTableCellNode(TableCellHeaderStates.NO_STATUS); $convertFromMarkdownString(textContent, PLAYGROUND_TRANSFORMERS, cell); return cell; }; var mapToTableCells = function mapToTableCells(textContent) { var match = textContent.match(TABLE_ROW_REG_EXP); if (!match || !match[1]) { return null; } return match[1].split('|').map(function (text) { return $createTableCell(text); }); }; export var PLAYGROUND_TRANSFORMERS = [TABLE, HR, // IMAGE, // EMOJI, // EQUATION, // TWEET, UNORDERED_LIST, ORDERED_LIST, CHECK_LIST].concat(_toConsumableArray(ELEMENT_TRANSFORMERS), _toConsumableArray(MULTILINE_ELEMENT_TRANSFORMERS), _toConsumableArray(TEXT_FORMAT_TRANSFORMERS), _toConsumableArray(TEXT_MATCH_TRANSFORMERS));