UNPKG

@dnb/eufemia

Version:

DNB Eufemia Design System UI Library

145 lines (144 loc) 4.72 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = renderWithFormatting; var _push = _interopRequireDefault(require("core-js-pure/stable/instance/push.js")); var _react = _interopRequireWildcard(require("react")); var _InlineLink = _interopRequireDefault(require("./internal/InlineLink.js")); var _Code = _interopRequireDefault(require("../elements/Code.js")); function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); } function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; } const Strong = c => _react.default.createElement("strong", null, c); const Em = c => _react.default.createElement("em", null, c); const Code = c => _react.default.createElement(_Code.default, null, c); const Link = (c, href) => _react.default.createElement(_InlineLink.default, { href: href, rel: "noopener noreferrer" }, c); function renderWithFormatting(text, { br = '{br}', strong = Strong, em = Em, link = Link, code = Code } = {}) { if (typeof text === 'string') { const HAS_MARKERS_RE = /(`[^`]+`|\[[^\]]+\]\([^)\s]+\)|\bhttps?:\/\/[^\s<>()]+|\*\*[^*]+\*\*|_[^_]+_)/; const hasFormatting = br && text.includes(br) || HAS_MARKERS_RE.test(text); if (!hasFormatting) { return text; } } return withFormatting(text, { strong, em, br, link, code }); } function withFormatting(text, { br, strong, em, link, code }) { let nodes = Array.isArray(text) ? text : [text]; nodes = splitToken(nodes, br, ({ k }) => _react.default.createElement("br", { key: k() })); const codeRe = /(`[^`]+`)/g; nodes = replaceInStrings(nodes, codeRe, (m, { k }) => [_react.default.createElement(_react.Fragment, { key: `c-${k()}` }, code(m[0].slice(1, -1)))]); const linkRe = /\[([^\]]+)\]\(([^)\s]+)\)/g; nodes = replaceInStrings(nodes, linkRe, (m, { k }) => { const [, label, href] = m; const children = withFormatting(label, { br, strong, em, link, code }); return [_react.default.createElement(_react.Fragment, { key: `a-${k()}` }, link(children, href))]; }); const bareUrlRe = /\b((?:https?:\/\/)[^\s<>()]+)\b/g; nodes = replaceInStrings(nodes, bareUrlRe, (m, { k }) => { const href = m[1]; return [_react.default.createElement(_react.Fragment, { key: `l-${k()}` }, link(href, href))]; }); const boldRe = /\*\*([^*]+)\*\*/g; nodes = replaceInStrings(nodes, boldRe, (m, { k }) => [_react.default.createElement(_react.Fragment, { key: `b-${k()}` }, strong(m[1]))]); const italicRe = /_([^_]+)_/g; nodes = replaceInStrings(nodes, italicRe, (m, { k }) => [_react.default.createElement(_react.Fragment, { key: `i-${k()}` }, em(m[1]))]); return _react.default.createElement(_react.Fragment, { key: "renderWithFormatting" }, nodes); } function replaceInStrings(nodes, re, replacer) { let key = 0; const k = () => String(key++); return nodes.flatMap((n, i) => { if (typeof n !== 'string') return [n]; const out = []; let last = 0; let m; while ((m = re.exec(n)) !== null) { const before = n.slice(last, m.index); if (before) (0, _push.default)(out).call(out, before); (0, _push.default)(out).call(out, ...replacer(m, { i, k })); last = m.index + m[0].length; if (re.lastIndex === m.index) re.lastIndex++; } const tail = n.slice(last); if (tail) (0, _push.default)(out).call(out, tail); return out; }); } function splitToken(nodes, token, make) { let key = 0; const k = () => String(key++); return nodes.flatMap((n, i) => { if (typeof n !== 'string') return [n]; const parts = n.split(token); const out = []; parts.forEach((chunk, idx) => { if (chunk) (0, _push.default)(out).call(out, chunk); if (idx < parts.length - 1) (0, _push.default)(out).call(out, _react.default.createElement(_react.Fragment, { key: k() }, make({ i, idx, k }))); }); return out; }); } //# sourceMappingURL=renderWithFormatting.js.map