Skip to content

Commit 28181a0

Browse files
Enhance JSON-LD generation
1 parent d8259e4 commit 28181a0

File tree

6 files changed

+93
-51
lines changed

6 files changed

+93
-51
lines changed

cynthia_websites_mini_client/src/cynthia_websites_mini_client/dom.gleam

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,3 +37,8 @@ pub fn set_hash(hash: String) -> Nil
3737
/// Get innerhtml of an element
3838
@external(javascript, "./dom.ts", "get_inner_html")
3939
pub fn get_inner_html(element: element.Element) -> String
40+
41+
/// jsonify_string
42+
/// Convert a string to a JSON safe string
43+
@external(javascript, "./dom.ts", "jsonify_string")
44+
pub fn jsonify_string(str: String) -> Result(String, Nil)

cynthia_websites_mini_client/src/cynthia_websites_mini_client/dom.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import { Error, Ok } from "../../prelude";
2+
13
export function get_color_scheme() {
24
// Media queries the preferred color colorscheme
35

@@ -57,3 +59,13 @@ export function destroy_comment_box() {
5759
}
5860
}
5961
}
62+
63+
export function jsonify_string(str: string) {
64+
// Convert a string to a JSON object
65+
try {
66+
return new Ok(JSON.stringify(str));
67+
} catch (e) {
68+
console.error("Failed to parse JSON string:", e);
69+
return new Error(null);
70+
}
71+
}
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
import cynthia_websites_mini_client
2+
import cynthia_websites_mini_client/configtype
3+
import cynthia_websites_mini_client/contenttypes
4+
import cynthia_websites_mini_client/dom
5+
import cynthia_websites_mini_client/pottery
6+
import gleam/list
7+
import gleam/result
8+
import gleam/string
9+
import lustre/element
10+
11+
/// Generates JSON-LD structured data for the website.
12+
pub fn generate_jsonld(cd: configtype.CompleteData) -> String {
13+
let base_jsonld = "{
14+
\"@context\": \"https://schema.org\",
15+
\"@type\": \"Website\",
16+
\"name\": " <> cd.global_site_name
17+
|> dom.jsonify_string()
18+
|> result.unwrap("Site name is invalid") <> ",
19+
\"description\": " <> cd.global_site_description
20+
|> dom.jsonify_string()
21+
|> result.unwrap("Site description is invalid") <> ",
22+
\"generator\": {
23+
\"@type\": \"SoftwareApplication\",
24+
\"name\": \"CynthiaMini Website Engine\",
25+
\"url\": \"https://github.com/CynthiaWebsiteEngine/Mini-docs\",
26+
\"version\": \"" <> cynthia_websites_mini_client.version() <> "\"
27+
},
28+
\"@graph\": ["
29+
30+
let content_jsonld =
31+
cd.content
32+
|> list.map(fn(c) {
33+
let title = {
34+
result.unwrap(dom.jsonify_string(c.title), "Title is invalid")
35+
}
36+
let description = {
37+
pottery.parse_html(c.description, "descr.dj")
38+
|> element.to_string()
39+
|> dom.jsonify_string()
40+
|> result.unwrap("Description is invalid")
41+
}
42+
let content_type = case c.data {
43+
contenttypes.PostData(..) -> "BlogPosting"
44+
contenttypes.PageData(..) -> "WebPage"
45+
}
46+
47+
let dates = case c.data {
48+
contenttypes.PostData(
49+
date_published: published,
50+
date_updated: updated,
51+
category: _,
52+
tags: _,
53+
) -> "\n\"datePublished\": \"" <> published <> "\",
54+
\"dateModified\": \"" <> updated <> "\","
55+
_ -> ""
56+
}
57+
58+
"{
59+
\"@type\": \"" <> content_type <> "\",
60+
\"@id\": " <> c.permalink |> dom.jsonify_string() |> result.unwrap("/") <> ",
61+
\"headline\": " <> title <> ",
62+
\"description\": " <> description <> "," <> dates <> "
63+
\"mainEntityOfPage\": {
64+
\"@type\": \"WebPage\",
65+
\"@id\": " <> c.permalink
66+
|> dom.jsonify_string()
67+
|> result.unwrap("/") <> "
68+
}
69+
}"
70+
})
71+
|> string.join(",\n")
72+
73+
base_jsonld <> content_jsonld <> "]}"
74+
}

cynthia_websites_mini_server/src/cynthia_websites_mini_server.gleam

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@ import bungibindies/bun
33
import bungibindies/bun/http/serve.{ServeOptions}
44
import cynthia_websites_mini_client
55
import cynthia_websites_mini_client/configtype
6+
import cynthia_websites_mini_client/shared/jsonld
67
import cynthia_websites_mini_client/shared/sitemap
78
import cynthia_websites_mini_server/config
8-
import cynthia_websites_mini_server/jsonld
99
import cynthia_websites_mini_server/mutable_model_type
1010
import cynthia_websites_mini_server/ssrs
1111
import cynthia_websites_mini_server/utils/files

cynthia_websites_mini_server/src/cynthia_websites_mini_server/jsonld.gleam

Lines changed: 0 additions & 49 deletions
This file was deleted.

cynthia_websites_mini_server/src/cynthia_websites_mini_server/web.gleam

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@ import bungibindies/bun/bunfile.{type BunFile}
33
import bungibindies/bun/http/serve/request.{type Request}
44
import bungibindies/bun/http/serve/response
55
import cynthia_websites_mini_client/configtype
6+
import cynthia_websites_mini_client/shared/jsonld
67
import cynthia_websites_mini_client/shared/sitemap
78
import cynthia_websites_mini_server/config
8-
import cynthia_websites_mini_server/jsonld
99
import cynthia_websites_mini_server/mutable_model_type
1010
import cynthia_websites_mini_server/ssrs
1111
import gleam/dict

0 commit comments

Comments
 (0)