UNPKG

nice-ui

Version:

React design system, components, and utilities

173 lines (172 loc) 5.9 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.pageutils = exports.augmentContentPages = exports.openInNewTab = exports.downloadFile = exports.downloadPageAsMarkdown = void 0; const parser_1 = require("../../markdown/parser"); const concurrency_1 = require("thingies/lib/concurrency"); const appendPage = async (page, result, parents) => { if (!page.src) return; result.text += '---\n\n'; result.text += `# ${parents.length ? parents.join(' > ') + ' > ' : ''}${page.name}\n\n`; result.text += await page.src(); result.text += '\n\n'; if (page.children && page.children.length) { for (const child of page.children) { await appendPage(child, result, [...parents, page.name]); } } }; const downloadPageAsMarkdown = async (page) => { const result = { text: '', }; await appendPage(page, result, []); return result; }; exports.downloadPageAsMarkdown = downloadPageAsMarkdown; const downloadFile = (filename, text, mime = 'text/plain') => { const element = document.createElement('a'); element.setAttribute('href', `data:${mime};charset=utf-8,` + encodeURIComponent(text)); element.setAttribute('download', filename); element.style.display = 'none'; document.body.appendChild(element); element.click(); document.body.removeChild(element); }; exports.downloadFile = downloadFile; const openInNewTab = (title, text) => { const w = window.open(''); if (!w) return; w.document.write(`<pre>${text}</pre>`); w.document.title = title; }; exports.openInNewTab = openInNewTab; const augmentContentPages = (page, parent) => { page.parent = parent; if (typeof page.slug !== 'string' && page.name) page.slug = page.name.toLowerCase().replace(/\s+/g, '-'); if (!page.steps) page.steps = page.slug ? [...(parent?.steps ?? []), page.slug] : []; page.to = '/' + page.steps.join('/'); if (page.children) { const length = page.children.length; for (let i = 0; i < length; i++) { const child = page.children[i]; (0, exports.augmentContentPages)(child, page); } } if (page.src && !page.md) { page.md = async () => { if (!page._md) page._md = page.src().then((src) => (0, parser_1.md)(src)); return await page._md; }; } }; exports.augmentContentPages = augmentContentPages; const preloadLimiter = (0, concurrency_1.concurrency)(3); const preload = (exec) => { preloadLimiter(exec).catch((error) => { console.log('Preload error'); // eslint-disable-line no-console console.error(error); // eslint-disable-line no-console }); }; exports.pageutils = { title: (page) => { return page.title || page.name || page.slug; }, prevSibling: (page) => { if (!page.parent) return undefined; const siblings = page.parent.children; if (!siblings) return; const index = siblings.indexOf(page); return index === -1 ? undefined : siblings[index - 1]; }, nextSibling: (page) => { const parent = page.parent; if (!parent) return undefined; const siblings = parent.children; if (!siblings) return; const index = siblings.indexOf(page); return index === -1 ? undefined : siblings[index + 1]; }, prev: (page) => { const prev = exports.pageutils.prevSibling(page); if (prev && prev.children && prev.children.length) { let lastChild = prev.children[prev.children.length - 1]; while (lastChild.children && lastChild.children.length) { lastChild = lastChild.children[lastChild.children.length - 1]; } return lastChild; } if (prev) return prev; return page.parent; }, next: (page, noParentCrawl) => { const children = page.children; if (children && children.length) return children[0]; const sibling = exports.pageutils.nextSibling(page); if (sibling) return sibling; if (!noParentCrawl) { while (page.parent) { const parent = page.parent; const nextSibling = exports.pageutils.nextSibling(parent); if (nextSibling) return nextSibling; page = parent; } } return; }, /** @todo This could internally use `.walk()` implementation. */ find: (page, to) => { if (typeof to === 'string') to = to.slice(1).split('/'); let index = 0; let curr = page; while (curr) { if (index >= to.length) return curr; const slug = to[index++]; const children = curr.children; if (!children) return undefined; curr = children.find((child) => child.slug === slug); } return; }, preloadChildren: async (page) => { if (!page.children) return; for (let i = 0; i < page.children.length; i++) { const child = page.children[i]; if (child && child.md) preload(() => child.md()); exports.pageutils.preloadChildren(child); } }, walk(page, steps, index = 0) { const list = []; let curr = page; // eslint-disable-next-line no-constant-condition while (true) { const children = curr.children; if (!children) break; curr = children.find((c) => c.slug === steps[index]); index++; if (!curr) break; list.push(curr); } return list; }, };