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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: item_formatter.cpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/06/01 19:44:52  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.11
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: item_formatter.cpp,v 1000.2 2004/06/01 19:44:52 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:  Aaron Ucko, NCBI
  35. *          Mati Shomrat
  36. *
  37. * File Description:
  38. *           
  39. *
  40. */
  41. #include <ncbi_pch.hpp>
  42. #include <corelib/ncbistd.hpp>
  43. #include <objects/biblio/Cit_book.hpp>
  44. #include <objects/biblio/Auth_list.hpp>
  45. #include <objects/biblio/Title.hpp>
  46. #include <objects/biblio/Imprint.hpp>
  47. #include <objmgr/util/sequence.hpp>
  48. #include <objtools/format/items/item.hpp>
  49. #include <objtools/format/item_formatter.hpp>
  50. #include <objtools/format/items/accession_item.hpp>
  51. #include <objtools/format/items/defline_item.hpp>
  52. #include <objtools/format/items/keywords_item.hpp>
  53. #include <objtools/format/text_ostream.hpp>
  54. #include <objtools/format/genbank_formatter.hpp>
  55. #include <objtools/format/embl_formatter.hpp>
  56. #include <objtools/format/gff_formatter.hpp>
  57. #include <objtools/format/ftable_formatter.hpp>
  58. #include <objtools/format/gbseq_formatter.hpp>
  59. #include <objtools/format/context.hpp>
  60. #include <objtools/format/flat_expt.hpp>
  61. #include "utils.hpp"
  62. BEGIN_NCBI_SCOPE
  63. BEGIN_SCOPE(objects)
  64. // static members
  65. const string CFlatItemFormatter::s_GenbankMol[] = {
  66.     "    ", "DNA ", "RNA ", "mRNA", "rRNA", "tRNA", "snRNA",
  67.     "scRNA", " AA ", "DNA ", "DNA ", "RNA ", "snoRNA", "RNA "
  68. };
  69. CFlatItemFormatter* CFlatItemFormatter::New(CFlatFileConfig::TFormat format)
  70. {
  71.     switch ( format ) {
  72.     case CFlatFileConfig::eFormat_GenBank:
  73.         return new CGenbankFormatter;
  74.         
  75.     case CFlatFileConfig::eFormat_EMBL:
  76.         return new CEmblFormatter;
  77.     case CFlatFileConfig::eFormat_GFF:
  78.         return new CGFFFormatter;
  79.     case CFlatFileConfig::eFormat_FTable:
  80.         return new CFtableFormatter;
  81.     case CFlatFileConfig::eFormat_GBSeq:
  82.         return new CGBSeqFormatter;
  83.     case CFlatFileConfig::eFormat_DDBJ:
  84.     default:
  85.         NCBI_THROW(CFlatException, eNotSupported, 
  86.             "This format is currently not supported");
  87.     }
  88.     return 0;
  89. }
  90.     
  91. CFlatItemFormatter::~CFlatItemFormatter(void)
  92. {
  93. }
  94. void CFlatItemFormatter::Format(const IFlatItem& item, IFlatTextOStream& text_os)
  95. {
  96.     item.Format(*this, text_os);
  97. }
  98. string  CFlatItemFormatter::x_FormatAccession
  99. (const CAccessionItem& acc,
  100.  char separator) const
  101. {
  102.     CNcbiOstrstream acc_line;
  103.     CBioseqContext& ctx = *acc.GetContext();
  104.     const string& primary = ctx.IsHup() ? ";" : acc.GetAccession();
  105.     
  106.     acc_line << primary;
  107.     if ( ctx.IsWGS() ) {
  108.         acc_line << separator << acc.GetWGSAccession();
  109.     }
  110.     ITERATE (CAccessionItem::TExtra_accessions, it, acc.GetExtraAccessions()) {
  111.         acc_line << separator << *it;
  112.     }
  113.     return CNcbiOstrstreamToString(acc_line);
  114. }
  115. string& CFlatItemFormatter::x_Pad(const string& s, string& out, SIZE_TYPE width,
  116.                                 const string& indent)
  117. {
  118.     out.assign(indent);
  119.     out += s;
  120.     out.resize(width, ' ');
  121.     return out;
  122. }
  123. string& CFlatItemFormatter::Pad(const string& s, string& out,
  124.                                 EPadContext where) const
  125. {
  126.     switch (where) {
  127.     case ePara:      return x_Pad(s, out, 12);
  128.     case eSubp:      return x_Pad(s, out, 12, string(2, ' '));
  129.     case eFeatHead:  return x_Pad(s, out, 21);
  130.     case eFeat:      return x_Pad(s, out, 21, string(5, ' '));
  131.     default:         return out; // shouldn't happen, but some compilers whine
  132.     }
  133. }
  134. list<string>& CFlatItemFormatter::Wrap
  135. (list<string>& l,
  136.  SIZE_TYPE width,
  137.  const string& tag,
  138.  const string& body,
  139.  EPadContext where) const
  140. {
  141.     NStr::TWrapFlags flags = /* ??? NStr::fWrap_HTMLPre :*/ 0;
  142.     string tag2;
  143.     Pad(tag, tag2, where);
  144.     NStr::Wrap(body, width, l, flags,
  145.                where == eFeat ? m_FeatIndent : m_Indent, tag2);
  146.     return l;
  147. }
  148. list<string>& CFlatItemFormatter::Wrap
  149. (list<string>& l,
  150.  const string& tag,
  151.  const string& body,
  152.  EPadContext where) const
  153. {
  154.     NStr::TWrapFlags flags = /* ??? NStr::fWrap_HTMLPre :*/ 0;
  155.     string tag2;
  156.     Pad(tag, tag2, where);
  157.     NStr::Wrap(body, GetWidth(), l, flags,
  158.                where == eFeat ? m_FeatIndent : m_Indent, tag2);
  159.     return l;
  160. }
  161. void CFlatItemFormatter::x_FormatRefLocation
  162. (CNcbiOstrstream& os,
  163.  const CSeq_loc& loc,
  164.  const string& to,
  165.  const string& delim,
  166.  CBioseqContext& ctx) const
  167. {
  168.     const string* delim_p = &kEmptyStr;
  169.     CScope& scope = ctx.GetScope();
  170.     os << (ctx.IsProt() ? "(residues " : "(bases ");
  171.     for ( CSeq_loc_CI it(loc);  it;  ++it ) {
  172.         CSeq_loc_CI::TRange range = it.GetRange();
  173.         if ( range.IsWhole() ) {
  174.             range.SetTo(sequence::GetLength(it.GetSeq_id(), &scope) - 1);
  175.         }
  176.         
  177.         os << *delim_p << range.GetFrom() + 1 << to << range.GetTo() + 1;
  178.         delim_p = &delim;
  179.     }
  180.     os << ')';
  181. }
  182. static size_t s_NumAuthors(const CCit_book::TAuthors& authors)
  183. {
  184.     if ( authors.CanGetNames() ) {
  185.         const CAuth_list::C_Names& names = authors.GetNames();
  186.         switch ( names.Which() ) {
  187.         case CAuth_list::C_Names::e_Std:
  188.             return names.GetStd().size();
  189.         case CAuth_list::C_Names::e_Ml:
  190.             return names.GetMl().size();
  191.         case CAuth_list::C_Names::e_Str:
  192.             return names.GetStr().size();
  193.         default:
  194.             break;
  195.         }
  196.     }
  197.     return 0;
  198. }
  199. void CFlatItemFormatter::x_FormatRefJournal
  200. (string& journal,
  201.  const CReferenceItem& ref) const
  202. {
  203.     if ( ref.GetBook() == 0 ) {  // not from a book
  204.         
  205.         switch ( ref.GetCategory() ) {
  206.         case CReferenceItem::eSubmission:
  207.             journal = "Submitted ";
  208.             if ( ref.GetDate() != 0 ) {
  209.                 journal += '(';
  210.                 DateToString(*ref.GetDate(), journal, true);
  211.                 journal += ") ";
  212.             }
  213.             journal += ref.GetJournal();
  214.             break;
  215.         case CReferenceItem::eUnpublished:
  216.             journal = ref.GetJournal();
  217.             break;
  218.         case CReferenceItem::ePublished:
  219.             journal = ref.GetJournal();
  220.             if ( !ref.GetVolume().empty() ) {
  221.                 journal += " " + ref.GetVolume();
  222.             }
  223.             if ( !ref.GetIssue().empty() ) {
  224.                 journal += " (" + ref.GetIssue() + ')';
  225.             }
  226.             if ( !ref.GetPages().empty() ) {
  227.                 journal += ", " + ref.GetPages();
  228.             }
  229.             if ( ref.GetDate() != 0 ) {
  230.                 ref.GetDate()->GetDate(&journal, " (%Y)");
  231.             }
  232.             break;
  233.         default:
  234.             break;
  235.         }
  236.         if ( ref.GetPrepub() == CImprint::ePrepub_in_press ) {
  237.             journal += " In press";
  238.         }
  239.         if ( journal.empty() ) {
  240.             journal = "Unpublished";
  241.         }
  242.     } else {
  243.         while ( true ) {
  244.             const CCit_book& book = *ref.GetBook();
  245.             _ASSERT(book.CanGetImp()  &&  book.CanGetTitle());
  246.             
  247.             string year;
  248.             if ( ref.GetDate() != 0 ) {
  249.                 ref.GetDate()->GetDate(&year, "(%Y)");
  250.             }
  251.             
  252.             if ( ref.GetCategory() == CReferenceItem::eUnpublished ) {
  253.                 journal = "Unpublished " + year;
  254.                 break;
  255.             }
  256.             
  257.             string title = book.GetTitle().GetTitle();
  258.             if ( title.length() < 3 ) {
  259.                 journal = ".";
  260.                 break;
  261.             }
  262.             CNcbiOstrstream jour;
  263.             jour << "(in) ";
  264.             if ( book.CanGetAuthors() ) {
  265.                 const CCit_book::TAuthors& auth = book.GetAuthors();
  266.                 jour << CReferenceItem::GetAuthString(&auth);
  267.                 size_t num_auth = s_NumAuthors(auth);
  268.                 jour << ((num_auth == 1) ? " (Ed.);" : " (Eds.);") << endl;
  269.             }
  270.             jour << NStr::ToUpper(title);
  271.             if ( !ref.GetVolume().empty()  &&  ref.GetVolume() != "0" ) {
  272.                 jour << " " << ref.GetVolume();
  273.             }
  274.             if ( !ref.GetIssue().empty() ) {
  275.                 jour << " " << ref.GetIssue();
  276.             }
  277.             if ( !ref.GetPages().empty() ) {
  278.                 jour << ": " << ref.GetPages();
  279.             }
  280.             jour << ';' << endl;
  281.             const CCit_book::TImp& imp = book.GetImp();
  282.             if ( imp.CanGetPub() ) {
  283.                 string affil;
  284.                 CReferenceItem::FormatAffil(imp.GetPub(), affil);
  285.                 if ( !affil.empty() ) {
  286.                     jour << affil << ' ';
  287.                 }
  288.             }
  289.             jour << year;
  290.             if ( ref.GetPrepub() == CImprint::ePrepub_in_press ) {
  291.                 jour << " In press";
  292.             }
  293.             journal = CNcbiOstrstreamToString(jour);
  294.             break;
  295.         }
  296.     }
  297. }
  298. void CFlatItemFormatter::x_GetKeywords
  299. (const CKeywordsItem& kws,
  300.  const string& prefix,
  301.  list<string>& l) const
  302. {
  303.     list<string> kw;
  304.     CKeywordsItem::TKeywords::const_iterator last = --(kws.GetKeywords().end());
  305.     ITERATE (CKeywordsItem::TKeywords, it, kws.GetKeywords()) {
  306.         kw.push_back(*it + (it == last ? '.' : ';'));
  307.     }
  308.     if ( kw.empty() ) {
  309.         kw.push_back(".");
  310.     }
  311.     string  str;
  312.     Pad(prefix, str, ePara);
  313.     NStr::WrapList(kw, GetWidth(), " ", l, 0, GetIndent(), &str);
  314. }
  315. END_SCOPE(objects)
  316. END_NCBI_SCOPE
  317. /*
  318. * ===========================================================================
  319. *
  320. * $Log: item_formatter.cpp,v $
  321. * Revision 1000.2  2004/06/01 19:44:52  gouriano
  322. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.11
  323. *
  324. * Revision 1.11  2004/05/21 21:42:54  gorelenk
  325. * Added PCH ncbi_pch.hpp
  326. *
  327. * Revision 1.10  2004/05/06 17:57:22  shomrat
  328. * Fixed Accession and RefLocation formatting
  329. *
  330. * Revision 1.9  2004/04/27 15:12:50  shomrat
  331. * fixed Journal formatting
  332. *
  333. * Revision 1.8  2004/04/22 16:00:58  shomrat
  334. * Changes in context
  335. *
  336. * Revision 1.7  2004/04/13 16:48:39  shomrat
  337. * Added Journal formatting (from fenbank_formatter)
  338. *
  339. * Revision 1.6  2004/04/07 14:51:24  shomrat
  340. * Fixed typo
  341. *
  342. * Revision 1.5  2004/04/07 14:28:19  shomrat
  343. * Added FTable format
  344. *
  345. * Revision 1.4  2004/02/11 22:54:00  shomrat
  346. * using types in flag file
  347. *
  348. * Revision 1.3  2004/01/14 16:17:42  shomrat
  349. * added support for GFF formatter
  350. *
  351. * Revision 1.2  2003/12/18 17:43:35  shomrat
  352. * context.hpp moved
  353. *
  354. * Revision 1.1  2003/12/17 20:23:02  shomrat
  355. * Initial Revision (adapted from flat lib)
  356. *
  357. *
  358. * ===========================================================================
  359. */