export type PaperPreview = { title: string; fileName: string; extension: string; href: string; }; export type DiagramPreview = { title: string; fileName: string; href: string; caption: string; }; export type CodeShowcaseItem = { id: string; title: string; summary: string; language: string; relativePath: string; rawHref: string; snippet: string; }; const escapeHtml = (value: string): string => { return value .replace(/&/g, '&') .replace(//g, '>') .replace(/"/g, '"') .replace(/'/g, '''); }; const renderPaperCard = (paper: PaperPreview, index: number): string => { const safeTitle = escapeHtml(paper.title); const safeFileName = escapeHtml(paper.fileName); const safeExtension = escapeHtml(paper.extension.toUpperCase()); const safeHref = escapeHtml(paper.href); const animationDelayMs = 80 * index; return `

${safeTitle}

${safeExtension}

${safeFileName}

Open Download
`; }; const renderDiagramCard = (diagram: DiagramPreview): string => { const safeTitle = escapeHtml(diagram.title); const safeFileName = escapeHtml(diagram.fileName); const safeCaption = escapeHtml(diagram.caption); const safeHref = escapeHtml(diagram.href); return `
${safeTitle}

${safeTitle}

${safeCaption}

${safeFileName} Open full-size diagram
`; }; const renderCodeCard = (item: CodeShowcaseItem): string => { const safeTitle = escapeHtml(item.title); const safeSummary = escapeHtml(item.summary); const safeLanguage = escapeHtml(item.language.toUpperCase()); const safePath = escapeHtml(item.relativePath); const safeHref = escapeHtml(item.rawHref); const safeSnippet = escapeHtml(item.snippet); return `

${safeTitle}

${safeSummary}

${safeLanguage}

${safePath}

${safeSnippet}
Open full file
`; }; const renderHomePage = ( papers: PaperPreview[], diagrams: DiagramPreview[], codeShowcase: CodeShowcaseItem[], ): string => { const papersMarkup = papers.length > 0 ? papers.map((paper, index) => renderPaperCard(paper, index)).join('\n') : `

No papers detected yet

Add your files to the repository projects/ directory to auto-populate this section.

`; const diagramsMarkup = diagrams.length > 0 ? diagrams.map((diagram) => renderDiagramCard(diagram)).join('\n') : `

No diagrams found

Run the diagram scripts under docs/diagrams to generate images for this showcase.

`; const codeMarkup = codeShowcase.length > 0 ? codeShowcase.map((item) => renderCodeCard(item)).join('\n') : `

No code showcase files mapped

Add curated code file entries in web/src/app.ts to populate this section.

`; return ` Devansh Patel Portfolio

Devansh Patel

Research, strategy, and execution in one portfolio

This is the journey of one, Devansh Patel through their Master of Business Administration.

Embedded Papers

${papers.length} document${papers.length === 1 ? '' : 's'} detected

${papersMarkup}

Project Architecture and Code Showcase

This section highlights the infrastructure diagrams and implementation files behind this portfolio deployment.

Diagrams

${diagrams.length} diagram${diagrams.length === 1 ? '' : 's'} available

${diagramsMarkup}

Code Highlights

${codeShowcase.length} curated file${codeShowcase.length === 1 ? '' : 's'}

${codeMarkup}
`; }; export default renderHomePage;