import { resolve } from 'node:path'; import { readdir, writeFile } from 'node:fs/promises'; import { statSync } from 'node:fs'; import { Path, Structure } from './builder-model'; import { CustomTemplates, Example, ExtraStrings, linker, shareLink, toc } from './templates'; export const buildLanding = async ({ structure, examplesDir, lang, outFile, strings, templates }: LandingParameters) => { const examples = await readdir(examplesDir); const landingHtml = await landingTemplate( { structure, strings, lang, templates }, examples.reduce((examples: Example[], folder) => { const fullName = resolve(examplesDir, folder); if (statSync(fullName).isDirectory()) { const name = folder.match(/^\d+\. (.+)$/)![1]; examples.push({ name, path: `examples/${folder}` as Path }); } return examples; }, []) ); await writeFile(outFile, landingHtml); }; export const landingTemplate = async ( { structure, strings, lang, templates }: Omit, examples: Example[] ) => { const link = linker(strings, lang); return ` ${strings.author}. ${strings.title} ${strings.landing.content.join('\n')} ${ strings.landing.download ? `

${strings.landing.download} PDF / EPUB ${ strings.landing.or } ${strings.landing.readOnline}.

` : `

${strings.landing.readOnline}.

` }

${strings.toc}

${await toc({ structure, strings, templates, lang }, examples)}

${strings.landing.license}

${strings.sourceCodeAt} ${ strings.links.githubString }

${strings.aboutMe.title}

${strings.aboutMe.content.join('\n')}
${strings.landing.footer.join('\n')} `; }; export interface LandingParameters { structure: Structure; examplesDir: Path; lang: string; outFile: Path; strings: ExtraStrings; templates: CustomTemplates; }