Skip to content

Commit d51f32f

Browse files
committed
add blog ordering
1 parent 1f68f12 commit d51f32f

File tree

5 files changed

+65
-2
lines changed

5 files changed

+65
-2
lines changed

content/blogs/blog1.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
---
22
title = "The First blog"
33
url = "blog_1"
4+
published = 2025-06-18T04:08:41+00:00
45
---
56

67
# Hello There

content/blogs/blog2.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
---
22
title = "The Second blog"
33
url = "blog_2"
4+
published = 2025-06-18T04:10:41+00:00
45
---
56

67
# General Kenobi

content/blogs/headers.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
---
22
title = "Headers"
33
url = "headers"
4+
published = 2025-06-18T04:11:41+00:00
45
---
56

67
# H1

content/blogs/math_test.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
title = "Test of Math Rendering"
33
url = "math_test"
44
math = true
5+
published = 2025-06-19T04:07:45+00:00
56
---
67

78
# Math

src/blog/render.gleam

Lines changed: 61 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import blog/posts
22
import gleam/dict
33
import gleam/list
4+
import gleam/order
45
import gleam/result
56
import lustre/attribute
67
import lustre/element/html.{a, body, div, head, html, link, p, script, text}
@@ -87,28 +88,86 @@ pub fn render_md(md: String, asset_path: String) -> vnode.Element(_) {
8788

8889
pub fn render_matter(
8990
base: String,
90-
matter: #(String, String),
91+
matter: #(String, String, tom.DateTime),
9192
) -> vnode.Element(_) {
9293
div([attribute.class("blog-link")], [
9394
p([], [text(matter.0)]),
9495
p([], [a([attribute.href(base <> "/" <> matter.1)], [text(matter.1)])]),
9596
])
9697
}
9798

99+
fn cmp_datetime(d1: tom.DateTime, d2: tom.DateTime) -> order.Order {
100+
let year = case d1.date.year - d2.date.year {
101+
0 -> order.Eq
102+
diff if diff < 0 -> order.Gt
103+
_ -> order.Lt
104+
}
105+
106+
use <- order.lazy_break_tie(year)
107+
108+
let month = case d1.date.month - d2.date.month {
109+
0 -> order.Eq
110+
diff if diff < 0 -> order.Gt
111+
_ -> order.Lt
112+
}
113+
114+
use <- order.lazy_break_tie(month)
115+
116+
let day = case d1.date.day - d2.date.day {
117+
0 -> order.Eq
118+
diff if diff < 0 -> order.Gt
119+
_ -> order.Lt
120+
}
121+
122+
use <- order.lazy_break_tie(day)
123+
124+
let hour = case d1.time.hour - d2.time.hour {
125+
0 -> order.Eq
126+
diff if diff < 0 -> order.Gt
127+
_ -> order.Lt
128+
}
129+
130+
use <- order.lazy_break_tie(hour)
131+
132+
let minute = case d1.time.minute - d2.time.minute {
133+
0 -> order.Eq
134+
diff if diff < 0 -> order.Gt
135+
_ -> order.Lt
136+
}
137+
138+
use <- order.lazy_break_tie(minute)
139+
140+
let second = case d1.time.second - d2.time.second {
141+
0 -> order.Eq
142+
diff if diff < 0 -> order.Gt
143+
_ -> order.Lt
144+
}
145+
146+
use <- order.lazy_break_tie(second)
147+
148+
let _millisecond = case d1.time.millisecond - d2.time.millisecond {
149+
0 -> order.Eq
150+
diff if diff < 0 -> order.Gt
151+
_ -> order.Lt
152+
}
153+
}
154+
98155
pub fn render_links(base: String, sources: List(posts.PostSource)) {
99156
// matters should be fallible (remove asserts)
100157
let matters = {
101158
use post <- list.map(sources)
102159
use matter <- result.try(djot.metadata(post.data))
103160
let assert Ok(tom.String(title)) = dict.get(matter, "title")
104161
let assert Ok(tom.String(url)) = dict.get(matter, "url")
105-
Ok(#(title, url))
162+
let assert Ok(tom.DateTime(datetime)) = dict.get(matter, "published")
163+
Ok(#(title, url, datetime))
106164
}
107165

108166
let assert Ok(matters) = result.all(matters)
109167

110168
let rendered_matters =
111169
matters
170+
|> list.sort(fn(t1, t2) { cmp_datetime(t1.2, t2.2) })
112171
|> list.map(render_matter(base, _))
113172

114173
[html.h1([], [text("Blogs")]), ..rendered_matters]

0 commit comments

Comments
 (0)