@yuntijs/ui
Version:
☁️ Yunti UI - an open-source UI component library for building Cloud Native web apps
277 lines (264 loc) • 10.6 kB
JavaScript
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 `})`;
// },
// 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));