コード例 #1
0
        // Parser
        public static CSourceRecord Parse( CGedcom gedcom, int nLevel )
        {
            CGedcomLine gedcomLine;
            bool bParsingFinished;

            // Temporary holders for class members.
            CEventRecorded er;
            CSourceRepositoryCitation src;
            CNoteStructure ns;
            CMultimediaLink ml;

            // Without an xref header, we can't continue
            if ((gedcomLine = gedcom.GetLine(nLevel, "SOUR")) == null)
            {
                // Not one of us
                return null;
            }

            CSourceRecord sr = new CSourceRecord( gedcom );

            System.Text.StringBuilder sbTextFromSource = new System.Text.StringBuilder( 64 );

            sr.m_xref = gedcomLine.XrefID;
            gedcom.IncrementLineIndex(1);

            do
            {
                bParsingFinished = true;

                // Let Record have a go at parsing the rest
                if( sr.ParseRecord( gedcom, nLevel ) )
                {
                    bParsingFinished = false;
                    continue;
                }
                else if( (gedcomLine = gedcom.GetLine(nLevel+1, "DATA")) != null )
                {
                    gedcom.IncrementLineIndex(1);
                    bool bParsingFinished2;
                    do
                    {
                        bParsingFinished2 = true;
                        if( (er = CEventRecorded.Parse( gedcom, nLevel+2)) != null )
                        {
                            sr.m_alEventsRecorded.Add( er );
                            bParsingFinished2 = false;
                        }
                        else if( (gedcomLine = gedcom.GetLine(nLevel+2, "AGNC")) != null )
                        {
                            sr.m_sResponsibleAgency = gedcomLine.LineItem;
                            gedcom.IncrementLineIndex(1);
                            bParsingFinished2 = false;
                        }
                        else if( (ns = CNoteStructure.Parse( gedcom, nLevel+2 )) != null )
                        {
                            sr.m_alDataNoteStructures.Add( ns );
                            bParsingFinished2 = false;
                        }
                    }
                    while( !bParsingFinished2 );
                    bParsingFinished = false;
                }
                else if( (gedcomLine = gedcom.GetLine(nLevel+1, "AUTH")) != null )
                {
                    sr.m_sSourceOriginator = gedcomLine.LineItem;
                    gedcom.IncrementLineIndex(1);
                    bool bParsingFinished2;
                    do
                    {
                        bParsingFinished2 = true;
                        if( (gedcomLine = gedcom.GetLine(nLevel+2, "CONC")) != null )
                        {
                            sr.m_sSourceOriginator += gedcomLine.LineItem;
                            gedcom.IncrementLineIndex(1);
                            bParsingFinished2 = false;
                        }
                        else if( (gedcomLine = gedcom.GetLine(nLevel+2, "CONT")) != null )
                        {
                            sr.m_sSourceOriginator += "\n" + gedcomLine.LineItem;
                            gedcom.IncrementLineIndex(1);
                            bParsingFinished2 = false;
                        }
                    }
                    while( !bParsingFinished2 );
                    bParsingFinished = false;
                }
                else if( ((gedcomLine = gedcom.GetLine(nLevel+1, "TITL")) != null) || ((gedcomLine = gedcom.GetLine(nLevel+1, "NAME")) != null) )
                {
                    sr.m_sSourceDescriptiveTitle = gedcomLine.LineItem;
                    gedcom.IncrementLineIndex(1);
                    bool bParsingFinished2;
                    do
                    {
                        bParsingFinished2 = true;
                        if( (gedcomLine = gedcom.GetLine(nLevel+2, "CONC")) != null )
                        {
                            sr.m_sSourceDescriptiveTitle += gedcomLine.LineItem;
                            gedcom.IncrementLineIndex(1);
                            bParsingFinished2 = false;
                        }
                        else if( (gedcomLine = gedcom.GetLine(nLevel+2, "CONT")) != null )
                        {
                            sr.m_sSourceDescriptiveTitle += "\n" + gedcomLine.LineItem;
                            gedcom.IncrementLineIndex(1);
                            bParsingFinished2 = false;
                        }
                    }
                    while( !bParsingFinished2 );
                    bParsingFinished = false;
                }
                else if( (gedcomLine = gedcom.GetLine(nLevel+1, "ABBR")) != null )
                {
                    sr.m_sSourceFiledByEntry = gedcomLine.LineItem;
                    gedcom.IncrementLineIndex(1);
                    bParsingFinished = false;
                }
                else if( (gedcomLine = gedcom.GetLine(nLevel+1, "PUBL")) != null )
                {
                    sr.m_sSourcePublicationFacts = gedcomLine.LineItem;
                    gedcom.IncrementLineIndex(1);
                    bool bParsingFinished2;
                    do
                    {
                        bParsingFinished2 = true;
                        if( (gedcomLine = gedcom.GetLine(nLevel+2, "CONC")) != null )
                        {
                            sr.m_sSourcePublicationFacts += gedcomLine.LineItem;
                            gedcom.IncrementLineIndex(1);
                            bParsingFinished2 = false;
                        }
                        else if( (gedcomLine = gedcom.GetLine(nLevel+2, "CONT")) != null )
                        {
                            sr.m_sSourcePublicationFacts += "\n" + gedcomLine.LineItem;
                            gedcom.IncrementLineIndex(1);
                            bParsingFinished2 = false;
                        }
                    }
                    while( !bParsingFinished2 );
                    bParsingFinished = false;
                }
                else if( (gedcomLine = gedcom.GetLine(nLevel+1, "TEXT")) != null )
                {
                    // Actually want strcpy equiv here.
                    sbTextFromSource.Append( gedcomLine.LineItem );
                    gedcom.IncrementLineIndex(1);
                    bool bParsingFinished2;
                    do
                    {
                        bParsingFinished2 = true;
                        if( (gedcomLine = gedcom.GetLine(nLevel+2, "CONC")) != null )
                        {
                            sbTextFromSource.Append( gedcomLine.LineItem );
                            gedcom.IncrementLineIndex(1);
                            bParsingFinished2 = false;
                        }
                        else if( (gedcomLine = gedcom.GetLine(nLevel+2, "CONT")) != null )
                        {
                            sbTextFromSource.Append( "\n" + gedcomLine.LineItem );
                            gedcom.IncrementLineIndex(1);
                            bParsingFinished2 = false;
                        }
                    }
                    while( !bParsingFinished2 );
                    bParsingFinished = false;
                }
                else if( (src = CSourceRepositoryCitation.Parse( gedcom, nLevel+1 )) != null )
                {
                    sr.m_alSourceRepositoryCitations.Add( src );
                    bParsingFinished = false;
                }
                else if( (ml = CMultimediaLink.Parse( gedcom, nLevel+1 )) != null )
                {
                    sr.m_alMultimediaLinks.Add( ml );
                    bParsingFinished = false;
                }
                else if( (ns = CNoteStructure.Parse( gedcom, nLevel+1 )) != null )
                {
                    sr.m_alNoteStructures.Add( ns );
                    bParsingFinished = false;
                }
                else if( ( gedcomLine = gedcom.GetLine()).Level > nLevel )
                {
                    LogFile.TheLogFile.WriteLine( LogFile.DT_GEDCOM, LogFile.EDebugLevel.Warning, "Unknown tag :" );
                    LogFile.TheLogFile.WriteLine( LogFile.DT_GEDCOM, LogFile.EDebugLevel.Warning, gedcomLine.ToString() );
                    gedcom.IncrementLineIndex(1);
                    bParsingFinished = false;
                }
            }
            while( !bParsingFinished );

            sr.m_sTextFromSource = sbTextFromSource.ToString();

            return sr;
        }