Trace every CR to a test case or delivered document, drop the draft FR/NFR remark column, record lessons learned, replace the three change reports with a change-control register, add high-level diagrams and wireframes to the design, plan verification rounds with dates and hours, and base the validation result on the Customer Requirements.
35 lines
1.7 KiB
JavaScript
35 lines
1.7 KiB
JavaScript
// Rasterise the Software Design figures (scripts/sdlc-seed/figures.mjs) to PNG with the
|
|
// document font, so Thai labels print the same in the PDF and survive the Word conversion.
|
|
// Usage: node scripts/sdlc-delivery/render-figures.mjs
|
|
import fs from 'node:fs/promises';
|
|
import path from 'node:path';
|
|
import { fileURLToPath } from 'node:url';
|
|
import { chromium } from 'playwright';
|
|
import { FIGURES } from '../sdlc-seed/figures.mjs';
|
|
|
|
const here = path.dirname(fileURLToPath(import.meta.url));
|
|
const output = path.resolve(here, '../sdlc-seed/figures');
|
|
|
|
async function main() {
|
|
const font = await fs.readFile(path.join(here, 'assets/LeelawadeeUI.ttf'));
|
|
const fontFace = `@font-face { font-family: "BRN Thai"; src: url(data:font/ttf;base64,${font.toString('base64')}) format("truetype"); font-weight: 400 700; }`;
|
|
await fs.mkdir(output, { recursive: true });
|
|
const browser = await chromium.launch({ headless: true });
|
|
try {
|
|
const page = await (await browser.newContext({ deviceScaleFactor: 2 })).newPage();
|
|
for (const [file, , draw] of Object.values(FIGURES)) {
|
|
const svg = draw();
|
|
const [, w, h] = svg.match(/width="(\d+)" height="(\d+)"/);
|
|
await page.setViewportSize({ width: Number(w), height: Number(h) });
|
|
await page.setContent(`<!doctype html><html><head><meta charset="utf-8"><style>${fontFace} html,body{margin:0}</style></head><body>${svg}</body></html>`);
|
|
await page.evaluate(() => document.fonts.ready);
|
|
await page.locator('svg').first().screenshot({ path: path.join(output, `${file}.png`) });
|
|
console.log(`Rendered figures/${file}.png`);
|
|
}
|
|
} finally {
|
|
await browser.close();
|
|
}
|
|
}
|
|
|
|
main().catch((error) => { console.error(error); process.exit(1); });
|