nice-ui
Version:
React design system, components, and utilities
173 lines (172 loc) • 5.9 kB
JavaScript
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;
},
};
;