aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXavier Del Campo Romero <xavi92@disroot.org>2025-10-08 01:48:14 +0200
committerXavier Del Campo Romero <xavi92@disroot.org>2025-10-08 02:03:17 +0200
commit9542016d5d820eef0882ed7f4c3da5f238453707 (patch)
tree4996e3ad0d2e5970e2385b6fd67ac3522e198aa7
parent9b928c550d53b313f8d138b6929d8b94bd699740 (diff)
page.c: Switch preview and download
So far, clicking on a directory name previewed it, whereas clicking on a file name would download it, and file previews were on a separate column. This behaviour was found to be confusing, so it has been simplified. Now, clicking on a file or directory name would preview it. On the other hand, the "Preview" column has been replaced with a "Download" column, so that both files and directories can be downloaded. Thanks to Avron for the suggestion. [1] [1]: https://codeberg.org/xavidcr/slcl/issues/2
-rw-r--r--page.c52
1 files changed, 35 insertions, 17 deletions
diff --git a/page.c b/page.c
index 3c66e0a..d519dcd 100644
--- a/page.c
+++ b/page.c
@@ -171,7 +171,7 @@ static int prepare_name(struct html_node *const n, struct stat *const sb,
int ret = -1;
struct html_node *a;
struct dynstr d, dname;
- const char *const sep = S_ISDIR(sb->st_mode) ? "/" : "";
+ const char *const sep = S_ISDIR(sb->st_mode) ? "/" : "", *href;
char *encurl = NULL;
dynstr_init(&d);
@@ -192,14 +192,29 @@ static int prepare_name(struct html_node *const n, struct stat *const sb,
fprintf(stderr, "%s: http_encode_url failed\n", __func__);
goto end;
}
- else if (html_node_add_attr(a, "href", encurl))
+ else if (S_ISDIR(sb->st_mode))
+ href = encurl;
+ else
+ {
+ dynstr_free(&d);
+
+ if (dynstr_append(&d, "%s?preview=1", encurl))
+ {
+ fprintf(stderr, "%s: dynstr_append [2] failed\n", __func__);
+ goto end;
+ }
+
+ href = d.str;
+ }
+
+ if (html_node_add_attr(a, "href", href))
{
fprintf(stderr, "%s: html_node_add_attr href failed\n", __func__);
goto end;
}
else if (dynstr_append(&dname, "%s%s", name, sep))
{
- fprintf(stderr, "%s: dynstr_append [2] failed\n", __func__);
+ fprintf(stderr, "%s: dynstr_append [3] failed\n", __func__);
goto end;
}
else if (html_node_set_value(a, dname.str))
@@ -370,7 +385,7 @@ end:
return ret;
}
-static int prepare_preview(struct html_node *const n,
+static int prepare_download(struct html_node *const n,
const struct stat *const sb, const char *const dir, const char *const name)
{
int ret = -1;
@@ -380,7 +395,7 @@ static int prepare_preview(struct html_node *const n,
dynstr_init(&d);
- if (!S_ISREG(sb->st_mode))
+ if (!S_ISREG(sb->st_mode) && !S_ISDIR(sb->st_mode))
return 0;
else if (!(a = html_node_add_child(n, "a")))
{
@@ -397,20 +412,23 @@ static int prepare_preview(struct html_node *const n,
fprintf(stderr, "%s: http_encode_url failed\n", __func__);
goto end;
}
-
- dynstr_free(&d);
-
- if (dynstr_append(&d, "%s?preview=1", encurl))
+ else if (S_ISDIR(sb->st_mode))
{
- fprintf(stderr, "%s: dynstr_append encd failed\n", __func__);
- goto end;
+ dynstr_free(&d);
+
+ if (dynstr_append(&d, "%s?download=1", encurl))
+ {
+ fprintf(stderr, "%s: dynstr_append encurl dir failed\n", __func__);
+ goto end;
+ }
}
- else if (html_node_add_attr(a, "href", d.str))
+
+ if (html_node_add_attr(a, "href", d.str))
{
fprintf(stderr, "%s: html_node_add_attr failed\n", __func__);
goto end;
}
- else if (html_node_set_value(a, "Preview"))
+ else if (html_node_set_value(a, "Download"))
{
fprintf(stderr, "%s: html_node_set_value value failed\n", __func__);
goto end;
@@ -491,12 +509,12 @@ static int add_element(struct html_node *const n,
}
else if (prepare_share(td[SHARE], &sb, pr->dir, name))
{
- fprintf(stderr, "%s: prepare_date failed\n", __func__);
+ fprintf(stderr, "%s: prepare_share failed\n", __func__);
goto end;
}
- else if (prepare_preview(td[PREVIEW], &sb, pr->dir, name))
+ else if (prepare_download(td[DOWNLOAD], &sb, pr->dir, name))
{
- fprintf(stderr, "%s: prepare_date failed\n", __func__);
+ fprintf(stderr, "%s: prepare_download failed\n", __func__);
goto end;
}
@@ -1391,7 +1409,7 @@ static int add_thead(struct html_node *const table)
[SIZE] = "Size",
[DATE] = "Date",
[SHARE] = "Share",
- [PREVIEW] = "Preview"
+ [DOWNLOAD] = "Download"
};
struct html_node *thead, *tr;