UNPKG

@curvenote/cli

Version:
86 lines (85 loc) 3.65 kB
import { KINDS, NavListItemKindEnum } from '@curvenote/blocks'; import { Project } from '../../../models.js'; import { articleToMarkdown } from '../markdown.js'; import { notebookToIpynb } from '../notebook.js'; import { getBlockAndLatestVersion } from '../utils/getBlockAndLatestVersion.js'; import { writeBibtex } from '../utils/writeBibtex.js'; import { writeConfig } from './config.js'; import { writeTOC } from './toc.js'; async function pullAll(session, nav, opts) { const { bibtex = 'references.bib' } = opts ?? {}; const blocks = await Promise.all(nav.data.items.map((item) => { if (item.kind === NavListItemKindEnum.Item) return getBlockAndLatestVersion(session, item.blockId).catch(() => null); return null; })); const articles = await Promise.all(blocks.map(async (blockData) => { if (!blockData) return null; const { block, version } = blockData; if (!version) { session.log.error(`Unable to download "${block.data.name}" - do you need to save the draft?`); return null; } switch (block.data.kind) { case KINDS.Article: { const filename = `${block.data.name ?? block.id.block}.md`; try { const article = await articleToMarkdown(session, version.id, { ...opts, filename, writeBibtex: false, }); return article; } catch (error) { session.log.debug(`\n\n${error?.stack}\n\n`); session.log.error(`Problem downloading article: ${block.data.name}`); return null; } } case KINDS.Notebook: { const filename = `${block.data.name ?? block.id.block}.ipynb`; try { const article = await notebookToIpynb(session, version.id, { ...opts, filename }); return article; } catch (error) { session.log.debug(`\n\n${error?.stack}\n\n`); session.log.error(`Problem downloading notebook: ${block.data.name}`); return null; } } default: session.log.warn(`Skipping block: "${block.data.name}" of kind "${block.data.kind}"`); return null; } })); const references = articles.reduce((obj, a) => ({ ...obj, ...a?.references }), {}); await writeBibtex(session, references, bibtex, { path: opts?.path, alwaysWriteFile: false }); } /** * Write jupyterbook from project * * Logs an error if no version of the nav is saved. */ export async function projectToJupyterBook(session, projectId, opts) { const [project, { version: nav }] = await Promise.all([ new Project(session, projectId).get(), getBlockAndLatestVersion(session, { project: projectId, block: 'nav' }), ]); if (!nav) { session.log.error(`Unable to load project navigation "${project.data.name}" - please save any article in your project?`); return; } if (opts.writeConfig ?? true) { writeConfig(session, { path: opts.path, title: project.data.title, author: project.data.team, url: `${session.config.editorUrl}/@${project.data.team}/${project.data.name}`, }); } await writeTOC(session, nav, { path: opts.path, ci: opts.ci }); await pullAll(session, nav, { bibtex: 'references.bib', ...opts }); }