Add fancyindex_css_href configuration option

This allows for inserting a <link> tag in the generated listings pointing to
an additional CSS stylesheet, which will be applied by the browser after the
built-in rules. This allows for super-easy customization of the output look.
pull/4/head
Adrian Perez 2010-06-10 16:56:31 +02:00
parent 224db63c53
commit 4b19f3a73f
4 changed files with 77 additions and 35 deletions

View File

@ -127,6 +127,16 @@ fancyindex_footer
header/footer is a must-have for you, please header/footer is a must-have for you, please
`let me know <mailto:aperez@connectical.com>`__. `let me know <mailto:aperez@connectical.com>`__.
fancyindex_css_href
~~~~~~~~~~~~~~~~~~~
:Syntax: *fancyindex_css_href uri*
:Default: fancyindex_css_href ""
:Context: http, server, location
:Description:
Allows inserting a link to a CSS style sheet in generated listings. The
provided *uri* parameter will be inserted as-is in a ``<link>`` HTML tag.
The link is inserted after the built-in CSS rules, so you can override the
default styles.
.. _nginx: http://nginx.net .. _nginx: http://nginx.net

View File

@ -45,6 +45,7 @@ typedef struct {
ngx_str_t header; /**< File name for header, or empty if none. */ ngx_str_t header; /**< File name for header, or empty if none. */
ngx_str_t footer; /**< File name for footer, or empty if none. */ ngx_str_t footer; /**< File name for footer, or empty if none. */
ngx_str_t css_href; /**< Link to a CSS stylesheet, or empty if none. */
} ngx_http_fancyindex_loc_conf_t; } ngx_http_fancyindex_loc_conf_t;
@ -111,11 +112,7 @@ static char *ngx_http_fancyindex_merge_loc_conf(ngx_conf_t *cf,
* above). * above).
*/ */
static ngx_inline ngx_buf_t* static ngx_inline ngx_buf_t*
make_header_buf(ngx_http_request_t *r) make_header_buf(ngx_http_request_t *r, const ngx_str_t css_href)
ngx_force_inline;
static ngx_inline ngx_buf_t*
make_header_buf(ngx_http_request_t *r)
ngx_force_inline; ngx_force_inline;
static ngx_inline ngx_buf_t* static ngx_inline ngx_buf_t*
@ -161,6 +158,13 @@ static ngx_command_t ngx_http_fancyindex_commands[] = {
offsetof(ngx_http_fancyindex_loc_conf_t, footer), offsetof(ngx_http_fancyindex_loc_conf_t, footer),
NULL }, NULL },
{ ngx_string("fancyindex_css_href"),
NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
ngx_conf_set_str_slot,
NGX_HTTP_LOC_CONF_OFFSET,
offsetof(ngx_http_fancyindex_loc_conf_t, css_href),
NULL },
ngx_null_command ngx_null_command
}; };
@ -197,23 +201,45 @@ ngx_module_t ngx_http_fancyindex_module = {
static const ngx_str_t css_href_pre =
ngx_string("<link rel=\"stylesheet\" href=\"");
static const ngx_str_t css_href_post =
ngx_string("\" type=\"text/css\"/>\n");
static ngx_inline ngx_buf_t* static ngx_inline ngx_buf_t*
make_header_buf(ngx_http_request_t *r) make_header_buf(ngx_http_request_t *r, const ngx_str_t css_href)
{ {
size_t blen = r->uri.len size_t blen = r->uri.len
+ ngx_sizeof_ssz(t01_head1) + ngx_sizeof_ssz(t01_head1)
+ ngx_sizeof_ssz(t02_head2) + ngx_sizeof_ssz(t02_head2)
+ ngx_sizeof_ssz(t03_body1) + ngx_sizeof_ssz(t03_head3)
+ ngx_sizeof_ssz(t04_body1)
; ;
if (css_href.len) {
blen += css_href_pre.len \
+ css_href.len \
+ css_href_post.len
;
}
ngx_buf_t *b = ngx_create_temp_buf(r->pool, blen); ngx_buf_t *b = ngx_create_temp_buf(r->pool, blen);
if (b == NULL) goto bailout; if (b == NULL) goto bailout;
b->last = ngx_cpymem_ssz(b->last, t01_head1); b->last = ngx_cpymem_ssz(b->last, t01_head1);
b->last = ngx_cpymem_str(b->last, r->uri);
if (css_href.len) {
b->last = ngx_cpymem_str(b->last, css_href_pre);
b->last = ngx_cpymem_str(b->last, 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, t02_head2);
b->last = ngx_cpymem_ssz(b->last, t03_body1); 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);
bailout: bailout:
return b; return b;
@ -228,11 +254,11 @@ make_footer_buf(ngx_http_request_t *r)
* TODO: Make this buffer static (i.e. readonly and reusable from * TODO: Make this buffer static (i.e. readonly and reusable from
* one request to another. * one request to another.
*/ */
ngx_buf_t *b = ngx_create_temp_buf(r->pool, ngx_sizeof_ssz(t07_foot1)); ngx_buf_t *b = ngx_create_temp_buf(r->pool, ngx_sizeof_ssz(t08_foot1));
if (b == NULL) goto bailout; if (b == NULL) goto bailout;
b->last = ngx_cpymem_ssz(b->last, t07_foot1); b->last = ngx_cpymem_ssz(b->last, t08_foot1);
bailout: bailout:
return b; return b;
@ -397,9 +423,9 @@ make_content_buf(
* Calculate needed buffer length. * Calculate needed buffer length.
*/ */
len = r->uri.len len = r->uri.len
+ ngx_sizeof_ssz(t04_body2) + ngx_sizeof_ssz(t05_body2)
+ ngx_sizeof_ssz(t05_list1) + ngx_sizeof_ssz(t06_list1)
+ ngx_sizeof_ssz(t06_list2) + ngx_sizeof_ssz(t07_list2)
; ;
entry = entries.elts; entry = entries.elts;
@ -438,8 +464,8 @@ make_content_buf(
} }
b->last = ngx_cpymem_str(b->last, r->uri); b->last = ngx_cpymem_str(b->last, r->uri);
b->last = ngx_cpymem_ssz(b->last, t04_body2); b->last = ngx_cpymem_ssz(b->last, t05_body2);
b->last = ngx_cpymem_ssz(b->last, t05_list1); b->last = ngx_cpymem_ssz(b->last, t06_list1);
tp = ngx_timeofday(); tp = ngx_timeofday();
@ -566,7 +592,7 @@ make_content_buf(
} }
/* Output table bottom */ /* Output table bottom */
b->last = ngx_cpymem_ssz(b->last, t06_list2); b->last = ngx_cpymem_ssz(b->last, t07_list2);
*pb = b; *pb = b;
return NGX_OK; return NGX_OK;
@ -671,7 +697,7 @@ add_builtin_header:
out[1].buf = out[0].buf; out[1].buf = out[0].buf;
/* Chain header buffer */ /* Chain header buffer */
out[0].next = &out[1]; out[0].next = &out[1];
out[0].buf = make_header_buf(r); out[0].buf = make_header_buf(r, alcf->css_href);
} }
/* If footer is disabled, chain up footer buffer. */ /* If footer is disabled, chain up footer buffer. */

View File

@ -36,22 +36,25 @@ static const u_char t01_head1[] = ""
"}" "}"
"</style>" "</style>"
"\n" "\n"
"<title>Index of "
; ;
static const u_char t02_head2[] = "" static const u_char t02_head2[] = ""
"\n"
"<title>Index of "
;
static const u_char t03_head3[] = ""
"</title>" "</title>"
"\n" "\n"
"</head>" "</head>"
; ;
static const u_char t03_body1[] = "" static const u_char t04_body1[] = ""
"<body>" "<body>"
"<h1>Index of " "<h1>Index of "
; ;
static const u_char t04_body2[] = "" static const u_char t05_body2[] = ""
"</h1>" "</h1>"
"\n" "\n"
; ;
static const u_char t05_list1[] = "" static const u_char t06_list1[] = ""
"<table id=\"list\" cellpadding=\"0.1em\" cellspacing=\"0\">" "<table id=\"list\" cellpadding=\"0.1em\" cellspacing=\"0\">"
"\n" "\n"
"<colgroup>" "<colgroup>"
@ -75,20 +78,21 @@ static const u_char t05_list1[] = ""
"<td>-</td>" "<td>-</td>"
"</tr>" "</tr>"
; ;
static const u_char t06_list2[] = "" static const u_char t07_list2[] = ""
"</tbody>" "</tbody>"
"</table>" "</table>"
; ;
static const u_char t07_foot1[] = "" static const u_char t08_foot1[] = ""
"</body>" "</body>"
"</html>" "</html>"
; ;
#define NFI_TEMPLATE_SIZE (0 \ #define NFI_TEMPLATE_SIZE (0 \
+ nfi_sizeof_ssz(t05_list1) \ + nfi_sizeof_ssz(t05_body2) \
+ nfi_sizeof_ssz(t06_list2) \ + nfi_sizeof_ssz(t06_list1) \
+ nfi_sizeof_ssz(t07_foot1) \ + nfi_sizeof_ssz(t07_list2) \
+ nfi_sizeof_ssz(t08_foot1) \
+ nfi_sizeof_ssz(t01_head1) \ + nfi_sizeof_ssz(t01_head1) \
+ nfi_sizeof_ssz(t02_head2) \ + nfi_sizeof_ssz(t02_head2) \
+ nfi_sizeof_ssz(t03_body1) \ + nfi_sizeof_ssz(t03_head3) \
+ nfi_sizeof_ssz(t04_body2) \ + nfi_sizeof_ssz(t04_body1) \
) )

View File

@ -35,22 +35,24 @@
} }
</style> </style>
<!-- var t02_head2 -->
<title>Index of <title>Index of
<!-- var NONE --> <!-- var NONE -->
/path/to/somewhere /path/to/somewhere
<!-- var t02_head2 --> <!-- var t03_head3 -->
</title> </title>
</head> </head>
<!-- var t03_body1 --> <!-- var t04_body1 -->
<body> <body>
<h1>Index of <h1>Index of
<!-- var NONE --> <!-- var NONE -->
/path/to/somewhere /path/to/somewhere
<!-- var t04_body2 --> <!-- var t05_body2 -->
</h1> </h1>
<!-- var t05_list1 --> <!-- var t06_list1 -->
<table id="list" cellpadding="0.1em" cellspacing="0"> <table id="list" cellpadding="0.1em" cellspacing="0">
<colgroup> <colgroup>
@ -89,9 +91,9 @@
<td>666</td> <td>666</td>
<td>date</td> <td>date</td>
</tr> </tr>
<!-- var t06_list2 --> <!-- var t07_list2 -->
</tbody> </tbody>
</table> </table>
<!-- var t07_foot1 --> <!-- var t08_foot1 -->
</body> </body>
</html> </html>