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;