add navigation to directory listing and improve css

Fri, 30 May 2025 16:37:54 +0200

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Fri, 30 May 2025 16:37:54 +0200
changeset 600
94c01980e3e5
parent 599
a5339182e67f
child 601
d9bc7c2dfae2

add navigation to directory listing and improve css

src/server/safs/service.c file | annotate | diff | comparison | revisions
src/server/util/strbuf.c file | annotate | diff | comparison | revisions
src/server/util/strbuf.h file | annotate | diff | comparison | revisions
--- a/src/server/safs/service.c	Fri May 30 15:00:05 2025 +0200
+++ b/src/server/safs/service.c	Fri May 30 16:37:54 2025 +0200
@@ -826,7 +826,15 @@
     const CxAllocator *a = pool_allocator(sn->pool);
 
     char *path = pblock_findkeyval(pb_key_path, rq->vars);
-    char *uri = pblock_findkeyval(pb_key_uri, rq->reqpb);
+    cxstring uri = cx_str(pblock_findkeyval(pb_key_uri, rq->reqpb));
+    if(uri.length == 0) {
+        return REQ_ABORTED;
+    }
+    if(uri.ptr[uri.length-1] != '/') {
+        cxmutstr newuri = cx_strcat_a(a, 2, uri, CX_STR("/"));
+        uri = cx_strcast(newuri);
+    }
+    
     
     // params
     char *useemojis = pblock_findval("use-emojis", pb);
@@ -871,16 +879,35 @@
 
     // write html header
     sbuf_puts(out, "<!DOCTYPE html>\n<html>\n<head>\n<title>Index of ");
-    sbuf_puts(out, uri);
+    sbuf_append(out, uri);
     sbuf_puts(out, "</title>\n");
     sbuf_puts(out, "<style>\n");
+    sbuf_puts(out, "body { font-family: sans; }\n");
+    sbuf_puts(out, "h1 { font-size: 1.1em; }\n");
     sbuf_puts(out, "th { text-align: left; }\n");
     sbuf_puts(out, "td { padding-right: 2em; }\n");
+    sbuf_puts(out, "a { text-decoration: none; }\n");
     sbuf_puts(out, ".type { padding-right: 0em; }\n");
+    sbuf_puts(out, ".path { background-color: #e0e0e0; border-radius: 0.5em; padding: 0.25em 0.75em 0.25em 0.75em; }");
     sbuf_puts(out, "</style>\n");
-    sbuf_puts(out, "</head><body>\n<h1>Index of ");
-    sbuf_puts(out, uri);
-    sbuf_puts(out, "</h1><hr>\n\n");
+    sbuf_puts(out, "</head><body><h1>");
+    
+    if(uri.length > 0) {
+        sbuf_puts(out, "<span class=\"path\"><a href=\"/\">/</a></span>\n");
+        size_t start = 1;
+        for(size_t i=1;i<uri.length;i++) {
+            if(uri.ptr[i] == '/') {
+                sbuf_puts(out, "<span class=\"path\"><a href=\"");
+                sbuf_write(out, uri.ptr, i);
+                sbuf_puts(out, "\">");
+                sbuf_write(out, uri.ptr+start, i-start);
+                sbuf_puts(out, "</a></span>\n");
+                start = i+1;
+            }
+        }
+    }
+    
+    sbuf_puts(out, "</h1><hr>");
 
     // read directory at store entries in the files list
     int ret = REQ_PROCEED;
@@ -927,6 +954,7 @@
         
         sbuf_puts(out, "<td>");
         sbuf_puts(out, "<a href=\"");
+        sbuf_append(out, uri);
         sbuf_puts(out, entry->name);
         sbuf_puts(out, "\">");
         sbuf_puts(out, entry->name);
--- a/src/server/util/strbuf.c	Fri May 30 15:00:05 2025 +0200
+++ b/src/server/util/strbuf.c	Fri May 30 16:37:54 2025 +0200
@@ -46,7 +46,7 @@
     return buf;
 }
 
-void sbuf_puts(sbuf_t *buf, char *str) {
+void sbuf_puts(sbuf_t *buf, const char *str) {
     sbuf_append(buf, cx_str(str));
 }
 
@@ -54,6 +54,10 @@
     sbuf_append(buf, (cxstring){&chr, 1});
 }
 
+void sbuf_write(sbuf_t *buf, const char *str, size_t length) {
+    sbuf_append(buf, cx_strn(str, length));
+}
+
 void sbuf_append(sbuf_t *buf, cxstring str) {
     if (buf->length + str.length >= buf->size) {
         buf->size *= 2;
--- a/src/server/util/strbuf.h	Fri May 30 15:00:05 2025 +0200
+++ b/src/server/util/strbuf.h	Fri May 30 16:37:54 2025 +0200
@@ -44,7 +44,9 @@
 
 sbuf_t* sbuf_new(size_t size);
 
-void sbuf_puts(sbuf_t *buf, char *str);
+void sbuf_puts(sbuf_t *buf, const char *str);
+
+void sbuf_write(sbuf_t *buf, const char *str, size_t length);
 
 void sbuf_put(sbuf_t *buf, char chr);
 

mercurial