aboutsummaryrefslogtreecommitdiffstats
path: root/src/server/template/vdom.ts
diff options
context:
space:
mode:
author2023-02-16 22:57:52 +0530
committer2023-02-16 22:57:52 +0530
commit93e75949e9a2861f651e2a3602e08e9b25cf47c4 (patch)
tree9da44bdc8885c94355ee3dc7a1ae029bc2627356 /src/server/template/vdom.ts
parent0.4.3 (diff)
downloadsudomsg-93e75949e9a2861f651e2a3602e08e9b25cf47c4.tar
sudomsg-93e75949e9a2861f651e2a3602e08e9b25cf47c4.tar.gz
sudomsg-93e75949e9a2861f651e2a3602e08e9b25cf47c4.tar.bz2
sudomsg-93e75949e9a2861f651e2a3602e08e9b25cf47c4.tar.lz
sudomsg-93e75949e9a2861f651e2a3602e08e9b25cf47c4.tar.xz
sudomsg-93e75949e9a2861f651e2a3602e08e9b25cf47c4.tar.zst
sudomsg-93e75949e9a2861f651e2a3602e08e9b25cf47c4.zip
Move to Server Side Render with expressjs
Backend Rewritten in typescript Signed-off-by: Marc Pervaz Boocha <mboocha@sudomsg.xyz> On branch main Your branch is up to date with 'origin/main'. Changes to be committed: new file: .editorconfig modified: .gitignore new file: Containerfile renamed: favicon/icon.svg -> assets/favicon.svg modified: assets/index.css deleted: assets/index.js deleted: assets/mandle.png deleted: assets/sw.js new file: assets/syntax.css modified: deploy deleted: eleventy.config.js deleted: favicon/192.png deleted: favicon/512.png deleted: favicon/icon.ico deleted: license modified: package-lock.json modified: package.json deleted: src/_data/env.js deleted: src/_data/metadata.js deleted: src/_includes/base.njk deleted: src/_includes/page.njk deleted: src/_includes/post.njk deleted: src/about.njk deleted: src/blog.njk new file: src/client/index.ts deleted: src/gen/atom.njk deleted: src/gen/error.njk deleted: src/gen/feedjson.11ty.js deleted: src/gen/gen.11tydata.js deleted: src/gen/manifest.11ty.js deleted: src/gen/metadata.11ty.js deleted: src/gen/robot.njk deleted: src/gen/sitemap.njk deleted: src/index.njk deleted: src/post/post.11tydata.js new file: src/server/app.ts new file: src/server/build.ts new file: src/server/content/about.ts new file: src/server/content/blog.ts new file: src/server/content/feed.ts new file: src/server/content/index.ts new file: src/server/content/robots.ts new file: src/server/content/sitemap.ts new file: src/server/content/webmanifest.ts new file: src/server/errHanadler.ts new file: src/server/img.ts new file: src/server/metadata.ts new file: src/server/router.ts new file: src/server/server.ts new file: src/server/template/Base.ts new file: src/server/template/Page.ts new file: src/server/template/Post.ts new file: src/server/template/atom.ts new file: src/server/template/header.ts new file: src/server/template/html.ts new file: src/server/template/sitemap.ts new file: src/server/template/syntax.ts new file: src/server/template/table.ts new file: src/server/template/vdom.ts new file: src/server/template/xml.ts new file: src/server/utils/createUrl.ts new file: src/server/utils/curl.ts new file: src/server/utils/isDefined.ts new file: src/server/utils/isDevel.ts new file: src/server/utils/relDir.ts new file: src/server/utils/relUrl.ts new file: src/server/utils/schema.ts new file: src/server/utils/setStingRoute.ts new file: src/server/utils/strHandler.ts new file: src/worker/sw.ts new file: src/worker/tsconfig.json new file: tsconfig.json
Diffstat (limited to 'src/server/template/vdom.ts')
-rw-r--r--src/server/template/vdom.ts105
1 files changed, 105 insertions, 0 deletions
diff --git a/src/server/template/vdom.ts b/src/server/template/vdom.ts
new file mode 100644
index 0000000..899565b
--- /dev/null
+++ b/src/server/template/vdom.ts
@@ -0,0 +1,105 @@
+export type component<
+ T extends Attribute = Attribute,
+ U extends node[] = node[],
+ R extends node = node
+> = ((attr: T, ...content: U) => R)
+
+export interface Attribute {
+ [key: string]: unknown,
+}
+
+export interface element<T extends string = string> {
+ name: T,
+ attr: Attribute,
+ content: node[],
+}
+
+export function iselement<T extends string = string>(e: unknown): e is element<T> {
+ return typeof e === "object" && e !== null && "name" in e;
+}
+
+export interface typed_data<T extends string = string> {
+ content: string,
+ type: T
+}
+
+export function istyped<T extends string = string>(e: unknown): e is typed_data<T> {
+ return typeof e === "object" && e !== null && "type" in e;
+}
+
+export type node = element | typed_data | node[] | string
+
+export function c<
+ T extends Attribute = Attribute,
+ U extends node[] = node[],
+ R extends node = node
+>(name: component<T, U, R>, attr: T, ...content: U): R {
+ return name(attr, ...content)
+}
+
+export default function t<T extends string = string>(name: T, attr?: Attribute, ...content: node[]): element<T> {
+ return {
+ name,
+ attr: attr ?? ({} as Attribute),
+ content
+ }
+}
+
+export function frag<T extends node[] = node[]>(_attr: Attribute, ...content: T) {
+ return content
+}
+
+export function join({sep = ""}: Attribute & {sep?: string}, ...content: string[]) {
+ return content.join(sep)
+}
+
+export function prenderdata<T extends string = string>(type: T) {
+ return function (content: string): typed_data<T> {
+ return {
+ content,
+ type
+ }
+ }
+}
+
+export function render<T extends string = string>(type: T, rendFunc: (node: element, content: string) => string) {
+ const data = prenderdata(type)
+ return function rend(Node: node): typed_data<T> {
+ if (Array.isArray(Node)) {
+ return data(Node.map(element => rend(element).content ?? "").join(""))
+ }
+
+ if (typeof Node == "string") {
+ return data(Node)
+ }
+
+ if (iselement(Node)) {
+ return data(rendFunc(Node, rend(Node.content).content))
+ }
+
+ if (istyped<T>(Node)) {
+ if (Node.type == type) {
+ return Node
+ } else {
+ throw new Error(Node.type + "is not valid. The type must be:" + type)
+ }
+ }
+ throw new TypeError("" + Node)
+ }
+}
+
+export function getText(node: node): string {
+ if (Array.isArray(node)) {
+ return node.map(element => getText(element) ?? "").join("")
+ }
+
+ if (typeof node == "string") {
+ return node
+ }
+
+ if (iselement(node)) {
+ return getText(node.content)
+ }
+
+ throw new TypeError("" + node)
+}