Skip to content

Commit 27252c2

Browse files
authored
feat: client side randomized results (#24)
* feat: client side randomize (caching persists obviously) * add founders on top
1 parent 023861b commit 27252c2

2 files changed

Lines changed: 63 additions & 23 deletions

File tree

index.html

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,19 @@
143143

144144
.empty { color: var(--muted); font-size: 0.9rem; }
145145

146+
.section-label {
147+
margin: 0 0 0.75rem;
148+
color: var(--muted);
149+
font-size: 0.75rem;
150+
text-transform: uppercase;
151+
letter-spacing: 0.1em;
152+
}
153+
.founders-section {
154+
margin-bottom: 2rem;
155+
padding-bottom: 2rem;
156+
border-bottom: 1px solid var(--overlay);
157+
}
158+
146159
.grid {
147160
display: grid;
148161
grid-template-columns: repeat(7, 1fr);
@@ -271,6 +284,11 @@ <h1>thread<span class="ring">locked</span></h1>
271284
</div>
272285
</header>
273286

287+
<div class="founders-section">
288+
<p class="section-label">founders</p>
289+
<div class="grid" id="founders-grid"><!--FOUNDERS--></div>
290+
</div>
291+
274292
<div class="controls">
275293
<input
276294
id="search"
@@ -282,6 +300,7 @@ <h1>thread<span class="ring">locked</span></h1>
282300
/>
283301
</div>
284302

303+
<p class="section-label">members</p>
285304
<div class="grid" id="grid"><!--MEMBERS--></div>
286305

287306
<p id="empty" class="empty" hidden>no members match.</p>
@@ -325,12 +344,20 @@ <h1>thread<span class="ring">locked</span></h1>
325344
var search = document.getElementById("search");
326345
var empty = document.getElementById("empty");
327346

347+
var grid = document.getElementById("grid");
328348
var items = [].slice
329-
.call(document.querySelectorAll(".card"))
349+
.call(grid.querySelectorAll(".card"))
330350
.map(function (el) {
331351
return { name: el.dataset.name, el: el };
332352
});
333353

354+
// shuffle members on every visit
355+
for (var i = items.length - 1; i > 0; i--) {
356+
var j = Math.floor(Math.random() * (i + 1));
357+
var tmp = items[i]; items[i] = items[j]; items[j] = tmp;
358+
}
359+
items.forEach(function (it) { grid.appendChild(it.el); });
360+
334361
var fuse =
335362
typeof Fuse !== "undefined"
336363
? new Fuse(items, {

main.go

Lines changed: 35 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -48,32 +48,36 @@ func host(raw string) string {
4848
return strings.TrimPrefix(u.Host, "www.")
4949
}
5050

51-
// renderIndex injects the member cards into the embedded page once, at startup,
52-
// so each request just writes static bytes (no per-request templating).
53-
func renderIndex(webring []WebringEntry) []byte {
54-
var cards strings.Builder
55-
for _, e := range webring {
51+
var founderNames = map[string]bool{"datavorous": true, "nisarga": true}
52+
53+
func buildCards(entries []WebringEntry) string {
54+
var b strings.Builder
55+
for _, e := range entries {
5656
name := html.EscapeString(e.Name)
57-
cards.WriteString(`<a class="card" href="`)
58-
cards.WriteString(html.EscapeString(e.Url))
59-
cards.WriteString(`" rel="noopener" data-name="`)
60-
cards.WriteString(name)
61-
cards.WriteString(`"><span class="avatar">`)
62-
cards.WriteString(html.EscapeString(initial(e.Name)))
57+
b.WriteString(`<a class="card" href="`)
58+
b.WriteString(html.EscapeString(e.Url))
59+
b.WriteString(`" rel="noopener" data-name="`)
60+
b.WriteString(name)
61+
b.WriteString(`"><span class="avatar">`)
62+
b.WriteString(html.EscapeString(initial(e.Name)))
6363
if e.Gh != "" {
64-
cards.WriteString(`<img src="https://avatars.githubusercontent.com/`)
65-
cards.WriteString(html.EscapeString(e.Gh))
66-
cards.WriteString(`?size=96" alt="" loading="lazy" onerror="this.setAttribute('data-failed','')" />`)
64+
b.WriteString(`<img src="https://avatars.githubusercontent.com/`)
65+
b.WriteString(html.EscapeString(e.Gh))
66+
b.WriteString(`?size=96" alt="" loading="lazy" onerror="this.setAttribute('data-failed','')" />`)
6767
}
68-
cards.WriteString(`</span><span class="meta"><span class="name">`)
69-
cards.WriteString(name)
70-
cards.WriteString(`</span><span class="host">`)
71-
cards.WriteString(html.EscapeString(host(e.Url)))
72-
cards.WriteString(`</span></span><span class="arrow">&rarr;</span></a>`)
68+
b.WriteString(`</span><span class="meta"><span class="name">`)
69+
b.WriteString(name)
70+
b.WriteString(`</span><span class="host">`)
71+
b.WriteString(html.EscapeString(host(e.Url)))
72+
b.WriteString(`</span></span><span class="arrow">&rarr;</span></a>`)
7373
}
74+
return b.String()
75+
}
7476

75-
out := strings.Replace(string(indexHTML), "<!--MEMBERS-->", cards.String(), 1)
76-
out = strings.Replace(out, "<!--COUNT-->", fmt.Sprintf("%d members", len(webring)), 1)
77+
func renderIndex(founders, members []WebringEntry) []byte {
78+
out := strings.Replace(string(indexHTML), "<!--FOUNDERS-->", buildCards(founders), 1)
79+
out = strings.Replace(out, "<!--MEMBERS-->", buildCards(members), 1)
80+
out = strings.Replace(out, "<!--COUNT-->", fmt.Sprintf("%d members", len(founders)+len(members)), 1)
7781
return []byte(out)
7882
}
7983

@@ -84,7 +88,16 @@ func main() {
8488
os.Exit(1)
8589
}
8690

87-
page := renderIndex(webring)
91+
var founders, members []WebringEntry
92+
for _, e := range webring {
93+
if founderNames[e.Name] {
94+
founders = append(founders, e)
95+
} else {
96+
members = append(members, e)
97+
}
98+
}
99+
100+
page := renderIndex(founders, members)
88101

89102
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
90103
reqHost := r.Host

0 commit comments

Comments
 (0)