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}
`);
}
);
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);
}