coar 98/09/02 14:04:43
Modified: htdocs/manual/mod mod_autoindex.html src CHANGES src/modules/standard mod_autoindex.c Log: Update the filname column width-sizing piece of mod_autoindex so that it's customisable with a NameLength keyword on the IndexOptions directive. A value of '*' means 'as wide as the longest filename,' which was the default effect of the last patch in this area. PR: 1949, 2324 Revision Changes Path 1.21 +12 -2 apache-1.3/htdocs/manual/mod/mod_autoindex.html Index: mod_autoindex.html =================================================================== RCS file: /export/home/cvs/apache-1.3/htdocs/manual/mod/mod_autoindex.html,v retrieving revision 1.20 retrieving revision 1.21 diff -u -r1.20 -r1.21 --- mod_autoindex.html 1998/08/31 01:18:48 1.20 +++ mod_autoindex.html 1998/09/02 21:04:39 1.21 @@ -482,10 +482,14 @@ <DD><!--%plaintext <?INDEX {\tt FancyIndexing} index option> --> This turns on fancy indexing of directories. <BLOCKQUOTE> - <STRONG>Note that the <SAMP>FancyIndexing</SAMP> and + <STRONG>Note that in versions of Apache prior to 1.3.2, the + <SAMP>FancyIndexing</SAMP> and <SAMP>IndexOptions</SAMP> directives will override each other. You should use <SAMP>IndexOptions FancyIndexing</SAMP> in preference - to the standalone <SAMP>FancyIndexing</SAMP> directive.</STRONG> + to the standalone <SAMP>FancyIndexing</SAMP> directive. + As of Apache 1.3.2, a standalone <SAMP>FancyIndexing</SAMP> directive + is combined with any <SAMP>IndexOptions</SAMP> directive already + specified for the current scope.</STRONG> </BLOCKQUOTE> <DT>IconHeight[=pixels] (<EM>Apache 1.3 and later</EM>) <DD> @@ -512,6 +516,12 @@ images have been loaded. If no value is given for the option, it defaults to the standard width of the icons supplied with the Apache software. +<DT>NameLength=[<EM>n</EM> | *] (<EM>Apache 1.3.2 and later</EM>) +<DD> +The NameLength keyword allows you to specify the width of the +filename column in bytes. If the keyword value is '<SAMP>*</SAMP>', +then the column is automatically sized to the length of the longest +filename in the display. <DT>ScanHTMLTitles <DD><!--%plaintext <?INDEX {\tt ScanHTMLTitles} index option> --> This enables the extraction of the title from HTML documents for fancy 1.1044 +4 -0 apache-1.3/src/CHANGES Index: CHANGES =================================================================== RCS file: /export/home/cvs/apache-1.3/src/CHANGES,v retrieving revision 1.1043 retrieving revision 1.1044 diff -u -r1.1043 -r1.1044 --- CHANGES 1998/09/01 17:21:11 1.1043 +++ CHANGES 1998/09/02 21:04:40 1.1044 @@ -1,5 +1,9 @@ Changes with Apache 1.3.2 + *) Add NameWidth keyword to IndexOptions directive so that the + width of the filename column is customisable. [Ken Coar, Dean Gaudet] + PR#1949, 2324. + *) Recognize lowercase _and_ uppercase `uname' results under SCO OpenServer. [David Coelho <[EMAIL PROTECTED]>] 1.91 +103 -11 apache-1.3/src/modules/standard/mod_autoindex.c Index: mod_autoindex.c =================================================================== RCS file: /export/home/cvs/apache-1.3/src/modules/standard/mod_autoindex.c,v retrieving revision 1.90 retrieving revision 1.91 diff -u -r1.90 -r1.91 --- mod_autoindex.c 1998/08/31 01:18:53 1.90 +++ mod_autoindex.c 1998/09/02 21:04:41 1.91 @@ -94,6 +94,9 @@ #define SUPPRESS_PREAMBLE 64 #define SUPPRESS_COLSORT 128 +#define K_PAD 1 +#define K_NOPAD 0 + /* * Define keys for sorting. */ @@ -111,6 +114,11 @@ #define DEFAULT_ICON_WIDTH 20 #define DEFAULT_ICON_HEIGHT 22 +/* + * Other default dimensions. + */ +#define DEFAULT_NAME_WIDTH 23 + struct item { char *type; char *apply_to; @@ -122,6 +130,8 @@ char *default_icon; int opts; + int name_width; + int name_adjust; int icon_width; int icon_height; @@ -335,6 +345,19 @@ else if (!strncasecmp(w, "IconHeight=", 11)) { d_cfg->icon_height = atoi(&w[11]); } + else if (!strncasecmp(w, "NameWidth=", 10)) { + if (w[10] == '*') { + d_cfg->name_adjust = 1; + } + else { + int width = atoi(&w[10]); + + if (width < 1) { + return "NameWidth value must be greater than 1"; + } + d_cfg->name_width = width; + } + } else { return "Invalid directory indexing option"; } @@ -382,6 +405,8 @@ new->icon_width = 0; new->icon_height = 0; + new->name_width = DEFAULT_NAME_WIDTH; + new->name_adjust = 0; new->icon_list = ap_make_array(p, 4, sizeof(struct item)); new->alt_list = ap_make_array(p, 4, sizeof(struct item)); new->desc_list = ap_make_array(p, 4, sizeof(struct item)); @@ -412,6 +437,8 @@ new->icon_list = ap_append_arrays(p, add->icon_list, base->icon_list); new->rdme_list = ap_append_arrays(p, add->rdme_list, base->rdme_list); new->opts = add->opts; + new->name_width = add->name_width; + new->name_adjust = add->name_adjust; return new; } @@ -837,6 +864,41 @@ } } +/* + * Fit a string into a specified buffer width, marking any + * truncation. The size argument is the actual buffer size, including + * the \0 termination byte. The buffer will be prefilled with blanks. + * If the pad argument is false, any extra spaces at the end of the + * buffer are omitted. (Used when constructing anchors.) + */ +static ap_inline char *widthify(const char *s, char *buff, int size, int pad) +{ + int s_len; + + memset(buff, ' ', size); + buff[size - 1] = '\0'; + s_len = strlen(s); + if (s_len > (size - 1)) { + ap_cpystrn(buff, s, size); + if (size > 1) { + buff[size - 2] = '>'; + } + if (size > 2) { + buff[size - 3] = '.'; + } + if (size > 3) { + buff[size - 4] = '.'; + } + } + else { + ap_cpystrn(buff, s, s_len + 1); + if (pad) { + buff[s_len] = ' '; + } + } + return buff; +} + static void output_directories(struct ent **ar, int n, autoindex_config_rec *d, request_rec *r, int autoindex_opts, char keyid, char direction) @@ -849,20 +911,23 @@ int name_width; char *name_scratch; - if (name[0] == '\0') + if (name[0] == '\0') { name = "/"; + } - name_width = 23; - for (x = 0; x < n; x++) { - int t = strlen(ar[x]->name); - if (t > name_width) { - name_width = t; + name_width = d->name_width; + if (d->name_adjust) { + for (x = 0; x < n; x++) { + int t = strlen(ar[x]->name); + if (t > name_width) { + name_width = t; + } } } ++name_width; name_scratch = ap_palloc(r->pool, name_width + 1); memset(name_scratch, ' ', name_width); - name_scratch[name_width] = 0; + name_scratch[name_width] = '\0'; if (autoindex_opts & FANCY_INDEXING) { ap_rputs("<PRE>", r); @@ -880,8 +945,18 @@ } ap_rputs("> ", r); } - emit_link(r, "Name", K_NAME, keyid, direction, static_columns); - ap_rputs(name_scratch + 4, r); + emit_link(r, widthify("Name", name_scratch, + (name_width > 5) ? 5 : name_width, K_NOPAD), + K_NAME, keyid, direction, static_columns); + if (name_width > 5) { + memset(name_scratch, ' ', name_width); + name_scratch[name_width] = '\0'; + ap_rputs(&name_scratch[5], r); + } + /* + * Emit the guaranteed-at-least-one-space-between-columns byte. + */ + ap_rputs(" ", r); if (!(autoindex_opts & SUPPRESS_LAST_MOD)) { emit_link(r, "Last modified", K_LAST_MOD, keyid, direction, static_columns); @@ -904,6 +979,7 @@ for (x = 0; x < n; x++) { char *anchor, *t, *t2; char *pad; + int nwidth; ap_clear_pool(scratch); @@ -946,7 +1022,22 @@ ap_rputs("</A>", r); } - ap_rvputs(r, " <A HREF=\"", anchor, "\">", t2, "</A>", pad, NULL); + ap_rvputs(r, " <A HREF=\"", anchor, "\">", + widthify(t2, name_scratch, name_width, K_NOPAD), + "</A>", NULL); + /* + * We know that widthify() prefilled the buffer with spaces + * before doing its thing, so use them. + */ + nwidth = strlen(t2); + if (nwidth < (name_width - 1)) { + name_scratch[nwidth] = ' '; + ap_rputs(&name_scratch[nwidth], r); + } + /* + * The blank before the storm.. er, before the next field. + */ + ap_rputs(" ", r); if (!(autoindex_opts & SUPPRESS_LAST_MOD)) { if (ar[x]->lm != -1) { char time_str[MAX_STRING_LEN]; @@ -970,7 +1061,8 @@ } } else { - ap_rvputs(r, "<LI> <A HREF=\"", anchor, "\"> ", t2, "</A>", pad, NULL); + ap_rvputs(r, "<LI><A HREF=\"", anchor, "\"> ", t2, + "</A>", pad, NULL); } ap_rputc('\n', r); }