reference_item.cpp

来自「ncbi源码」· C++ 代码 · 共 1,302 行 · 第 1/3 页

CPP
1,302
字号
void CReferenceItem::x_Init(const CPub& pub, CBioseqContext& ctx){    switch (pub.Which()) {    case CPub::e_Gen:        x_Init(pub.GetGen(), ctx);        break;    case CPub::e_Sub:        x_Init(pub.GetSub(), ctx);        break;    case CPub::e_Medline:        x_Init(pub.GetMedline(), ctx);        break;    case CPub::e_Muid:        if ( m_MUID == 0 ) {            m_MUID = pub.GetMuid();            m_Category = ePublished;        }        break;    case CPub::e_Article:        x_Init(pub.GetArticle(), ctx);        break;    case CPub::e_Journal:        x_Init(pub.GetJournal(), ctx);        break;    case CPub::e_Book:        x_Init(pub.GetBook(), ctx);        break;    case CPub::e_Proc:        x_Init(pub.GetProc().GetBook(), ctx);        break;    case CPub::e_Patent:        x_Init(pub.GetPatent(), ctx);        break;    case CPub::e_Man:        x_Init(pub.GetMan(), ctx);        break;    case CPub::e_Equiv:        ITERATE (CPub_equiv::Tdata, it, pub.GetEquiv().Get()) {            x_Init(**it, ctx);        }        break;    case CPub::e_Pmid:        if ( m_PMID == 0 ) {            m_PMID = pub.GetPmid();            m_Category = ePublished;        }        break;    default:        break;    }}void CReferenceItem::x_Init(const CCit_gen& gen, CBioseqContext& ctx){    // serial    if ( gen.CanGetSerial_number()  &&  m_Serial == 0 ) {        m_Serial = gen.GetSerial_number();    }    // title    if ( m_Title.empty() ) {        if ( gen.CanGetTitle()  &&  !gen.GetTitle().empty() ) {            m_Title = gen.GetTitle();        } else {            if ( gen.CanGetCit()  &&  !gen.GetCit().empty() ) {                const string& cit = gen.GetCit();                SIZE_TYPE pos = NStr::Find(cit, "Title=\"");                if ( pos != NPOS ) {                    pos += 7;                    SIZE_TYPE end = cit.find_first_of('"', pos);                    m_Title = cit.substr(pos, end - pos);                }            }        }    }        // Journal    x_SetJournal(gen, ctx);        // Authors    if ( gen.CanGetAuthors() ) {        x_AddAuthors(gen.GetAuthors());    }    // MUID    if ( gen.CanGetMuid()  &&  m_MUID == 0 ) {        m_MUID = gen.GetMuid();    }        // PMID    if ( gen.CanGetPmid()  &&  m_PMID == 0 ) {        m_PMID = gen.GetPmid();    }    // Volume    if ( gen.CanGetVolume()  &&  m_Volume.empty() ) {        m_Volume = gen.GetVolume();    }    // Issue    if ( gen.CanGetIssue()  &&  m_Issue.empty() ) {        m_Issue = gen.GetIssue();    }    // Pages    if ( gen.CanGetPages()  &&  m_Pages.empty() ) {        m_Pages = gen.GetPages();        s_FixPages(m_Pages);    }    // Date    if ( gen.CanGetDate()  &&  !m_Date ) {        m_Date = &gen.GetDate();    }}void CReferenceItem::x_Init(const CCit_sub& sub, CBioseqContext& ctx){    // Title    m_Title = "Direct Submission";    // Authors    x_AddAuthors(sub.GetAuthors());    if ( sub.GetAuthors().CanGetAffil() ) {        FormatAffil(sub.GetAuthors().GetAffil(), m_Journal);    }    // Date    if ( sub.CanGetDate() ) {        m_Date = &sub.GetDate();    } else {        // complain?        if ( sub.CanGetImp() ) {            m_Date = &sub.GetImp().GetDate();        }    }    m_Category = eSubmission;}void CReferenceItem::x_Init(const CMedline_entry& mle, CBioseqContext& ctx){    m_Category = ePublished;    if ( mle.CanGetUid()  &&  m_MUID == 0 ) {        m_MUID = mle.GetUid();    }    if ( !m_Date ) {        m_Date = &mle.GetEm();    }    if ( mle.CanGetPmid()  &&  m_PMID == 0 ) {        m_PMID = mle.GetPmid();    }    if ( mle.CanGetCit() ) {        x_Init(mle.GetCit(), ctx);    }}void CReferenceItem::x_Init(const CCit_art& art, CBioseqContext& ctx){    // Title    if ( art.CanGetTitle()  &&  !art.GetTitle().Get().empty() ) {        m_Title = art.GetTitle().GetTitle();    }    // Authors    if ( art.CanGetAuthors() ) {        x_AddAuthors(art.GetAuthors());    }    // Journal    switch ( art.GetFrom().Which() ) {    case CCit_art::C_From::e_Journal:        x_Init(art.GetFrom().GetJournal(), ctx);        break;    case CCit_art::C_From::e_Book:        x_Init(art.GetFrom().GetBook(), ctx, true);        break;    case CCit_art::C_From::e_Proc:        x_Init(art.GetFrom().GetProc().GetBook(), ctx, true);        break;    default:        break;    }    if ( art.CanGetIds() ) {        ITERATE (CArticleIdSet::Tdata, it, art.GetIds().Get()) {            switch ( (*it)->Which() ) {            case CArticleId::e_Pubmed:                if ( m_PMID == 0 ) {                    m_PMID = (*it)->GetPubmed();                }                break;            case CArticleId::e_Medline:                if ( m_MUID == 0 ) {                    m_MUID = (*it)->GetMedline();                }                break;            default:                break;            }        }    }}void CReferenceItem::x_Init(const CCit_jour& jour, CBioseqContext& ctx){    x_SetJournal(jour.GetTitle(), ctx);    x_AddImprint(jour.GetImp(), ctx);}void CReferenceItem::x_Init(const CCit_book& book, CBioseqContext& ctx, bool for_art){    if ( !for_art ) {        if ( book.CanGetImp() ) {            x_AddImprint(book.GetImp(), ctx);        }        if ( book.CanGetTitle()  &&  !book.GetTitle().Get().empty() ) {            m_Journal = book.GetTitle().GetTitle();        }        if ( m_Authors.Empty()  &&  book.CanGetAuthors() ) {            x_AddAuthors(book.GetAuthors());        }    }  else if ( book.CanGetTitle()  &&  book.CanGetImp() ) {        m_Book.Reset(&book);        x_AddImprint(book.GetImp(), ctx);    }}void CReferenceItem::x_Init(const CCit_pat& pat, CBioseqContext& ctx){    bool embl = ctx.Config().IsFormatEMBL();    m_Category = ePublished;    m_Title = pat.GetTitle();    x_AddAuthors(pat.GetAuthors());    m_Journal = (embl ? "Patent number " : "Patent: ") + pat.GetCountry() + ' ';    if ( pat.CanGetNumber()  &&  !pat.GetNumber().empty() ) {        m_Journal += pat.GetNumber();    } else if ( pat.CanGetApp_number()  &&  !pat.GetApp_number().empty() ) {        m_Journal += pat.GetApp_number();    }    if ( pat.CanGetDoc_type()  &&  !pat.GetDoc_type().empty() ) {        m_Journal += '-';        m_Journal += pat.GetDoc_type();    }    CPatent_seq_id::TSeqid seqid = 0;    ITERATE (CBioseq::TId, it, ctx.GetBioseqIds()) {        if ((*it)->IsPatent()) {            seqid = (*it)->GetPatent().GetSeqid();        }    }    if ( seqid > 0 ) {        m_Journal += embl ? '/' : ' ';        m_Journal += NStr::IntToString(seqid);        if ( embl ) {            m_Journal += ", ";        }    } else {        m_Journal += ' ';    }    if ( pat.CanGetDate_issue() ) {        m_Journal += ' ';        DateToString(pat.GetDate_issue(), m_Journal);    } else if ( pat.CanGetApp_date() ) {        m_Journal += ' ';        DateToString(pat.GetApp_date(), m_Journal);    }    m_Journal += (embl ? '.' : ';');}void CReferenceItem::x_Init(const CCit_let& man, CBioseqContext& ctx){    x_Init(man.GetCit(), ctx);    if (man.CanGetType()  &&  man.GetType() == CCit_let::eType_thesis) {        const CImprint& imp = man.GetCit().GetImp();        if ( !m_Journal.empty() ) {            m_Title = m_Journal;            m_Journal.erase();        }        m_Journal = "Thesis (";        imp.GetDate().GetDate(&m_Journal, "%Y");        m_Journal += ')';        if (imp.CanGetPrepub()            &&  imp.GetPrepub() == CImprint::ePrepub_in_press) {            m_Journal += ", In press";        }        if (imp.CanGetPub()) {            string affil;            FormatAffil(imp.GetPub(), affil);            replace(affil.begin(), affil.end(), '\"', '\'');            m_Journal += ' ' + affil;        }        m_Date.Reset();    }}void CReferenceItem::x_AddAuthors(const CAuth_list& auth_list){    m_Authors.Reset(&auth_list);    if ( !auth_list.CanGetNames() ) return;        // also populate the consortium (if available)    if ( !m_Consortium.empty() ) return;    const CAuth_list::TNames& names = auth_list.GetNames();        if ( names.IsStd() ) {        ITERATE (CAuth_list::TNames::TStd, it, names.GetStd()) {            const CAuthor& auth = **it;            if ( auth.CanGetName()  &&                   auth.GetName().IsConsortium() ) {                m_Consortium = auth.GetName().GetConsortium();                break;            }        }    }}void CReferenceItem::x_SetJournal(const CTitle& title, CBioseqContext& ctx){    // Only GenBank/EMBL/DDBJ require ISO JTA in ENTREZ/RELEASE modes.    bool require_iso_jta = ctx.Config().CitArtIsoJta();    if ( !ctx.IsGED()  &&  !ctx.IsTPA() ) {        require_iso_jta = false;    }    // always use iso_jta title if present    const CTitle::C_E* ttl = 0;    ITERATE (CTitle::Tdata, it, title.Get()) {        if ( (*it)->IsIso_jta() ) {            ttl = *it;            break;        }    }    bool electronic_journal = false;    if ( ttl == 0 ) {        ttl = title.Get().front();        if ( ttl != 0  &&  ttl->IsName() ) {            if ( NStr::StartsWith(ttl->GetName(), "(er)", NStr::eNocase) ) {                electronic_journal = true;            }        }        if ( require_iso_jta  &&  !electronic_journal ) {            return;        }        m_Journal = title.GetTitle();    } else {        m_Journal = ttl->GetIso_jta();    }}void CReferenceItem::x_SetJournal(const CCit_gen& gen, CBioseqContext& ctx){    if ( !gen.CanGetCit()  &&  !gen.CanGetJournal()  &&  !gen.CanGetDate()  &&         gen.CanGetSerial_number()  &&  gen.GetSerial_number() != 0 ) {        return;    }    if ( !gen.CanGetJournal()  &&          gen.CanGetCit()  &&            NStr::StartsWith(gen.GetCit(), "unpublished", NStr::eNocase) ) {        const string& cit = gen.GetCit();        if ( ctx.Config().NoAffilOnUnpub() ) {            m_Category = eUnpublished;            m_Journal = "Unpublished";            return;        }        if ( gen.CanGetAuthors()  &&  gen.GetAuthors().CanGetAffil() ) {            string affil;            (gen.GetAuthors().GetAffil(), affil);            if ( !affil.empty() ) {                m_Category = eUnpublished;                m_Journal = "Unpublished " + affil;                return;            }        }        m_Journal = cit;        return;    }        string result, in_press;    if ( gen.CanGetJournal() ) {        x_SetJournal(gen.GetJournal(), ctx);        result = m_Journal;    }    if ( gen.CanGetCit() ) {        const string& cit = gen.GetCit();        SIZE_TYPE pos = NStr::FindNoCase(cit, "Journal=\"");        if ( pos != NPOS ) {            result = cit.substr(pos + 9);

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?