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