private static bool PopulateTextFromBIRDDoc(ref FDO.IText newText, TextCreationParams textParams)
{
s_importOptions = textParams.ImportOptions;
Interlineartext interlinText = textParams.InterlinText;
FdoCache cache = textParams.Cache;
IThreadedProgress progress = textParams.Progress;
if (s_importOptions.CheckAndAddLanguages == null)
s_importOptions.CheckAndAddLanguages = CheckAndAddLanguagesInternal;
ILgWritingSystemFactory wsFactory = cache.WritingSystemFactory;
const char space = ' ';
//handle the languages(writing systems) section alerting the user if new writing systems are encountered
if (!s_importOptions.CheckAndAddLanguages(cache, interlinText, wsFactory, progress))
return false;
//handle the header(info or meta) information
SetTextMetaAndMergeMedia(cache, interlinText, wsFactory, newText, false);
//create all the paragraphs
foreach (var paragraph in interlinText.paragraphs)
{
if (newText.ContentsOA == null)
{
newText.ContentsOA = cache.ServiceLocator.GetInstance<IStTextFactory>().Create();
}
IStTxtPara newTextPara = newText.ContentsOA.AddNewTextPara("");
int offset = 0;
if (paragraph.phrases == null)
{
continue;
}
foreach (var phrase in paragraph.phrases)
{
ICmObject oldSegment = null;
//Try and locate a segment with this Guid.
if (!String.IsNullOrEmpty(phrase.guid))
{
if (cache.ServiceLocator.ObjectRepository.TryGetObject(new Guid(phrase.guid), out oldSegment))
{
//We aren't merging, but we have this guid in our system; ignore the file Guid
oldSegment = cache.ServiceLocator.GetInstance<ISegmentFactory>().Create(newTextPara, offset);
}
else
{
//The segment is identified by a Guid, but apparently we don't have it in our current document, so make one with the guid
oldSegment = cache.ServiceLocator.GetInstance<ISegmentFactory>().Create(newTextPara, offset, cache,
new Guid(phrase.guid));
}
}
//set newSegment to the old, or create a brand new one.
ISegment newSegment = oldSegment as ISegment ?? cache.ServiceLocator.GetInstance<ISegmentFactory>().Create(newTextPara, offset);
var tsStrFactory = cache.ServiceLocator.GetInstance<ITsStrFactory>();
//Fill in the ELAN time information if it is present.
AddELANInfoToSegment(cache, phrase, newSegment);
ITsString phraseText = null;
bool textInFile = false;
//Add all of the data from <item> elements into the segment.
AddSegmentItemData(cache, wsFactory, phrase, newSegment, tsStrFactory, ref textInFile, ref phraseText);
bool lastWasWord = false;
if (phrase.WordsContent != null && phrase.WordsContent.Words != null)
{
if (textParams.Version == 0 && PhraseHasExactlyOneTxtItemNotAKnownWordform(newSegment.Cache, phrase))
{
// It might be a SayMore text that makes the whole segment a single txt item.
// We want to add the text anyway (unless a higher level did so), but we will skip making
// a wordform. Eventual parsing of the text will do so.
if (!textInFile)
{
UpdatePhraseTextForWordItems(wsFactory, tsStrFactory, ref phraseText, phrase.WordsContent.Words[0], ref lastWasWord, space);
}
}
else
{
foreach (var word in phrase.WordsContent.Words)
{
//If the text of the phrase was not given in the document build it from the words.
if (!textInFile)
{
UpdatePhraseTextForWordItems(wsFactory, tsStrFactory, ref phraseText, word, ref lastWasWord, space);
}
AddWordToSegment(newSegment, word, tsStrFactory);
}
}
}
UpdateParagraphTextForPhrase(newTextPara, ref offset, phraseText);
}
}
return true;
}