Ignore:
Timestamp:
2000-02-07T10:27:04+13:00 (24 years ago)
Author:
sjboddie
Message:

updated cstr

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/cstr/src/recpt/cstrbrowsetools.cpp

    r891 r911  
    2626 *********************************************************************/
    2727
    28 /*
    29    $Log$
    30    Revision 1.1  2000/02/01 22:32:37  sjboddie
    31    Initial revision
    32 
    33    Revision 1.1  1999/09/07 21:49:41  sjboddie
    34    new cstr receptionist
    35 
    36  */
    37 
    38 
    3928#include "cstrbrowsetools.h"
    4029#include "OIDtools.h"
    4130#include "cgiutils.h"
    42 
    43 // simply checks to see if formatstring begins with a <td> tag
    44 static bool is_table_content (const text_t &formatstring) {
    45   text_t::const_iterator here = formatstring.begin();
    46   text_t::const_iterator end = formatstring.end();
    47  
    48   while (here != end) {
    49     if (*here != ' ') {
    50       if (*here == '<') {
    51     if ((*(here+1) == 't' || *(here+1) == 'T') &&
    52         (*(here+2) == 'd' || *(here+2) == 'D') &&
    53         (*(here+3) == '>' || *(here+3) == ' '))
    54       return true;
    55       } else return false;
    56     }
    57     here ++;
    58   }
    59   return false;
    60 }
    61 
    62 static bool is_table_content (const format_t *formatlistptr) {
    63 
    64   if (formatlistptr == NULL) return false;
    65  
    66   if (formatlistptr->command == comText)
    67     return is_table_content (formatlistptr->text);
    68    
    69   return false;
    70 }
    71 
    72 
    73 // output_controls displays the detach, expand/contract contents,
    74 // expand/contract text and highlighting/no highlighting buttons
    75 static void output_controls (cgiargsclass &args, const text_tarray &ibuttons,
    76                  recptproto */*collectproto*/, displayclass &disp,
    77                  outconvertclass &outconvert, ostream &textout,
    78                  ostream &/*logout*/) {
    79 
    80   if (args["u"] != "1") {
    81  
    82     FilterResponse_t response;
    83     text_tset metadata;
    84     text_tarray buttons;
    85 
    86     text_t &arg_gg = args["gg"];
    87 
    88     text_tarray::const_iterator here = ibuttons.begin();
    89     text_tarray::const_iterator end = ibuttons.end();
    90 
    91     while (here != end) {
    92    
    93       if (*here == "Detach")
    94     buttons.push_back ("_document:imagedetach_");
    95       else if (*here == "Highlight" && arg_gg == "text") {
    96     if (args["hl"] == "1")
    97       buttons.push_back ("_document:imagenohighlight_");
    98     else
    99       buttons.push_back ("_document:imagehighlight_");
    100     //      } else if (*here == "Expand Contents") {
    101     //  if (args["gc"] == "1")
    102     //    buttons.push_back ("_document:imagecontracttoc_");
    103     //  else
    104     //    buttons.push_back ("_document:imageexpandtoc_");
    105       } else if (*here == "Expand Text" && arg_gg == "text") {
    106     if (args.getintarg("gt"))
    107       buttons.push_back ("_document:imagecontracttext_");
    108     else
    109       buttons.push_back ("_document:imageexpandtext_");
    110       }
    111       here ++;
    112     }
    113 
    114     here = buttons.begin();
    115     end = buttons.end();
    116     int count = 0;
    117     while (here != end) {
    118       if ((count != 0) && ((count % 3) == 0)) textout << "<br>\n";
    119       textout << outconvert << disp << *here;
    120       count ++;
    121       here ++;
    122     }
    123   }
    124 }
    125 
     31#include "browsetools.h"
     32
     33
     34
     35// outputs the postscript, abstract, figures etc buttons
    12636static void output_cstr_controls (cgiargsclass &args, const text_t &source,
    12737                  const text_t &description, const text_t &figures,
     
    15666}
    15767
    158 /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
    159 Functions for generating a document type tables of contents. These aren't really tables of
    160 contents at all, just a title, some navigation buttons and arrows and maybe a page ? of ?
    161 type thing. These should only be called for document level tocs (i.e. when the "d" argument
    162 is set) as I don't think it makes sense to display top level classifications in this way.
    163 -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
    164 
    165 void output_document_toc (cgiargsclass &args, const formatinfo_t &formatinfo,
    166               recptproto *collectproto, displayclass &disp,
    167               outconvertclass &outconvert, ostream &textout,
    168               ostream &logout) {
    169 
     68
     69
     70void output_cstr_toc (cgiargsclass &args, browsermapclass *browsermap,
     71                 formatinfo_t &formatinfo, recptproto *collectproto,
     72                 displayclass &disp, outconvertclass &outconvert,
     73                ostream &textout, ostream &logout) {
     74
     75  int tabcount = 0;
     76  bool havecontrols = false;
     77  bool fulltoc = false;
     78
     79
     80  if (args["cl"] != "search") {
     81    // see if there's a FullTOC string
     82    text_t cl_top, full_toc;
     83    get_top (args["cl"], cl_top);
     84    if (get_formatstring (cl_top, "FullTOC", formatinfo.formatstrings, full_toc))
     85      if (full_toc == "true") fulltoc = true;
     86  }
    17087  text_t &arg_d = args["d"];
    171   if (arg_d.empty()) return;
    172 
    173   text_tset metadata;
    174   FilterResponse_t response;
    175   ResultDocInfo_t docinfo;
    176   text_t booktop, facsimiles, figures, description, source, summary;
    177   text_t &collection = args["c"];
    178 
    179   metadata.insert ("Title");
    180   if (get_info (arg_d, collection, metadata, false, collectproto, response, logout)) {
    181 
    182     metadata.erase (metadata.begin(), metadata.end());
    183     docinfo = response.docInfo[0];
    184 
    185     textout
    186       << "\n<!-- Table of Contents produced by cstrbrowsetools::output_document_toc -->\n\n";
    187 
    188     // get title and author of book
    189     get_top (arg_d, booktop);
    190     metadata.insert ("facsimiles");
    191     metadata.insert ("figures");
    192     metadata.insert ("Description");
    193     metadata.insert ("Source");
    194     metadata.insert ("Summary");
    195     get_info (booktop, collection, metadata, false, collectproto, response, logout);
    196     facsimiles = response.docInfo[0].metadata[0].values[0];
    197     figures = response.docInfo[0].metadata[1].values[0];
    198     description = response.docInfo[0].metadata[2].values[0];
    199     source = response.docInfo[0].metadata[3].values[0];
    200     summary = response.docInfo[0].metadata[4].values[0];
    201 
    202     metadata.erase (metadata.begin(), metadata.end());
     88  // get the facsimile image (if there is one) and the control buttons
     89  // if we're inside a book
     90  if ((!fulltoc) && (!arg_d.empty())) {
     91
     92    // this code from old cstr browsetools outputdocument_toc
     93    text_tset metadata;
     94    FilterResponse_t response;
     95    ResultDocInfo_t docinfo;
     96    text_t booktop, facsimiles, figures, description, source, summary;
     97    text_t &collection = args["c"];
     98
     99    metadata.insert ("Title");
     100    if (get_info (arg_d, collection, metadata, false, collectproto, response, logout)) {
     101
     102      metadata.erase (metadata.begin(), metadata.end());
     103      docinfo = response.docInfo[0];
     104     
     105      textout
     106    << "\n<!-- Table of Contents produced by cstrbrowsetools::output_document_toc -->\n\n";
     107
     108      // get title and author of book
     109      get_top (arg_d, booktop);
     110      metadata.insert ("facsimiles");
     111      metadata.insert ("figures");
     112      metadata.insert ("Description");
     113      metadata.insert ("Source");
     114      metadata.insert ("Summary");
     115      get_info (booktop, collection, metadata, false, collectproto, response, logout);
     116      facsimiles = response.docInfo[0].metadata["facsimiles"].values[0];
     117      figures = response.docInfo[0].metadata["figures"].values[0];
     118      description = response.docInfo[0].metadata["Description"].values[0];
     119      source = response.docInfo[0].metadata["Source"].values[0];
     120      summary = response.docInfo[0].metadata["Summary"].values[0];
     121
     122      metadata.erase (metadata.begin(), metadata.end());
    203123 
    204     textout << outconvert << disp
    205         << "<p><center>\n"
    206         << "<table cellpadding=0 cellspacing=0 width=_pagewidth_>\n"
    207         << "<tr valign=top><td>\n";
    208 
    209     // don't want arrows and page number if text expanded
    210     if (formatinfo.DocumentArrowsBottom && !args.getintarg ("gt")) {
     124      textout << outconvert << disp
     125          << "<p><center>\n"
     126          << "<table cellpadding=0 cellspacing=0 width=_pagewidth_>\n"
     127          << "<tr valign=top><td>\n";
     128
     129      /*     
     130      // don't want arrows and page number if text expanded
     131      if (formatinfo.DocumentArrowsBottom && !args.getintarg ("gt")) {
    211132   
    212       // previous arrow
    213       textout << outconvert << disp << "<table><tr valign=top>\n"
    214           << "<td align=left>_document:prevarrow_</td>\n";
     133    // previous arrow
     134    textout << outconvert << disp << "<table><tr valign=top>\n"
     135        << "<td align=left>_document:prevarrow_</td>\n";
    215136   
    216       // page ? of ? text
    217       textout << "<td align=center>\n";
    218      
    219       if (is_number (docinfo.metadata[0].values[0])) {
    220     text_t doctop;
    221     metadata.insert ("Title");
    222     get_top (arg_d, doctop);
    223     // get title of last sibling
    224     if (get_info (doctop + ".lc", collection, metadata, false, collectproto, response, logout)) {
    225       if (is_number (response.docInfo[0].metadata[0].values[0])) {
    226         textout << outconvert << disp << "_document:page_" << docinfo.metadata[0].values[0]
    227             << "_document:of_" << response.docInfo[0].metadata[0].values[0];
    228       } else {
    229         textout << outconvert << docinfo.metadata[0].values[0];
     137    // page ? of ? text
     138    textout << "<td align=center>\n";
     139   
     140    if (is_number (docinfo.metadata["Title"].values[0])) {
     141      text_t doctop;
     142      metadata.insert ("Title");
     143      get_top (arg_d, doctop);
     144      // get title of last sibling
     145      if (get_info (doctop + ".lc", collection, metadata, false, collectproto, response, logout)) {
     146        if (is_number (response.docInfo[0].metadata["Title"].values[0])) {
     147          textout << outconvert << disp << "_document:page_" << docinfo.metadata["Title"].values[0]
     148              << "_document:of_" << response.docInfo[0].metadata["Title"].values[0];
     149        } else {
     150          textout << outconvert << docinfo.metadata["Title"].values[0];
     151        }
    230152      }
    231     }
    232       } else {
    233     textout << outconvert << docinfo.metadata[0].values[0];
     153    } else {
     154      textout << outconvert << docinfo.metadata["Title"].values[0];
    234155      }
    235156 
    236       // next arrow
    237       textout << outconvert << disp << "</td>\n<td align=right>_document:nextarrow_</td>\n</table>\n";
     157    // next arrow
     158    textout << outconvert << disp << "</td>\n<td align=right>_document:nextarrow_</td>\n</table>\n";
     159      }
     160     
     161      // goto line ****** ????????????
     162      //if (formatinfo.DocumentGoTo)
     163      textout << outconvert << disp << "_document:gotoform_";
     164      */
     165
     166      //if (formatinfo.DocumentArrowsBottom && !args.getintarg ("gt")) {
     167    if (args.getintarg("gc") == 1) {
     168   
     169      // expanded table of contents
     170      expanded_contents (args, tabcount, fulltoc, browsermap, formatinfo,
     171                 collectproto, disp, outconvert, textout, logout);
     172    } else {
     173     
     174      // contracted table of contents
     175      contracted_contents (args, tabcount, fulltoc, browsermap, formatinfo,
     176                   collectproto, disp, outconvert, textout, logout);
     177    }
     178    // }
     179      // control buttons
     180      output_controls (args, formatinfo.DocumentButtons, collectproto,
     181               disp, outconvert, textout, logout);
     182      textout << "</td><td valign=top>\n";
     183
     184      if (!summary.empty())
     185    textout << outconvert << summary << "\n";
     186
     187      output_cstr_controls (args, source, description, figures,
     188                disp, outconvert, textout);
     189
     190      textout << "</td>\n";
     191   
     192      // facsimile image
     193      // only want the first facsimile (some documents have two)
     194      if (!facsimiles.empty()) {
     195    text_t::const_iterator fbegin = facsimiles.begin();
     196    facsimiles = substr (fbegin, findchar (fbegin, facsimiles.end(), ','));
     197    textout << outconvert << disp << "<td valign=top><a href=\"_httpcurrentdocument_&gg=facsimiles\">"
     198        << "<img src=\"_httpcollimg_/_thisOID_/"
     199        << facsimiles << "\" width=150 height=250></a>" << "</td>\n";
     200      }
     201     
     202
     203      textout << "</td></tr></table></center>\n";
     204      textout << "\n<!-- end of Table of Contents -->\n";
     205     
    238206    }
    239207
    240     // goto line ****** ????????????
    241     //if (formatinfo.DocumentGoTo)
    242     //  textout << outconvert << disp << "_document:gotoform_";
    243 
    244     // control buttons
    245     output_controls (args, formatinfo.DocumentButtons, collectproto,
    246              disp, outconvert, textout, logout);
     208    /*    textout << "<p><table cellpadding=0 cellspacing=0><tr>\n";
     209    textout << "<td valign=top";
     210    if (formatinfo.DocumentContents) textout << " width=200>\n";
     211    else textout << " width=100%>\n";
     212    if (formatinfo.DocumentImages)
     213      output_cover_image (args, collectproto, disp, outconvert, textout, logout);
     214    else if (formatinfo.DocumentTitles)
     215      output_titles (args, collectproto, formatinfo, disp, outconvert, textout, logout);
     216    output_controls (args, formatinfo.DocumentButtons, collectproto, disp,
     217             outconvert, textout, logout);
    247218    textout << "</td><td valign=top>\n";
    248 
    249     if (!summary.empty())
    250       textout << outconvert << summary << "\n";
    251 
    252     output_cstr_controls (args, source, description, figures,
    253               disp, outconvert, textout);
    254 
    255     textout << "</td>\n";
    256    
    257     // facsimile image
    258     // only want the first facsimile (some documents have two)
    259     if (!facsimiles.empty()) {
    260       text_t::const_iterator fbegin = facsimiles.begin();
    261       facsimiles = substr (fbegin, findchar (fbegin, facsimiles.end(), ','));
    262       textout << outconvert << disp << "<td valign=top><a href=\"_httpcurrentdocument_&gg=facsimiles\">"
    263           << "<img src=\"_httpcollection_/archives/_thisOID_/"
    264           << facsimiles << "\" width=150 height=250></a>" << "</td>\n";
     219    havecontrols = true; */
     220  }
     221  /*
     222  if (formatinfo.DocumentContents || args["d"].empty()) {
     223    if (args.getintarg("gc") == 1) {
     224     
     225      // expanded table of contents
     226      expanded_contents (args, tabcount, fulltoc, browsermap, formatinfo,
     227             collectproto, disp, outconvert, textout, logout);
     228    } else {
     229     
     230      // contracted table of contents
     231      contracted_contents (args, tabcount, fulltoc, browsermap, formatinfo,
     232               collectproto, disp, outconvert, textout, logout);
    265233    }
    266 
    267 
    268     textout << "</td></tr></table></center>\n";
    269     textout << "\n<!-- end of Table of Contents -->\n";
    270 
    271   }
     234  }
     235  */
     236  if (havecontrols) textout << "</td></tr></table>\n";
    272237}
    273238
    274239
    275 /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
    276 Functions for generating a "Hierarchy" type table of contents. These can be used either
    277 at top classification level or at document level (the difference being that a cover
    278 image and control buttons may be displayed at document level).
    279 -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
    280 
    281 // prototypes
    282 
    283 static void output_contracted_hierarchy_toc (const text_t &classifytype, text_t &formatstring,
    284                          cgiargsclass &args, recptproto *collectproto,
    285                          displayclass &disp, outconvertclass &outconvert,
    286                          ostream &textout, ostream &logout);
    287 
    288 static void output_expanded_hierarchy_toc (cgiargsclass &args, recptproto *collectproto,
    289                        displayclass &disp, outconvertclass &outconvert,
    290                        ostream &textout, ostream &logout);
    291 
    292 static void output_parents_toc (cgiargsclass &args, const FilterResponse_t &parents,
    293                 int &tabcount, displayclass &disp,
    294                 format_t *formatlistptr, outconvertclass &outconvert,
    295                 ostream &textout, ostream &logout);
    296 
    297 static void output_siblings_toc (const text_t &classifytype, cgiargsclass &args,
    298                  const FilterResponse_t &siblings, int &tabcount,
    299                  displayclass &disp, format_t *formatlistptr,
    300                  outconvertclass &outconvert, ostream &textout,
    301                  ostream &logout);
    302 
    303 static void output_stdlist (cgiargsclass &args, ResultDocInfo_tarray::iterator &here,
    304                 ResultDocInfo_tarray::iterator &end, bool intable,
    305                 displayclass &disp, format_t *formatlistptr,
    306                  outconvertclass &outconvert, ostream &textout);
    307 
    308 static void output_datelist (cgiargsclass &args, ResultDocInfo_tarray::iterator &here,
    309                  ResultDocInfo_tarray::iterator &end, bool intable,
    310                  displayclass &disp, format_t *formatlistptr,
    311                  outconvertclass &outconvert, ostream &textout);
    312 
    313 
    314 void output_standard_toc (const text_t &classifytype, const formatinfo_t &formatinfo,
    315               text_t &formatstring, cgiargsclass &args,
    316               recptproto *collectproto, displayclass &disp,
    317               outconvertclass &outconvert, ostream &textout,
    318               ostream &logout) {
    319 
    320   bool havecontrols = false;
    321 
    322   textout << "\n<!-- Table of Contents produced by cstrbrowsetools::output_standard_toc -->\n\n";
    323 
    324   // get the cover image (if there is one) and the control buttons
    325   // if we're inside a book
    326   if (!args["d"].empty()) {
    327     textout << "<p><table cellpadding=0 cellspacing=0><tr>\n";
    328     textout << "<td valign=top width=200>\n";
    329     //    if (cover) output_cover_image (args, collectproto, disp, outconvert, textout, logout);
    330     output_controls (args, formatinfo.DocumentButtons, collectproto, disp, outconvert, textout, logout);
    331     textout << "</td><td valign=top>\n";
    332     havecontrols = true;
    333   }
    334  
    335   // get table of contents
    336   textout << "<table>\n";
    337 
    338   if (args.getintarg("gc"))
    339     output_expanded_hierarchy_toc(args, collectproto, disp, outconvert, textout, logout);
    340   else
    341     output_contracted_hierarchy_toc(classifytype, formatstring, args, collectproto,
    342                     disp, outconvert, textout, logout);
    343 
    344   textout << "</table>\n";
    345 
    346   if (havecontrols) textout << "</td></tr></table>\n";
    347 
    348   textout << "\n<!-- end of Table of Contents -->\n";
    349 }
    350 
    351 
    352 void output_contracted_hierarchy_toc (const text_t &classifytype, text_t &formatstring,
    353                       cgiargsclass &args, recptproto *collectproto,
    354                       displayclass &disp, outconvertclass &outconvert,
    355                       ostream &textout, ostream &logout) {
    356 
    357   int tabcount = 0;
    358   text_tarray parents;
    359   text_tset metadata;
    360   FilterResponse_t fsiblings, fparents;
    361   bool getParents = false;
    362 
    363   text_t &arg_d = args["d"];
    364   text_t OID = arg_d;
    365   if (OID.empty()) OID = args["cl"];
    366   text_t &collection = args["c"];
    367 
    368   // if format string is empty use the default
    369   if (formatstring.empty())
    370     formatstring = "<td valign=top nowrap>[link][icon][/link]</td><td>{Or}{[Title],Untitled}</td>";
    371 
    372   format_t *formatlistptr = new format_t();
    373   parse_formatstring (formatstring, formatlistptr, metadata, getParents);
    374 
    375   metadata.insert ("Date");
    376   metadata.insert ("hastxt");
    377   metadata.insert ("haschildren");
    378   metadata.insert ("doctype");
    379   metadata.insert ("classifytype");
    380 
    381   if (has_children (OID, collection, collectproto, logout)) {
    382       get_parents_array (OID + ".fc", parents);
    383 
    384       if (!get_children (OID, collection, metadata, getParents,
    385              collectproto, fsiblings, logout))
    386     return;
    387   } else {
    388     get_parents_array (OID, parents);
    389     if (!get_children (OID + ".pr", collection, metadata,
    390                getParents, collectproto, fsiblings, logout))
    391     return;
    392   }
    393   if (!get_info (parents, collection, metadata, false, collectproto, fparents, logout)) return;
    394  
    395   if (!fparents.docInfo.empty())
    396     output_parents_toc(args, fparents, tabcount, disp,
    397                formatlistptr, outconvert, textout, logout);
    398  
    399   if (!fsiblings.docInfo.empty())
    400     output_siblings_toc (classifytype, args, fsiblings, tabcount, disp,
    401              formatlistptr, outconvert, textout, logout);
    402 }
    403 void output_parents_toc (cgiargsclass &args, const FilterResponse_t &parents,
    404              int &tabcount, displayclass &disp,
    405              format_t *formatlistptr, outconvertclass &outconvert,
    406              ostream &textout, ostream &/*logout*/) {
    407 
    408   text_t tab, icon;
    409   text_t &arg_cl = args["cl"];
    410   text_t &arg_d = args["d"];
    411   int numcols = parents.docInfo.size() + 1;
    412  
    413   bool intable = is_table_content (formatlistptr);
    414  
    415   ResultDocInfo_tarray::iterator thisparent = parents.docInfo.begin();
    416   ResultDocInfo_tarray::iterator end = parents.docInfo.end();
    417 
    418   int len = (*thisparent).metadata.size();
    419   const text_t &classifytype = (*thisparent).metadata[len-1].values[0];
    420 
    421   // don't want top level of any classifications to be displayed
    422   if (arg_d.empty() && thisparent != end) {thisparent ++; numcols --;}
    423 
    424   // don't want second level of classifications using classification links
    425   if ((classifytype == "AZList" || classifytype == "DateList") && (thisparent != end))
    426     {thisparent ++; numcols --;}
    427 
    428   // the tab line
    429   if (thisparent != end) {
    430     text_t coltabs;
    431     for (int i = 0; i < numcols; i ++) coltabs += "_document:tab_";
    432     textout << outconvert << disp << "<tr>" << coltabs << "<td></td></tr>\n";
    433   }
    434 
    435   while (thisparent != end) {
    436 
    437     const text_t &doctype = (*thisparent).metadata[len-2].values.back();
    438 
    439     // set up icon and pointer
    440     icon = "_document:icon";
    441     if ((doctype != "classify") && ((*thisparent).OID == arg_d))
    442       icon += "arrow";
    443     if (doctype == "classify") icon += "openbookshelf_";
    444     else if (is_top((*thisparent).OID)) icon += "openbook_";
    445     else icon += "openfolder_";
    446    
    447     if (tabcount == 1) textout << "<td></td>\n";
    448     else if (tabcount > 1) textout << "<td colspan=" << tabcount << "></td>";
    449    
    450     // set up the link
    451     text_t link = "<a href=\"_httpdocument_";
    452     if (is_top((*thisparent).OID) && args.getintarg("x")) link = "<a name=top>";
    453     else
    454       if (doctype == "classify") link += "&cl=" + (*thisparent).OID + ".pr\">";
    455       else
    456     if (is_top ((*thisparent).OID))
    457       if (arg_cl.empty())
    458         link = "<a name=top>";
    459       else if (arg_cl == "search")
    460         link = "<a href=\"_httpquery_\">";
    461       else
    462         link += "&cl=" + arg_cl + "\">";
    463     else link += "&cl=" + arg_cl + "&d=" + (*thisparent).OID + ".pr\">";
    464    
    465     if ((numcols-tabcount) == 1) textout << "<td>";
    466     else if ((numcols-tabcount) > 1) textout << "<td colspan="
    467                          << (numcols-tabcount) << ">";
    468 
    469     if (intable) textout << "<table><tr>";
    470    
    471     textout << outconvert << disp
    472         << get_formatted_string (*thisparent, formatlistptr, link, icon);
    473    
    474     if (intable) textout << "</tr></table>";
    475     textout << "</td></tr>\n";
    476 
    477     tabcount ++;
    478     thisparent ++;
    479   }
    480 }
    481 
    482 
    483 void output_siblings_toc (const text_t &classifytype, cgiargsclass &args,
    484               const FilterResponse_t &siblings, int &tabcount,
    485               displayclass &disp, format_t *formatlistptr,
    486               outconvertclass &outconvert, ostream &textout,
    487               ostream &/*logout*/) {
    488 
    489   bool intable = is_table_content (formatlistptr);
    490 
    491   ResultDocInfo_tarray::const_iterator thissibling = siblings.docInfo.begin();
    492   ResultDocInfo_tarray::const_iterator sibend = siblings.docInfo.end();
    493 
    494   if (thissibling == sibend) return;
    495 
    496   // tabbing
    497   if (tabcount) {
    498     if (tabcount == 1) textout << "<tr><td></td>\n";
    499     else if (tabcount > 1) textout << "<tr><td colspan=" << tabcount << "></td>";
    500     textout << "<td><table>\n";
    501   }
    502 
    503   if (!intable) textout << "<tr><td>\n";
    504  
    505   if (classifytype == "DateList")
    506     output_datelist (args, thissibling, sibend, intable, disp,
    507              formatlistptr, outconvert, textout);
    508   else
    509     output_stdlist (args, thissibling, sibend, intable, disp,
    510             formatlistptr, outconvert, textout);
    511 
    512   if (!intable) textout << "</td></tr></table>\n";
    513   if (tabcount) textout << "</table></td></tr>\n";
    514 }
    515 
    516 void output_stdlist (cgiargsclass &args, ResultDocInfo_tarray::iterator &here,
    517              ResultDocInfo_tarray::iterator &end, bool intable,
    518              displayclass &disp, format_t *formatlistptr,
    519              outconvertclass &outconvert, ostream &textout) {
    520 
    521   text_t icon;
    522   int count = 1;
    523   int gt = args.getintarg("gt");
    524   text_t &arg_cl = args["cl"];
    525   text_t &arg_d = args["d"];
    526 
    527   while (here != end) {
    528 
    529     int len = (*here).metadata.size();
    530     const text_t &doctype = (*here).metadata[len-2].values.back();
    531     const text_t &hastxt = (*here).metadata[len-4].values.back();
    532     const text_t &haschildren = (*here).metadata[len-3].values.back();
    533 
    534     // set up icon and pointer
    535     icon = "_document:icon";
    536     if (doctype == "classify") {
    537       if (((*here).OID == arg_cl) && (hastxt == "1"))
    538         icon += "arrow";
    539     } else if ((*here).OID == arg_d) icon += "arrow";
    540 
    541     if (haschildren == "0") icon += "smalltext_";
    542     else if (doctype == "classify") icon += "closedbookshelf_";
    543     else if (is_top((*here).OID)) icon += "closedbook_";
    544     else icon += "closedfolder_";
    545    
    546     // set up link
    547     text_t link = "<a href=\"_httpdocument_";
    548     if (doctype == "classify") link += "&cl=" + (*here).OID + "\">";
    549     else link += "&cl=" + arg_cl + "&d=" + (*here).OID + "\">";
    550     if (gt) {
    551       link = "<a href=\"#" + text_t(count) + "\">";
    552       count ++;
    553     }
    554 
    555     if (intable) textout << "<tr>";
    556    
    557     textout << outconvert << disp
    558         << get_formatted_string (*here, formatlistptr, link, icon) << "\n";
    559    
    560     if (intable) textout << "</tr>";
    561 
    562     here ++;
    563   }
    564 }
    565 
    566 
    567 void output_datelist (cgiargsclass &args, ResultDocInfo_tarray::iterator &here,
    568               ResultDocInfo_tarray::iterator &end, bool intable,
    569               displayclass &disp, format_t *formatlistptr,
    570               outconvertclass &outconvert, ostream &textout) {
    571 
    572   text_t lastyear = "0000";
    573   text_t lastmonth = "00";
    574 
    575   while (here != end) {
    576 
    577     int len = (*here).metadata.size();
    578     const text_t &doctype = (*here).metadata[len-2].values.back();
    579     const text_t &date = (*here).metadata[len-5].values.back();
    580 
    581     // bail on this document if it has no date
    582     if (date.empty()) continue;
    583 
    584     text_t::const_iterator datebegin = date.begin();
    585 
    586     text_t link = "<a href=\"_httpdocument_&cl=";
    587     text_t icon = "_document:iconclosedbook_";
    588      
    589     if (doctype == "classify") {
    590       icon = "_document:iconclosedbookshelf_";
    591       link += (*here).OID + "\">";
    592     } else link += args["cl"] + "&d=" + (*here).OID + "\">";
    593 
    594     text_t thisyear = substr (datebegin, datebegin+4);
    595     text_t thismonth = substr (datebegin+4, datebegin+6);
    596 
    597     textout << "<tr>\n";
    598 
    599     if (thisyear != lastyear) {
    600       textout << outconvert << "<td><b>" << thisyear << "</b></td>";
    601       lastyear = thisyear;
    602     } else
    603       textout << "<td></td>";
    604 
    605     if (thismonth != lastmonth) {
    606       textout << outconvert << disp << ("<td><b>_textmonth" + thismonth + "_</b></td>");
    607       lastmonth = thismonth;
    608     } else
    609       textout << "<td></td>";
    610 
    611     if (!intable) textout << "<td>\n";
    612    
    613     textout << outconvert << disp
    614           << get_formatted_string (*here, formatlistptr, link, icon) << "\n";
    615 
    616     if (!intable) textout << "</td>";
    617      
    618     textout << "</tr>\n";
    619 
    620     here ++;
    621   }
    622 }
    623 
    624 void output_expanded_hierarchy_toc (cgiargsclass &args, recptproto *collectproto,
    625                     displayclass &disp, outconvertclass &outconvert,
    626                     ostream &textout, ostream &logout) {
    627 
    628   text_t OID, topOID, icon;
    629   bool is_classify;
    630   FilterResponse_t response;
    631   int tabcols=0, totalcols=0, lasttabcols=0;
    632 
    633   int gt = args.getintarg("gt");
    634   text_t doclink = "<a href=\"_httpdocument_&cl=";
    635 
    636   text_t &arg_d = args["d"];
    637   text_t &arg_cl = args["cl"];
    638 
    639   if (arg_d.empty()) {
    640     if (arg_cl.empty()) return;
    641     OID = arg_cl;
    642     topOID = OID; // don't always want to expand from top if expanding classifications
    643     is_classify=true;
    644   } else {
    645     OID = arg_d;
    646     get_top (arg_d, topOID);
    647     is_classify=false;
    648   }
    649 
    650   // Get OIDs and metadata of all topOIDs contents (and topOID itself)
    651   text_tset metadata;
    652   metadata.insert ("Title");
    653   metadata.insert ("haschildren");
    654   metadata.insert ("doctype");
    655   //  metadata.insert ("hastxt");
    656 
    657   get_contents (topOID, is_classify, metadata, totalcols,
    658         args["c"], collectproto, response, logout);
    659   int excess = countchar (topOID.begin(), topOID.end(), '.');
    660   totalcols -= excess;
    661 
    662   // allow for pointer
    663   if (!is_classify && !gt) totalcols += 2;
    664   else totalcols += 1;
    665 
    666   ResultDocInfo_tarray::iterator thissection = response.docInfo.begin();
    667   ResultDocInfo_tarray::iterator lastsection = response.docInfo.end();
    668  
    669   int count = 1;
    670   while (thissection != lastsection) {
    671    
    672     const text_t &title = (*thissection).metadata[0].values[0];
    673     const int haschildren = (*thissection).metadata[1].values[0].getint();
    674     const text_t &doctype = (*thissection).metadata[2].values[0];
    675 
    676     text_t icontabs, tab, pointer;
    677 
    678     // set up icon
    679     icon = "_document:iconsmalltext_";
    680     if (is_top((*thissection).OID))
    681       if (classifytype == "Document") icon = "_document:iconopenbook_";
    682       else
    683     if (doctype == "classify") icon = "_document:iconopenbookshelf_";
    684     else icon = "_document:iconclosedbook_";
    685     else if (haschildren)
    686       if (classifytype == "Document") icon = "_document:iconopenfolder_";
    687       else icon = "_document:iconopenbookshelf_";
    688    
    689     // set up tabbing
    690     if ((classifytype == "classify") && (doctype != "classify"))
    691       tabcols = lasttabcols + 1;
    692     else {
    693       tabcols = countchar ((*thissection).OID.begin(), (*thissection).OID.end(), '.');
    694       lasttabcols = tabcols;
    695     }
    696     tabcols -= excess;
    697 
    698     for (int i = 0; i < tabcols; i++)
    699       icontabs += "_document:icontab_";
    700    
    701     // set up pointer
    702     if (classifytype == "Document" && !gt) {
    703       if ((*thissection).OID == OID) pointer = "_document:iconpointer_";
    704       else pointer = "_document:icontab_";
    705       tabcols ++;
    706     }
    707    
    708     int colsremaining = totalcols - tabcols;
    709 
    710     if (tabcols > 0) {
    711       tab = "<td";
    712       if (tabcols > 1) tab += " colspan=" + text_t(tabcols);
    713       tab += ">" + icontabs + pointer + "</td>";
    714     }
    715 
    716     textout << outconvert << disp << "<tr>" << tab << "<td>";
    717    
    718     if ((classifytype == "Document") && (is_top((*thissection).OID)) &&
    719     (args.getintarg("x")))
    720       textout << outconvert << disp << icon << "</td><td";
    721 
    722     else {
    723       if (!gt) {
    724     const text_t &thisOID = (*thissection).OID;
    725     text_t link;
    726     if (is_top (thisOID))
    727       if (classifytype == "classify")
    728         link = doclink + arg_cl + "&d=" + thisOID + "\">";
    729       else
    730         if (arg_cl.empty())
    731           link.clear();
    732         else if (arg_cl == "search")
    733           link = "<a href=\"_httpquery_\">";
    734         else
    735           link = doclink + arg_cl + "\">";
    736     else
    737       if (haschildren)
    738         if (classifytype == "classify")
    739           link = doclink + thisOID + ".pr\">";
    740         else
    741           link = doclink + arg_cl + "&d=" + thisOID + ".pr\">";
    742       else
    743         if (classifytype == "classify")
    744           link = doclink + thisOID + "\">";
    745         else
    746           link = doclink + arg_cl + "&d=" + thisOID + "\">";
    747    
    748     textout << outconvert << disp << link;
    749       } else {
    750     textout << "<a href=\"#" << count << "\">";
    751     count ++;
    752       }
    753    
    754       textout << outconvert << disp << icon << "</a></td><td";
    755     }
    756     if (colsremaining > 1) textout << " colspan=" << colsremaining;
    757     textout << outconvert << disp << ">" << title << "</td></tr>\n";
    758 
    759     thissection ++;
    760   }
    761 }
    762 
    763 /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
    764 -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
    765 
    766 // set_arrow_macros sets the _httpprevarrow_ and _httpnextarrow_ macros
    767 // it shouldn't be called if OID is the top level of a book
    768 // as the "hasprevious" and "hasnext" metadata won't be set
    769 // when the filter can't get OIDs parent info - one day I'll
    770 // fix this ;-)
    771 void set_arrow_macros (const text_t &OID, const text_t &classifytype,
    772                bool showtoppage, displayclass &disp,
    773                recptproto *collectproto, const text_t &collection,
    774                ostream &logout) {
    775 
    776   if (OID.empty()) return;
    777 
    778   text_tset metadata;
    779   FilterResponse_t response;
    780 
    781   metadata.insert ("haschildren");
    782   metadata.insert ("hasnext");
    783   metadata.insert ("hasprevious");
    784   // get "haschildren", "hasnext" and "hasprevious" metadata for OID
    785   if (get_info (OID, collection, metadata, false, collectproto, response, logout)) {
    786 
    787     text_t haschildren = response.docInfo[0].metadata[0].values[0];
    788     text_t hasnext = response.docInfo[0].metadata[1].values[0];
    789     text_t hasprevious = response.docInfo[0].metadata[2].values[0];
    790 
    791     if ((classifytype == "Hierarchy") || (classifytype == "Book")) {
    792       if (haschildren == "1")
    793     disp.setmacro ("httpnextarrow", "document",
    794                "_If_(_cgiargd_,_httpdocument_&cl=_cgiargcl_&d=_cgiargd_.fc,_httpdocument_&cl=_cgiargcl_.fc)");
    795       else if (hasnext == "1")
    796     disp.setmacro ("httpnextarrow", "document",
    797                "_If_(_cgiargd_,_httpdocument_&cl=_cgiargcl_&d=_cgiargd_.ns,_httpdocument_&cl=_cgiargcl_.ns)");
    798       else {
    799     // see if parent has younger siblings
    800     if (get_info (OID + ".pr", collection, metadata, false, collectproto, response, logout)) {
    801       if (!response.docInfo[0].metadata.empty() &&
    802           response.docInfo[0].metadata[1].values[0] == "1")
    803         disp.setmacro ("httpnextarrow", "document",
    804                "_If_(_cgiargd_,_httpdocument_&cl=_cgiargcl_&d=_cgiargd_.pr.ns,_httpdocument_&cl=_cgiargcl_.pr.ns)");
    805     }
    806       }
    807 
    808       if (hasprevious == "1") {
    809     // see if OIDs older sibling has children
    810     if (get_info (OID + ".ps", collection, metadata, false, collectproto, response, logout)) {
    811       if (response.docInfo[0].metadata[0].values[0] == "1")
    812         disp.setmacro ("httpprevarrow", "document",
    813                "_If_(_cgiargd_,_httpdocument_&cl=_cgiargcl_&d=_cgiargd_.ps.lc,_httpdocument_&cl=_cgiargcl_.ps.lc)");
    814       else
    815         disp.setmacro ("httpprevarrow", "document",
    816                "_If_(_cgiargd_,_httpdocument_&cl=_cgiargcl_&d=_cgiargd_.ps,_httpdocument_&cl=_cgiargcl_.ps)");
    817     }
    818       } else if (showtoppage && !is_top (OID))
    819     disp.setmacro ("httpprevarrow", "document",
    820                "_If_(_cgiargd_,_httpdocument_&cl=_cgiargcl_&d=_cgiargd_.pr,_httpdocument_&cl=_cgiargcl_.pr)");
    821     }
    822 
    823     else {
    824       if (hasnext == "1")
    825     disp.setmacro ("httpnextarrow", "document",
    826                "_If_(_cgiargd_,_httpdocument_&cl=_cgiargcl_&d=_cgiargd_.ns,_httpdocument_&cl=_cgiargcl_.ns)");
    827       if (hasprevious == "1")
    828     disp.setmacro ("httpprevarrow", "document",
    829                "_If_(_cgiargd_,_httpdocument_&cl=_cgiargcl_&d=_cgiargd_.ps,_httpdocument_&cl=_cgiargcl_.ps)");
    830     }
    831   }
    832 }
    833 
    834 
    835 
    836 
    837 
    838 
    839 
    840 
    841 
    842 
    843 
    844 
    845 
    846 
    847 
     240
     241
     242
     243
     244
     245
     246
Note: See TracChangeset for help on using the changeset viewer.