coar        99/12/01 14:10:50

  Modified:    htdocs/manual/mod mod_autoindex.html
               src      CHANGES
               src/modules/standard mod_autoindex.c
  Log:
        Add the long-awaited IndexOptions DescriptionWidth keyword.
        It was waiting for a way to avoid breaking HTML tags, but
        that's already been done as much as possible -- we can't
        do anything about breaking HTML elements without putting
        a full parser in.
  
  PR:           2324
  
  Revision  Changes    Path
  1.33      +22 -1     apache-1.3/htdocs/manual/mod/mod_autoindex.html
  
  Index: mod_autoindex.html
  ===================================================================
  RCS file: /home/cvs/apache-1.3/htdocs/manual/mod/mod_autoindex.html,v
  retrieving revision 1.32
  retrieving revision 1.33
  diff -u -r1.32 -r1.33
  --- mod_autoindex.html        1999/12/01 20:33:48     1.32
  +++ mod_autoindex.html        1999/12/01 22:10:32     1.33
  @@ -215,6 +215,17 @@
   <CODE>IndexOptions&nbsp;SuppressSize</CODE>, and 19 bytes may be
   added if <CODE>IndexOptions&nbsp;SuppressLastModified</CODE> is
   in effect.  The widest this column can be is therefore 49 bytes.
  +<blockquote>
  +As of Apache 1.3.10, the
  +<a href="#indexoptions:descriptionwidth">DescriptionWidth</a>
  +<samp>IndexOptions</samp> keyword allows you to adjust this width
  +to any arbitrary size.
  +</blockquote>
  +<b>Caution:</b> Descriptive text defined with <samp>AddDescription</samp>
  +may contain HTML markup, such as tags and character entities.  If the
  +width of the description column should happen to truncate a tagged
  +element (such as cutting off the end of a bolded phrase), the results
  +may affect the rest of the directory listing.
   </P>
   <HR>
   
  @@ -545,13 +556,23 @@
    REL="Help"
   ><STRONG>Compatibility:</STRONG></A> '+/-' syntax and merging of multiple
    <SAMP>IndexOptions</SAMP> directives is only available with
  - Apache 1.3.3 and later; the <samp>FoldersFirst</samp> option is only
  + Apache 1.3.3 and later; the <samp>FoldersFirst</samp> and
  + <samp>DescriptionWidth</samp> options are only
    available with Apache 1.3.10 and later
   <P>
   
   The IndexOptions directive specifies the behavior of the directory indexing.
   <EM>Option</EM> can be one of
   <DL>
  +<dt><a name="indexoptions:descriptionwidth">DescriptionWidth=[<em>n</em> | *]
  + (<em>Apache 1.3.10 and later</em>)</a>
  +<dd>
  +The <samp>DescriptionWidth</samp> keyword allows you to specify the
  +width of the description column in characters.  If the keyword value
  +is '<samp>*</samp>', then the column is automatically sized to the
  +length of the longest filename in the display.
  +<b>See the section on <a 
