source: trunk/cstr/src/recpt/cstrbrowsetools.cpp@ 891

Last change on this file since 891 was 891, checked in by sjboddie, 24 years ago

Initial revision

  • Property svn:keywords set to Author Date Id Revision
File size: 27.9 KB
RevLine 
[891]1/**********************************************************************
2 *
3 * cstrbrowsetools.cpp --
4 * Copyright (C) 1999 The New Zealand Digital Library Project
5 *
6 * A component of the Greenstone digital library software
7 * from the New Zealand Digital Library Project at the
8 * University of Waikato, New Zealand.
9 *
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 2 of the License, or
13 * (at your option) any later version.
14 *
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
19 *
20 * You should have received a copy of the GNU General Public License
21 * along with this program; if not, write to the Free Software
22 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
23 *
24 * $Id: cstrbrowsetools.cpp 891 2000-02-01 22:32:36Z sjboddie $
25 *
26 *********************************************************************/
27
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
39#include "cstrbrowsetools.h"
40#include "OIDtools.h"
41#include "cgiutils.h"
42
43// simply checks to see if formatstring begins with a <td> tag
44static 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
62static 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
75static 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
126static void output_cstr_controls (cgiargsclass &args, const text_t &source,
127 const text_t &description, const text_t &figures,
128 displayclass &disp, outconvertclass &outconvert,
129 ostream &textout) {
130 text_tarray buttons;
131 text_t &arg_gg = args["gg"];
132
133 if (!source.empty())
134 buttons.push_back ("_document:imagepostscript_(" + cgi_safe(source) + ")");
135
136 if ((!description.empty()) && (arg_gg != "abstract"))
137 buttons.push_back ("_document:imageabstract_");
138
139 if ((!figures.empty()) && (arg_gg != "figures"))
140 buttons.push_back ("_document:imagefigures_");
141
142 if (arg_gg != "text")
143 buttons.push_back ("_document:imageviewtext_");
144
145 textout << "<br>\n";
146
147 text_tarray::const_iterator here = buttons.begin();
148 text_tarray::const_iterator end = buttons.end();
149 int count = 0;
150 while (here != end) {
151 if ((count != 0) && ((count % 3) == 0)) textout << "<br>\n";
152 textout << outconvert << disp << *here;
153 count ++;
154 here ++;
155 }
156}
157
158/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
159Functions for generating a document type tables of contents. These aren't really tables of
160contents at all, just a title, some navigation buttons and arrows and maybe a page ? of ?
161type thing. These should only be called for document level tocs (i.e. when the "d" argument
162is set) as I don't think it makes sense to display top level classifications in this way.
163-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
164
165void output_document_toc (cgiargsclass &args, const formatinfo_t &formatinfo,
166 recptproto *collectproto, displayclass &disp,
167 outconvertclass &outconvert, ostream &textout,
168 ostream &logout) {
169
170 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());
203
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")) {
211
212 // previous arrow
213 textout << outconvert << disp << "<table><tr valign=top>\n"
214 << "<td align=left>_document:prevarrow_</td>\n";
215
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];
230 }
231 }
232 } else {
233 textout << outconvert << docinfo.metadata[0].values[0];
234 }
235
236 // next arrow
237 textout << outconvert << disp << "</td>\n<td align=right>_document:nextarrow_</td>\n</table>\n";
238 }
239
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);
247 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";
265 }
266
267
268 textout << "</td></tr></table></center>\n";
269 textout << "\n<!-- end of Table of Contents -->\n";
270
271 }
272}
273
274
275/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
276Functions for generating a "Hierarchy" type table of contents. These can be used either
277at top classification level or at document level (the difference being that a cover
278image and control buttons may be displayed at document level).
279-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
280
281// prototypes
282
283static 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
288static void output_expanded_hierarchy_toc (cgiargsclass &args, recptproto *collectproto,
289 displayclass &disp, outconvertclass &outconvert,
290 ostream &textout, ostream &logout);
291
292static 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
297static 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
303static 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
308static 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
314void 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
352void 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}
403void 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
483void 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
516void 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
567void 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
624void 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 ;-)
771void 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
Note: See TracBrowser for help on using the repository browser.