import Template from 'template'; import AccountNode from 'type/node/account'; import getManifest from 'utility/get-manifest'; import AccountMenuTemplate from 'template/partial/account-menu'; export interface Breadcrumb { readonly label: string; readonly url?: string; } export interface PageTemplateInput { readonly account: AccountNode; } abstract class PageTemplate extends Template { protected getHtml(): string { const document_title = this.getDocumentTitle(); const account_menu_html = this.getAccountMenuHtml(); const breadcrumbs_html = this.getBreadcrumbsHtml(); const content_title = this.getContentTitle(); const content_html = this.getContentHtml(); const footer_html = this.getFooterHtml(); return ` ${document_title}
${account_menu_html}

${content_title}

${content_html}

${footer_html}
`; } protected getDocumentTitle(): string { return this.getContentTitle(); } protected getAccount(): AccountNode { const input = this.getInput(); return input.account; } private getAccountMenuHtml(): string { const account = this.getAccount(); const template = new AccountMenuTemplate({ account }); return template.render(); } private getBreadcrumbsHtml(): string { const breadcrumbs = this.getBreadcrumbs(); const serialized_breadcrumbs = breadcrumbs.map((breadcrumb) => { return this.getBreadcrumbHtml(breadcrumb); }); return serialized_breadcrumbs.join(` > `); } private getBreadcrumbHtml(breadcrumb: Breadcrumb): string { if (breadcrumb.url === undefined) { return `${breadcrumb.label}`; } return ` ${breadcrumb.label} `; } private getFooterHtml(): string { const manifest = getManifest(); const project_name = manifest.name; const version = manifest.version; let url: string; if (manifest.homepage !== undefined) { url = manifest.homepage; } else { url = `https://npmjs.com/package/${project_name}`; } return ` Running ${project_name} v${version} `; } protected abstract getBreadcrumbs(): Breadcrumb[]; protected abstract getContentTitle(): string; protected abstract getContentHtml(): string; } export default PageTemplate;