diff options
Diffstat (limited to 'src/server/content')
-rw-r--r-- | src/server/content/about.ts | 32 | ||||
-rw-r--r-- | src/server/content/blog.ts | 35 | ||||
-rw-r--r-- | src/server/content/feed.ts | 32 | ||||
-rw-r--r-- | src/server/content/index.ts | 20 | ||||
-rw-r--r-- | src/server/content/robots.ts | 9 | ||||
-rw-r--r-- | src/server/content/sitemap.ts | 16 | ||||
-rw-r--r-- | src/server/content/webmanifest.ts | 26 |
7 files changed, 170 insertions, 0 deletions
diff --git a/src/server/content/about.ts b/src/server/content/about.ts new file mode 100644 index 0000000..4a988e3 --- /dev/null +++ b/src/server/content/about.ts @@ -0,0 +1,32 @@ +import Page from "../template/Page.js" +import metadata from "../metadata.js" +import { c } from "../template/vdom.js" +import h from "../template/header.js" +import schema from "../utils/schema.js" +import { img, picture, source, div, p, span, ul, li, a } from "../template/html.js" + +Page({ + title: "About Me", + url: "/about", + content() { + return c(div, { itemscope: true, itemtype: schema("Person") }, + c(h, { level: 2, itemprop: "name" }, metadata.author.name), + c(picture, { class: "side" }, + c(source, { srcset: [128, 256, 512].map(width => `${metadata.author.image}?format=png&width=${width} ${width}w`).join(", ") }), + c(img, { itemprop: "image", alt: "A Photo of me", src: metadata.author.image }) + ), + c(p, { itemprop: "description" }, "I am an analytical and passionate third year ", + c(span, { itemprop: "affiliation", itemtype: schema("CollegeOrUniversity"), itemscope: true }, c(span, { itemprop: "name" }, "CHRIST University")), + " ", c(span, {}, "student"), ` pursuing B. Tech in Computer Engineering in Bengaluru. I am eager to further my knowledge, develop my skills ", + "and gain experience to convert my interest in computers into a fulfilling career.`), + c(p, {}, "Contact Details"), + c(ul, {}, + c(li, {}, c(a, { href: `mailto:${metadata.author.email}`, itemprop: "email" }, "Email")), + c(li, {}, c(a, { href: "https://github.com/marcthe12", itemprop: "sameas" }, "Github")), + c(li, {}, c(a, { href: "https://www.linkedin.com/in/marc-pervaz-boocha-200706236/", itemprop: "sameas" }, "LinkedIn")), + ), + ) + } +}).setupRoute() + + diff --git a/src/server/content/blog.ts b/src/server/content/blog.ts new file mode 100644 index 0000000..373b1ca --- /dev/null +++ b/src/server/content/blog.ts @@ -0,0 +1,35 @@ +import { posts } from "../template/Post.js" +import Base from "../template/Base.js" +import { c } from "../template/vdom.js" +import h from "../template/header.js" +import relUrl from "../utils/relUrl.js" +import schema from "../utils/schema.js" +import metadata from "../metadata.js" +import { div, article, a, small, time, span, p } from "../template/html.js" + +Base({ + title: "Blog Posts", + url: "/blog", + content() { + return c(div, { itemscope: true, itemtype: schema("Blog"), role: "feed", "aria-busy": "false" }, + ...posts.map((post, index, { length }) => { + const { date_mod, date_pub, title, description, url } = post + return c(article, { itemprop: "blogPost", itemscope: true, itemtype: schema("BlogPosting"), "aria-posinset": index, "aria-setsize": length }, + c(h, { level: 1, itemprop: "headline" }, c(a, { href: relUrl(url), itemprop: "sameAs" }, title)), + c(small, {}, + date_pub != date_mod ? [ + c(time, { datetime: date_mod.toISOString(), itemprop: "dateModified" }, date_mod.toDateString()), + "- Modified " + ] : [], + c(time, { datetime: date_pub.toISOString(), itemprop: "datePublished" }, date_pub.toDateString()) + , " - ", + c(span, { itemprop: "author", itemscope: true, itemtype: schema("Person") }, + c(a, { href: metadata.author.url, rel: "author", itemprop: "url" }, + c(span, { itemprop: "name" }, metadata.author.name)) + ), + ), + c(p, { itemprop: "abstract" }, description) + ) + })) + } +}).setupRoute() diff --git a/src/server/content/feed.ts b/src/server/content/feed.ts new file mode 100644 index 0000000..b0d6c0f --- /dev/null +++ b/src/server/content/feed.ts @@ -0,0 +1,32 @@ +import curl from "../utils/curl.js" +import setStingRoute from "../utils/setStingRoute.js" +import { posts } from "../template/Post.js" +import metadata from "../metadata.js" +import { doctype } from "../template/xml.js" +import { c } from "../template/vdom.js" +import { feed, title, link, summary, id, author, subtitle, updated, name, email, entry } from "../template/atom.js" + +setStingRoute("/feed", ["application/atom+xml", "xml"], async () => doctype({}, + c(feed, { xmlns: new URL("http://www.w3.org/2005/Atom"), "xml:lang": metadata.language }, + c(title, {}, metadata.title), + c(subtitle, {}, metadata.description), + c(link, { href: curl(metadata.feed.atom), rel: "self" }), + c(link, { href: metadata.url }), + ...(posts[0] ? [c(updated, { date: posts[0].date_mod })] : []), + c(id, { id: metadata.url }), + c(author, {}, + c(name, {}, metadata.author.name), + c(email, {}, metadata.author.email), + ), + ...posts.map(({ url, date_mod, title: Title, description }) => + c(entry, {}, + c(title, {}, Title), + c(link, { href: url }), + c(updated, { date: date_mod }), + c(id, { id: url }), + c(summary, {}, description) + ) + ) + ) +)) + diff --git a/src/server/content/index.ts b/src/server/content/index.ts new file mode 100644 index 0000000..6eaa3de --- /dev/null +++ b/src/server/content/index.ts @@ -0,0 +1,20 @@ +import { c } from "../template/vdom.js" +import code from "../template/syntax.js" +import Page from "../template/Page.js" +import { pre } from "../template/html.js" + +Page({ + title: "Welcome", + url: "/", + isHighlight: true, + content() { + return c(pre, { class: "pad", }, + "$ ", c(code, { lang: "bash" }, "sudo cat ~root/msg"), + ` +Hello World! +Welcome to my blog. +I occassion leave my writings here. Hope you will enjoy them :). +$` + ) + } +}).setupRoute() diff --git a/src/server/content/robots.ts b/src/server/content/robots.ts new file mode 100644 index 0000000..ad8e7ab --- /dev/null +++ b/src/server/content/robots.ts @@ -0,0 +1,9 @@ +import curl from "../utils/curl.js" +import setStingRoute from "../utils/setStingRoute.js" + +setStingRoute("/robots.txt", "robots.txt", async () => Object.entries({ + "User-agent": "*", + Disallow: "", + Sitemap: curl("sitemap.xml") +}).map(([key, val]) => `${key}: ${val}`).join("\n") +) diff --git a/src/server/content/sitemap.ts b/src/server/content/sitemap.ts new file mode 100644 index 0000000..c9e3ef5 --- /dev/null +++ b/src/server/content/sitemap.ts @@ -0,0 +1,16 @@ +import { pages } from "../template/Base.js" +import setStingRoute from "../utils/setStingRoute.js" +import { doctype } from "../template/xml.js" +import { c } from "../template/vdom.js" +import { lastmod, loc, url, urlset } from "../template/sitemap.js" + +setStingRoute("/sitemap.xml", "sitemap.xml", async () => doctype({}, + c(urlset, { xmlns: new URL("http://www.sitemaps.org/schemas/sitemap/0.9") }, + ...pages.map(page => + c(url, {}, + c(loc, {}, (page.url?.href) ?? ""), + ...(page.date_mod ? [c(lastmod, {}, page.date_mod.toISOString())] : []) + ) + ) + ) +)) diff --git a/src/server/content/webmanifest.ts b/src/server/content/webmanifest.ts new file mode 100644 index 0000000..6e4031e --- /dev/null +++ b/src/server/content/webmanifest.ts @@ -0,0 +1,26 @@ +import metadata from "../metadata.js" +import { contentType } from "mime-types" +import setStingRoute from "../utils/setStingRoute.js" + +setStingRoute("/app.webmanifest", "app.webmanifest", async () => ({ + $schema: "https://json.schemastore.org/web-manifest-combined.json", + name: metadata.title, + lang: metadata.language, + start_url: "/", + id: "/", scope: "/", + display: "minimal-ui", + background_color: metadata.theme, + theme_color: metadata.theme, + description: metadata.description, + icons: ["png", "svg"].flatMap(format => format == "svg" ? { + src: "/favicon.svg", + type: contentType(format), + sizes: "any", + purpose: "any maskable" + } : [192, 512, 1024].map(size => ({ + src: `/favicon.svg?format=${format}&width=${size}`, + type: contentType(format), + sizes: `${size}x${size}`, + purpose: "maskable" + }))) +})) |