hypermedia blog

static site generator

hypermedia blog

src/index.ts


import {
	getCategories,
	getPosts,
	getTagByName,
	getTags,
	getTotalPostCount,
	getTotalPostCountByCat,
	getTotalPostCountBySubCat,
	getTotalPostCountByTag,
} from "./models/blog.js";
import {
	generateAtom,
	generateRSS
} from "./views/syndication.js";
import {
	generateCatPage,
	generateErrorPages,
	generatePage,
	generatePost,
	generateSubCatPage,
	generateTagPage,
} from "./views/templ8.js";

/*            _   __
 *  \  / /\  |_) (_
 *   \/ /--\ | \ __)
 */
const domain: string = "//localhost"; // no trailing slash
const title: string = "blog.x-e.ro /";
const postsPerPage: number = 7;

/*   _           _ ___    _        __
 *  |_ | | |\ | /   |  | / \ |\ | (_
 *  |  |_| | \| \_  |  | \_/ | \| __)
 */
[
	`exit`,
	`SIGINT`,
	`SIGUSR1`,
	`SIGUSR2`,
	`uncaughtException`,
	`SIGTERM`,
].forEach((eventType) => {
	process.on(eventType, (_) => {
		console.log(" BЦП ЯЦП DЦП ");
		process.exit();
	});
});

function makeErrorPages() {
	generateErrorPages(domain, title);
}
function makePages() {
	const total: number = getTotalPostCount();
	const limit: number = postsPerPage;
	const pages: number = total / limit + 1;
	let offset: number = 0;
	let current: number = 1;

	while (current <= pages) {
		generatePage(domain, title, limit, offset, total, current);
		offset += limit;
		current++;
	}
}
function makePosts() {
	const total: number = getTotalPostCount();
	const posts = getPosts(total, 0);
	posts.forEach((post) => {
		generatePost(domain, title, [post]);
	});
}
function makeFeeds() {
	const posts = getPosts(10, 0);
	generateRSS(domain, posts);
	generateAtom(domain, posts);
}
function makeTags() {
	const tags = getTags();
	tags.forEach((tag) => {
		let limit = postsPerPage;
		let current = 1;
		let offset = 0;
		let id = getTagByName(tag.url);
		let total = getTotalPostCountByTag(id);
		let pages = Math.ceil(total / limit);
		while (current <= pages) {
			generateTagPage(domain, title, tag.url, limit, offset, total, current);
			offset += limit;
			current++;
		}
	});
}
function makeCats() {
	const cats = getCategories();
	cats.forEach((cat) => {
		let type = cat.blog_cat_id.toString().includes(".") ? "subcat" : "cat";
		let limit = postsPerPage;
		let current = 1;
		let offset = 0;
		let total =
			type == "subcat"
				? getTotalPostCountBySubCat(cat.blog_cat_id)
				: getTotalPostCountByCat(cat.blog_cat_id);
		let pages = Math.ceil(total / limit);
		while (current <= pages) {
			if (type == "subcat") {
				generateSubCatPage(
					domain,
					title,
					cat.url,
					cat.blog_cat_id,
					limit,
					offset,
					total,
					current,
				);
			} else {
				generateCatPage(domain, title, cat.url, limit, offset, total, current);
			}
			offset += limit;
			current++;
		}
	});
}

/*  |\/|  /\  | |\ |
 *  |  | /--\ | | \|
 */
makeErrorPages();
makePages();
makePosts();
makeFeeds();
makeTags();
makeCats();

Download

raw zip tar