import { BASELINE_CONCERN, BASELINE_NAME, DOC_STATUS, DOC_TYPE } from "#configuration/constants/tone.constants"; import { BASELINE_HEADERS, BASELINE_INTRO, BASELINE_SUMMARY, BASELINE_TITLE, GENERATED_BANNER, } from "#configuration/strings/baseline.strings"; import { LINE_END } from "#configuration/constants/inventory.constants"; import type { ToneBaseline } from "#types/tone.types"; const FRONTMATTER = "---"; const CELL = " | "; const EDGE = "| "; const EDGE_END = " |"; const RULE = "---"; const HEADING = "# "; const DECIMALS = 1; const row = function row(cells: readonly string[]): string { return EDGE + cells.join(CELL) + EDGE_END; }; const wordsPerSentence = function wordsPerSentence(words: number, sentences: number): string { return sentences === 0 ? String(0) : (words / sentences).toFixed(DECIMALS); }; export const renderBaseline = function renderBaseline(baseline: ToneBaseline): string { const lines = [ FRONTMATTER, `type: ${DOC_TYPE}`, `name: ${BASELINE_NAME}`, `summary: ${BASELINE_SUMMARY}`, `concern: ${BASELINE_CONCERN}`, `status: ${DOC_STATUS}`, FRONTMATTER, "", GENERATED_BANNER, "", HEADING + BASELINE_TITLE, "", BASELINE_INTRO, "", row(BASELINE_HEADERS), row(BASELINE_HEADERS.map(() => RULE)), ]; for (const metrics of baseline.modules) { lines.push( row([ metrics.module, String(metrics.literals), String(metrics.sentences), wordsPerSentence(metrics.words, metrics.sentences), String(metrics.longestSentence), String(metrics.agentlessPassives), String(metrics.chainedSentences), String(metrics.longDashes), String(metrics.semicolons), String(metrics.digitMetrics), String(metrics.bannedTerms), String(metrics.firstPerson), String(metrics.secondPerson), String(metrics.collectivePerson), String(metrics.labelledItems), ]), ); } return lines.join(LINE_END) + LINE_END; };