From 4a6845348b0d97f4e06938e08b951f948ed3d420 Mon Sep 17 00:00:00 2001 From: Ryan Schmidt Date: Mon, 9 May 2022 11:23:34 -0500 Subject: [PATCH 1/3] Rename template variables to omit leading numbers The quantity of template variables is about to increase and it's tedious to renumber all subsequent variables just to keep them in numerical order. One of the variables, t_parentdir_entry, already didn't have a leading number, so this change makes the rest of the variables consistent with that. --- ngx_http_fancyindex_module.c | 40 ++++++++++++++++++------------------ template.h | 32 ++++++++++++++--------------- template.html | 16 +++++++-------- 3 files changed, 44 insertions(+), 44 deletions(-) diff --git a/ngx_http_fancyindex_module.c b/ngx_http_fancyindex_module.c index e6928dd..e877b5f 100644 --- a/ngx_http_fancyindex_module.c +++ b/ngx_http_fancyindex_module.c @@ -617,10 +617,10 @@ make_header_buf(ngx_http_request_t *r, const ngx_str_t css_href) { ngx_buf_t *b; size_t blen = r->uri.len - + ngx_sizeof_ssz(t01_head1) - + ngx_sizeof_ssz(t02_head2) - + ngx_sizeof_ssz(t03_head3) - + ngx_sizeof_ssz(t04_body1) + + ngx_sizeof_ssz(t_head1) + + ngx_sizeof_ssz(t_head2) + + ngx_sizeof_ssz(t_head3) + + ngx_sizeof_ssz(t_body1) ; if (css_href.len) { @@ -633,7 +633,7 @@ make_header_buf(ngx_http_request_t *r, const ngx_str_t css_href) if ((b = ngx_create_temp_buf(r->pool, blen)) == NULL) return NULL; - b->last = ngx_cpymem_ssz(b->last, t01_head1); + b->last = ngx_cpymem_ssz(b->last, t_head1); if (css_href.len) { b->last = ngx_cpymem_str(b->last, css_href_pre); @@ -641,10 +641,10 @@ make_header_buf(ngx_http_request_t *r, const ngx_str_t css_href) b->last = ngx_cpymem_str(b->last, css_href_post); } - b->last = ngx_cpymem_ssz(b->last, t02_head2); + b->last = ngx_cpymem_ssz(b->last, t_head2); b->last = ngx_cpymem_str(b->last, r->uri); - b->last = ngx_cpymem_ssz(b->last, t03_head3); - b->last = ngx_cpymem_ssz(b->last, t04_body1); + b->last = ngx_cpymem_ssz(b->last, t_head3); + b->last = ngx_cpymem_ssz(b->last, t_body1); return b; } @@ -851,17 +851,17 @@ make_content_buf( if (alcf->show_path) len = r->uri.len + escape_html - + ngx_sizeof_ssz(t05_body2) - + ngx_sizeof_ssz(t06_list1) + + ngx_sizeof_ssz(t_body2) + + ngx_sizeof_ssz(t_list_begin) + ngx_sizeof_ssz(t_parentdir_entry) - + ngx_sizeof_ssz(t07_list2) + + ngx_sizeof_ssz(t_list_end) + ngx_fancyindex_timefmt_calc_size (&alcf->time_format) * entries.nelts ; else len = r->uri.len + escape_html - + ngx_sizeof_ssz(t06_list1) + + ngx_sizeof_ssz(t_list_begin) + ngx_sizeof_ssz(t_parentdir_entry) - + ngx_sizeof_ssz(t07_list2) + + ngx_sizeof_ssz(t_list_end) + ngx_fancyindex_timefmt_calc_size (&alcf->time_format) * entries.nelts ; @@ -1025,11 +1025,11 @@ make_content_buf( /* Display the path, if needed */ if (alcf->show_path){ b->last = last = (u_char *) ngx_escape_html(b->last, r->uri.data, r->uri.len); - b->last = ngx_cpymem_ssz(b->last, t05_body2); + b->last = ngx_cpymem_ssz(b->last, t_body2); } /* Open the tag */ - b->last = ngx_cpymem_ssz(b->last, t06_list1); + b->last = ngx_cpymem_ssz(b->last, t_list_begin); tp = ngx_timeofday(); @@ -1129,7 +1129,7 @@ make_content_buf( } /* Output table bottom */ - b->last = ngx_cpymem_ssz(b->last, t07_list2); + b->last = ngx_cpymem_ssz(b->last, t_list_end); *pb = b; return NGX_OK; @@ -1259,8 +1259,8 @@ add_builtin_header: out[last].buf->pos = alcf->footer.local.data; out[last].buf->last = alcf->footer.local.data + alcf->footer.local.len; } else { - out[last].buf->pos = (u_char*) t08_foot1; - out[last].buf->last = (u_char*) t08_foot1 + sizeof(t08_foot1) - 1; + out[last].buf->pos = (u_char*) t_foot; + out[last].buf->last = (u_char*) t_foot + sizeof(t_foot) - 1; } out[last-1].buf->last_in_chain = 0; @@ -1321,8 +1321,8 @@ add_builtin_header: if (out[0].buf == NULL) return NGX_ERROR; out[0].buf->memory = 1; - out[0].buf->pos = (u_char*) t08_foot1; - out[0].buf->last = (u_char*) t08_foot1 + sizeof(t08_foot1) - 1; + out[0].buf->pos = (u_char*) t_foot; + out[0].buf->last = (u_char*) t_foot + sizeof(t_foot) - 1; out[0].buf->last_in_chain = 1; out[0].buf->last_buf = 1; /* Directly send out the builtin footer */ diff --git a/template.h b/template.h index 02ba908..8188bb5 100644 --- a/template.h +++ b/template.h @@ -1,5 +1,5 @@ /* Automagically generated, do not edit! */ -static const u_char t01_head1[] = "" +static const u_char t_head1[] = "" "" "" "" @@ -44,24 +44,24 @@ static const u_char t01_head1[] = "" "" "\n" ; -static const u_char t02_head2[] = "" +static const u_char t_head2[] = "" "\n" "Index of " ; -static const u_char t03_head3[] = "" +static const u_char t_head3[] = "" "" "\n" "" ; -static const u_char t04_body1[] = "" +static const u_char t_body1[] = "" "" "

Index of " ; -static const u_char t05_body2[] = "" +static const u_char t_body2[] = "" "

" "\n" ; -static const u_char t06_list1[] = "" +static const u_char t_list_begin[] = "" "
" "" "" @@ -81,22 +81,22 @@ static const u_char t_parentdir_entry[] = "" "" "\n" ; -static const u_char t07_list2[] = "" +static const u_char t_list_end[] = "" "" "
" ; -static const u_char t08_foot1[] = "" +static const u_char t_foot[] = "" "" "" ; #define NFI_TEMPLATE_SIZE (0 \ - + nfi_sizeof_ssz(t01_head1) \ - + nfi_sizeof_ssz(t02_head2) \ - + nfi_sizeof_ssz(t03_head3) \ - + nfi_sizeof_ssz(t04_body1) \ - + nfi_sizeof_ssz(t05_body2) \ - + nfi_sizeof_ssz(t06_list1) \ + + nfi_sizeof_ssz(t_head1) \ + + nfi_sizeof_ssz(t_head2) \ + + nfi_sizeof_ssz(t_head3) \ + + nfi_sizeof_ssz(t_body1) \ + + nfi_sizeof_ssz(t_body2) \ + + nfi_sizeof_ssz(t_list_begin) \ + nfi_sizeof_ssz(t_parentdir_entry) \ - + nfi_sizeof_ssz(t07_list2) \ - + nfi_sizeof_ssz(t08_foot1) \ + + nfi_sizeof_ssz(t_list_end) \ + + nfi_sizeof_ssz(t_foot) \ ) diff --git a/template.html b/template.html index b2f521b..829a2bc 100644 --- a/template.html +++ b/template.html @@ -1,4 +1,4 @@ - + @@ -42,24 +42,24 @@ } - + Index of <!-- var NONE --> /path/to/somewhere -<!-- var t03_head3 --> +<!-- var t_head3 --> - +

Index of /path/to/somewhere - +

- + @@ -93,9 +93,9 @@ - +
666 date
- + From c07bc573d15da6b0ad82d1fa701dc14289bb8056 Mon Sep 17 00:00:00 2001 From: Ryan Schmidt Date: Mon, 9 May 2022 13:13:53 -0500 Subject: [PATCH 2/3] Add aria-sort attribute to the appropriate th Add the aria-sort attribute to the th of the column by which the data is sorted. This is conceivably useful to let screen readers know how the table is sorted, but it also allows CSS styles to be applied, for example to highlight the sorted column header or to change an icon in the column header to indicate the sort direction. This required breaking the start of the table into separate variables so that the column headers can be addressed individually. This is a step toward being able to reorder (#66) or remove (#133) columns. --- ngx_http_fancyindex_module.c | 76 +++++++++++++++++++++++++++++++----- template.h | 30 ++++++++++++-- template.html | 16 ++++++-- 3 files changed, 107 insertions(+), 15 deletions(-) diff --git a/ngx_http_fancyindex_module.c b/ngx_http_fancyindex_module.c index e877b5f..95f69e6 100644 --- a/ngx_http_fancyindex_module.c +++ b/ngx_http_fancyindex_module.c @@ -667,7 +667,7 @@ make_content_buf( ngx_tm_t tm; ngx_array_t entries; ngx_time_t *tp; - ngx_uint_t i, j; + ngx_uint_t i, j, sort_criterion; ngx_str_t path; ngx_dir_t dir; ngx_buf_t *b; @@ -853,6 +853,14 @@ make_content_buf( len = r->uri.len + escape_html + ngx_sizeof_ssz(t_body2) + ngx_sizeof_ssz(t_list_begin) + + ngx_sizeof_ssz(t_list_colhead_name1) + + ngx_sizeof_ssz(t_list_colhead_name2) + + ngx_sizeof_ssz(t_list_colhead_size1) + + ngx_sizeof_ssz(t_list_colhead_size2) + + ngx_sizeof_ssz(t_list_colhead_date1) + + ngx_sizeof_ssz(t_list_colhead_date2) + + ngx_sizeof_ssz(" aria-sort=\"descending\"") + + ngx_sizeof_ssz(t_list_mid) + ngx_sizeof_ssz(t_parentdir_entry) + ngx_sizeof_ssz(t_list_end) + ngx_fancyindex_timefmt_calc_size (&alcf->time_format) * entries.nelts @@ -860,6 +868,14 @@ make_content_buf( else len = r->uri.len + escape_html + ngx_sizeof_ssz(t_list_begin) + + ngx_sizeof_ssz(t_list_colhead_name1) + + ngx_sizeof_ssz(t_list_colhead_name2) + + ngx_sizeof_ssz(t_list_colhead_size1) + + ngx_sizeof_ssz(t_list_colhead_size2) + + ngx_sizeof_ssz(t_list_colhead_date1) + + ngx_sizeof_ssz(t_list_colhead_date2) + + ngx_sizeof_ssz(" aria-sort=\"descending\"") + + ngx_sizeof_ssz(t_list_mid) + ngx_sizeof_ssz(t_parentdir_entry) + ngx_sizeof_ssz(t_list_end) + ngx_fancyindex_timefmt_calc_size (&alcf->time_format) * entries.nelts @@ -923,44 +939,51 @@ make_content_buf( case 'M': /* Sort by mtime */ if (sort_descending) { sort_cmp_func = ngx_http_fancyindex_cmp_entries_mtime_desc; - if (alcf->default_sort != NGX_HTTP_FANCYINDEX_SORT_CRITERION_DATE_DESC) + sort_criterion = NGX_HTTP_FANCYINDEX_SORT_CRITERION_DATE_DESC; + if (sort_criterion != alcf->default_sort) sort_url_args = "?C=M&O=D"; } else { sort_cmp_func = ngx_http_fancyindex_cmp_entries_mtime_asc; - if (alcf->default_sort != NGX_HTTP_FANCYINDEX_SORT_CRITERION_DATE) + sort_criterion = NGX_HTTP_FANCYINDEX_SORT_CRITERION_DATE; + if (sort_criterion != alcf->default_sort) sort_url_args = "?C=M&O=A"; } break; case 'S': /* Sort by size */ if (sort_descending) { sort_cmp_func = ngx_http_fancyindex_cmp_entries_size_desc; - if (alcf->default_sort != NGX_HTTP_FANCYINDEX_SORT_CRITERION_SIZE_DESC) + sort_criterion = NGX_HTTP_FANCYINDEX_SORT_CRITERION_SIZE_DESC; + if (sort_criterion != alcf->default_sort) sort_url_args = "?C=S&O=D"; } else { sort_cmp_func = ngx_http_fancyindex_cmp_entries_size_asc; - if (alcf->default_sort != NGX_HTTP_FANCYINDEX_SORT_CRITERION_SIZE) - sort_url_args = "?C=S&O=A"; + sort_criterion = NGX_HTTP_FANCYINDEX_SORT_CRITERION_SIZE; + if (sort_criterion != alcf->default_sort) + sort_url_args = "?C=S&O=A"; } break; case 'N': /* Sort by name */ default: if (sort_descending) { sort_cmp_func = ngx_http_fancyindex_cmp_entries_name_desc; - if (alcf->default_sort != NGX_HTTP_FANCYINDEX_SORT_CRITERION_NAME_DESC) + sort_criterion = NGX_HTTP_FANCYINDEX_SORT_CRITERION_NAME_DESC; + if (sort_criterion != alcf->default_sort) sort_url_args = "?C=N&O=D"; } else { sort_cmp_func = ngx_http_fancyindex_cmp_entries_name_asc; - if (alcf->default_sort != NGX_HTTP_FANCYINDEX_SORT_CRITERION_NAME) + sort_criterion = NGX_HTTP_FANCYINDEX_SORT_CRITERION_NAME; + if (sort_criterion != alcf->default_sort) sort_url_args = "?C=N&O=A"; } break; } } else { - switch (alcf->default_sort) { + sort_criterion = alcf->default_sort; + switch (sort_criterion) { case NGX_HTTP_FANCYINDEX_SORT_CRITERION_DATE_DESC: sort_cmp_func = ngx_http_fancyindex_cmp_entries_mtime_desc; break; @@ -1031,6 +1054,41 @@ make_content_buf( /* Open the tag */ b->last = ngx_cpymem_ssz(b->last, t_list_begin); + /* Write the column headers */ + b->last = ngx_cpymem_ssz(b->last, t_list_colhead_name1); + switch (sort_criterion) { + case NGX_HTTP_FANCYINDEX_SORT_CRITERION_NAME_DESC: + b->last = ngx_cpymem_ssz(b->last, " aria-sort=\"descending\""); + break; + case NGX_HTTP_FANCYINDEX_SORT_CRITERION_NAME: + b->last = ngx_cpymem_ssz(b->last, " aria-sort=\"ascending\""); + break; + } + b->last = ngx_cpymem_ssz(b->last, t_list_colhead_name2); + b->last = ngx_cpymem_ssz(b->last, t_list_colhead_size1); + switch (sort_criterion) { + case NGX_HTTP_FANCYINDEX_SORT_CRITERION_SIZE_DESC: + b->last = ngx_cpymem_ssz(b->last, " aria-sort=\"descending\""); + break; + case NGX_HTTP_FANCYINDEX_SORT_CRITERION_SIZE: + b->last = ngx_cpymem_ssz(b->last, " aria-sort=\"ascending\""); + break; + } + b->last = ngx_cpymem_ssz(b->last, t_list_colhead_size2); + b->last = ngx_cpymem_ssz(b->last, t_list_colhead_date1); + switch (sort_criterion) { + case NGX_HTTP_FANCYINDEX_SORT_CRITERION_DATE_DESC: + b->last = ngx_cpymem_ssz(b->last, " aria-sort=\"descending\""); + break; + case NGX_HTTP_FANCYINDEX_SORT_CRITERION_DATE: + b->last = ngx_cpymem_ssz(b->last, " aria-sort=\"ascending\""); + break; + } + b->last = ngx_cpymem_ssz(b->last, t_list_colhead_date2); + + /* Begin the table body */ + b->last = ngx_cpymem_ssz(b->last, t_list_mid); + tp = ngx_timeofday(); /* "Parent dir" entry, always first if displayed */ diff --git a/template.h b/template.h index 8188bb5..5e1f7e9 100644 --- a/template.h +++ b/template.h @@ -65,9 +65,26 @@ static const u_char t_list_begin[] = "" "
" "" "" -"" -"" -"" +; +static const u_char t_list_colhead_name1[] = "" +"" +; +static const u_char t_list_colhead_size1[] = "" +"File Size  ↓ " +; +static const u_char t_list_colhead_date1[] = "" +"Date  ↓ " +; +static const u_char t_list_mid[] = "" "" "" "\n" @@ -96,6 +113,13 @@ static const u_char t_foot[] = "" + nfi_sizeof_ssz(t_body1) \ + nfi_sizeof_ssz(t_body2) \ + nfi_sizeof_ssz(t_list_begin) \ + + nfi_sizeof_ssz(t_list_colhead_name1) \ + + nfi_sizeof_ssz(t_list_colhead_name2) \ + + nfi_sizeof_ssz(t_list_colhead_size1) \ + + nfi_sizeof_ssz(t_list_colhead_size2) \ + + nfi_sizeof_ssz(t_list_colhead_date1) \ + + nfi_sizeof_ssz(t_list_colhead_date2) \ + + nfi_sizeof_ssz(t_list_mid) \ + nfi_sizeof_ssz(t_parentdir_entry) \ + nfi_sizeof_ssz(t_list_end) \ + nfi_sizeof_ssz(t_foot) \ diff --git a/template.html b/template.html index 829a2bc..3eca849 100644 --- a/template.html +++ b/template.html @@ -63,9 +63,19 @@
File Name  ↓ File Size  ↓ Date  ↓ File Name  ↓ 
- - - + + + + + + + From 8f1e66edee1b77ee6ff76385aed271d6d392e2e1 Mon Sep 17 00:00:00 2001 From: Ryan Schmidt Date: Tue, 10 May 2022 11:57:53 -0500 Subject: [PATCH 3/3] Add sort criterion and order classes to table tag Add a class "sort-col-1", "sort-col-2", or "sort-col-3" to the table tag to indicate by which column the data is sorted, and a class "asc" or "desc" to indicate whether it is sorted in ascending or descending order. This is intended to be useful for applying a style to the sorted column or its header. Modify the default template to slightly darken the sorted column. --- ngx_http_fancyindex_module.c | 25 +++++++++++++++++++++++++ template.h | 21 ++++++++++++++++++++- template.html | 21 ++++++++++++++++++++- 3 files changed, 65 insertions(+), 2 deletions(-) diff --git a/ngx_http_fancyindex_module.c b/ngx_http_fancyindex_module.c index 95f69e6..ef62b0a 100644 --- a/ngx_http_fancyindex_module.c +++ b/ngx_http_fancyindex_module.c @@ -853,6 +853,8 @@ make_content_buf( len = r->uri.len + escape_html + ngx_sizeof_ssz(t_body2) + ngx_sizeof_ssz(t_list_begin) + + ngx_sizeof_ssz(t_list_head) + + ngx_sizeof_ssz("desc sort-col-1") + ngx_sizeof_ssz(t_list_colhead_name1) + ngx_sizeof_ssz(t_list_colhead_name2) + ngx_sizeof_ssz(t_list_colhead_size1) @@ -868,6 +870,8 @@ make_content_buf( else len = r->uri.len + escape_html + ngx_sizeof_ssz(t_list_begin) + + ngx_sizeof_ssz(t_list_head) + + ngx_sizeof_ssz("desc sort-col-1") + ngx_sizeof_ssz(t_list_colhead_name1) + ngx_sizeof_ssz(t_list_colhead_name2) + ngx_sizeof_ssz(t_list_colhead_size1) @@ -1053,6 +1057,27 @@ make_content_buf( /* Open the
File Name  ↓ File Size  ↓ Date  ↓  +>File Name  ↓  +>File Size  ↓  +>Date  ↓ 
tag */ b->last = ngx_cpymem_ssz(b->last, t_list_begin); + switch (sort_criterion) { + case NGX_HTTP_FANCYINDEX_SORT_CRITERION_NAME_DESC: + b->last = ngx_cpymem_ssz(b->last, "desc sort-col-1"); + break; + case NGX_HTTP_FANCYINDEX_SORT_CRITERION_NAME: + b->last = ngx_cpymem_ssz(b->last, "asc sort-col-1"); + break; + case NGX_HTTP_FANCYINDEX_SORT_CRITERION_SIZE_DESC: + b->last = ngx_cpymem_ssz(b->last, "desc sort-col-2"); + break; + case NGX_HTTP_FANCYINDEX_SORT_CRITERION_SIZE: + b->last = ngx_cpymem_ssz(b->last, "asc sort-col-2"); + break; + case NGX_HTTP_FANCYINDEX_SORT_CRITERION_DATE_DESC: + b->last = ngx_cpymem_ssz(b->last, "desc sort-col-3"); + break; + case NGX_HTTP_FANCYINDEX_SORT_CRITERION_DATE: + b->last = ngx_cpymem_ssz(b->last, "asc sort-col-3"); + break; + } + b->last = ngx_cpymem_ssz(b->last, t_list_head); /* Write the column headers */ b->last = ngx_cpymem_ssz(b->last, t_list_colhead_name1); diff --git a/template.h b/template.h index 5e1f7e9..7234c2c 100644 --- a/template.h +++ b/template.h @@ -41,6 +41,21 @@ static const u_char t_head1[] = "" "text-overflow: '>';" "overflow: hidden;" "}" +".sort-col-1 th:nth-of-type(1)," +".sort-col-2 th:nth-of-type(2)," +".sort-col-3 th:nth-of-type(3) {" +"background:#ddd;" +"}" +".sort-col-1 td:nth-of-type(1)," +".sort-col-2 td:nth-of-type(2)," +".sort-col-3 td:nth-of-type(3) {" +"background:#eee;" +"}" +".sort-col-1 tr:nth-child(even) td:nth-of-type(1)," +".sort-col-2 tr:nth-child(even) td:nth-of-type(2)," +".sort-col-3 tr:nth-child(even) td:nth-of-type(3) {" +"background:#e4e4e4;" +"}" "" "\n" ; @@ -62,7 +77,10 @@ static const u_char t_body2[] = "" "\n" ; static const u_char t_list_begin[] = "" -"
" +"
" "" "" ; @@ -113,6 +131,7 @@ static const u_char t_foot[] = "" + nfi_sizeof_ssz(t_body1) \ + nfi_sizeof_ssz(t_body2) \ + nfi_sizeof_ssz(t_list_begin) \ + + nfi_sizeof_ssz(t_list_head) \ + nfi_sizeof_ssz(t_list_colhead_name1) \ + nfi_sizeof_ssz(t_list_colhead_name2) \ + nfi_sizeof_ssz(t_list_colhead_size1) \ diff --git a/template.html b/template.html index 3eca849..aaf15a7 100644 --- a/template.html +++ b/template.html @@ -40,6 +40,21 @@ text-overflow: '>'; overflow: hidden; } + .sort-col-1 th:nth-of-type(1), + .sort-col-2 th:nth-of-type(2), + .sort-col-3 th:nth-of-type(3) { + background:#ddd; + } + .sort-col-1 td:nth-of-type(1), + .sort-col-2 td:nth-of-type(2), + .sort-col-3 td:nth-of-type(3) { + background:#eee; + } + .sort-col-1 tr:nth-child(even) td:nth-of-type(1), + .sort-col-2 tr:nth-child(even) td:nth-of-type(2), + .sort-col-3 tr:nth-child(even) td:nth-of-type(3) { + background:#e4e4e4; + } @@ -60,7 +75,11 @@ -
+