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