// 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; }