href="#adddescription"><samp>AddDescription</samp></a>
  +for dangers inherent in truncating descriptions.</b></dd>
   <DT><A NAME="indexoptions:fancyindexing">FancyIndexing</A>
   <DD><!--%plaintext &lt;?INDEX {\tt FancyIndexing} index option&gt; -->
   This turns on fancy indexing of directories.
  
  
  
  1.1468    +5 -0      apache-1.3/src/CHANGES
  
  Index: CHANGES
  ===================================================================
  RCS file: /home/cvs/apache-1.3/src/CHANGES,v
  retrieving revision 1.1467
  retrieving revision 1.1468
  diff -u -r1.1467 -r1.1468
  --- CHANGES   1999/12/01 20:54:55     1.1467
  +++ CHANGES   1999/12/01 22:10:39     1.1468
  @@ -1,5 +1,10 @@
   Changes with Apache 1.3.10
   
  +  *) Add IndexOptions DescriptionWidth so that the width of the
  +     description field in fancy-indexed directory listings can
  +     be specified.
  +     [Ken Coar] PR#2324, plus lots that are closed unsatisfied
  +
     *) EBCDIC: Escaped characters were encoding the ebcdic representation
        of the special characters, not the latin1 representation. This
        would result in invalid URI's for, e.g., filenames (with special chars)
  
  
  
  1.112     +80 -19    apache-1.3/src/modules/standard/mod_autoindex.c
  
  Index: mod_autoindex.c
  ===================================================================
  RCS file: /home/cvs/apache-1.3/src/modules/standard/mod_autoindex.c,v
  retrieving revision 1.111
  retrieving revision 1.112
  diff -u -r1.111 -r1.112
  --- mod_autoindex.c   1999/12/01 20:34:10     1.111
  +++ mod_autoindex.c   1999/12/01 22:10:45     1.112
  @@ -125,6 +125,7 @@
    * Other default dimensions.
    */
   #define DEFAULT_NAME_WIDTH 23
  +#define DEFAULT_DESC_WIDTH 23
   
   struct item {
       char *type;
  @@ -141,13 +142,14 @@
   } ai_desc_t;
   
   typedef struct autoindex_config_struct {
  -
       char *default_icon;
       int opts;
       int incremented_opts;
       int decremented_opts;
       int name_width;
       int name_adjust;
  +    int desc_width;
  +    int desc_adjust;
       int icon_width;
       int icon_height;
       char *default_order;
  @@ -465,6 +467,31 @@
                d_cfg->name_adjust = K_NOADJUST;
            }
        }
  +     else if (!strcasecmp(w, "DescriptionWidth")) {
  +         if (action != '-') {
  +             return "DescriptionWidth with no value may only appear as "
  +                    "'-DescriptionWidth'";
  +         }
  +         d_cfg->desc_width = DEFAULT_DESC_WIDTH;
  +         d_cfg->desc_adjust = K_NOADJUST;
  +     }
  +     else if (!strncasecmp(w, "DescriptionWidth=", 17)) {
  +         if (action == '-') {
  +             return "Cannot combine '-' with DescriptionWidth=n";
  +         }
  +         if (w[17] == '*') {
  +             d_cfg->desc_adjust = K_ADJUST;
  +         }
  +         else {
  +             int width = atoi(&w[17]);
  +
  +             if (width < 12) {
  +                 return "DescriptionWidth value must be greater than 12";
  +             }
  +             d_cfg->desc_width = width;
  +             d_cfg->desc_adjust = K_NOADJUST;
  +         }
  +     }
        else {
            return "Invalid directory indexing option";
        }
  @@ -576,6 +603,8 @@
       new->icon_height = 0;
       new->name_width = DEFAULT_NAME_WIDTH;
       new->name_adjust = K_UNSET;
  +    new->desc_width = DEFAULT_DESC_WIDTH;
  +    new->desc_adjust = K_UNSET;
       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(ai_desc_t));
  @@ -663,6 +692,17 @@
        new->name_width = add->name_width;
        new->name_adjust = add->name_adjust;
       }
  +    /*
  +     * Likewise for DescriptionWidth.
  +     */
  +    if (add->desc_adjust == K_UNSET) {
  +     new->desc_width = base->desc_width;
  +     new->desc_adjust = base->desc_adjust;
  +    }
  +    else {
  +     new->desc_width = add->desc_width;
  +     new->desc_adjust = add->desc_adjust;
  +    }
   
       new->default_order = (add->default_order != NULL)
        ? add->default_order : base->default_order;
  @@ -1208,19 +1248,27 @@
   }
   
   static char *terminate_description(autoindex_config_rec *d, char *desc,
  -                                int autoindex_opts)
  +                                int autoindex_opts, int desc_width)
   {
  -    int maxsize = 23;
  +    int maxsize = desc_width;
       register int x;
   
  -    if (autoindex_opts & SUPPRESS_LAST_MOD) {
  -     maxsize += 19;
  -    }
  -    if (autoindex_opts & SUPPRESS_SIZE) {
  -     maxsize += 7;
  +    /*
  +     * If there's no DescriptionWidth in effect, default to the old
  +     * behaviour of adjusting the description size depending upon
  +     * what else is being displayed.  Otherwise, stick with the
  +     * setting.
  +     */
  +    if (d->desc_adjust == K_UNSET) {
  +     if (autoindex_opts & SUPPRESS_LAST_MOD) {
  +         maxsize += 19;
  +     }
  +     if (autoindex_opts & SUPPRESS_SIZE) {
  +         maxsize += 7;
  +     }
       }
   
  -    for (x = 0; desc[x] && (maxsize > 0 || desc[x]=='<'); x++) {
  +    for (x = 0; desc[x] && ((maxsize > 0) || (desc[x] == '<')); x++) {
        if (desc[x] == '<') {
            while (desc[x] != '>') {
                if (!desc[x]) {
  @@ -1286,6 +1334,7 @@
       int static_columns = (autoindex_opts & SUPPRESS_COLSORT);
       pool *scratch = ap_make_sub_pool(r->pool);
       int name_width;
  +    int desc_width;
       char *name_scratch;
       char *pad_scratch;
   
  @@ -1293,6 +1342,17 @@
        name = "/";
       }
   
  +    desc_width = d->desc_width;
  +    if (d->desc_adjust == K_ADJUST) {
  +     for (x = 0; x < n; x++) {
  +         if (ar[x]->desc != NULL) {
  +             int t = strlen(ar[x]->desc);
  +             if (t > desc_width) {
  +                 desc_width = t;
  +             }
  +         }
  +     }
  +    }
       name_width = d->name_width;
       if (d->name_adjust == K_ADJUST) {
        for (x = 0; x < n; x++) {
  @@ -1392,17 +1452,17 @@
   
            nwidth = strlen(t2);
            if (nwidth > name_width) {
  -           memcpy(name_scratch, t2, name_width - 3);
  -           name_scratch[name_width - 3] = '.';
  -           name_scratch[name_width - 2] = '.';
  -           name_scratch[name_width - 1] = '>';
  -           name_scratch[name_width] = 0;
  -           t2 = name_scratch;
  -           nwidth = name_width;
  +             memcpy(name_scratch, t2, name_width - 3);
  +             name_scratch[name_width - 3] = '.';
  +             name_scratch[name_width - 2] = '.';
  +             name_scratch[name_width - 1] = '>';
  +             name_scratch[name_width] = 0;
  +             t2 = name_scratch;
  +             nwidth = name_width;
            }
            ap_rvputs(r, " <A HREF=\"", anchor, "\">",
  -           ap_escape_html(scratch, t2), "</A>", pad_scratch + nwidth,
  -           NULL);
  +                   ap_escape_html(scratch, t2), "</A>",
  +                   pad_scratch + nwidth, NULL);
            /*
             * The blank before the storm.. er, before the next field.
             */
  @@ -1426,7 +1486,8 @@
            if (!(autoindex_opts & SUPPRESS_DESC)) {
                if (ar[x]->desc) {
                    ap_rputs(terminate_description(d, ar[x]->desc,
  -                                                autoindex_opts), r);
  +                                                autoindex_opts,
  +                                                desc_width), r);
                }
            }
        }
  
  
  

Reply via email to