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;