import lume from "lume/mod.ts";
import date from "lume/plugins/date.ts";
import picture from "lume/plugins/picture.ts";
import source_maps from "lume/plugins/source_maps.ts";
import toml from "lume/plugins/toml.ts";
// URL Management
import slugify_urls from "lume/plugins/slugify_urls.ts";
import resolveUrls from "lume/plugins/resolve_urls.ts";
// File Generation
import feed from "lume/plugins/feed.ts";
import metas from "lume/plugins/metas.ts";
import robots from "lume/plugins/robots.ts";
import sitemap from "lume/plugins/sitemap.ts";
// Optimization
import brotli from "lume/plugins/brotli.ts";
import gzip from "lume/plugins/gzip.ts";
import minify_html from "lume/plugins/minify_html.ts";
import svgo from "lume/plugins/svgo.ts";
import transform_images from "lume/plugins/transform_images.ts";
// Markdown-it plugins
import { BiDirectionalLinks } from "@nolebase/markdown-it-bi-directional-links";
import { default as mdItObsidianCallouts } from "markdown-it-obsidian-callouts";
// Additional external plugins
import toc from "https://deno.land/x/lume_markdown_plugins@v0.8.0/toc.ts";
// CSS
// // Base dependencies
import tailwindcss from "lume/plugins/tailwindcss.ts";
// // Fonts
import googleFonts from "lume/plugins/google_fonts.ts";
// // Optimization
import lightningcss from "lume/plugins/lightningcss.ts";
// Validation
import validateHTML from "./plugins/validateHTML.ts";
// Disabled Plugins:
// import nav from "lume/plugins/nav.ts";
// import og_images from "lume/plugins/og_images.ts";
// import pagefind from "lume/plugins/pagefind.ts";
// import purgecss from "lume/plugins/purgecss.ts";
// import relations from "lume/plugins/relations.ts";
// import sri from "lume/plugins/sri.ts";
// import { default as md_linenums } from "npm:markdown-it-inject-linenumbers@0.3.0";
// To Add:
// https://deno.land/x/lume_markdown_plugins@v0.8.0 (footnotes plugins)
// https://deno.land/x/lume_shiki@0.0.16
const site = lume({
src: "./src",
location: new URL("https://pyrox.dev"),
});
// site.hooks.addMarkdownItPlugin(md_linenums, {});
site.hooks.addMarkdownItPlugin(BiDirectionalLinks({
dir: Deno.cwd() + "/src/",
stillRenderNoMatched: false,
}));
site.hooks.addMarkdownItPlugin(mdItObsidianCallouts, {
icons: {
abstract: '',
bug: '',
danger: '',
example: '',
failure: '',
info: '',
note: '',
question: '',
quote: '',
success: '',
tip: '',
todo: '',
warning: '',
},
});
// Copy Static Files
site.add(".css");
site.add("static/.well-known", ".well-known");
site.add(".woff2");
// Tailwind CSS
site.use(tailwindcss());
// Fonts
site.use(
googleFonts({
subsets: ["latin", "latin-ext"],
folder: "/static/fonts/",
cssFile: "/static/fonts.css",
fonts:
"https://fonts.googleapis.com/css2?family=IBM+Plex+Serif:ital,wght@0,300;0,400;0,500;0,600;0,700;1,300;1,400;1,500;1,600;1,700&family=Inter:ital,opsz,wght@0,14..32,100..900;1,14..32,100..900",
}),
);
site.use(metas());
site.use(picture());
site.use(transform_images());
// site.use(relations());
site.use(sitemap());
site.use(slugify_urls());
site.use(svgo());
site.use(toml());
site.use(
date({
formats: {
SHORT_DATE: "yyyy-MM-dd",
POST_DATE: "dd MMM, yyyy",
},
}),
);
site.use(toc());
site.use(resolveUrls());
// RSS/JSON Feed Generation
site.use(
feed({
output: ["/blog.rss", "/blog.json"],
query: "category=blog",
info: {
title: "dish blog",
description: "dish's thoughts on many things",
published: new Date(),
lang: "en",
generator: true,
authorName: "dish",
authorUrl: "https://blog.pyrox.dev",
},
items: {
title: "=title",
description: "=summary",
published: "=published",
updated: "=updated",
content: "$.e-content",
lang: "=lang",
image: "=banner",
authorName: "=author.name",
authorUrl: "=author.url",
},
}),
);
// CSS postprocessing
// site.use(purgecss());
site.use(lightningcss({
options: {
minify: true,
},
}));
// Source Map Generation
// Applies to CSS and JS
site.use(source_maps());
site.use(validateHTML());
// Minify HTML Output
site.use(minify_html({
options: {
keep_html_and_head_opening_tags: true,
keep_spaces_between_attributes: true,
},
}));
// robots.txt generation
site.use(
robots({
disallow: [
"AI2Bot",
"Amazonbot",
"Applebot-Extended",
"Bytespider",
"ChatGPT-User",
"ClaudeBot",
"Diffbot",
"DuckAssistBot",
"FacebookBot",
"GPTBot",
"Google-Extended",
"Meta-ExternalAgent",
"Meta-ExternalFetcher",
"OAI-SearchBot",
"Operator",
"PanguBot",
"PerplexityBot",
"SemrushBot",
"SemrushBot-OCOB",
"Timpibot",
"Webzio-Extended",
"YouBot",
"cohere-training-data-crawler",
"omgili",
"t3versions",
],
}),
);
// Compress everything with Brotli/Gzip
site.use(
brotli({
quality: 11,
extensions: [
".html",
".css",
".js",
".mjs",
".svg",
".json",
".xml",
".txt",
".rss",
".map",
],
}),
);
site.use(
gzip({
extensions: [
".html",
".css",
".js",
".mjs",
".svg",
".json",
".xml",
".txt",
".rss",
".map",
],
}),
);
// Get current commit as a version number
// Taken from https://github.com/pixeldesu/pixelde.su/blob/main/_config.ts
const commitCmd = new Deno.Command("git", { args: ["rev-parse", "HEAD"] });
const { stdout } = await commitCmd.output();
const commitHash = new TextDecoder().decode(stdout);
site.data("commit", commitHash);
export default site;