import './setup.ts'; import Pageres from 'pageres'; import fs from 'fs'; import dbConnection from './db.ts'; import Suml from 'suml'; import { calendar } from '../src/calendar/calendar.ts'; import type { Config } from '../locale/config.ts'; const __dirname = new URL('.', import.meta.url).pathname; const loadSuml = (name: string): unknown => new Suml().parse(fs.readFileSync(`${__dirname}/../data/${name}.suml`).toString()); const config = loadSuml('config') as Config; const dir = `${__dirname}/../static/calendar`; const force = process.argv[2] === '-f' || process.argv[2] === '--force'; const shoot = async (url: string, filename: string): Promise => { const pr = new Pageres({ delay: 3, scale: 2, }); pr.src(process.env.BASE_URL + url, ['1500x300']); for (const buffer of await pr.run()) { fs.mkdirSync(dir, { recursive: true }); const target = `${dir}/${filename}.png`; console.log(target); fs.writeFileSync(target, buffer); } }; const dumpNameDays = async (): Promise => { if (!config.names || !config.names.enabled || !config.names.namedays) { return; } const db = await dbConnection(); const names = await db.all(` SELECT n.name, n.namedays FROM names n WHERE n.namedays IS NOT NULL AND approved = 1 AND deleted = 0 `); const output: Record = {}; for (const { name, namedays } of names) { output[name] = namedays.split('|'); } fs.writeFileSync(`${__dirname}/../data/names/namedays.json`, JSON.stringify(output)); }; (async (): Promise => { if (!config.calendar?.enabled) { return; } const prevPath = `${__dirname}/../cache/calendar.json`; const prev = fs.existsSync(prevPath) ? JSON.parse(fs.readFileSync(prevPath, 'utf-8')) : {}; const current = calendar.buildSummary(); const changedYears = new Set(); for (const day in current) { if (!current.hasOwnProperty(day)) { continue; } const year = day.substring(0, 4); if (current[day] !== prev[day] || !fs.existsSync(`${dir}/${day}.png`) || force) { await shoot(`/${config.calendar.route}/${day}?layout=basic`, `${day}`); changedYears.add(year); } if (!fs.existsSync(`${dir}/${year}-overview.png`) || !fs.existsSync(`${dir}/${year}-labels.png`) || force) { changedYears.add(year); } } for (const year of changedYears) { await shoot(`/${config.calendar.route}/${year}?layout=basic`, `${year}-overview`); await shoot(`/${config.calendar.route}/${year}?layout=basic&labels=true`, `${year}-labels`); } fs.writeFileSync(prevPath, JSON.stringify(current, null, 4)); await dumpNameDays(); })();