1import lume from "lume/mod.ts";
2import date from "lume/plugins/date.ts";
3import picture from "lume/plugins/picture.ts";
4import source_maps from "lume/plugins/source_maps.ts";
5import toml from "lume/plugins/toml.ts";
6
7// URL Management
8import relations from "lume/plugins/relations.ts";
9import slugify_urls from "lume/plugins/slugify_urls.ts";
10import resolveUrls from "lume/plugins/resolve_urls.ts";
11
12// File Generation
13import feed from "lume/plugins/feed.ts";
14import metas from "lume/plugins/metas.ts";
15import robots from "lume/plugins/robots.ts";
16import sitemap from "lume/plugins/sitemap.ts";
17
18// Optimization
19import brotli from "lume/plugins/brotli.ts";
20import minify_html from "lume/plugins/minify_html.ts";
21import svgo from "lume/plugins/svgo.ts";
22import transform_images from "lume/plugins/transform_images.ts";
23
24// Markdown-it plugins
25import { default as md_linenums } from "npm:markdown-it-inject-linenumbers@0.3.0";
26import { BiDirectionalLinks } from "npm:@nolebase/markdown-it-bi-directional-links";
27import { default as mdItObsidianCallouts } from "npm:markdown-it-obsidian-callouts";
28
29// Additional external plugins
30import toc from "https://deno.land/x/lume_markdown_plugins@v0.8.0/toc.ts";
31
32// CSS
33// // Base dependencies
34import tailwindcss from "lume/plugins/tailwindcss.ts";
35// // Fonts
36import googleFonts from "lume/plugins/google_fonts.ts";
37// // Optimization
38import lightningcss from "lume/plugins/lightningcss.ts";
39import purgecss from "lume/plugins/purgecss.ts";
40
41// Disabled Plugins:
42// import og_images from "lume/plugins/og_images.ts";
43// import pagefind from "lume/plugins/pagefind.ts";
44// import sri from "lume/plugins/sri.ts";
45// import nav from "lume/plugins/nav.ts";
46
47// To Add:
48// https://deno.land/x/lume_markdown_plugins@v0.8.0 (toc and footnotes plugins)
49// https://deno.land/x/lume_shiki@0.0.16
50
51const site = lume({
52 src: "./src",
53 location: new URL("https://pyrox.dev"),
54});
55
56// site.hooks.addMarkdownItPlugin(md_linenums, {});
57site.hooks.addMarkdownItPlugin(BiDirectionalLinks({
58 dir: Deno.cwd() + "/src/",
59 stillRenderNoMatched: false,
60}));
61site.hooks.addMarkdownItPlugin(mdItObsidianCallouts, {
62 icons: {
63 abstract: '<i class="bi bi-clipboard2-data"></i>',
64 bug: '<i class="bi bi-bug"></i>',
65 danger: '<i class="bi bi-lightning"></i>',
66 example: '<i class="bi bi-list-ul"></i>',
67 failure: '<i class="bi bi-x-lg"></i>',
68 info: '<i class="bi bi-info-circle"></i>',
69 note: '<i class="bi bi-pencil"></i>',
70 question: '<i class="bi bi-question-circle"></i>',
71 quote: '<i class="bi bi-quote"></i>',
72 success: '<i class="bi bi-check2"></i>',
73 tip: '<i class="bi bi-fire"></i>',
74 todo: '<i class="bi bi-check-circle"></i>',
75 warning: '<i class="bi bi-exclamation-triangle"></i>',
76 },
77});
78
79// Copy Static Files
80site.add(".css");
81site.add("static/.well-known", ".well-known");
82site.add(".woff2");
83// Tailwind CSS
84site.use(tailwindcss());
85
86// Fonts
87site.use(
88 googleFonts({
89 subsets: ["latin", "latin-ext"],
90 folder: "/static/fonts/",
91 cssFile: "/static/fonts.css",
92 fonts:
93 "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",
94 }),
95);
96
97site.use(metas());
98site.use(picture());
99site.use(transform_images());
100site.use(relations());
101site.use(sitemap());
102site.use(slugify_urls());
103site.use(svgo());
104site.use(toml());
105site.use(
106 date({
107 formats: {
108 SHORT_DATE: "yyyy-MM-dd",
109 POST_DATE: "dd MMM, yyyy",
110 },
111 }),
112);
113site.use(toc());
114site.use(resolveUrls());
115
116// RSS/JSON Feed Generation
117site.use(
118 feed({
119 output: ["/blog.rss", "/blog.json"],
120 query: "category=blog",
121 info: {
122 title: "dish blog",
123 description: "dish's thoughts on many things",
124 published: new Date(),
125 lang: "en",
126 generator: true,
127 authorName: "dish",
128 authorUrl: "https://blog.pyrox.dev",
129 },
130 items: {
131 title: "=title",
132 description: "=summary",
133 published: "=published",
134 updated: "=updated",
135 content: "$.e-content",
136 lang: "=lang",
137 image: "=banner",
138 authorName: "=author.name",
139 authorUrl: "=author.url",
140 },
141 }),
142);
143
144// CSS postprocessing
145// site.use(purgecss());
146site.use(lightningcss({
147 options: {
148 minify: true,
149 bundle: false,
150 },
151}));
152
153// Source Map Generation
154// Applies to CSS and JS
155site.use(source_maps());
156
157// Minify HTML Output
158site.use(minify_html({
159 options: {
160 keep_html_and_head_opening_tags: true,
161 keep_spaces_between_attributes: true,
162 },
163}));
164
165// robots.txt generation
166site.use(
167 robots({
168 disallow: [
169 "AI2Bot",
170 "Amazonbot",
171 "Applebot-Extended",
172 "Bytespider",
173 "ChatGPT-User",
174 "ClaudeBot",
175 "Diffbot",
176 "DuckAssistBot",
177 "FacebookBot",
178 "GPTBot",
179 "Google-Extended",
180 "Meta-ExternalAgent",
181 "Meta-ExternalFetcher",
182 "OAI-SearchBot",
183 "Operator",
184 "PanguBot",
185 "PerplexityBot",
186 "SemrushBot",
187 "SemrushBot-OCOB",
188 "Timpibot",
189 "Webzio-Extended",
190 "YouBot",
191 "cohere-training-data-crawler",
192 "omgili",
193 "t3versions",
194 ],
195 }),
196);
197
198// Compress everything with Brotli
199site.use(
200 brotli({
201 extensions: [
202 ".html",
203 ".css",
204 ".js",
205 ".mjs",
206 ".svg",
207 ".json",
208 ".xml",
209 ".txt",
210 ".rss",
211 ".map",
212 ],
213 }),
214);
215
216// Get current commit as a version number
217// Taken from https://github.com/pixeldesu/pixelde.su/blob/main/_config.ts
218// Associated usage in src/_includes/components/footer.vto also from the above repo
219const commitCmd = new Deno.Command("git", { args: ["rev-parse", "HEAD"] });
220const { stdout } = await commitCmd.output();
221const commitHash = new TextDecoder().decode(stdout);
222site.data("commit", commitHash);
223
224export default site;