import Handlebars from "handlebars"; import spdxLicenseList from "spdx-license-list"; import { marked } from "marked"; import sanitizeHtml from "sanitize-html"; export function createOutput( data: any, catalogData: any, templateType: any, templateString: string ): string { const template = Handlebars.compile(templateString); if (catalogData) { data.catalog = catalogData; } const date = new Date(); data.now = date.toLocaleDateString(); const getCatalogChapter = (chapterId: string): any => { for (const chapter of catalogData.chapters) { if (chapter.id === chapterId) { return chapter; } } }; Handlebars.registerHelper("catalogChapter", getCatalogChapter); Handlebars.registerHelper( "catalogCriteriaLabel", function (chapterId, criteriaNum) { for (const chapter of catalogData.chapters) { if (chapter.id === chapterId) { for (const catalogChapterCriteria of chapter.criteria) { if (catalogChapterCriteria.id === criteriaNum) { return catalogChapterCriteria.handle; } } } } } ); Handlebars.registerHelper( "catalogCriteriaURL", function (chapterId, criteriaNum, url) { for (const chapter of catalogData.chapters) { if (chapter.id === chapterId) { for (const catalogChapterCriteria of chapter.criteria) { if (catalogChapterCriteria.id === criteriaNum) { return `${url}#${catalogChapterCriteria.alt_id}`; } } } } } ); const getCatalogComponentLabel = (componentId: string): any => { if (catalogData.components) { for (const component of catalogData.components) { if (component.id === componentId) { if (component.label != "") { return component.label; } else { return "All"; } } } } }; Handlebars.registerHelper("catalogComponentLabel", function (componentId) { if (catalogData.components) { for (const component of catalogData.components) { if (component.id === componentId) { if (component.label != "") { if (templateType === "html") { return new Handlebars.SafeString( `${component.label}: ` ); } else { return `**${component.label}**: `; } } } } } }); const getLevelLabel = (level: string): any => { if (catalogData.terms) { for (const terms of catalogData.terms) { if (terms.id === level) { return terms.label; } } } // If a level is provided but has no matching terms, provide a default. return "Not Applicable"; }; Handlebars.registerHelper("levelLabel", getLevelLabel); Handlebars.registerHelper("standardsIncluded", function (standardChapters) { const result = []; for (const standardChapter of standardChapters) { const catalogChapters = getCatalogChapter(standardChapter); if (data.chapters[standardChapter]) { if ( !data.chapters[standardChapter].disabled || data.chapters[standardChapter].notes ) { result.push(`
  • ${catalogChapters.label}
  • `); } } } return new Handlebars.SafeString(``); }); Handlebars.registerHelper("license", function () { if (data.license) { if (templateType === "html") { return new Handlebars.SafeString( `${ spdxLicenseList[data.license].name } (opens in a new window or tab)` ); } else { return `[${spdxLicenseList[data.license].name}](${ spdxLicenseList[data.license].url })`; } } else { if (templateType === "html") { return new Handlebars.SafeString( `${spdxLicenseList["CC-BY-4.0"].name} (opens in a new window or tab)` ); } else { return `[${spdxLicenseList["CC-BY-4.0"].name}](${spdxLicenseList["CC-BY-4.0"].url})`; } } }); Handlebars.registerHelper("concat", function (a, b) { if (b) { return a + b; } return a; }); Handlebars.registerHelper( "headerWithAnchor", function (headerText, idText, headerLevel) { return new Handlebars.SafeString(` ${headerText} Anchor link `); } ); Handlebars.registerHelper("reportFilename", function (reportVersion) { let reportFilename = data.product.name.toLowerCase(); if (data.product.version) { reportFilename += "-" + data.product.version; } if (reportVersion && data.version) { reportFilename += "-" + data.version; } return reportFilename; }); Handlebars.registerHelper("levelCount", function (components) { let levelCount = 0; for (const component of components) { if (component.adherence && component.adherence.level) { levelCount = levelCount + 1; } } return levelCount; }); Handlebars.registerHelper("progressPerChapter", function (criterias) { let tableHeader = ""; let tableHeaderMarkdownUnderline = ""; const tableCounts: any[] = []; for (const component of criterias[0].components) { if (templateType === "html") { tableHeader += `${getCatalogComponentLabel(component.name)}`; } else { tableHeader += ` | ${getCatalogComponentLabel(component.name)}`; tableHeaderMarkdownUnderline += " | ---"; } tableCounts[component.name] = []; } for (const criteria of criterias) { if (criteria.components) { for (const component of criteria.components) { if (component.adherence) { if (tableCounts[component.name] === undefined) { if (templateType === "html") { tableHeader += `${getCatalogComponentLabel( component.name )}`; } else { tableHeader += ` | ${getCatalogComponentLabel(component.name)}`; tableHeaderMarkdownUnderline += " | ---"; } tableCounts[component.name] = []; } if (tableCounts[component.name][component.adherence.level]) { tableCounts[component.name][component.adherence.level] += 1; } else { tableCounts[component.name][component.adherence.level] = 1; } } } } } let tableBody = ""; if (catalogData.terms) { for (const term of catalogData.terms) { if (term.label != "" && term.id != "not-evaluated") { if (templateType === "html") { tableBody += `${getLevelLabel(term.id)}`; } else { tableBody += `| ${getLevelLabel(term.id)}`; } for (const component in tableCounts) { if (templateType === "html") { if (tableCounts[component] && tableCounts[component][term.id]) { tableBody += `${tableCounts[component][term.id]}`; } else { tableBody += "0"; } } else { if (tableCounts[component] && tableCounts[component][term.id]) { tableBody += ` | ${tableCounts[component][term.id]}`; } else { tableBody += " | 0"; } } } if (templateType === "html") { tableBody += ""; } else { tableBody += ` | `; } } } } if (templateType === "html") { return new Handlebars.SafeString( `Conformance Level${tableHeader}${tableBody}` ); } else { return `| Conformance Level${tableHeader} | | ---${tableHeaderMarkdownUnderline} | ${tableBody}`; } }); Handlebars.registerHelper("sanitizeMarkdown", function (text) { const markdown = marked.parse(text); return new Handlebars.SafeString(sanitizeHtml(markdown)); }); return template(data); }