label_util.cpp
上传用户:yhdzpy8989
上传日期:2007-06-13
资源大小:13604k
文件大小:6k
源码类别:

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: label_util.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 19:31:42  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.2
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9.  /*$Id: label_util.cpp,v 1000.1 2004/06/01 19:31:42 gouriano Exp $
  10.  * ===========================================================================
  11.  *
  12.  *                            PUBLIC DOMAIN NOTICE
  13.  *               National Center for Biotechnology Information
  14.  *
  15.  *  This software/database is a "United States Government Work" under the
  16.  *  terms of the United States Copyright Act.  It was written as part of
  17.  *  the author's official duties as a United States Government employee and
  18.  *  thus cannot be copyrighted.  This software/database is freely available
  19.  *  to the public for use. The National Library of Medicine and the U.S.
  20.  *  Government have not placed any restriction on its use or reproduction.
  21.  *
  22.  *  Although all reasonable efforts have been taken to ensure the accuracy
  23.  *  and reliability of the software and data, the NLM and the U.S.
  24.  *  Government do not and cannot warrant the performance or results that
  25.  *  may be obtained by using this software or data. The NLM and the U.S.
  26.  *  Government disclaim all warranties, express or implied, including
  27.  *  warranties of performance, merchantability or fitness for any particular
  28.  *  purpose.
  29.  *
  30.  *  Please cite the author in any work or product based on this material.
  31.  *
  32.  * ===========================================================================
  33.  *
  34.  * Author:  Clifford Clausen, Aleksey Grichenko
  35.  *          (moved from CPub class)
  36.  *
  37.  * File Description:
  38.  *   utility functions for GetLabel()
  39.  *
  40.  */  
  41. #include <ncbi_pch.hpp>
  42. #include <objects/biblio/label_util.hpp>
  43. #include <objects/general/Date.hpp>
  44. #include <objects/general/Person_id.hpp>
  45. #include <objects/biblio/Auth_list.hpp>
  46. #include <objects/biblio/Imprint.hpp>
  47. #include <objects/biblio/Title.hpp>
  48. #include <objects/biblio/Author.hpp>
  49. BEGIN_NCBI_SCOPE
  50. BEGIN_objects_SCOPE
  51. void GetLabelContent(string*            label,
  52.                      bool               unique,
  53.                      const CAuth_list*  authors,
  54.                      const CImprint*    imprint,
  55.                      const CTitle*      title,
  56.                      const CCit_book*   book,
  57.                      const CCit_jour*   journal,
  58.                      const string*      title1,
  59.                      const string*      title2,
  60.                      const string*      titleunique,
  61.                      const string*      date,
  62.                      const string*      volume,
  63.                      const string*      issue,
  64.                      const string*      pages,
  65.                      bool               unpublished)
  66. {
  67.     const string* part_sup = 0;
  68.     const string* part_supi = 0;
  69.     string subst_date;
  70.     if (imprint) {
  71.         if ( !date ) {
  72.             imprint->GetDate().GetDate(&subst_date);
  73.             date = &subst_date;
  74.         }
  75.         volume = !volume && imprint->IsSetVolume() ?
  76.             &imprint->GetVolume() : volume;
  77.         issue = !issue && imprint->IsSetIssue() ? &imprint->GetIssue() : issue;
  78.         pages = !pages && imprint->IsSetPages() ? &imprint->GetPages() : pages;
  79.         part_sup = imprint->IsSetPart_sup() ? &imprint->GetPart_sup() : 0;
  80.         part_supi = imprint->IsSetPart_supi() ? &imprint->GetPart_supi() : 0;
  81.     }
  82.     if (authors) {
  83.         switch (authors->GetNames().Which()) {
  84.         case CAuth_list::C_Names::e_Std:
  85.             if (authors->GetNames().GetStd().size() > 0) {
  86.                 const CPerson_id& id = 
  87.                     authors->GetNames().GetStd().front()->GetName();
  88.                     id.GetLabel(label);
  89.             }
  90.             break;
  91.         case CAuth_list::C_Names::e_Ml:
  92.             if (authors->GetNames().GetMl().size() > 0) {
  93.                 *label += authors->GetNames().GetMl().front();
  94.             }
  95.             break;
  96.         case CAuth_list::C_Names::e_Str:
  97.             if (authors->GetNames().GetStr().size() > 0) {
  98.                 *label += authors->GetNames().GetStr().front();
  99.             }
  100.             break;
  101.         default:
  102.             break;
  103.         }
  104.     }
  105.     string::size_type z = label->size();
  106.     if (date) {
  107.         if (z == 0 || label->substr(z-1, 1).compare(" ") == 0) {
  108.           *label += "(";
  109.         }
  110.         else {
  111.           *label += " (";
  112.         }
  113.         *label += *date + ")";
  114.     }
  115.     if (title && !titleunique) {
  116.         try {
  117.             titleunique = &title->GetTitle();
  118.         } catch (exception&) {}
  119.     }
  120.     if (title && !title2) {
  121.         try {
  122.             title2 = &title->GetTitle();
  123.         } catch (exception&) {}
  124.     }
  125.     if (title2) {
  126.         if (book) {
  127.             *label += " (in) " + *title2;
  128.         }
  129.         else if (title1) {
  130.             *label += " " + *title1 + *title2;
  131.         }
  132.         else {
  133.             *label += " " + *title2;
  134.         }
  135.     }
  136.     if (volume) {
  137.         if (part_sup) {
  138.             *label += " " + *volume + *part_sup + ":";
  139.         }
  140.         else {
  141.             *label += " " + *volume + ":";
  142.         }
  143.     }
  144.     if (issue) {
  145.         if (part_supi) {
  146.             *label += "(" + *issue + *part_supi + ")";
  147.         }
  148.         else {
  149.             *label += "(" + *issue + ")";
  150.         }
  151.     }
  152.     if (pages) {
  153.         *label += *pages;
  154.     }
  155.     if (unpublished) {
  156.         *label += "Unpublished";
  157.     }
  158.     // If unique paramter true, then add unique tag to end of label
  159.     // constructed from the first character of each whitespace separated
  160.     // word in titleunique
  161.     if (unique && titleunique && !titleunique->empty()) {
  162.         CNcbiIstrstream is(titleunique->c_str(), titleunique->size());
  163.         string tag, word;
  164.         int cnt = 0;
  165.         while ( (is >> word) && (cnt++ < 40) ) {
  166.             tag += word[0];
  167.         }
  168.         *label += "|" + tag;
  169.     }
  170. }
  171. END_objects_SCOPE
  172. END_NCBI_SCOPE
  173. /*
  174.  * ---------------------------------------------------------------------------
  175.  * $Log: label_util.cpp,v $
  176.  * Revision 1000.1  2004/06/01 19:31:42  gouriano
  177.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.2
  178.  *
  179.  * Revision 1.2  2004/05/19 17:18:17  gorelenk
  180.  * Added include of PCH - ncbi_pch.hpp
  181.  *
  182.  * Revision 1.1  2004/02/24 15:52:25  grichenk
  183.  * Initial revision
  184.  *
  185.  *
  186.  * ===========================================================================
  187.  */