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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: genbank_formatter.cpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/06/01 19:44:37  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.14
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: genbank_formatter.cpp,v 1000.2 2004/06/01 19:44:37 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/seqloc/Seq_loc.hpp>
  44. #include <objects/biblio/Author.hpp>
  45. #include <objects/general/Person_id.hpp>
  46. #include <objmgr/util/sequence.hpp>
  47. #include <objtools/format/text_ostream.hpp>
  48. #include <objtools/format/genbank_formatter.hpp>
  49. #include <objtools/format/items/locus_item.hpp>
  50. #include <objtools/format/items/defline_item.hpp>
  51. #include <objtools/format/items/accession_item.hpp>
  52. #include <objtools/format/items/version_item.hpp>
  53. #include <objtools/format/items/dbsource_item.hpp>
  54. #include <objtools/format/items/segment_item.hpp>
  55. #include <objtools/format/items/keywords_item.hpp>
  56. #include <objtools/format/items/source_item.hpp>
  57. #include <objtools/format/items/reference_item.hpp>
  58. #include <objtools/format/items/comment_item.hpp>
  59. #include <objtools/format/items/feature_item.hpp>
  60. #include <objtools/format/items/basecount_item.hpp>
  61. #include <objtools/format/items/sequence_item.hpp>
  62. #include <objtools/format/items/wgs_item.hpp>
  63. #include <objtools/format/items/primary_item.hpp>
  64. #include <objtools/format/items/contig_item.hpp>
  65. #include <objtools/format/items/genome_item.hpp>
  66. #include <objtools/format/items/origin_item.hpp>
  67. #include <objtools/format/context.hpp>
  68. #include "utils.hpp"
  69. BEGIN_NCBI_SCOPE
  70. BEGIN_SCOPE(objects)
  71. CGenbankFormatter::CGenbankFormatter(void) 
  72. {
  73.     SetIndent(string(12, ' '));
  74.     SetFeatIndent(string(21, ' '));
  75. }
  76. ///////////////////////////////////////////////////////////////////////////
  77. //
  78. // END SECTION
  79. void CGenbankFormatter::EndSection
  80. (const CEndSectionItem&,
  81.  IFlatTextOStream& text_os)
  82. {
  83.     list<string> l;
  84.     l.push_back("//");
  85.     text_os.AddParagraph(l);
  86. }
  87. ///////////////////////////////////////////////////////////////////////////
  88. //
  89. // Locus
  90. //
  91. // NB: The old locus line format is no longer supported for GenBank.
  92. // (DDBJ will still show the old line format)
  93. // Locus line format as specified in the GenBank release notes:
  94. //
  95. // Positions  Contents
  96. // ---------  --------
  97. // 01-05      'LOCUS'
  98. // 06-12      spaces
  99. // 13-28      Locus name
  100. // 29-29      space
  101. // 30-40      Length of sequence, right-justified
  102. // 41-41      space
  103. // 42-43      bp
  104. // 44-44      space
  105. // 45-47      spaces, ss- (single-stranded), ds- (double-stranded), or
  106. //            ms- (mixed-stranded)
  107. // 48-53      NA, DNA, RNA, tRNA (transfer RNA), rRNA (ribosomal RNA), 
  108. //            mRNA (messenger RNA), uRNA (small nuclear RNA), snRNA,
  109. //            snoRNA. Left justified.
  110. // 54-55      space
  111. // 56-63      'linear' followed by two spaces, or 'circular'
  112. // 64-64      space
  113. // 65-67      The division code (see Section 3.3 in GenBank release notes)
  114. // 68-68      space
  115. // 69-79      Date, in the form dd-MMM-yyyy (e.g., 15-MAR-1991)
  116. void CGenbankFormatter::FormatLocus
  117. (const CLocusItem& locus, 
  118.  IFlatTextOStream& text_os)
  119. {
  120.     static const string strands[]  = { "   ", "ss-", "ds-", "ms-" };
  121.     const CBioseqContext& ctx = *locus.GetContext();
  122.     list<string> l;
  123.     CNcbiOstrstream locus_line;
  124.     string units = "bp";
  125.     if ( !ctx.IsProt() ) {
  126.         if ( ctx.IsWGSMaster()  &&  ctx.IsRSWGSNuc() ) {
  127.             units = "rc";
  128.         }
  129.     } else {
  130.         units = "aa";
  131.     }
  132.     string topology = (locus.GetTopology() == CSeq_inst::eTopology_circular) ?
  133.                 "circular" : "linear  ";
  134.     locus_line.setf(IOS_BASE::left, IOS_BASE::adjustfield);
  135.     locus_line << setw(16) << locus.GetName() << ' ';
  136.     locus_line.setf(IOS_BASE::right, IOS_BASE::adjustfield);
  137.     locus_line
  138.         << setw(11) << locus.GetLength()
  139.         << ' '
  140.         << units
  141.         << ' '
  142.         << strands[locus.GetStrand()];
  143.     locus_line.setf(IOS_BASE::left, IOS_BASE::adjustfield);
  144.     locus_line
  145.         << setw(6) << s_GenbankMol[locus.GetBiomol()]
  146.         << "  "
  147.         << topology
  148.         << ' '              
  149.         << locus.GetDivision()
  150.         << ' '
  151.         << locus.GetDate();
  152.     Wrap(l, GetWidth(), "LOCUS", CNcbiOstrstreamToString(locus_line));
  153.     text_os.AddParagraph(l);
  154. }
  155. ///////////////////////////////////////////////////////////////////////////
  156. //
  157. // Definition
  158. void CGenbankFormatter::FormatDefline
  159. (const CDeflineItem& defline,
  160.  IFlatTextOStream& text_os)
  161. {
  162.     list<string> l;
  163.     Wrap(l, "DEFINITION", defline.GetDefline());
  164.     text_os.AddParagraph(l);
  165. }
  166. ///////////////////////////////////////////////////////////////////////////
  167. //
  168. // Accession
  169. void CGenbankFormatter::FormatAccession
  170. (const CAccessionItem& acc, 
  171.  IFlatTextOStream& text_os)
  172. {
  173.     string acc_line = x_FormatAccession(acc, ' ');
  174.     if ( acc.IsSetRegion() ) {
  175.         acc_line += " REGION: ";
  176.         acc_line += NStr::Int8ToString(acc.GetRegion().GetFrom());
  177.         acc_line += "..";
  178.         acc_line += NStr::Int8ToString(acc.GetRegion().GetTo());
  179.     }
  180.     if ( !acc_line.empty() ) {
  181.         list<string> l;
  182.         Wrap(l, "ACCESSION", acc_line);
  183.         text_os.AddParagraph(l);
  184.     }
  185. }
  186. ///////////////////////////////////////////////////////////////////////////
  187. //
  188. // Version
  189. void CGenbankFormatter::FormatVersion
  190. (const CVersionItem& version,
  191.  IFlatTextOStream& text_os)
  192. {
  193.     list<string> l;
  194.     CNcbiOstrstream version_line;
  195.     if ( version.GetAccession().empty() ) {
  196.         l.push_back("VERSION");
  197.     } else {
  198.         version_line << version.GetAccession();
  199.         if ( version.GetGi() > 0 ) {
  200.             version_line << "  GI:" << version.GetGi();
  201.         }
  202.         Wrap(l, GetWidth(), "VERSION", CNcbiOstrstreamToString(version_line));
  203.     }
  204.     text_os.AddParagraph(l);
  205. }
  206. ///////////////////////////////////////////////////////////////////////////
  207. //
  208. // Keywords
  209. void CGenbankFormatter::FormatKeywords
  210. (const CKeywordsItem& keys,
  211.  IFlatTextOStream& text_os)
  212. {
  213.     list<string> l;
  214.     x_GetKeywords(keys, "KEYWORDS", l);
  215.     text_os.AddParagraph(l);
  216. }
  217. ///////////////////////////////////////////////////////////////////////////
  218. //
  219. // Segment
  220. void CGenbankFormatter::FormatSegment
  221. (const CSegmentItem& seg,
  222.  IFlatTextOStream& text_os)
  223. {
  224.     list<string> l;
  225.     CNcbiOstrstream segment_line;
  226.     segment_line << seg.GetNum() << " of " << seg.GetCount();
  227.     Wrap(l, "SEGMENT", CNcbiOstrstreamToString(segment_line));
  228.     text_os.AddParagraph(l);
  229. }
  230. ///////////////////////////////////////////////////////////////////////////
  231. //
  232. // Source
  233. // SOURCE + ORGANISM
  234. void CGenbankFormatter::FormatSource
  235. (const CSourceItem& source,
  236.  IFlatTextOStream& text_os)
  237. {
  238.     list<string> l;
  239.     x_FormatSourceLine(l, source);
  240.     x_FormatOrganismLine(l, source);
  241.     text_os.AddParagraph(l);    
  242. }
  243. void CGenbankFormatter::x_FormatSourceLine
  244. (list<string>& l,
  245.  const CSourceItem& source) const
  246. {
  247.     CNcbiOstrstream source_line;
  248.     
  249.     string prefix = source.IsUsingAnamorph() ? " (anamorph: " : " (";
  250.     
  251.     source_line << source.GetOrganelle() << source.GetTaxname();
  252.     if ( !source.GetCommon().empty() ) {
  253.         source_line << prefix << source.GetCommon() << ")";
  254.     }
  255.     
  256.     Wrap(l, GetWidth(), "SOURCE", CNcbiOstrstreamToString(source_line));
  257. }
  258. void CGenbankFormatter::x_FormatOrganismLine
  259. (list<string>& l,
  260.  const CSourceItem& source) const
  261. {
  262.     Wrap(l, GetWidth(), "ORGANISM", source.GetTaxname(), eSubp);
  263.     Wrap(l, GetWidth(), kEmptyStr, source.GetLineage() + '.', eSubp);
  264. }
  265. ///////////////////////////////////////////////////////////////////////////
  266. //
  267. // REFERENCE
  268. // The REFERENCE field consists of five parts: the keyword REFERENCE, and
  269. // the subkeywords AUTHORS, TITLE (optional), JOURNAL, MEDLINE (optional),
  270. // PUBMED (optional), and REMARK (optional).
  271. void CGenbankFormatter::FormatReference
  272. (const CReferenceItem& ref,
  273.  IFlatTextOStream& text_os)
  274. {
  275.     CBioseqContext& ctx = *ref.GetContext();
  276.     list<string> l;
  277.     x_Reference(l, ref, ctx);
  278.     x_Authors(l, ref, ctx);
  279.     x_Consortium(l, ref, ctx);
  280.     x_Title(l, ref, ctx);
  281.     x_Journal(l, ref, ctx);
  282.     x_Medline(l, ref, ctx);
  283.     x_Pubmed(l, ref, ctx);
  284.     x_Remark(l, ref, ctx);
  285.     text_os.AddParagraph(l);
  286. }
  287. // The REFERENCE line contains the number of the particular reference and
  288. // (in parentheses) the range of bases in the sequence entry reported in
  289. // this citation.
  290. void CGenbankFormatter::x_Reference
  291. (list<string>& l,
  292.  const CReferenceItem& ref,
  293.  CBioseqContext& ctx) const
  294. {
  295.     CNcbiOstrstream ref_line;
  296.     // print serial number
  297.     ref_line << ref.GetSerial() << (ref.GetSerial() < 10 ? "  " : " ");
  298.     // print sites or range
  299.     CPubdesc::TReftype reftype = ref.GetReftype();
  300.     if ( reftype == CPubdesc::eReftype_sites  ||
  301.          reftype == CPubdesc::eReftype_feats ) {
  302.         ref_line << "(sites)";
  303.     } else if ( reftype == CPubdesc::eReftype_no_target ) {
  304.     } else {
  305.         const CSeq_loc* loc = ref.GetLoc() != 0 ? ref.GetLoc() : &ctx.GetLocation();
  306.         x_FormatRefLocation(ref_line, *loc, " to ", "; ", ctx);
  307.     }
  308.     Wrap(l, GetWidth(), "REFERENCE", CNcbiOstrstreamToString(ref_line));
  309. }
  310. void CGenbankFormatter::x_Authors
  311. (list<string>& l,
  312.  const CReferenceItem& ref,
  313.  CBioseqContext& ctx) const
  314. {
  315.     string auth = CReferenceItem::GetAuthString(ref.GetAuthors());
  316.     if ( !NStr::EndsWith(auth, ".") ) {
  317.         auth += ".";
  318.     }
  319.     Wrap(l, "AUTHORS", auth, eSubp);
  320. }
  321. void CGenbankFormatter::x_Consortium
  322. (list<string>& l,
  323.  const CReferenceItem& ref,
  324.  CBioseqContext& ctx) const
  325. {
  326.     Wrap(l, "CONSRTM", ref.GetConsortium(), eSubp);
  327. }
  328. void CGenbankFormatter::x_Title
  329. (list<string>& l,
  330.  const CReferenceItem& ref,
  331.  CBioseqContext& ctx) const
  332. {
  333.     string title = ref.GetTitle();
  334.     if ( NStr::EndsWith(title, ".") ) {
  335.         title.erase(title.length() - 1);
  336.     }
  337.     
  338.     Wrap(l, "TITLE",   title,   eSubp);
  339. }
  340. void CGenbankFormatter::x_Journal
  341. (list<string>& l,
  342.  const CReferenceItem& ref,
  343.  CBioseqContext& ctx) const
  344. {
  345.     string journal;
  346.     x_FormatRefJournal(journal, ref);
  347.     Wrap(l, "JOURNAL", journal, eSubp);
  348. }
  349. void CGenbankFormatter::x_Medline
  350. (list<string>& l,
  351.  const CReferenceItem& ref,
  352.  CBioseqContext& ctx) const
  353. {
  354.     if ( ref.GetMUID() != 0 ) {
  355.         Wrap(l, GetWidth(), "MEDLINE", NStr::IntToString(ref.GetMUID()), eSubp);
  356.     }
  357. }
  358. void CGenbankFormatter::x_Pubmed
  359. (list<string>& l,
  360.  const CReferenceItem& ref,
  361.  CBioseqContext& ctx) const
  362. {
  363.     if ( ref.GetPMID() != 0 ) {
  364.         Wrap(l, " PUBMED", NStr::IntToString(ref.GetPMID()), eSubp);
  365.     }
  366. }
  367. void CGenbankFormatter::x_Remark
  368. (list<string>& l,
  369.  const CReferenceItem& ref,
  370.  CBioseqContext& ctx) const
  371. {
  372.     Wrap(l, "REMARK", ref.GetRemark(), eSubp);
  373. }
  374. ///////////////////////////////////////////////////////////////////////////
  375. //
  376. // COMMENT
  377. void CGenbankFormatter::FormatComment
  378. (const CCommentItem& comment,
  379.  IFlatTextOStream& text_os)
  380. {
  381.     list<string> l;
  382.     if ( !comment.IsFirst() ) {
  383.         Wrap(l, kEmptyStr, comment.GetComment(), eSubp);
  384.     } else {
  385.         Wrap(l, "COMMENT", comment.GetComment());
  386.     }
  387.     text_os.AddParagraph(l);
  388. }
  389. ///////////////////////////////////////////////////////////////////////////
  390. //
  391. // FEATURES
  392. // Fetures Header
  393. void CGenbankFormatter::FormatFeatHeader
  394. (const CFeatHeaderItem& fh,
  395.  IFlatTextOStream& text_os)
  396. {
  397.     list<string> l;
  398.     Wrap(l, "FEATURES", "Location/Qualifiers", eFeatHead);
  399.     text_os.AddParagraph(l);
  400. }
  401. void CGenbankFormatter::FormatFeature
  402. (const CFeatureItemBase& f,
  403.  IFlatTextOStream& text_os)
  404.     CConstRef<CFlatFeature> feat = f.Format();
  405.     list<string>        l;
  406.     Wrap(l, feat->GetKey(), feat->GetLoc().GetString(), eFeat);
  407.     ITERATE (vector<CRef<CFormatQual> >, it, feat->GetQuals()) {
  408.         string qual = '/' + (*it)->GetName(), value = (*it)->GetValue();
  409.         switch ((*it)->GetStyle()) {
  410.         case CFormatQual::eEmpty:
  411.             value = qual;
  412.             qual.erase();
  413.             break;
  414.         case CFormatQual::eQuoted:
  415.             qual += "="";  value += '"';
  416.             break;
  417.         case CFormatQual::eUnquoted:
  418.             qual += '=';
  419.             break;
  420.         }
  421.         // Call NStr::Wrap directly to avoid unwanted line breaks right
  422.         // before the start of the value (in /translation, e.g.)
  423.         NStr::Wrap(value, GetWidth(), l,
  424.                    /*DoHTML() ? NStr::fWrap_HTMLPre : */0, GetFeatIndent(),
  425.                    GetFeatIndent() + qual);
  426.     }
  427.     text_os.AddParagraph(l);
  428. }
  429. ///////////////////////////////////////////////////////////////////////////
  430. //
  431. // BASE COUNT
  432. void CGenbankFormatter::FormatBasecount
  433. (const CBaseCountItem& bc,
  434.  IFlatTextOStream& text_os)
  435. {
  436.     list<string> l;
  437.     CNcbiOstrstream bc_line;
  438.     bc_line.setf(IOS_BASE::right, IOS_BASE::adjustfield);
  439.     bc_line
  440.         << setw(7) << bc.GetA() << " a"
  441.         << setw(7) << bc.GetC() << " c"
  442.         << setw(7) << bc.GetG() << " g"
  443.         << setw(7) << bc.GetT() << " t";
  444.     if ( bc.GetOther() > 0 ) {
  445.         bc_line << setw(7) << bc.GetOther() << " others";
  446.     }
  447.     Wrap(l, "BASE COUNT", CNcbiOstrstreamToString(bc_line));
  448.     text_os.AddParagraph(l);
  449. }
  450. ///////////////////////////////////////////////////////////////////////////
  451. //
  452. // SEQUENCE
  453. void CGenbankFormatter::FormatSequence
  454. (const CSequenceItem& seq,
  455.  IFlatTextOStream& text_os)
  456. {
  457.     list<string> l;
  458.     CNcbiOstrstream seq_line;
  459.     const CSeqVector& vec = seq.GetSequence();
  460.     TSeqPos base_count = seq.GetFrom();
  461.     CSeqVector::const_iterator iter = vec.begin();
  462.     while ( iter ) {
  463.         seq_line.setf(IOS_BASE::right, IOS_BASE::adjustfield);
  464.         seq_line << setw(9) << base_count;
  465.         for ( TSeqPos count = 0; count < 60  &&  iter; ++count, ++iter, ++base_count ) {
  466.             if ( count % 10 == 0 ) {
  467.                 seq_line << ' ';
  468.             }
  469.             seq_line << (char)tolower(*iter);
  470.         }
  471.         seq_line << 'n';
  472.     }
  473.     NStr::Split(CNcbiOstrstreamToString(seq_line), "n", l);
  474.     text_os.AddParagraph(l);
  475. }
  476. ///////////////////////////////////////////////////////////////////////////
  477. //
  478. // DBSOURCE
  479. void CGenbankFormatter::FormatDBSource
  480. (const CDBSourceItem& dbs,
  481.  IFlatTextOStream& text_os)
  482. {
  483.     list<string> l;
  484.     if ( !dbs.GetDBSource().empty() ) {
  485.         string tag = "DBSOURCE";
  486.         ITERATE (list<string>, it, dbs.GetDBSource()) {
  487.             Wrap(l, tag, *it);
  488.             tag.erase();
  489.         }
  490.         if ( !l.empty() ) {
  491.             text_os.AddParagraph(l);
  492.         }
  493.     }        
  494. }
  495. ///////////////////////////////////////////////////////////////////////////
  496. //
  497. // WGS
  498. void CGenbankFormatter::FormatWGS
  499. (const CWGSItem& wgs,
  500.  IFlatTextOStream& text_os)
  501. {
  502.     string tag;
  503.     switch ( wgs.GetType() ) {
  504.     case CWGSItem::eWGS_Projects:
  505.         tag = "WGS";
  506.         break;
  507.     case CWGSItem::eWGS_ScaffoldList:
  508.         tag = "WGS_SCAFLD";
  509.         break;
  510.     case CWGSItem::eWGS_ContigList:
  511.         tag = "WGS_CONTIG";
  512.         break;
  513.     default:
  514.         return;
  515.     }
  516.     list<string> l;
  517.     if ( wgs.GetFirstID() == wgs.GetLastID() ) {
  518.         Wrap(l, tag, wgs.GetFirstID());
  519.     } else {
  520.         Wrap(l, tag, wgs.GetFirstID() + "-" + wgs.GetLastID());
  521.     }
  522.     text_os.AddParagraph(l);
  523. }
  524. ///////////////////////////////////////////////////////////////////////////
  525. //
  526. // PRIMARY
  527. void CGenbankFormatter::FormatPrimary
  528. (const CPrimaryItem& primary,
  529.  IFlatTextOStream& text_os)
  530. {
  531.     list<string> l;
  532.     Wrap(l, "PRIMARY", primary.GetString());
  533.     text_os.AddParagraph(l);
  534. }
  535. ///////////////////////////////////////////////////////////////////////////
  536. //
  537. // GENOME
  538. void CGenbankFormatter::FormatGenome
  539. (const CGenomeItem& genome,
  540.  IFlatTextOStream& text_os)
  541. {
  542.     // !!!
  543. }
  544. ///////////////////////////////////////////////////////////////////////////
  545. //
  546. // CONTIG
  547. void CGenbankFormatter::FormatContig
  548. (const CContigItem& contig,
  549.  IFlatTextOStream& text_os)
  550. {
  551.     list<string> l;
  552.     string assembly = CFlatSeqLoc(contig.GetLoc(), *contig.GetContext(), 
  553.         CFlatSeqLoc::eType_assembly).GetString();
  554.     Wrap(l, "CONTIG", assembly);
  555.     text_os.AddParagraph(l);
  556. }
  557. ///////////////////////////////////////////////////////////////////////////
  558. //
  559. // ORIGIN
  560. void CGenbankFormatter::FormatOrigin
  561. (const COriginItem& origin,
  562.  IFlatTextOStream& text_os)
  563. {
  564.     list<string> l;
  565.     if ( origin.GetOrigin().empty() ) {
  566.         l.push_back("ORIGIN      ");
  567.     } else {
  568.         Wrap(l, "ORIGIN", origin.GetOrigin());
  569.     }
  570.     text_os.AddParagraph(l);
  571. }
  572. END_SCOPE(objects)
  573. END_NCBI_SCOPE
  574. /*
  575. * ===========================================================================
  576. *
  577. * $Log: genbank_formatter.cpp,v $
  578. * Revision 1000.2  2004/06/01 19:44:37  gouriano
  579. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.14
  580. *
  581. * Revision 1.14  2004/05/21 21:42:54  gorelenk
  582. * Added PCH ncbi_pch.hpp
  583. *
  584. * Revision 1.13  2004/05/06 17:53:12  shomrat
  585. * CFlatQual -> CFormatQual
  586. *
  587. * Revision 1.12  2004/04/22 15:59:59  shomrat
  588. * Changes in context
  589. *
  590. * Revision 1.11  2004/04/13 16:47:53  shomrat
  591. * Journal formatting moved to base class
  592. *
  593. * Revision 1.10  2004/03/26 17:25:36  shomrat
  594. * fixes to reference formatting
  595. *
  596. * Revision 1.9  2004/03/18 15:40:28  shomrat
  597. * Fixes to COMMENT formatting
  598. *
  599. * Revision 1.8  2004/03/10 21:29:01  shomrat
  600. * Fix VERSION formatting when empty
  601. *
  602. * Revision 1.7  2004/03/05 18:46:05  shomrat
  603. * fixed formatting of empty qualifier
  604. *
  605. * Revision 1.6  2004/02/19 18:13:12  shomrat
  606. * Added formatting of Contig and Origin
  607. *
  608. * Revision 1.5  2004/01/14 16:16:39  shomrat
  609. * removed const; using ctrl_items
  610. *
  611. * Revision 1.4  2003/12/19 00:14:44  ucko
  612. * Eliminate remaining uses of LEFT and RIGHT manipulators.
  613. *
  614. * Revision 1.3  2003/12/18 21:23:41  ucko
  615. * Avoid using LEFT and RIGHT manipulators lacking in GCC 2.9x.
  616. *
  617. * Revision 1.2  2003/12/18 17:43:34  shomrat
  618. * context.hpp moved
  619. *
  620. * Revision 1.1  2003/12/17 20:22:12  shomrat
  621. * Initial Revision (adapted from flat lib)
  622. *
  623. *
  624. * ===========================================================================
  625. */